From f3699c9cf04d9be4a63acd7b80a224f3473a5153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Fri, 23 Oct 2026 15:57:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=90=88=E5=90=8C=E7=89=B9=E6=89=B9?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=9B=9E=E4=BC=A0=E6=94=B9=E6=8C=89=E5=90=88?= =?UTF-8?q?=E8=A7=84=E5=90=88=E5=90=8CID=EF=BC=88hcs=5Ffd=5Fid=EF=BC=89?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E5=90=88=E5=90=8C=E5=B9=B6=E8=81=94=E5=8A=A8?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsSyncController.java | 8 +- .../hcs/HcsContractSpecSyncSupport.java | 91 +++++++------------ .../hcs/dto/HcsLegalResultDTO.java | 6 +- 3 files changed, 41 insertions(+), 64 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 2b35b54c..e192d772 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -292,13 +292,13 @@ public class HcsSyncController { *
* 免登免授权:blade.secure skip-url + auth permitAll 放行(doc/nacos/blade.yaml);
* iPaaS 网关注册映射:/gwzh/HTHG/contractLegal/result → /hcs/contractLegal/result;
- * 报文 {sourceSystem, requestId=TMS合同ID, status=APPROVED/REJECTED, reason},
- * approved 恢复流程展示,rejected 联动合同审批驳回。
+ * 报文 {sourceSystem, requestId=合规合同ID(hcs_fd_id), id, status=APPROVED/REJECTED, reason},
+ * 按 requestId=hcs_fd_id 定位合同,approved 恢复流程展示,rejected 联动合同审批驳回。
*/
@PostMapping("/contractLegal/result")
@ApiOperationSupport(order = 15)
- @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批(金蝶同步)结果,按合同编号定位并联动特批状态,原文留痕")
- public R
- * 结果推送报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=},原文留痕 blade_hcs_check_log。
+ * 结果推送报文 {sourceSystem, requestId=合规合同ID, id, status=APPROVED/REJECTED, reason},原文留痕 blade_hcs_check_log。
*
* @author Chill
*/
@@ -167,79 +163,56 @@ public class HcsContractSpecSyncSupport {
}
/**
- * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-13 按合规方最新字段表修正报文结构):
- * 特批完成后合规侧同步金蝶并回调,报文 {contractType, contractCode, requestId, success, reason, kingdeeId, sourceSystem=};
- * sourceSystem 须为 (不符抛"来源系统标识错误"异常);contractCode=TMS 合同编号定位(requestId 仅请求头回显不可定位);
- * success=true 联动恢复"审批通过"(金蝶合同ID回填 kingdee_id);success=false 联动合同审批驳回走重新提交闭环(reason 随原文留痕)
+ * 合同特批结果接收处理(合规 contractLegal/result 推送,2026-10-23 按联调实际报文修正):
+ * 报文 {sourceSystem, requestId=合规合同ID, id, status=APPROVED/REJECTED, reason};
+ * sourceSystem 须与 third-party.hcs.src-system 一致(不符抛"来源系统标识错误"异常);
+ * requestId 即合规合同ID(与 id 同值),按 blade_contract_manage.hcs_fd_id 定位合同;
+ * approved 联动恢复"审批通过",rejected 联动合同审批驳回走重新提交闭环(reason 随原文留痕)
*
* @param param 合规推送报文
* @return 处理结果描述
*/
- public String handleLegalResult(HcsContractLegalResultDTO param) {
- // 来源系统校验:仅接受合规方约定的 ,防伪造回传
+ public String handleLegalResult(HcsLegalResultDTO param) {
+ // 来源系统校验:仅接受合规方约定的来源标识,防伪造回传
if (!StrUtil.equalsIgnoreCase(param == null ? null : param.getSourceSystem(), hcsProperties.getSrcSystem())) {
log.warn("合同特批结果推送来源系统标识错误:sourceSystem={}", param == null ? null : param.getSourceSystem());
throw new ServiceException("来源系统标识错误");
}
String raw = JSONUtil.toJsonStr(param);
- ContractManage contractManage = locateContractByNo(param.getContractCode());
+ String requestId = param.getRequestId();
+ ContractManage contractManage = locateContractByFdId(requestId);
if (contractManage == null) {
- log.warn("合同特批结果推送未定位到合同:contractCode={},报文已留痕", param.getContractCode());
+ log.warn("合同特批结果推送未定位到合同:requestId={},报文已留痕", requestId);
writeCallbackLog(null, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送未定位到合同:" + raw);
- return "已留痕:未定位到合同(contractCode=" + param.getContractCode() + ")";
+ return "已留痕:未定位到合同(requestId=" + requestId + ")";
}
- if (param.getSuccess() == null) {
- log.warn("合同特批结果推送 success 字段缺失:contractNo={},报文已留痕", contractManage.getContractNo());
- writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送 success 字段缺失:" + raw);
- return "已留痕:success 字段缺失(contractNo=" + contractManage.getContractNo() + ")";
+ String normalizedStatus = param.getStatus() == null ? "" : param.getStatus().trim();
+ if (!HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus)
+ && !HcsSyncConstant.LEGAL_RESULT_REJECTED.equalsIgnoreCase(normalizedStatus)) {
+ log.warn("合同特批结果推送状态未识别:contractNo={},status={},报文已留痕", contractManage.getContractNo(), param.getStatus());
+ writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, "合同特批结果推送状态未识别:" + raw);
+ return "已留痕:状态字段未识别(contractNo=" + contractManage.getContractNo() + ")";
}
- boolean success = param.getSuccess();
- // 成功:特批完成且金蝶同步成功,恢复"审批通过";金蝶合同ID回填 kingdee_id 留痕保存
- if (success) {
- syncContractOnSpecResult(contractManage, true);
- contractManage.setKingdeeId(param.getKingdeeId());
- appendKingdeeResultRecord(contractManage, "金蝶同步成功:金蝶合同ID=" + param.getKingdeeId());
- markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_APPROVED,
- "合同特批结果推送:金蝶同步成功,kingdeeId=" + param.getKingdeeId());
- writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_PASS, "合同特批结果推送:" + raw);
- log.info("合同特批结果推送处理完成:contractNo={},结果=approved,kingdeeId={}", contractManage.getContractNo(), param.getKingdeeId());
- return "特批结果已处理:approved";
- }
- // 失败:特批流程已完成但金蝶同步失败,联动合同审批驳回,走重新编辑→提交→审批→重新特批闭环(失败单独重试机制待联调确认)
- syncContractOnSpecResult(contractManage, false);
- appendKingdeeResultRecord(contractManage, "金蝶同步失败:" + param.getReason());
- markSpec(contractManage, HcsSyncConstant.SPEC_STATUS_REJECTED, "合同特批结果推送:金蝶同步失败:" + param.getReason());
- writeCallbackLog(contractManage, HcsSyncConstant.CHECK_RESULT_FAIL, "合同特批结果推送:" + raw);
- log.info("合同特批结果推送处理完成:contractNo={},结果=rejected,reason={}", contractManage.getContractNo(), param.getReason());
- return "特批结果已处理:rejected";
+ boolean approved = HcsSyncConstant.LEGAL_RESULT_APPROVED.equalsIgnoreCase(normalizedStatus);
+ // 特批结果联动合同审批状态(通过恢复展示,驳回联动审批驳回),随 markSpec 一并落库
+ syncContractOnSpecResult(contractManage, approved);
+ markSpec(contractManage, approved ? HcsSyncConstant.SPEC_STATUS_APPROVED : HcsSyncConstant.SPEC_STATUS_REJECTED,
+ "合同特批结果推送:" + normalizedStatus + (StringUtil.isBlank(param.getReason()) ? "" : ",reason=" + param.getReason()));
+ writeCallbackLog(contractManage, approved ? HcsSyncConstant.CHECK_RESULT_PASS : HcsSyncConstant.CHECK_RESULT_FAIL,
+ "合同特批结果推送:" + raw);
+ log.info("合同特批结果推送处理完成:contractNo={},结果={},reason={}", contractManage.getContractNo(), normalizedStatus, param.getReason());
+ return "特批结果已处理:" + (approved ? "approved" : "rejected");
}
/**
- * 金蝶同步结果回填变更记录(changeRecordJson 追加一条;系统回调无登录用户,操作人记来源标识)
+ * 按合规合同ID定位合同(合规推送 requestId/id,即 blade_contract_manage.hcs_fd_id)
*/
- private void appendKingdeeResultRecord(ContractManage contractManage, String changeContent) {
- List