|
@@ -1,7 +1,7 @@
|
|
|
# Story 004.001: 创建多租户信用额度模块
|
|
# Story 004.001: 创建多租户信用额度模块
|
|
|
|
|
|
|
|
## Status
|
|
## Status
|
|
|
-Draft
|
|
|
|
|
|
|
+✅ Completed
|
|
|
|
|
|
|
|
## Story
|
|
## Story
|
|
|
**As a** 系统管理员,
|
|
**As a** 系统管理员,
|
|
@@ -17,58 +17,58 @@ Draft
|
|
|
6. 编写单元测试覆盖核心逻辑
|
|
6. 编写单元测试覆盖核心逻辑
|
|
|
|
|
|
|
|
## Tasks / Subtasks
|
|
## Tasks / Subtasks
|
|
|
-- [ ] **创建多租户信用额度模块包结构** (AC: 1, 2, 3, 4, 6)
|
|
|
|
|
- - [ ] 创建包目录:`packages/credit-balance-module-mt/` (参考:`packages/advertisements-module-mt/`)
|
|
|
|
|
- - [ ] 配置package.json,包名:`@d8d/credit-balance-module-mt` (参考:`packages/advertisements-module-mt/package.json`)
|
|
|
|
|
- - [ ] 配置TypeScript和Vitest配置文件 (参考:`packages/advertisements-module-mt/tsconfig.json`, `packages/advertisements-module-mt/vitest.config.ts`)
|
|
|
|
|
- - [ ] 创建核心模块结构:`src/entities/`, `src/services/`, `src/schemas/`, `src/routes/`, `src/types/` (参考:`packages/advertisements-module-mt/src/`)
|
|
|
|
|
- - [ ] 创建测试目录结构:`tests/unit/`, `tests/integration/` (参考:`packages/advertisements-module-mt/tests/`)
|
|
|
|
|
-
|
|
|
|
|
-- [ ] **实现信用额度实体** (AC: 1)
|
|
|
|
|
- - [ ] 创建`CreditBalanceMt`实体类,对应`credit_balance_mt`表 (参考:`packages/advertisements-module-mt/src/entities/advertisement.entity.ts`)
|
|
|
|
|
- - [ ] 添加字段:`tenant_id`, `user_id`, `total_limit`, `used_amount`, `available_amount`, `is_enabled`
|
|
|
|
|
- - [ ] 添加唯一约束:`uk_tenant_user (tenant_id, user_id)`
|
|
|
|
|
- - [ ] 添加索引:`idx_tenant_id`, `idx_user_id`
|
|
|
|
|
- - [ ] 使用TypeORM装饰器定义实体关系 (参考:`packages/advertisements-module-mt/src/entities/advertisement.entity.ts`)
|
|
|
|
|
-
|
|
|
|
|
-- [ ] **实现额度变更记录实体** (AC: 2)
|
|
|
|
|
- - [ ] 创建`CreditBalanceLogMt`实体类,对应`credit_balance_log_mt`表 (参考:`packages/advertisements-module-mt/src/entities/advertisement-type.entity.ts`)
|
|
|
|
|
- - [ ] 添加字段:`tenant_id`, `user_id`, `change_type`, `change_amount`, `before_total`, `after_total`, `before_used`, `after_used`, `reference_id`, `remark`, `operator_id`
|
|
|
|
|
- - [ ] 添加索引:`idx_tenant_user`, `idx_reference`, `idx_created`
|
|
|
|
|
- - [ ] 定义变更类型枚举:`SET_LIMIT`, `PAYMENT`, `CHECKOUT`, `CANCEL_ORDER`, `REFUND`, `ADJUST`
|
|
|
|
|
-
|
|
|
|
|
-- [ ] **实现额度管理服务** (AC: 3)
|
|
|
|
|
- - [ ] 创建`CreditBalanceService`服务类 (参考:`packages/advertisements-module-mt/src/services/advertisement.service.ts`)
|
|
|
|
|
- - [ ] 实现方法:`setLimit()`, `adjustLimit()`, `deductAmount()`, `restoreAmount()`, `getBalance()`, `getBalanceByUserId()`
|
|
|
|
|
- - [ ] 实现额度恢复方法:`restoreBalanceForCancelOrder()`, `restoreBalanceForRefund()`
|
|
|
|
|
- - [ ] 添加事务处理确保数据一致性
|
|
|
|
|
- - [ ] 添加额度检查和验证逻辑
|
|
|
|
|
-
|
|
|
|
|
-- [ ] **实现API路由** (AC: 4)
|
|
|
|
|
- - [ ] 创建路由文件:`src/routes/index.mt.ts` (参考:`packages/advertisements-module-mt/src/routes/index.ts`)
|
|
|
|
|
- - [ ] 实现API端点:
|
|
|
|
|
- - [ ] `GET /api/credit-balance/{userId}` - 查询用户额度
|
|
|
|
|
- - [ ] `PUT /api/credit-balance/{userId}` - 设置用户额度
|
|
|
|
|
- - [ ] `POST /api/credit-balance/{userId}/adjust` - 调整用户额度
|
|
|
|
|
- - [ ] `GET /api/credit-balance/{userId}/logs` - 查询额度变更记录
|
|
|
|
|
- - [ ] `POST /api/credit-balance/payment` - 额度支付
|
|
|
|
|
- - [ ] `POST /api/credit-balance/checkout` - 结账恢复额度
|
|
|
|
|
- - [ ] 添加数据验证Schema (参考:`packages/advertisements-module-mt/src/schemas/`)
|
|
|
|
|
- - [ ] 添加权限控制和认证中间件
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-- [ ] **编写测试** (AC: 6)
|
|
|
|
|
- - [ ] **服务测试**:测试额度管理逻辑 (参考:`packages/file-module/tests/unit/file.service.test.ts`)
|
|
|
|
|
- - [ ] **API集成测试**:测试端点功能和验证 (参考:`packages/advertisements-module-mt/tests/integration/advertisements.integration.test.ts`)
|
|
|
|
|
- - [ ] 添加边界条件测试:额度不足、重复操作等场景
|
|
|
|
|
- - [ ] 确保测试覆盖率 ≥ 80%
|
|
|
|
|
-
|
|
|
|
|
-- [ ] **配置包依赖和导出** (AC: 3, 4)
|
|
|
|
|
- - [ ] 配置package.json依赖关系(TypeORM、Hono等) (参考:`packages/advertisements-module-mt/package.json`)
|
|
|
|
|
- - [ ] 创建主入口文件:`src/index.mt.ts` 导出所有模块接口 (参考:`packages/advertisements-module-mt/src/index.ts`)
|
|
|
|
|
- - [ ] 配置TypeScript编译选项 (参考:`packages/advertisements-module-mt/tsconfig.json`)
|
|
|
|
|
- - [ ] 配置Vitest测试环境 (参考:`packages/advertisements-module-mt/vitest.config.ts`)
|
|
|
|
|
- - [ ] 确保包可以正确导入和使用
|
|
|
|
|
|
|
+- [x] **创建多租户信用额度模块包结构** (AC: 1, 2, 3, 4, 6)
|
|
|
|
|
+ - [x] 创建包目录:`packages/credit-balance-module-mt/` (参考:`packages/advertisements-module-mt/`)
|
|
|
|
|
+ - [x] 配置package.json,包名:`@d8d/credit-balance-module-mt` (参考:`packages/advertisements-module-mt/package.json`)
|
|
|
|
|
+ - [x] 配置TypeScript和Vitest配置文件 (参考:`packages/advertisements-module-mt/tsconfig.json`, `packages/advertisements-module-mt/vitest.config.ts`)
|
|
|
|
|
+ - [x] 创建核心模块结构:`src/entities/`, `src/services/`, `src/schemas/`, `src/routes/`, `src/types/` (参考:`packages/advertisements-module-mt/src/`)
|
|
|
|
|
+ - [x] 创建测试目录结构:`tests/unit/`, `tests/integration/` (参考:`packages/advertisements-module-mt/tests/`)
|
|
|
|
|
+
|
|
|
|
|
+- [x] **实现信用额度实体** (AC: 1)
|
|
|
|
|
+ - [x] 创建`CreditBalanceMt`实体类,对应`credit_balance_mt`表 (参考:`packages/advertisements-module-mt/src/entities/advertisement.entity.ts`)
|
|
|
|
|
+ - [x] 添加字段:`tenant_id`, `user_id`, `total_limit`, `used_amount`, `available_amount`, `is_enabled`
|
|
|
|
|
+ - [x] 添加唯一约束:`uk_tenant_user (tenant_id, user_id)`
|
|
|
|
|
+ - [x] 添加索引:`idx_tenant_id`, `idx_user_id`
|
|
|
|
|
+ - [x] 使用TypeORM装饰器定义实体关系 (参考:`packages/advertisements-module-mt/src/entities/advertisement.entity.ts`)
|
|
|
|
|
+
|
|
|
|
|
+- [x] **实现额度变更记录实体** (AC: 2)
|
|
|
|
|
+ - [x] 创建`CreditBalanceLogMt`实体类,对应`credit_balance_log_mt`表 (参考:`packages/advertisements-module-mt/src/entities/advertisement-type.entity.ts`)
|
|
|
|
|
+ - [x] 添加字段:`tenant_id`, `user_id`, `change_type`, `change_amount`, `before_total`, `after_total`, `before_used`, `after_used`, `reference_id`, `remark`, `operator_id`
|
|
|
|
|
+ - [x] 添加索引:`idx_tenant_user`, `idx_reference`, `idx_created`
|
|
|
|
|
+ - [x] 定义变更类型枚举:`SET_LIMIT`, `PAYMENT`, `CHECKOUT`, `CANCEL_ORDER`, `REFUND`, `ADJUST`
|
|
|
|
|
+
|
|
|
|
|
+- [x] **实现额度管理服务** (AC: 3)
|
|
|
|
|
+ - [x] 创建`CreditBalanceService`服务类 (参考:`packages/advertisements-module-mt/src/services/advertisement.service.ts`)
|
|
|
|
|
+ - [x] 实现方法:`setLimit()`, `adjustLimit()`, `deductAmount()`, `restoreAmount()`, `getBalance()`, `getBalanceByUserId()`
|
|
|
|
|
+ - [x] 实现额度恢复方法:`restoreBalanceForCancelOrder()`, `restoreBalanceForRefund()`
|
|
|
|
|
+ - [x] 添加事务处理确保数据一致性
|
|
|
|
|
+ - [x] 添加额度检查和验证逻辑
|
|
|
|
|
+
|
|
|
|
|
+- [x] **实现API路由** (AC: 4)
|
|
|
|
|
+ - [x] 创建路由文件:`src/routes/index.mt.ts` (参考:`packages/advertisements-module-mt/src/routes/index.ts`)
|
|
|
|
|
+ - [x] 实现API端点:
|
|
|
|
|
+ - [x] `GET /api/credit-balance/{userId}` - 查询用户额度
|
|
|
|
|
+ - [x] `PUT /api/credit-balance/{userId}` - 设置用户额度
|
|
|
|
|
+ - [x] `POST /api/credit-balance/{userId}/adjust` - 调整用户额度
|
|
|
|
|
+ - [x] `GET /api/credit-balance/{userId}/logs` - 查询额度变更记录
|
|
|
|
|
+ - [x] `POST /api/credit-balance/payment` - 额度支付
|
|
|
|
|
+ - [x] `POST /api/credit-balance/checkout` - 结账恢复额度
|
|
|
|
|
+ - [x] 添加数据验证Schema (参考:`packages/advertisements-module-mt/src/schemas/`)
|
|
|
|
|
+ - [x] 添加权限控制和认证中间件
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+- [x] **编写测试** (AC: 6)
|
|
|
|
|
+ - [x] **服务测试**:测试额度管理逻辑 (参考:`packages/file-module/tests/unit/file.service.test.ts`)
|
|
|
|
|
+ - [x] **API集成测试**:测试端点功能和验证 (参考:`packages/advertisements-module-mt/tests/integration/advertisements.integration.test.ts`)
|
|
|
|
|
+ - [x] 添加边界条件测试:额度不足、重复操作等场景
|
|
|
|
|
+ - [x] 确保测试覆盖率 ≥ 80%
|
|
|
|
|
+
|
|
|
|
|
+- [x] **配置包依赖和导出** (AC: 3, 4)
|
|
|
|
|
+ - [x] 配置package.json依赖关系(TypeORM、Hono等) (参考:`packages/advertisements-module-mt/package.json`)
|
|
|
|
|
+ - [x] 创建主入口文件:`src/index.mt.ts` 导出所有模块接口 (参考:`packages/advertisements-module-mt/src/index.ts`)
|
|
|
|
|
+ - [x] 配置TypeScript编译选项 (参考:`packages/advertisements-module-mt/tsconfig.json`)
|
|
|
|
|
+ - [x] 配置Vitest测试环境 (参考:`packages/advertisements-module-mt/vitest.config.ts`)
|
|
|
|
|
+ - [x] 确保包可以正确导入和使用
|
|
|
|
|
|
|
|
## Dev Notes
|
|
## Dev Notes
|
|
|
|
|
|
|
@@ -277,16 +277,56 @@ packages/
|
|
|
*此部分由开发代理在实现过程中填写*
|
|
*此部分由开发代理在实现过程中填写*
|
|
|
|
|
|
|
|
### Agent Model Used
|
|
### Agent Model Used
|
|
|
-*待开发代理填写*
|
|
|
|
|
|
|
+- Claude Code (d8d-model)
|
|
|
|
|
|
|
|
### Debug Log References
|
|
### Debug Log References
|
|
|
-*待开发代理填写*
|
|
|
|
|
|
|
+- 修复PostgreSQL不支持tinyint类型问题:将`tinyint`改为`smallint`
|
|
|
|
|
+- 集成测试数据库连接问题:使用`IntegrationTestDatabase`类替代`createIntegrationTestDb`函数
|
|
|
|
|
|
|
|
### Completion Notes List
|
|
### Completion Notes List
|
|
|
-*待开发代理填写*
|
|
|
|
|
|
|
+1. ✅ 成功创建多租户信用额度模块包结构
|
|
|
|
|
+2. ✅ 实现信用额度实体(CreditBalanceMt)和额度变更记录实体(CreditBalanceLogMt)
|
|
|
|
|
+3. ✅ 实现完整的额度管理服务(CreditBalanceService),包含设置额度、调整额度、扣减额度、恢复额度等方法
|
|
|
|
|
+4. ✅ 实现API路由,支持查询额度、设置额度、调整额度、查询变更记录、额度支付、结账恢复等功能
|
|
|
|
|
+5. ✅ 编写完整的单元测试(13个测试用例)和集成测试(11个测试用例)
|
|
|
|
|
+6. ✅ 配置包依赖和导出,确保模块可以正确导入和使用
|
|
|
|
|
+7. ✅ 修复PostgreSQL不支持tinyint类型问题:将`tinyint`改为`smallint`
|
|
|
|
|
+8. ✅ 修复集成测试数据库连接问题:使用`IntegrationTestDatabase`类替代`createIntegrationTestDb`函数
|
|
|
|
|
+9. ✅ 修复路由架构问题:参照订单模块重构为链式聚合模式,使用独立路由文件聚合导出
|
|
|
|
|
+10. ✅ 修复测试写法问题:参照订单模块重写集成测试,使用真实JWT令牌和RPC风格API调用
|
|
|
|
|
+11. ✅ 修复类型检查错误:修复分页参数类型、枚举使用、referenceId类型等问题
|
|
|
|
|
+12. ✅ 修复小数精度问题:TypeORM decimal字段返回字符串,在服务中转换为数字
|
|
|
|
|
+13. ✅ 修复数据库索引重复创建问题:CreditBalanceLogMt实体中两个字段使用相同索引名称
|
|
|
|
|
+14. ✅ 修复401认证失败问题:创建测试数据工厂,使用真实用户实体生成JWT令牌
|
|
|
|
|
+15. ✅ 修复Zod验证错误:将Schema中的`z.number()`改为`z.coerce.number()`
|
|
|
|
|
+16. ✅ 单元测试通过率100%,集成测试通过率100%
|
|
|
|
|
|
|
|
### File List
|
|
### File List
|
|
|
-*待开发代理填写*
|
|
|
|
|
|
|
+**创建的文件:**
|
|
|
|
|
+1. `packages/credit-balance-module-mt/package.json` - 包配置
|
|
|
|
|
+2. `packages/credit-balance-module-mt/tsconfig.json` - TypeScript配置
|
|
|
|
|
+3. `packages/credit-balance-module-mt/vitest.config.ts` - 测试配置
|
|
|
|
|
+4. `packages/credit-balance-module-mt/src/entities/credit-balance.mt.entity.ts` - 信用额度实体
|
|
|
|
|
+5. `packages/credit-balance-module-mt/src/entities/credit-balance-log.mt.entity.ts` - 额度变更记录实体
|
|
|
|
|
+6. `packages/credit-balance-module-mt/src/entities/index.ts` - 实体导出
|
|
|
|
|
+7. `packages/credit-balance-module-mt/src/services/credit-balance.service.ts` - 额度管理服务
|
|
|
|
|
+8. `packages/credit-balance-module-mt/src/services/index.ts` - 服务导出
|
|
|
|
|
+9. `packages/credit-balance-module-mt/src/schemas/index.ts` - 数据验证Schema
|
|
|
|
|
+10. `packages/credit-balance-module-mt/src/routes/index.ts` - API路由聚合文件
|
|
|
|
|
+11. `packages/credit-balance-module-mt/src/routes/get-balance.mt.ts` - 查询用户额度路由
|
|
|
|
|
+12. `packages/credit-balance-module-mt/src/routes/set-limit.mt.ts` - 设置用户额度路由
|
|
|
|
|
+13. `packages/credit-balance-module-mt/src/routes/adjust-limit.mt.ts` - 调整用户额度路由
|
|
|
|
|
+14. `packages/credit-balance-module-mt/src/routes/get-balance-logs.mt.ts` - 查询额度变更记录路由
|
|
|
|
|
+15. `packages/credit-balance-module-mt/src/routes/payment.mt.ts` - 额度支付路由
|
|
|
|
|
+16. `packages/credit-balance-module-mt/src/routes/checkout.mt.ts` - 结账恢复额度路由
|
|
|
|
|
+17. `packages/credit-balance-module-mt/src/types/index.ts` - 类型定义
|
|
|
|
|
+18. `packages/credit-balance-module-mt/src/index.ts` - 主入口文件
|
|
|
|
|
+19. `packages/credit-balance-module-mt/tests/unit/credit-balance.service.test.ts` - 服务单元测试
|
|
|
|
|
+20. `packages/credit-balance-module-mt/tests/integration/credit-balance-routes.integration.test.ts` - API集成测试
|
|
|
|
|
+21. `packages/credit-balance-module-mt/tests/utils/test-data-factory.ts` - 测试数据工厂
|
|
|
|
|
+
|
|
|
|
|
+**修改的文件:**
|
|
|
|
|
+1. `docs/stories/004.001.credit-balance-module-mt.story.md` - 更新任务状态和开发记录
|
|
|
|
|
|
|
|
## QA Results
|
|
## QA Results
|
|
|
*此部分由QA代理在审查完成后填写*
|
|
*此部分由QA代理在审查完成后填写*
|