hailin
|
4c6fd424b5
|
feat(pre-planting): 合成树后算力切换(预种 5 份合同签署触发)
当用户购买满5份预种后合成1棵树并签署合同时,自动执行算力切换:
1. 作废5份份额的算力记录(is_expired=true,remark 标注合成原因,已挖积分不受影响)
2. 从认种人账户扣减旧个人算力(保持账户余额准确)
3. 以1棵完整树的算力单价创建新算力记录(remark 标注来源订单)
4. 写入 pre_planting_synced_merges 幂等标记
== 实现方式 ==
- 触发节点:Debezium CDC on pre_planting_merges.mining_enabled_at(null → 非null)
- 新增 Debezium table:public.pre_planting_merges
- 新增 Kafka topic 订阅:cdc.pre-planting.public.pre_planting_merges
- 新增 handler:PrePlantingMergeSyncedHandler(解析 CDC 事件)
- 新增 service 方法:swapContributionForMerge(核心算力切换逻辑)
- 新增常量:PRE_PLANTING_MERGE_SOURCE_ID_OFFSET = 20B(区别于份额的 10B 偏移)
- 新增 DB 表:pre_planting_synced_merges(幂等标记,migration 已包含)
== 幂等保证 ==
- CDC 层:processedCdcEvent 表(sourceTopic + offset 唯一)
- 业务层:contribution_records WHERE sourceAdoptionId=20B+mergeId 存在性检查
- 标记层:pre_planting_synced_merges(best-effort,事务提交后写入)
== 对现有系统的影响 ==
- 零修改现有 contribution 调度器 / freeze scheduler
- 团队分润账户净效果≈0(旧5份=1棵树,切换后金额一致)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-02-28 07:22:09 -08:00 |
hailin
|
390e5ccb19
|
fix(pre-planting): 用 orderNo 替代 BigInt 自增 ID 作为 CDC 关联键
问题:Debezium CDC 事件中 Prisma @map("order_id") 字段以 DB 列名
order_id 发送,而代码访问 data.id 导致 undefined → BigInt 转换失败。
修复方案(遵循"用 orderNo 业务键关联"原则):
- pre-planting-order-synced.handler.ts:
* PrePlantingOrderSyncResult 改为 { orderNo: string }
* handleCreateOrSnapshot/handleUpdate 均用 order_no 字段
* syncToTrackingTable upsert where 改为 { orderNo }
* ensureAdoptionMarker 入参从 orderId bigint 改为 orderNo string
- markerAdoptionId = PRE_PLANTING_SOURCE_ID_OFFSET + hash(orderNo)
* isAlreadyDistributed 改为 findUnique({ where: { orderNo } })
* calculateAfterCommit 传 result.orderNo
- pre-planting-contribution.service.ts:
* calculateForPrePlantingOrder 入参从 bigint 改为 string(orderNo)
* findUnique({ where: { orderNo } }) 查询,用存储的 originalOrderId 计算偏移
* 所有日志/update 中 originalOrderId 替换为 orderNo
* processUndistributedOrders 改为传 order.orderNo,orderBy 改为 createdAt
- schema.prisma:orderNo 字段新增 @unique 约束
- migration SQL:CREATE UNIQUE INDEX on order_no 列
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-02-28 02:31:04 -08:00 |
hailin
|
a11e4d0261
|
fix(pre-planting): 修复 5 个预种模块 Bug + 补全 3 服务 migration
Bug #1 (HIGH): allocateFunds 从 Prisma 事务内移到事务外
- pre-planting-reward.service.ts: distributeRewards 拆为
prepareAndPersistRewards(事务内持久化)+ executeAllocations(事务后转账)
- pre-planting-application.service.ts: 事务后调用 executeAllocations
Bug #2 (HIGH): signContract 后触发 hasPlanted
- 签约事务成功后发布 PlantingOrderPaid 到 planting-events topic
- wallet-service 消费后执行 markUserAsPlanted + settleUserPendingRewards
- event-publisher.service.ts: 新增 publishRawToPlantingEvents 方法
Bug #3 (MEDIUM): PENDING 推荐奖励改为全部 SETTLED
- 与现有认种行为对齐,推荐奖励立即发放
Bug #4 (HIGH): 补全 3 个服务的数据库迁移文件
- planting-service: 4 张预种表(orders/positions/merges/reward_entries)
- admin-service: 1 张配置表(pre_planting_configs)+ 默认数据
- contribution-service: 4 张 CDC 追踪表(synced_orders/positions/freeze_states/processed_cdc_events)
Bug #5 (LOW): 合并循环 if→while,支持一次购买多份触发多次合并
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
2026-02-23 18:09:14 -08:00 |