From 68e269b602009e041a95914f182d27a7d6915f9d Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 25 Dec 2025 00:52:01 -0800 Subject: [PATCH] =?UTF-8?q?fix(planting):=20=E4=BD=BF=E7=94=A8upsert?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=90=88=E5=90=8C=E7=AD=BE=E7=BA=A6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=9B=E5=BB=BA=E7=9A=84=E5=B9=B6=E5=8F=91=E5=86=B2?= =?UTF-8?q?=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kafka事件重复消费时,多个消费者同时创建签约任务会导致唯一约束冲突 改用upsert确保幂等性,如果orderNo已存在则返回现有记录 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../contract-signing-task.repository.impl.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/services/planting-service/src/infrastructure/persistence/repositories/contract-signing-task.repository.impl.ts b/backend/services/planting-service/src/infrastructure/persistence/repositories/contract-signing-task.repository.impl.ts index bc092cee..ca138357 100644 --- a/backend/services/planting-service/src/infrastructure/persistence/repositories/contract-signing-task.repository.impl.ts +++ b/backend/services/planting-service/src/infrastructure/persistence/repositories/contract-signing-task.repository.impl.ts @@ -41,9 +41,11 @@ export class ContractSigningTaskRepositoryImpl implements IContractSigningTaskRe }); return this.mapToDomain(updated); } else { - // 创建 - const created = await this.prisma.contractSigningTask.create({ - data: { + // 创建 - 使用 upsert 处理并发幂等性 + // 如果 orderNo 已存在,则只返回现有记录(不更新) + const result = await this.prisma.contractSigningTask.upsert({ + where: { orderNo: task.orderNo }, + create: { orderNo: task.orderNo, userId: task.userId, accountSequence: task.accountSequence, @@ -62,8 +64,10 @@ export class ContractSigningTaskRepositoryImpl implements IContractSigningTaskRe status: task.status, expiresAt: task.expiresAt, }, + // 如果已存在,不更新任何字段,只返回现有记录 + update: {}, }); - return this.mapToDomain(created); + return this.mapToDomain(result); } }