diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 46d829ab..6b3a70fb 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -580,7 +580,8 @@ "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(fiat-withdrawal\\): add complete fiat withdrawal system\n\n实现完整的法币提现功能,支持银行卡、支付宝、微信三种收款方式。\n此功能与现有的区块链划转功能完全独立,互不影响。\n\n## 后端 \\(wallet-service\\)\n\n### 数据库\n- 新增 `fiat_withdrawal_orders` 表存储法币提现订单\n- 与现有 `withdrawal_orders` 表\\(区块链划转\\)完全分离\n- 添加完整索引支持高效查询\n\n### 领域层\n- 新增 `FiatWithdrawalStatus` 枚举(与 WithdrawalStatus 独立)\n - 流程: PENDING -> FROZEN -> REVIEWING -> APPROVED -> PAYING -> COMPLETED\n - 或 REJECTED / FAILED / CANCELLED\n- 新增 `PaymentMethod` 枚举: BANK_CARD / ALIPAY / WECHAT\n- 新增 `FiatWithdrawalOrder` 聚合根\n- 新增 `IFiatWithdrawalOrderRepository` 仓储接口\n- 新增 `FIAT_WITHDRAWAL` 账本流水类型\n\n### 应用层\n- 新增 `FiatWithdrawalApplicationService` 处理业务逻辑\n - 发送短信验证码\n - 申请法币提现(冻结余额)\n - 提交审核\n - 审核通过/驳回\n - 开始打款\n - 完成打款\n\n### API层\n- 新增 `FiatWithdrawalController` 提供用户端API\n - POST /wallet/fiat-withdrawal/send-sms - 发送验证码\n - POST /wallet/fiat-withdrawal - 申请提现\n - GET /wallet/fiat-withdrawal - 获取提现记录\n- 新增内部API供管理端调用\n - GET /api/v1/wallets/fiat-withdrawals - 查询订单\n - POST /api/v1/wallets/fiat-withdrawals/:orderNo/review - 审核\n - POST /api/v1/wallets/fiat-withdrawals/:orderNo/start-payment - 开始打款\n - POST /api/v1/wallets/fiat-withdrawals/:orderNo/complete-payment - 完成打款\n\n## 前端 \\(admin-web\\)\n\n- 新增法币提现审核管理页面 `/withdrawals`\n- 支持按状态分 Tab 查看订单\n- 支持审核通过/驳回\n- 支持打款操作\n- 支持查看订单详情\n\n## 前端 \\(mobile-app\\)\n\n- 新增 `WithdrawFiatPage` 法币提现页面\n - 支持选择银行卡/支付宝/微信\n - 输入收款账户信息\n- 新增 `WithdrawFiatConfirmPage` 确认页面\n - 短信验证码验证\n - 密码验证\n- 在 `WalletService` 中添加法币提现相关方法和模型\n\n## 重要说明\n\n此功能与现有的区块链划转功能 \\(withdraw_usdt_page.dart\\) 完全独立:\n- 独立的数据库表\n- 独立的聚合根\n- 独立的状态枚举\n- 独立的API端点\n- 独立的前端页面\n\n原有的区块链划转功能保持不变,不受任何影响。\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(pending-actions\\): add special deduction feature for admin-created user actions\n\n实现特殊扣减功能,允许管理员为用户创建扣减待办操作,由用户在移动端确认执行。\n\n## 后端 \\(wallet-service\\)\n\n### 领域层\n- 新增 `SPECIAL_DEDUCTION` 到 LedgerEntryType 枚举\n 用于记录特殊扣减的账本流水类型\n\n### 应用层\n- 新增 `executeSpecialDeduction` 方法\n - 验证用户钱包存在性\n - 检查余额是否充足\n - 乐观锁控制并发\n - 扣减余额并记录账本流水\n - 返回操作结果和新余额\n\n### API层\n- 新增内部API: POST /api/v1/wallets/special-deduction/execute\n 供移动端调用执行特殊扣减操作\n\n## 前端 \\(admin-web\\)\n\n### 类型定义\n- 新增 `SPECIAL_DEDUCTION` 到 ACTION_CODES\n- 新增 `SpecialDeductionParams` 接口定义扣减参数\n - amount: 扣减金额\n - reason: 扣减原因\n\n### 页面\n- 更新待办操作管理页面\n - 当选择 SPECIAL_DEDUCTION 时显示扣减金额和原因输入框\n - 验证扣减金额必须大于0\n - 验证扣减原因不能为空\n\n### 样式\n- 新增特殊扣减表单区域样式\n\n## 前端 \\(mobile-app\\)\n\n### 服务层\n- 新增 `executeSpecialDeduction` 方法到 WalletService\n- 新增 `SpecialDeductionResult` 结果类\n- 新增 `specialDeduction` 到 PendingActionCode 枚举\n\n### 页面\n- 新增 `SpecialDeductionPage` 特殊扣减确认页面\n - 显示扣减金额和管理员备注\n - 显示当前余额和扣减后余额\n - 余额不足时禁用确认按钮\n - 温馨提示说明操作性质\n\n- 更新 `PendingActionsPage`\n - 处理 SPECIAL_DEDUCTION 类型的待办操作\n - 从 actionParams 解析 amount 和 reason\n - 导航到特殊扣减确认页面\n\n## 工作流程\n\n1. 管理员在 admin-web 创建 SPECIAL_DEDUCTION 待办操作\n - 选择目标用户\n - 输入扣减金额\n - 输入扣减原因\n\n2. 用户在 mobile-app 待办操作列表看到该操作\n\n3. 用户点击后进入特殊扣减确认页面\n - 查看扣减详情\n - 确认余额充足\n - 点击确认执行扣减\n\n4. 后端执行扣减并记录账本流水\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", "Bash(git check-ignore:*)", - "Bash(git hash-object:*)" + "Bash(git hash-object:*)", + "Bash(git commit -m \"$\\(cat <<''EOF''\nfix\\(planting\\): draw signature directly on page instead of using form field\n\nThe PDF signature field is only 92x51 points, which causes signatures to\nappear too small or invisible. Changed to use drawImage\\(\\) directly on\nthe page at the field''s position with a larger size \\(150x80 max\\).\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")" ], "deny": [], "ask": [] diff --git a/backend/services/authorization-service/src/api/dto/response/community-hierarchy.response.ts b/backend/services/authorization-service/src/api/dto/response/community-hierarchy.response.ts index 16680153..d4968c2c 100644 --- a/backend/services/authorization-service/src/api/dto/response/community-hierarchy.response.ts +++ b/backend/services/authorization-service/src/api/dto/response/community-hierarchy.response.ts @@ -46,7 +46,7 @@ export class CommunityHierarchyResponse { export const HEADQUARTERS_COMMUNITY: CommunityInfo = { authorizationId: 'headquarters', accountSequence: '', - communityName: '总部社区', + communityName: '总部', userId: undefined, isHeadquarters: true, } diff --git a/backend/services/authorization-service/src/application/services/authorization-application.service.ts b/backend/services/authorization-service/src/application/services/authorization-application.service.ts index 9890145f..b338a93d 100644 --- a/backend/services/authorization-service/src/application/services/authorization-application.service.ts +++ b/backend/services/authorization-service/src/application/services/authorization-application.service.ts @@ -922,7 +922,7 @@ export class AuthorizationApplicationService { const HEADQUARTERS_COMMUNITY = { authorizationId: 'headquarters', accountSequence: '0', - communityName: '总部社区', + communityName: '总部', userId: undefined, isHeadquarters: true, } diff --git a/backend/services/identity-service/prisma/seed.ts b/backend/services/identity-service/prisma/seed.ts index 66b9873e..abd0e214 100644 --- a/backend/services/identity-service/prisma/seed.ts +++ b/backend/services/identity-service/prisma/seed.ts @@ -24,7 +24,7 @@ const SYSTEM_ACCOUNTS = [ { userId: BigInt(1), accountSequence: 'S0000000001', // 总部社区 - nickname: '总部社区', + nickname: '总部', referralCode: 'HQ000001', status: 'SYSTEM', }, diff --git a/backend/services/leaderboard-service/prisma/seed.ts b/backend/services/leaderboard-service/prisma/seed.ts index 795a50da..06add12f 100644 --- a/backend/services/leaderboard-service/prisma/seed.ts +++ b/backend/services/leaderboard-service/prisma/seed.ts @@ -28,7 +28,7 @@ async function main() { update: {}, create: { accountType: 'HEADQUARTERS', - displayName: '总部社区', + displayName: '总部', isActive: true, }, }); diff --git a/backend/services/leaderboard-service/src/domain/entities/virtual-account.entity.ts b/backend/services/leaderboard-service/src/domain/entities/virtual-account.entity.ts index 545726d0..e90186a4 100644 --- a/backend/services/leaderboard-service/src/domain/entities/virtual-account.entity.ts +++ b/backend/services/leaderboard-service/src/domain/entities/virtual-account.entity.ts @@ -120,7 +120,7 @@ export class VirtualAccount { static createHeadquarters(): VirtualAccount { return new VirtualAccount( VirtualAccountType.HEADQUARTERS, - '总部社区', + '总部', null, null, null, diff --git a/backend/services/leaderboard-service/src/domain/value-objects/virtual-account-type.enum.ts b/backend/services/leaderboard-service/src/domain/value-objects/virtual-account-type.enum.ts index cb693117..4cbe1717 100644 --- a/backend/services/leaderboard-service/src/domain/value-objects/virtual-account-type.enum.ts +++ b/backend/services/leaderboard-service/src/domain/value-objects/virtual-account-type.enum.ts @@ -12,5 +12,5 @@ export const VirtualAccountTypeLabels: Record = { [VirtualAccountType.RANKING_VIRTUAL]: '排名虚拟账户', [VirtualAccountType.SYSTEM_PROVINCE]: '系统省公司', [VirtualAccountType.SYSTEM_CITY]: '系统市公司', - [VirtualAccountType.HEADQUARTERS]: '总部社区', + [VirtualAccountType.HEADQUARTERS]: '总部', };