Ready for Review
As a 小程序用户, I want 可以使用信用额度进行支付, so that 在余额不足时也能完成购买
[x] 扩展订单模块支持额度支付类型 (AC: 1, 2, 3, 4, 7)
orders_mt表的pay_type字段,确认现有支付类型(已完成)pay_type枚举,新增CREDIT额度支付类型(已完成)[x] 在支付模块中集成额度支付逻辑 (AC: 1, 2, 3, 4, 7)
@d8d/mini-payment-mt支付模块结构(已完成检查,额度支付是独立支付方式)/api/credit-balance/paymentdeductAmount方法实现用户额度验证CreditBalanceService.deductAmount()方法[x] 在额度模块中添加当前用户额度查询路由 (AC: 1, 3, 6)
/api/credit-balance/me路由,从上下文中获取当前用户IDme.route.mt.ts实现[x] 实现额度恢复机制 (AC: 5)
/api/credit-balance/checkout接口调用(已完成)CreditBalanceService.restoreBalanceForCancelOrder()方法(已完成)restoreAmount方法保证同一订单只能恢复一次额度[x] 更新小程序支付页面 (AC: 1, 3, 7)
[x] 在小程序个人中心显示欠款信息 (AC: 6)
[x] 按照小程序mini规范编写测试 (AC: 1, 2, 3, 4, 5, 6, 7)
mini/tests/unit/pages/payment/ 创建测试文件,测试额度支付选项mini/tests/unit/pages/profile/ 创建测试文件,测试欠款信息显示mini/tests/integration/ 创建 credit-payment-flow.test.tsx,测试完整支付流程mini/tests/integration/ 创建 credit-balance-restore.test.tsx,测试额度恢复逻辑[x] 验证模块间集成 (AC: 7)
@d8d/mini-payment (微信小程序支付模块)@d8d/credit-balance-module-mt (多租户信用额度模块)@d8d/orders-module-mt (多租户订单管理模块)tinyint类型,需要改为smallintIntegrationTestDatabase类替代createIntegrationTestDb函数z.number()改为z.coerce.number()z.coerce.number()支持类型转换jest.mock('@tarojs/taro', ...) 模拟Taro APImini/tests/unit/ 和 mini/tests/integration/ 目录结构moduleNameMapper 进行路径映射QueryClientProvider 包装组件waitFor() 处理异步操作和状态更新jest.mock() 模拟API客户端调用describe + it 格式credit_balance_mt表结构:
CREATE TABLE credit_balance_mt (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
tenant_id INT UNSIGNED NOT NULL COMMENT '租户ID',
user_id INT UNSIGNED NOT NULL COMMENT '用户ID',
total_limit DECIMAL(10,2) DEFAULT 0.00 COMMENT '总额度',
used_amount DECIMAL(10,2) DEFAULT 0.00 COMMENT '已用额度',
available_amount DECIMAL(10,2) GENERATED ALWAYS AS (total_limit - used_amount) STORED COMMENT '可用额度',
is_enabled TINYINT DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_tenant_user (tenant_id, user_id),
INDEX idx_tenant_id (tenant_id),
INDEX idx_user_id (user_id)
) COMMENT='用户信用额度表';
credit_balance_log_mt表结构:
CREATE TABLE credit_balance_log_mt (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
tenant_id INT UNSIGNED NOT NULL COMMENT '租户ID',
user_id INT UNSIGNED NOT NULL COMMENT '用户ID',
change_type VARCHAR(20) NOT NULL COMMENT '变更类型: SET_LIMIT(设置额度), PAYMENT(支付扣减), CHECKOUT(结账恢复), CANCEL_ORDER(取消订单恢复), REFUND(退款恢复), ADJUST(调整额度)',
change_amount DECIMAL(10,2) NOT NULL COMMENT '变更金额(正数表示增加额度,负数表示减少额度)',
before_total DECIMAL(10,2) COMMENT '变更前总额度',
after_total DECIMAL(10,2) COMMENT '变更后总额度',
before_used DECIMAL(10,2) COMMENT '变更前已用额度',
after_used DECIMAL(10,2) COMMENT '变更后已用额度',
reference_id VARCHAR(100) COMMENT '关联ID(订单号等)',
remark VARCHAR(500) COMMENT '备注',
operator_id INT UNSIGNED COMMENT '操作人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_tenant_user (tenant_id, user_id),
INDEX idx_reference (reference_id),
INDEX idx_created (created_at)
) COMMENT='额度变更记录表';
额度模块对外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 - 结账恢复额度需要新增的API:
GET /api/credit-balance/me - 查询当前用户额度(从上下文中获取用户ID)额度模块服务接口(供其他模块调用):
CreditBalanceService.restoreBalanceForCancelOrder(orderId, userId, amount) - 取消订单恢复额度CreditBalanceService.restoreBalanceForRefund(orderId, userId, refundAmount) - 退款恢复额度设计说明:
/api/credit-balance/checkout接口CreditBalanceService.restoreBalanceForCancelOrder()方法CreditBalanceService.restoreBalanceForRefund()方法@d8d/credit-balance-module-mt包名导入服务类进行直接调用packages/credit-balance-module-mt/packages/credit-balance-management-ui-mt/packages/mini-payment-mt/ (需要检查是否存在多租户版本)packages/orders-module-mt/mini/ 目录下tests/目录下订单模块集成:
orders_mt表的pay_type字段,新增额度支付类型(已完成)@d8d/credit-balance-module-mt包(已完成)CreditBalanceService.restoreBalanceForCancelOrder()方法(已完成)支付流程修正:
@d8d/mini-payment-mt微信支付模块/api/credit-balance/payment API/api/payment/create APICreditBalanceService.restoreBalanceForRefund()方法小程序集成:
额度恢复逻辑:
mini/tests/ 目录下mini/tests/unit/**/*.test.tsxmini/tests/integration/**/*.test.tsx^@/(.*)$ → mini/src/$1^~/(.*)$ → mini/tests/$1^@tarojs/taro$ → mini/tests/__mocks__/taroMock.tsdescribe + it 或 test 格式,中文描述测试行为单元测试: 验证单个组件功能、hooks逻辑、工具函数
jest.mock() 模拟Taro API和外部依赖fireEvent 或 userEvent 模拟用户交互screen.getByText() / getByTestId() 等查询方法expect().toBeDefined() / toHaveBeenCalled() 等断言集成测试: 验证完整用户流程和API集成
QueryClientProvider 包装React Query组件waitFor() 处理异步操作支付流程测试: 测试额度支付完整流程
额度恢复测试: 测试结账、取消订单、退款时的额度恢复逻辑
错误处理测试: 测试各种错误场景
Taro API模拟: 使用 mini/tests/__mocks__/taroMock.ts 模拟Taro API
// 示例:模拟Taro API
jest.mock('@tarojs/taro', () => ({
default: {
navigateTo: jest.fn(),
showToast: jest.fn(),
showModal: jest.fn(),
getStorageSync: jest.fn(),
setStorageSync: jest.fn(),
},
}))
API客户端模拟: 使用 jest.mock() 模拟API客户端
// 示例:模拟额度查询API
jest.mock('@/api', () => ({
creditBalanceClient: {
$get: jest.fn(() => Promise.resolve({
status: 200,
json: () => Promise.resolve({
totalLimit: 1000,
usedAmount: 200,
availableAmount: 800,
isEnabled: true
})
}))
}
}))
React Query包装: 集成测试需要使用 QueryClientProvider
const createTestQueryClient = () => new QueryClient({
defaultOptions: {
queries: { retry: false },
mutations: { retry: false }
}
})
const TestWrapper = ({ children }: { children: React.ReactNode }) => (
<QueryClientProvider client={createTestQueryClient()}>
{children}
</QueryClientProvider>
)
测试数据工厂: 创建可复用的测试数据
// 示例:创建测试用户额度数据
export function createTestCreditBalance(overrides = {}) {
return {
totalLimit: 1000,
usedAmount: 200,
availableAmount: 800,
isEnabled: true,
userId: 1,
tenantId: 1,
...overrides
}
}
// 不同额度状态
const normalCredit = createTestCreditBalance() // 正常额度
const zeroCredit = createTestCreditBalance({ totalLimit: 0, availableAmount: 0 }) // 额度为0
const insufficientCredit = createTestCreditBalance({ totalLimit: 100, usedAmount: 80, availableAmount: 20 }) // 额度不足
mini/tests/
├── __mocks__/
│ ├── taroMock.ts # Taro API模拟
│ ├── styleMock.js # 样式文件模拟
│ └── fileMock.js # 文件资源模拟
├── unit/
│ ├── pages/
│ │ └── payment/
│ │ ├── index.test.tsx # 支付页面单元测试
│ │ └── credit-payment.test.tsx # 额度支付功能测试
│ └── components/
│ └── credit-balance-display.test.tsx # 额度显示组件测试
└── integration/
└── credit-payment-flow.test.tsx # 额度支付流程集成测试
[ ] 创建支付页面额度支付单元测试 (AC: 1, 3, 7)
mini/tests/unit/pages/payment/ 创建测试文件[ ] 创建个人中心欠款显示单元测试 (AC: 6)
mini/tests/unit/pages/profile/ 创建测试文件[ ] 创建额度支付流程集成测试 (AC: 1, 2, 3, 4, 7)
mini/tests/integration/ 创建 credit-payment-flow.test.tsx[ ] 创建额度恢复集成测试 (AC: 5)
mini/tests/integration/ 创建 credit-balance-restore.test.tsx[ ] 更新现有测试文件 (AC: 7)
| Date | Version | Description | Author |
|---|---|---|---|
| 2025-12-04 | 1.1 | 更新测试部分,按照小程序mini测试规范编写 | Bob (Scrum Master) |
| 2025-12-04 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
此部分由开发代理在实现过程中填写
Claude Code (d8d-model)
已完成的工作:
orders_mt表的pay_type字段注释PayType枚举,新增CREDIT额度支付类型/api/credit-balance/paymentdeductAmount方法实现/api/credit-balance/checkout接口CreditBalanceService.restoreBalanceForCancelOrder()方法restoreAmount方法保证已完成的工作:
/api/credit-balance/me路由,从上下文中获取当前用户ID已完成的工作:
已完成的工作:
mini/tests/unit/pages/payment/credit-payment.test.tsxmini/tests/unit/pages/profile/credit-balance-display.test.tsxmini/tests/integration/credit-payment-flow.test.tsxmini/tests/integration/credit-balance-restore.test.tsx已完成的工作:
redirectTo方法支持已完成的工作:
CreditBalanceService,在取消订单时调用restoreBalanceForCancelOrder()方法/api/credit-balance/payment APIcreditBalanceClient,支付页面和个人中心页面正确调用额度APICreditBalanceRoutes类型,小程序API客户端使用该类型确保类型安全已完成的工作:
creditBalance?.availableAmount >= amount时才显示额度支付选项useQuery改为useMutation,页面加载时不自动调用微信支付APIhandlePayment函数,在用户选择微信支付并点击支付按钮时才调用APIhandleRetryPayment函数,适配新的支付流程已完成的工作:
已修改的文件:
packages/orders-module-mt/src/entities/order.mt.entity.ts - 更新pay_type字段注释packages/orders-module-mt/src/schemas/order.mt.schema.ts - 扩展PayType枚举,更新schema验证packages/orders-module-mt/src/services/order.mt.service.ts - 导入CreditBalanceService,实现取消订单额度恢复packages/server/src/index.ts - 集成额度模块路由和实体mini/src/api.ts - 添加creditBalanceClient导出docs/stories/004.003.integrate-credit-payment.story.md - 更新任务状态和集成说明packages/credit-balance-module-mt/src/routes/me.mt.ts - 新增当前用户额度查询路由packages/credit-balance-module-mt/src/routes/index.ts - 更新路由索引,添加me路由packages/credit-balance-module-mt/tests/integration/credit-balance-routes.integration.test.ts - 添加me路由集成测试mini/src/pages/payment/index.tsx - 添加额度支付选项和逻辑packages/server/package.json - 添加额度模块依赖packages/orders-module-mt/package.json - 添加额度模块依赖mini/src/pages/profile/index.tsx - 添加欠款信息显示组件新创建的测试文件:
mini/tests/unit/pages/payment/credit-payment.test.tsx - 支付页面额度支付单元测试mini/tests/unit/pages/profile/credit-balance-display.test.tsx - 个人中心欠款显示单元测试mini/tests/integration/credit-payment-flow.test.tsx - 额度支付流程集成测试mini/tests/integration/credit-balance-restore.test.tsx - 额度恢复集成测试需要创建/修改的文件:
本次修复修改的文件:
mini/tests/__mocks__/taroMock.ts - 添加redirectTo方法支持mini/tests/unit/pages/payment/credit-payment.test.tsx - 修复文本匹配和定时器问题mini/tests/integration/credit-payment-flow.test.tsx - 修复文本匹配和按钮禁用检查本次优化修改的文件:
mini/src/pages/payment/index.tsx - 优化额度显示逻辑和支付流程
mini/tests/unit/pages/payment/credit-payment.test.tsx - 更新测试以验证新的额度和支付逻辑
此部分由QA代理在审查完成后填写