From 51114f265db68f3c871f0c2407b70c289afda8b9 Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 8 Jan 2026 11:42:16 -0800 Subject: [PATCH] =?UTF-8?q?fix(planting-service):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=90=88=E5=90=8CPDF=E7=AD=BE=E7=BD=B2=E6=97=A5=E6=9C=9F?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=BAUTC=E6=97=B6=E9=97=B4=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 合同生成时使用 new Date().toISOString().split('T')[0] 获取日期, 该方法返回UTC时间,导致北京时间凌晨签署的合同显示为前一天日期。 修复方案:新增 getBeijingDateString() 函数,将UTC时间转换为北京时间(UTC+8) 影响范围:仅影响PDF合同上显示的签署日期,不影响数据库时间戳或业务逻辑 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .claude/settings.local.json | 3 ++- .../controllers/contract-signing.controller.ts | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index ffca055f..a9fc560e 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -659,7 +659,8 @@ "Bash(DATABASE_URL=\"postgresql://test:test@localhost:5432/test\" npx prisma validate:*)", "Bash(DATABASE_URL=\"postgresql://test:test@localhost:5432/test\" npx prisma format:*)", "Bash(timeout 60 npx tsc:*)", - "Bash(git commit -m \"$\\(cat <<''EOF''\nfeat\\(wallet-service\\): 三层保护机制确保内部转账接收方钱包存在\n\n新增三层保护机制:\n1. 用户注册时:监听 identity.UserAccountCreated 事件自动创建钱包\n2. 发起转账时:检测内部转账后调用 ensureWalletExists\\(\\) 预创建钱包\n3. 链上确认时:原有 upsert 逻辑兜底(保持不变)\n\n新增文件:\n- identity-event-consumer.service.ts: 消费 identity 用户注册事件\n- user-account-created.handler.ts: 处理用户注册事件创建钱包\n\n新增 API:\n- POST /wallets/ensure-wallet: 确保单个钱包存在\n- POST /wallets/ensure-wallets: 批量确保钱包存在\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\\(wallet-service\\): 三层保护机制确保内部转账接收方钱包存在\n\n新增三层保护机制:\n1. 用户注册时:监听 identity.UserAccountCreated 事件自动创建钱包\n2. 发起转账时:检测内部转账后调用 ensureWalletExists\\(\\) 预创建钱包\n3. 链上确认时:原有 upsert 逻辑兜底(保持不变)\n\n新增文件:\n- identity-event-consumer.service.ts: 消费 identity 用户注册事件\n- user-account-created.handler.ts: 处理用户注册事件创建钱包\n\n新增 API:\n- POST /wallets/ensure-wallet: 确保单个钱包存在\n- POST /wallets/ensure-wallets: 批量确保钱包存在\n\n🤖 Generated with [Claude Code]\\(https://claude.com/claude-code\\)\n\nCo-Authored-By: Claude Opus 4.5 \nEOF\n\\)\")", + "Bash(git -C \"c:/Users/dong/Desktop/rwadurian\" add -A)" ], "deny": [], "ask": [] diff --git a/backend/services/planting-service/src/api/controllers/contract-signing.controller.ts b/backend/services/planting-service/src/api/controllers/contract-signing.controller.ts index 8b9cd0d1..326cb861 100644 --- a/backend/services/planting-service/src/api/controllers/contract-signing.controller.ts +++ b/backend/services/planting-service/src/api/controllers/contract-signing.controller.ts @@ -20,6 +20,17 @@ import { PdfGeneratorService } from '../../infrastructure/pdf/pdf-generator.serv import { MinioStorageService } from '../../infrastructure/storage/minio-storage.service'; import * as crypto from 'crypto'; +/** + * 获取北京时间的日期字符串 (YYYY-MM-DD) + * 用于合同签署日期显示 + */ +function getBeijingDateString(): string { + const now = new Date(); + // 北京时间 = UTC + 8小时 + const beijingTime = new Date(now.getTime() + 8 * 60 * 60 * 1000); + return beijingTime.toISOString().split('T')[0]; +} + /** * 签名轨迹点 */ @@ -277,7 +288,7 @@ export class ContractSigningController { } // 5. 生成带签名的 PDF(在同一个实例上完成填充和签名) - const signingDate = new Date().toISOString().split('T')[0]; + const signingDate = getBeijingDateString(); const pdfBuffer = await this.pdfGeneratorService.generateSignedContractPdf( { contractNo: task.contractNo, @@ -371,7 +382,7 @@ export class ContractSigningController { } // 5. 生成带签名的 PDF(在同一个实例上完成填充和签名) - const signingDate = new Date().toISOString().split('T')[0]; + const signingDate = getBeijingDateString(); const pdfBuffer = await this.pdfGeneratorService.generateSignedContractPdf( { contractNo: task.contractNo, @@ -510,7 +521,7 @@ export class ContractSigningController { userPhoneNumber?: string; treeCount: number; }): Promise { - const signingDate = new Date().toISOString().split('T')[0]; + const signingDate = getBeijingDateString(); return this.pdfGeneratorService.generateContractPdf({ contractNo: task.contractNo, userRealName: task.userRealName || '未认证',