hailin
e9b2917561
fix(pdf-generator): 使用自定义外观流嵌入签名图片
...
- 恢复使用 widget.setNormalAppearance() 方式
- 创建 XObject Form 作为外观流
- 签名图片按字段尺寸等比例缩放并居中
- 不依赖页面索引,直接设置到widget上
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 07:58:44 -08:00
hailin
91d3e65289
fix(pdf-generator): 使用page.drawImage在按钮位置绘制签名图片
...
- 从git历史恢复正确的签名嵌入实现
- 获取signature按钮的widget和rectangle位置
- 按字段尺寸等比例缩放签名图片并居中
- 使用page.drawImage()绘制签名,而非setImage()
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 07:54:17 -08:00
hailin
954f170bd4
feat(contract-signing): 增强签名功能
...
前端改进:
- 签名页面添加红色醒目提示"请使用正楷书写您的真实姓名"
- 签名前显示用户真实姓名供参照
- 实现全屏横向签名面板(自动切换横屏/竖屏)
- 记录签名轨迹数据(每个点的坐标和时间戳、笔画顺序)
后端改进:
- 扩展SignContractParams接口支持signatureTrace字段
- 控制器记录签名轨迹日志(笔画数、总时长)
- 签名轨迹数据以JSON格式存储,作为法律凭证
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 06:42:15 -08:00
hailin
d4763ea5bf
chore(planting-service): 更新合同PDF模板(修复红色文字)
...
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 06:29:08 -08:00
hailin
dfecdc06e9
chore(planting-service): 更新合同PDF模板
...
使用新的榴莲树认种权益协议_发布版_form.pdf替换原模板
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 06:15:49 -08:00
hailin
ad5b153fa9
fix(pdf-generator): 签名按字段尺寸等比例缩放并居中
...
- 计算宽度和高度的缩放比例,取较小值确保签名完全在字段内
- 在字段内居中放置签名图片
- 符合行业标准:签名根据字段尺寸自适应缩放
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 05:56:38 -08:00
hailin
2e65a92e04
fix(planting-service): 签名图片按比例缩放到合适大小
...
- 目标宽度 150pt(约 5cm)
- 保持宽高比不变
- 避免签名图片过大
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 05:53:51 -08:00
hailin
6c017d2086
fix(planting-service): 签名图片保持原始尺寸放置
...
- 不再缩放签名图片适应按钮大小
- 直接在按钮位置绘制原始尺寸的签名
- 避免签名被压扁变形
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 05:53:22 -08:00
hailin
666be6ea60
fix(planting-service): 签名后查看合同返回已签名的PDF
...
- 修改 /tasks/:orderNo/pdf 接口,检查任务状态
- 如果已签名且有 signedPdfUrl,从 MinIO 下载已签名的 PDF
- 添加 downloadSignedPdf 方法到 MinioStorageService
- 在 ContractSigningTaskDto 中添加 signedPdfUrl 字段
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 05:48:22 -08:00
hailin
86103e4c4d
fix(planting-service): 使用自定义外观流嵌入签名图片
...
- setImage 无法正确渲染签名到按钮字段
- 手动创建 XObject Form 外观流
- 计算图片缩放和居中位置
- 设置 widget 的 NormalAppearance
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 05:35:58 -08:00
hailin
bdeff3b372
fix(planting-service): 修复合同签名无法放到指定位置的问题
...
- 修改 generateSignedContractPdf 在同一个 PDFDocument 实例上完成填充和签名
- 移除 fillFormFields 中的 form.flatten(),保留签名字段供后续使用
- 最后统一扁平化所有表单字段,确保签名放到正确位置
- 控制器改用 generateSignedContractPdf 替代分两步调用
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 05:23:53 -08:00
hailin
1d6982c73e
feat(planting-service): 合同签署超时时间从24小时改为1年
2025-12-26 03:58:56 -08:00
hailin
9addd99710
fix(planting-service): 修正导入路径
...
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 01:50:37 -08:00
hailin
24a46521f3
fix(planting-service): 修复跨服务调用使用错误标识符导致的500错误
...
问题根源:
- getBalance 调用使用 userId.toString() (纯数字如 "14")
- wallet-service 按 accountSequence 查找钱包失败后尝试创建新钱包
- 但 userId 已存在,触发唯一约束冲突导致500错误
修复内容:
1. planting-application.service.ts:
- createOrder: getBalance(userId.toString()) → getBalance(accountSequence)
- payOrder: getBalance(userId.toString()) → getBalance(walletIdentifier)
2. payment-compensation.service.ts:
- 注入 IPlantingOrderRepository 获取订单的 accountSequence
- handleUnfreeze/handleRetryConfirm 添加 accountSequence 参数
3. wallet-service.client.ts:
- ensureRegionAccounts 接口添加 provinceTeamAccount/cityTeamAccount 字段
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 01:48:22 -08:00
hailin
f62a96f3f1
feat(planting): 已付款未KYC用户强制进入实名认证流程
...
后端 (planting-service):
- 添加 /contract-signing/kyc-requirement 接口检查用户是否需要KYC
- 检查已付款订单但无合同签署任务的情况
前端 (mobile-app):
- ContractCheckService 新增 checkAll() 综合检查方法
- HomeShellPage 综合检查待签署合同和KYC需求
- 需要KYC时弹出强制认证弹窗,不可关闭
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 21:14:53 -08:00
hailin
1e15b820b4
fix(planting-service): 合同PDF显示完整手机号和身份证号
...
- 移除 PDF 生成时对手机号和身份证号的脱敏处理
- 表单字段模式和坐标定位模式都直接使用原始值
- 删除 maskIdCard() 和 maskPhone() 脱敏方法
- 签订合同需要显示完整信息
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 18:55:55 -08:00
hailin
7a1e789f4d
fix(contract): 合同签署页面和模板优化
...
1. 合同模板:身份证号和联系方式显示完整信息,不再使用星号掩码
2. 签署页面:checkbox 默认不选中,用户阅读到底部后才可点击确认
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 09:31:39 -08:00
hailin
63ac0debf3
feat(planting-service): 添加合同签署后事件恢复定时任务
...
每2~5分钟随机间隔扫描已签署超过2分钟的合同
重新发布 contract.signed 事件,确保扣款确认和奖励分配完成
幂等性已由 wallet-service 保证
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 09:08:47 -08:00
hailin
484cc99636
fix(planting-service): 修复 identity-service 响应解析
...
identity-service 响应被 TransformInterceptor 包装为 { success, data }
需要从 response.data.data 获取实际用户信息
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 08:47:43 -08:00
hailin
48f4ed60a6
fix(planting-service): 修复 identity-service API 调用路径
...
添加 /api/v1 前缀以匹配 identity-service 的全局路由配置
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 08:39:45 -08:00
hailin
c907f44851
feat(planting-service): 订单表添加 accountSequence,实现合同恢复任务
...
变更内容:
1. 订单表添加 account_sequence 字段
- 创建订单时保存用户的 accountSequence
- 避免跨服务调用 identity-service 获取用户信息
2. 新增 ContractSigningRecoveryJob 定时任务
- 每 3 分钟扫描已支付但未创建合同的订单
- 使用订单中的 accountSequence 获取 KYC 信息
- 为已通过 KYC 的用户补创建合同签署任务
3. 修改 PlantingOrder 聚合根
- create() 方法增加 accountSequence 参数
- markAsPaid() 不再需要 accountSequence 参数
- 事件中携带 accountSequence
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 08:19:36 -08:00
hailin
1c3ddb0f9b
fix: 修复internal用户详情接口路由和KYC状态检查
...
问题1: /internal/users/:accountSequence/detail 返回404
原因: 路由顺序问题,通配路由在前拦截了请求
修复: 将 /detail 路由移到通配路由之前
问题2: planting-service 只接受 kycStatus='VERIFIED'
原因: identity-service 使用 REAL_NAME_VERIFIED 等状态
修复: 接受所有有效的KYC状态
同时:
- identity-service 返回 idCardNumber 用于合同签署
- planting-service 使用 idCardNumber
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 07:51:11 -08:00
hailin
8163804f23
fix(contract-signing): 修复合同签署流程的持仓更新时机
...
问题:支付后直接更新持仓和开启挖矿,导致款还在冻结中树就种下去了
修复:
- planting-application.service: 支付时不再更新持仓和开启挖矿
- contract-signing.service: signContract 在事务里同时完成合同+持仓+挖矿
- contract-signing.service: handleExpiredTasks 超时也更新持仓+挖矿(钱扣总部)
- KYCVerifiedEvent 添加 accountSequence 字段
- kyc-verified-event.consumer 直接用事件里的 accountSequence
流程变为:支付冻结 → 签署合同 → [事务: 合同+持仓+挖矿] → 发事件
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 06:50:03 -08:00
hailin
2e0df30473
fix(migration): 移除 DO $$ 块,Prisma 不支持 PL/pgSQL
...
Prisma migrate deploy 只支持简单 SQL 语句
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 05:55:42 -08:00
hailin
7ce71ad27b
fix(planting-service): 移除 Dockerfile 中的 db push 回退逻辑
...
db push 不使用迁移文件,会导致添加必填列时失败
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 05:47:46 -08:00
hailin
500e4381a6
fix(migration): 使迁移脚本幂等以支持重试
...
迁移脚本添加 IF NOT EXISTS 检查,避免重复执行时失败
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 05:39:38 -08:00
hailin
929ae335c5
feat(contract): 增强合同生成功能
...
- 添加 IdentityServiceClient 从 identity-service 获取用户 KYC 信息
- 只允许已完成实名认证的用户创建合同
- 添加 KycVerifiedEventConsumer 监听 KYC 完成事件
- 用户完成 KYC 后自动为其之前已支付的订单补创建合同
- PDF 生成器支持 AcroForm 表单字段填充(更可靠)
- 保留坐标定位方式作为后备方案
- 更新 PDF 模板为带表单字段版本
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 05:35:40 -08:00
hailin
0e93d2a343
feat(contract): 使用合同编号代替订单号
...
合同编号格式: accountSequence-yyyyMMddHHmm
例如: 10001-202512251003
修改内容:
- 数据库: 添加 contract_no 字段
- 后端: 聚合根、Repository、Service、PDF生成器支持 contractNo
- 前端: 显示合同编号代替订单号
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 04:58:39 -08:00
hailin
a7206eef2e
fix(planting-service): 修复 BigInt userId 比较问题
...
- 使用 toString() 比较 BigInt 避免类型不匹配
- 添加调试日志帮助排查问题
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 03:59:27 -08:00
hailin
2d9e1b2d03
fix(planting-service): 修复合同签署任务创建的并发问题
...
- 将 upsert 改为 create + 重试机制
- 处理 P2002 唯一约束冲突时使用指数退避重试
- 确保并发创建时能正确返回已存在的记录
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 03:50:19 -08:00
hailin
c657fb5a19
feat(planting-service): 实现合同签名和PDF云存储功能
...
- 添加 MinIO 存储服务,支持上传签名图片和已签署 PDF
- 添加 signedPdfUrl 字段到数据库模型
- 修改签署流程:生成 PDF、嵌入签名、上传到云存储
- 修复前端签署 API 响应处理
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 03:35:15 -08:00
hailin
cdd275479e
fix(planting-service): 使用楷体 STKAITI.ttf 替换无效字体
...
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 02:56:01 -08:00
hailin
65ba75d8d1
fix(planting-service): 修复 fontkit 导入方式
...
使用 require 替代 ES import 解决 TypeScript 编译后 default export 问题
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 02:44:37 -08:00
hailin
6536ff9256
fix(planting-service): Dockerfile 添加 templates 目录复制
...
PDF 模板和字体文件需要复制到 Docker 容器中
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 02:41:22 -08:00
hailin
c509daa353
feat(contract-signing): 使用 pdf-lib 实现专业 PDF 合同展示
...
后端改动:
- 添加 pdf-lib 和 @pdf-lib/fontkit 依赖
- 新建 PdfGeneratorService 使用 PDF 模板直接填充用户数据
- 添加中文字体支持 (NotoSansSC-Regular.ttf)
- 新增 GET /tasks/:orderNo/pdf 接口返回 PDF 文件
- 合同模板存放于 templates/contract-template.pdf
前端改动:
- 添加 flutter_pdfview 依赖
- 重写合同签署页面使用 PDFView 组件展示 PDF
- 下载 PDF 到临时目录后展示
- 滑动到最后一页自动标记已阅读
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 02:27:54 -08:00
hailin
e7f2d69def
fix(planting-service): 添加 P2002 错误捕获处理并发创建冲突
...
PostgreSQL 的 upsert 在高并发下仍可能出现唯一约束错误,
添加 try-catch 捕获 P2002 错误,发生冲突时直接查询返回已存在的记录。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 00:56:53 -08:00
hailin
68e269b602
fix(planting): 使用upsert解决合同签约任务创建的并发冲突
...
Kafka事件重复消费时,多个消费者同时创建签约任务会导致唯一约束冲突
改用upsert确保幂等性,如果orderNo已存在则返回现有记录
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 00:52:01 -08:00
hailin
94a5c29a09
fix(planting-service): Dockerfile复制tsconfig以支持ts-node seed
...
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 21:41:32 -08:00
hailin
8a0bff5010
fix(planting-service): Dockerfile添加自动seed步骤
...
启动时自动运行 prisma db seed 创建合同模板
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 21:29:46 -08:00
hailin
bc34907a84
fix(auth): 注册验证码页面显示完整手机号
...
验证码页面不再隐藏手机号中间数字,改为完整显示
格式: 138 1234 5678
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 21:03:30 -08:00
hailin
8b1db58318
fix(planting-service): 修复用户ID字段名与JwtAuthGuard一致
...
JwtAuthGuard 设置 req.user.id,controller 需要使用相同字段名
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 20:50:58 -08:00
hailin
aa9370dc56
fix(planting-service): 排除 prisma 目录修复编译输出路径
...
prisma/seed.ts 导致 TypeScript 编译时目录结构变化,
dist/main.js 变成 dist/src/main.js
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 20:39:19 -08:00
hailin
80a854e9d8
chore(planting-service): 更新 package-lock.json
...
添加 @nestjs/schedule 依赖的锁文件
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 20:25:31 -08:00
hailin
33a5b79c2a
fix(planting-service): 修复合同签署功能编译错误
...
- 修复 JwtAuthGuard 导入路径
- 添加 @nestjs/schedule 依赖
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 20:24:00 -08:00
hailin
714ce42e4f
feat(contract-signing): 添加电子合同签署功能及单点配置优化
...
- planting-service: 添加合同签署任务管理和超时检测
- 新增 ContractSigningTask 领域模型
- 添加 24 小时合同签署超时定时任务
- 支付后资金保持冻结,由 referral-service 统一确认扣款
- referral-service: 单点配置 CONTRACT_SIGNING_ENABLED
- 新增 ContractSigningHandler 处理合同签署/超时事件
- 新增 WalletServiceClient 调用钱包服务确认扣款
- planting.created 处理后根据配置决定是否等待合同签署
- reward-service: 移除 CONTRACT_SIGNING_ENABLED 配置
- 扣款确认由 referral-service 在发送事件前完成
- 保持奖励分配逻辑不变
配置说明:
- CONTRACT_SIGNING_ENABLED=true (默认): 等待合同签署后分配奖励
- CONTRACT_SIGNING_ENABLED=false: 立即分配奖励(原有流程)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 20:12:12 -08:00
hailin
943fd9efe9
chore: 提交所有未提交的修改
...
包括:
- admin-service: 系统配置功能
- authorization-service: 自助授权申请功能
- planting-service: 资金分配服务
- reward-service: 奖励计算服务
- admin-web: 用户管理和设置页面
- mobile-app: 授权、认证、路由等功能
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-19 06:09:43 -08:00
hailin
1cc27731d9
fix(planting): 移除个人最大认种数量限制
...
删除 MAX_TREES_PER_USER = 1000 的限制和 checkRiskControl 方法
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 01:10:03 -08:00
hailin
92772f071a
feat(ui): 优化待领取明细显示和移除认种数量限制
...
- 移除单次认种100棵的数量限制 (planting-service)
- 龙虎榜省市信息分两行显示
- 待领取明细改为堆叠卡片样式,节省屏幕空间
- 支持上下滑动选择卡片
- 滑动时有震动反馈
- 选中卡片展开显示完整信息
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-16 22:46:48 -08:00
hailin
09e66cef10
refactor: 多项UI优化和品牌更名
...
- 品牌更名: 将"榴莲女皇"全部替换为"榴莲皇后"(前端+后端共15处)
- 导航优化: 将"交易"Tab改名为"兑换"
- 创建钱包页: 添加返回按钮,可返回向导页第5页(仅账号未创建时显示)
- 兑换页面: 禁用"一键结算"和"卖出DST"按钮,提款按钮在余额为0时禁用
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 01:43:47 -08:00
hailin
d6055099c7
fix(planting): 支付完成后直接开启挖矿,跳过底池注入流程
...
- enableMining() 允许从 PAID 状态直接开启
- addPlanting() 树直接进入 effectiveTreeCount
- payOrder() 删除底池批次逻辑,直接调用 enableMining()
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 04:25:31 -08:00