bindbox-game/.trae/documents/补齐删除级联遗漏清单与改造计划.md
邹方成 2a89a1ab9d
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 39s
feat(admin): 更新前端资源文件及修复相关功能
refactor(service): 修改banner和guild删除逻辑为软删除
fix(service): 修复删除操作使用软删除而非物理删除

build: 添加SQLite测试仓库实现
docs: 新增奖励管理字段拆分和批量抽奖UI改造文档

ci: 更新CI忽略文件
style: 清理无用资源文件
2025-11-19 01:35:55 +08:00

3.2 KiB
Raw Blame History

结论与遗漏点

  • 当前事务级联已覆盖核心链路,但仍有以下遗漏按业务应清理:
  • 删除用户:
    • 订单子表:order_items.order_id IN(用户订单ID)(模型:internal/repository/mysql/model/order_items.gen.go:17
    • 支付流水:payment_preorders/order_idpayment_transactions/order_idpayment_refunds/order_id(模型:payment_preorders.gen.go:16payment_transactions.gen.go:16payment_refunds.gen.go:16
    • 邀请关系:user_invites.inviter_id = 用户ID OR invitee_id = 用户ID(模型:user_invites.gen.go:18,19
    • 资产转赠流水:user_inventory_transfers.from_user_id = 用户ID OR to_user_id = 用户ID,以及通过 inventory_id 引用用户资产(模型:user_inventory_transfers.gen.go:17-19
  • 删除活动:
    • 发货记录(与资产关联):shipping_records.inventory_id IN(活动产生的 user_inventory.id)(模型:shipping_records.gen.go:21
    • 资产转赠流水:user_inventory_transfers.inventory_id IN(活动产生的 user_inventory.id)
  • 删除期:
    • 可选(视运营策略):删除与该期绑定的系统道具模板 system_item_cards.issue_id = 期ID(模型:system_item_cards.gen.go:24)。若模板为系统公共配置且希望保留,请跳过。

改造方案

  • 用户级联(internal/service/user/batch_user.go:32
    1. 查出该用户的订单ID集合 → 删除 order_itemsorder_id IN (...)
    2. 按订单ID集合删除payment_preorderspayment_transactionspayment_refunds
    3. 删除邀请关系:user_invitesinviter_id = userID OR invitee_id = userID
    4. 删除资产转赠:user_inventory_transfersfrom_user_id = userID OR to_user_id = userID并按用户资产ID集合删除 inventory_id IN (...)
  • 活动级联(internal/service/activity/activity_delete.go:8-106
    1. 查出活动对应 user_inventory.id 集合
    2. 删除发货记录:shipping_records.inventory_id IN (...)
    3. 删除资产转赠流水:user_inventory_transfers.inventory_id IN (...)
  • 期级联(internal/service/activity/issue_delete.go:8-55
    • 可选:删除 system_item_cardsissue_id = 期ID(若模板为期专用且不保留)

技术细节

  • 顺序先删子表items、支付、转赠、发货→ 再删主表orders/users/activities/issues
  • 性能:大表采用分批删除(如 5000/批);所有条件列均为主/索引列(user_idorder_idinventory_id)以保证扫描性能
  • 幂等:条件删除无记录时不报错;重复执行安全

验收标准

  • 删除用户后,不残留该用户的订单行、支付流水、邀请关系、资产转赠流水、发货及统计(统计表可保留)
  • 删除活动后,不残留与该活动资产相关的发货记录与资产转赠流水
  • 删除期后(若启用模板清理),不残留该期范围的系统卡模板
  • 编译通过,现有接口行为不变(仅增强删除逻辑);事务全链路失败回滚

执行计划

  • 补充三处服务方法的事务删除步骤,并针对大数据量路径加分批删除;完成后编译验证和快速自测(构造少量数据路径)。

请确认是否按上述方案继续,我将直接补齐代码并完成验证。