feat: 实现企业设备授权功能并归档 OpenSpec 变更
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m39s

- 新增企业设备授权模块(Model、DTO、Service、Handler、Store)
- 实现设备授权的创建、查询、更新、删除等完整业务逻辑
- 添加企业卡授权与设备授权的关联关系
- 新增 2 个数据库迁移脚本
- 同步 OpenSpec delta specs 到 main specs
- 归档 add-enterprise-device-authorization 变更
- 更新 API 文档和路由配置
- 新增完整的集成测试和单元测试覆盖
This commit is contained in:
2026-01-29 13:18:49 +08:00
parent e87513541b
commit b02175271a
118 changed files with 14306 additions and 472 deletions

View File

@@ -0,0 +1,3 @@
schema: spec-driven
created: 2026-01-29

View File

@@ -0,0 +1,61 @@
# 一次性佣金修复 - 设计
## 目标
1. 通过 `ShopSeriesAllocation` 创建/更新接口即可配置一次性佣金并生效(你确认 B=1
2. “累计充值触发”场景每次支付成功都累加保存,达到阈值触发一次性佣金发放。
3. 发放具备幂等:同一资源(卡/设备)只发放一次。
## 1) 配置落库
### 固定类型fixed
`tb_shop_series_allocation` 写入:
- enable_one_time_commission
- one_time_commission_type = fixed
- one_time_commission_trigger
- one_time_commission_threshold
- one_time_commission_modefixed/percent
- one_time_commission_value
### 梯度类型tiered
`tb_shop_series_allocation` 写入:
- enable_one_time_commission
- one_time_commission_type = tiered
- one_time_commission_trigger
- one_time_commission_threshold
并在 `tb_shop_series_one_time_commission_tier` 维护档位:
- allocation_id
- tier_typesales_count/sales_amount
- threshold_value
- commission_modefixed/percent
- commission_value
更新策略建议:
- 更新配置时:先删除 allocation_id 对应的旧 tiers再批量插入新 tiers实现简单且可控
## 2) 累计触发逻辑
针对 `accumulated_recharge`
- 每次支付成功都更新 `AccumulatedRecharge += orderAmount`
- 若累计达到阈值且未发放过:
- 计算佣金金额
- 创建佣金记录并入账
- 标记 `FirstCommissionPaid = true`
注意:累计的更新应当以“支付成功”为准,避免未支付订单污染累计值。
## 3) 测试
- 配置落库测试:创建/更新分配后,查询数据库字段与 tiers 表是否一致
- 累计触发测试:模拟多次支付累计到阈值,验证只发放一次且累计值递增
- 修复现有单测字段不匹配导致的编译失败
## 验收标准
- 创建/更新 `ShopSeriesAllocation` 时,一次性佣金配置能正确落库并在查询响应中返回。
- 累计触发场景下,多次支付能累加并在达到阈值时发放一次性佣金;之后不重复发放。
- `go test ./...` 通过。

View File

@@ -0,0 +1,30 @@
# 一次性佣金修复:配置可落库 + 累计触发可累加 + 单测修复
## Why
一次性佣金能力已引入配置字段与计算逻辑,但目前存在两类关键问题:
1. **配置无法生效**:你确认希望通过 `ShopSeriesAllocation` 的创建/更新接口B=1直接配置一次性佣金并落库生效否则会出现“接口看起来支持配置但实际不生效”的问题。
2. **累计触发无法累加**:你确认累计规则为“每次购买都要累加,达到阈值就发放佣金”;如果不写回累计值,阈值永远达不到。
此外,相关单测目前编译失败,需要修复以保证回归可控。
## What Changes
- **一次性佣金配置落库**
-`ShopSeriesAllocation` 创建/更新时写入一次性佣金相关字段
- 若类型为梯度tiered同步维护 `tb_shop_series_one_time_commission_tier` 档位数据(更新时先清理再重建或做差量更新)
- **累计触发逻辑修复**
- 对“累计充值触发”场景,每次支付成功都写回累计金额
- 达到阈值的那次发放一次性佣金,并标记 `FirstCommissionPaid` 防止重复发放
- **测试修复与补充**
- 修复 `tests/unit/my_commission_service_test.go` 字段不匹配导致的编译失败
- 新增测试覆盖:配置落库与累计逻辑
## Impact
涉及模块(预期):
- 分配配置:`internal/service/shop_series_allocation/service.go``internal/store/postgres/shop_series_one_time_commission_tier_store.go`
- 佣金计算:`internal/service/commission_calculation/service.go`
- 测试:`tests/unit/my_commission_service_test.go` 及新增用例

View File

@@ -0,0 +1,24 @@
# 一次性佣金修复 - 实现任务
## 1. 配置落库ShopSeriesAllocation
- [ ] 1.1 更新 `internal/service/shop_series_allocation/service.go`:在创建分配时处理 `EnableOneTimeCommission/OneTimeCommissionConfig` 并落库
- [ ] 1.2 更新 `internal/service/shop_series_allocation/service.go`:在更新分配时支持更新一次性佣金配置并落库
- [ ] 1.3 梯度配置:使用 `ShopSeriesOneTimeCommissionTierStore` 在创建/更新时写入 tiers更新时先清理再重建
- [ ] 1.4 参数校验启用一次性佣金时必须提供配置fixed 必须有 mode/valuetiered 必须有 tiers
## 2. 累计触发逻辑修复
- [ ] 2.1 更新 `internal/service/commission_calculation/service.go`:累计触发场景每次支付成功都写回累计金额
- [ ] 2.2 达到阈值时仅发放一次,发放后标记 `FirstCommissionPaid=true`
## 3. 测试修复与补充
- [ ] 3.1 修复 `tests/unit/my_commission_service_test.go`:将 `CommissionType` 调整为 `CommissionSource`
- [ ] 3.2 新增测试:一次性佣金配置落库(含 tiered tiers 落库)
- [ ] 3.3 新增测试:累计触发多次支付后达到阈值触发一次性佣金且不重复
## 4. 验证
- [ ] 4.1 运行 `go test ./...` 确保通过