feat: 金蝶锁单改1对1逐张调用并新增列表锁状态展示
This commit is contained in:
+13
-8
@@ -1,6 +1,6 @@
|
||||
# 金蝶单据锁定与解锁业务流程(lockBusiData 锁定 - unLockNotifyBusiData 回调 - 失败补偿 - 删单还原)
|
||||
|
||||
- 日期:2026-10-09
|
||||
- 日期:2026-10-09(2026-10-10 变更:lockBusiData 确认为 1对1 接口,不支持逗号拼接批量,锁定/补偿改为逐张调用)
|
||||
- 范围:正式结算单(应付 A102-2 / 应收 A302-2)、开票申请单(A303-1)推送金蝶成功后的单据锁定、金蝶解锁/删单回调、锁定失败定时补偿
|
||||
- 设计文档:`docs/superpowers/specs/2026-10-09-kingdee-bill-lock-unlock-design.md`
|
||||
- 锁记录表:`blade_kingdee_bill_lock`(一行 = 一张金蝶目标单)
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
- lockBusiData:WLTMS 调金蝶,源系统 WLTMS、目标系统 XH、lockAction=LOCK
|
||||
- unLockNotifyBusiData:金蝶调 WLTMS,源系统 XH、目标系统 WLTMS、lockAction=UNLOCK
|
||||
- 批量约定:多张单据编号英文逗号拼接(sourceBillNo 与 targetBillNo 顺序一一对应),同一源单的多张金蝶单合并一次调用
|
||||
- 传参约定:接口 1对1,单次仅一个源单号(sourceBillNo)对一个金蝶单号(targetBillNo);多张金蝶单(开票申请一张主单对 N 张金蝶单)逐张调用,单张成败互不影响,成败结果批量落库
|
||||
- 出入参同构,应答为 `{updateCount, updateResultList}` 裸结构(逐单 1-成功/0-失败)
|
||||
|
||||
## 二、主线流程
|
||||
@@ -28,9 +28,9 @@
|
||||
│ └─ 事务提交
|
||||
├─ 锁定(lockAfterPush):
|
||||
│ ├─ 每张金蝶目标单一行锁记录,先落 failed 占位(保证补偿扫表无遗漏)
|
||||
│ ├─ 同源单多张目标单合并一次调用:LOCK + SAVE,编号逗号拼接
|
||||
│ ├─ 应答 updateCount>0 → 全部翻 locked ──→ 单据冻结
|
||||
│ └─ 失败/超时 → 保持 failed,tryCount+1,失败原因落 fail_reason(主单同步状态不受影响)
|
||||
│ ├─ 接口1对1:逐张调用 LOCK + SAVE,单张成败互不影响
|
||||
│ ├─ 单张应答成功 → 该张翻 locked ──→ 单据冻结
|
||||
│ └─ 单张失败/超时 → 保持 failed,tryCount+1,失败原因落 fail_reason(主单同步状态不受影响)
|
||||
└─ 附件联带上传(A902,原有动作,后置不受影响)
|
||||
```
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
### 2. 金蝶侧解锁回调(金蝶 → WLTMS)
|
||||
|
||||
金蝶在星瀚侧对单据解锁或删单后,回调 `POST /kingdee-bfi/unLockNotifyBusiData`(`UNLOCK` + 逗号拼接批量):
|
||||
金蝶在星瀚侧对单据解锁或删单后,回调 `POST /kingdee-bfi/unLockNotifyBusiData`(`UNLOCK`;targetBillNo 兼容单张/逗号拼接):
|
||||
|
||||
```
|
||||
校验:sourceSystem=XH、targetSystem=WLTMS、lockAction=UNLOCK(否则应答失败)
|
||||
@@ -69,7 +69,7 @@
|
||||
```
|
||||
KingdeeBillLockRetryTask(thirdParty.bfi.billLock.retryEnabled,默认每5分钟)
|
||||
└─ 扫 lock_status=failed 且 try_count<5 的锁记录
|
||||
├─ 按源单分组,组内合并一次 lockBusiData 重锁
|
||||
├─ 接口1对1:逐张重调 lockBusiData,单张成败互不影响;成败结果批量落库
|
||||
├─ 成功 → 翻 locked,进入正常锁定态
|
||||
└─ 失败 → try_count+1,超过 5 次停试,留 fail_reason 待人工排查
|
||||
```
|
||||
@@ -103,9 +103,13 @@ failed(锁定失败,待补偿)→ locked(金蝶锁定中)→ unlocked
|
||||
|
||||
1. **先占位再锁**:锁记录落库先于远程调用,补偿任务扫 `failed` 就是完整的待重试集合,不漏单
|
||||
2. **锁失败不回滚推送**:金蝶单已生成,本地回滚只会制造断链;代价是短暂"已推未锁"窗口,由补偿任务闭合
|
||||
3. **批量同成败**:接口应答只有聚合 updateCount,无逐单成败,整批一起翻状态,最简且不错账
|
||||
3. **1对1逐张锁**:lockBusiData 单次仅支持一个源单号对一个金蝶单号,逐张调用互不连坐;成败结果 updateBatchById 批量落库,避免逐张 update
|
||||
4. **回调幂等**:按 targetBillType+targetBillNo 找最新 locked 记录,找不到/已 unlocked 直接跳过应答成功,防金蝶重试风暴
|
||||
5. **DELETE 还原口径**:作废源单 + 清金蝶同步信息 + 关联状态刷新;作废是终态,重推需新单重走流程(口径待业务联调确认)
|
||||
6. **前端锁状态展示**(2026-10-10 新增):结算单/开票申请列表与详情 VO 填充 `kingdeeLockStatus`/`kingdeeLockFailReason`/`kingdeeTryCount`
|
||||
(后端 `mapActiveLocks` 每页一次批量查锁表,无 N+1;unlocked 终态不返回即 null=无锁/已解锁)。
|
||||
前端渲染:`locked` 红 tag「金蝶锁定中」并禁用编辑/作废(后端守卫是权威);`failed` 且 `tryCount<5` 橙 tag「锁定失败·补偿中」tooltip 显示原因;
|
||||
`failed` 且 `tryCount≥5` 红 tag「锁定失败·已达重试上限」提示重推同步金蝶;null 不显示
|
||||
|
||||
## 五、代码落点速查
|
||||
|
||||
@@ -113,6 +117,7 @@ failed(锁定失败,待补偿)→ locked(金蝶锁定中)→ unlocked
|
||||
| --- | --- |
|
||||
| 锁单 Feign/DTO/应答 VO | `blade-bfi-api`:`BfiBillLockDTO`、`BfiBillLockResultVO`、`IBfiClient.lockBusiData`、`IBfiService.lockBusiData` |
|
||||
| 锁类型常量与映射 | `transport/constant/KingdeeLockConstant` |
|
||||
| 锁状态展示填充 | `IKingdeeBillLockService.mapActiveLocks`(批量查活跃锁)+ `FormalSettlementServiceImpl/InvoiceApplicationServiceImpl.fillKingdeeLockStatus`(列表/详情填充)+ 两个 VO 的 `kingdeeLockStatus/kingdeeLockFailReason/kingdeeTryCount` 字段 |
|
||||
| 锁记录实体/服务 | `KingdeeBillLock`、`IKingdeeBillLockService` + `KingdeeBillLockServiceImpl` |
|
||||
| 回调端点 | `KingdeeBfiPublicController`:`POST /kingdee-bfi/unLockNotifyBusiData`(PERMIT_ALL + TenantIgnore) |
|
||||
| 补偿定时任务 | `KingdeeBillLockRetryTask`(`thirdParty.bfi.billLock.retryEnabled`,默认每5分钟) |
|
||||
|
||||
Reference in New Issue
Block a user