From 6781178f6c983d1e0585646ced53a070d05d0416 Mon Sep 17 00:00:00 2001 From: xinian Date: Sun, 26 Apr 2026 23:57:40 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=8A=A8=E6=80=81=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=95=86=E5=BA=97=E5=89=8D=E7=BD=AE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=AD=89=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- help/base_sys_user_role去重.sql | 30 ++++++++++++++++++++++++++++++ help/约束类.sql | 13 ++++++++++++- modules/player/service/task.go | 32 ++++++++++++++++++++++++-------- 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 help/base_sys_user_role去重.sql diff --git a/help/base_sys_user_role去重.sql b/help/base_sys_user_role去重.sql new file mode 100644 index 00000000..74cd0ac7 --- /dev/null +++ b/help/base_sys_user_role去重.sql @@ -0,0 +1,30 @@ +-- base_sys_user_role 角色授权去重 +-- 保留每组 userId + roleId 中 id 最小的一条,删除其余重复记录 + +-- 1. 执行前查看重复数据 +SELECT + "userId", + "roleId", + COUNT(*) AS cnt, + MIN(id) AS keep_id, + ARRAY_AGG(id ORDER BY id) AS ids +FROM base_sys_user_role +GROUP BY "userId", "roleId" +HAVING COUNT(*) > 1 +ORDER BY cnt DESC, "userId", "roleId"; + +-- 2. 删除重复数据 +DELETE FROM base_sys_user_role a +USING base_sys_user_role b +WHERE a."userId" = b."userId" + AND a."roleId" = b."roleId" + AND a.id > b.id; + +-- 3. 执行后复查,应返回 0 行 +SELECT + "userId", + "roleId", + COUNT(*) AS cnt +FROM base_sys_user_role +GROUP BY "userId", "roleId" +HAVING COUNT(*) > 1; diff --git a/help/约束类.sql b/help/约束类.sql index 2acbafda..d947de69 100644 --- a/help/约束类.sql +++ b/help/约束类.sql @@ -39,4 +39,15 @@ WHERE deleted_at IS NULL; --房间索引 CREATE UNIQUE INDEX uk_player_room_house ON player_room_house (player_id, is_vip) -WHERE deleted_at IS NULL; \ No newline at end of file +WHERE deleted_at IS NULL; + +-- 集市权限角色 联合唯一 +-- 先清理历史重复授权,保留每组 userId + roleId 中 id 最小的一条 +DELETE FROM base_sys_user_role a +USING base_sys_user_role b +WHERE a."userId" = b."userId" + AND a."roleId" = b."roleId" + AND a.id > b.id; + +CREATE UNIQUE INDEX IF NOT EXISTS uk_base_sys_user_role_user_role +ON base_sys_user_role ("userId", "roleId"); diff --git a/modules/player/service/task.go b/modules/player/service/task.go index 5b127a1e..fa104afd 100644 --- a/modules/player/service/task.go +++ b/modules/player/service/task.go @@ -5,6 +5,7 @@ import ( configservice "blazing/modules/config/service" "blazing/modules/player/model" "errors" + "fmt" "strings" "github.com/pointernil/bitset32" @@ -15,17 +16,19 @@ func (s *TaskService) CanShop() bool { } func (s *TaskService) ShopRequirementError() error { - var gg *model.Task + braveRequireLevel := shopRequiredTowerLevel(configservice.NewTower500Service()) + var braveTask *model.Task - s.dbm(s.Model).Where("task_id", 500).Scan(&gg) - if gg == nil || !bitset32.From(gg.Data).Test(80) { - return errors.New("请先完成勇者任务80") + s.dbm(s.Model).Where("task_id", 500).Scan(&braveTask) + if braveRequireLevel > 0 && (braveTask == nil || !bitset32.From(braveTask.Data).Test(uint(braveRequireLevel))) { + return fmt.Errorf("请先完成勇者任务%d", braveRequireLevel) } - var ggg *model.Task - s.dbm(s.Model).Where("task_id", 600).Scan(&ggg) - if ggg == nil || !bitset32.From(ggg.Data).Test(50) { - return errors.New("请先完成试炼任务50") + trialRequireLevel := shopRequiredTowerLevel(configservice.NewTower600Service()) + var trialTask *model.Task + s.dbm(s.Model).Where("task_id", 600).Scan(&trialTask) + if trialRequireLevel > 0 && (trialTask == nil || !bitset32.From(trialTask.Data).Test(uint(trialRequireLevel))) { + return fmt.Errorf("请先完成试炼任务%d", trialRequireLevel) } var darkTask *model.Task @@ -44,6 +47,19 @@ func (s *TaskService) ShopRequirementError() error { return nil } +func shopRequiredTowerLevel(towerService *configservice.TowerService) uint32 { + levels := towerService.EnabledLevels() + if len(levels) == 0 { + return 0 + } + + highestLevel := levels[len(levels)-1] + if highestLevel <= 10 { + return 0 + } + return highestLevel - 10 +} + func (s *TaskService) GetTask(id uint32) (*model.Task, error) { var task *model.Task if err := s.dbm(s.Model).Where("task_id", id).Scan(&task); err != nil {