bindbox-game/.trae/documents/称号管理重构对齐后端模型的实施计划.md
邹方成 8141a47690
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(称号系统): 新增称号管理功能与抽奖效果集成
- 新增系统称号模板与效果配置表及相关CRUD接口
- 实现用户称号分配与抽奖效果应用逻辑
- 优化抽奖接口支持用户ID参数以应用称号效果
- 新增称号管理前端页面与分配功能
- 修复Windows时区错误与JSON字段初始化问题
- 移除无用管理接口代码并更新文档说明
2025-11-16 11:37:40 +08:00

158 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 目标
* 移除无关的“客服组”等错误效果类型与字段严格对齐后端模型定义SystemTitles/SystemTitleEffects/UserTitles
* 统一“效果类型/参数/叠加策略/封顶/作用范围”配置为后端可用的结构确保抽奖逻辑effect\_type=5/6准确生效。
* 优化前端管理界面与 API 交互,保证运营可视化配置与后端运行一致。
## 范围
* 前端文件:
* `web/admin/src/views/operations/titles/components/EffectEditDialog.vue`
* `web/admin/src/views/operations/titles/components/EffectManagerDialog.vue`
* `web/admin/src/views/operations/titles/components/RuleConfigDialog.vue`
* `web/admin/src/views/operations/titles/index.vue`
* `web/admin/src/api/titles.ts`
* 后端仅对齐说明,不改动逻辑(模型/服务已正确):
* `internal/service/activity/draw_with_effects.go`(抽奖应用)
* `internal/service/title/effects_resolver.go`(效果范围)
* `internal/api/admin/titles_admin.go`(创建/修改/分配)
## 重构设计(按模型对齐)
### 效果类型与参数(替换现有 UI 与默认值)
* 1 领券(优惠券使者)
* `params_json``{ "template_id": number, "frequency": { "period": "day|week|month", "times": number } }`
* 2 抽奖折扣
* `params_json``{ "discount_type": "percentage|fixed", "value_x1000": number, "max_discount_x1000": number }`
* 3 签到倍数
* `params_json``{ "multiplier_x1000": number, "daily_cap_points": number }`
* 4 领道具卡
* `params_json``{ "template_id": number, "frequency": { "period": "week|month", "times": number } }`
* 5 概率加成(抽奖)
* `params_json``{ "target_prize_ids": number[], "boost_x1000": number, "cap_x1000": number? }`
* 6 奖品双倍概率(抽奖)
* `params_json``{ "target_prize_ids": number[], "chance_x1000": number, "period_cap_times": number? }`
* 移除:`生日特权/专属客服` 效果类型与全部相关字段UI/默认值/展示/说明)。
### 叠加策略与封顶(严格按模型)
* `stacking_strategy` 取值与文案:
* 0最大值max\_only
* 1累加封顶sum\_with\_cap
* 2首个匹配first\_match
* `cap_value_x1000`:统一封顶,单位千分比(用于 5/6 合并时的全局封顶)。
* 统一前端控件与默认值默认建议1 累加封顶;`cap_value_x1000`=0 表示不封顶)。
### 效果作用范围(效果级 scopes\_json
* 字段:`activity_ids/issue_ids/category_ids``exclude.*`
* 在效果编辑对话框中新增“作用范围”折叠面板:
* 多选输入上述集合;支持排除列表;空集合视为全局。
* 展示格式:在效果列表中将 `scopes_json` 可视化为“包含/排除”标签。
### 获得规则(标题级 obtain\_rules\_json
* 保留 UI方便运营标注明确说明其仅存储不参与当前自动授予后续如接入事件评估器再使用。
* JSON 结构:`{ methods: string[], conditions: object }`;维持现有 RuleConfigDialog 保存逻辑。
## 具体改动点(不执行,供审核)
* `EffectEditDialog.vue`
* 替换效果类型下拉项为 1\~6 正确枚举;删除“生日特权/专属客服”。
* 重写各类型的表单字段与 `getDefaultParams()` 返回值,改为上述模型参数结构。
* 调整 `stacking_strategy` 单选值为 0/1/2文案与后端一致。
* 新增“作用范围”字段并在提交时携带 `scopes_json`
* `EffectManagerDialog.vue`
* 更新 `effectTypes` 名称与 Tag 映射为正确文案:`领券/抽奖折扣/签到倍数/领道具卡/概率加成/双倍概率`
* 调整 `stackingStrategies` 文案为 0/1/2去掉无模型项。
* 更新参数格式化 `formatParam()`,支持 `template_id/frequency/discount_type/value_x1000/...`
* 增加对 `scopes_json` 的展示:包含/排除集合标签。
* `RuleConfigDialog.vue`
* 保留现有 UI在文档中明确“标题级范围不参与运行时判定”避免误解。
* `titles.ts`
* 校验请求参数与后端一致:`effect_type/params_json/stacking_strategy(0|1|2)/cap_value_x1000/scopes_json/sort/status`
## 数据迁移与兼容
* 已存在的效果记录:
* 运营检查并手动改为新结构(通过管理端编辑),或提供一次性迁移脚本:按 `effect_type` 将旧 `params_json` 映射为新字段。
* 前端:
* 旧页面中“生日特权/客服组”等效果无法再新建;编辑时提示需切换为模型定义效果。
## 测试与验收
* 配置与展示:创建每一种效果,检查列表显示与 JSON 持久化。
* 抽奖逻辑:
* `effect_type=5`:目标奖品权重按 `boost_x1000` 调整,叠加与封顶正确;参见 `internal/service/activity/draw_with_effects.go`
* `effect_type=6`:双倍概率按 `chance_x1000` 合并封顶;命中后倍数 x2名称后缀标识参见同文件。
* 作用范围:在 issueID 不同期下验证包含/排除命中行为;参见 `effects_resolver.go` 与抽奖文件。
* 运营页面每个功能或者配置字段需要详细描述
## 交付物
* 代码层面的重构(上述文件修改)。
* 文档更新:已在 `docs/称号系统/说明文档.md` 完成字段级详解与代码绑定点,重构后同步补充“字段校验与默认值”章节与新 UI 截图位点。
## 风险与注意
* 现有错误效果类型的数据需运营确认是否迁移或删除。
* 前端表单字段与后端参数必须完全对齐,否则抽奖效果不会生效。
确认后我将开始实施重构并提供测试用例与验证记录。