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 contractLegalResult(@RequestBody(required = false) HcsContractLegalResultDTO param) { + @Operation(summary = "合同特批结果回传接收", description = "合规系统推送合同特批结果,按合规合同ID(hcs_fd_id=requestId)定位并联动特批状态,原文留痕") + public R contractLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) { return R.data(hcsContractSpecSyncSupport.handleLegalResult(param)); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java index 9c99fbfc..7a25effe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSpecSyncSupport.java @@ -35,7 +35,7 @@ import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsContractDetailQueryDTO; import org.springblade.hcs.dto.HcsContractDetailVO; -import org.springblade.hcs.dto.HcsContractLegalResultDTO; +import org.springblade.hcs.dto.HcsLegalResultDTO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.feign.IHcsClient; import org.springblade.transport.constant.HcsSyncConstant; @@ -45,13 +45,9 @@ import org.springblade.transport.pojo.entity.ContractManage; import org.springblade.transport.pojo.entity.HcsContractCheckLog; import org.springframework.stereotype.Component; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; /** * HCS 合同特批同步支撑组件(合规特批结果接收:contractLegal/result 推送 + C103-4 定时查询兜底 + 人工确认)。 @@ -61,7 +57,7 @@ import java.util.Map; * 集团审批结果经合规 contractLegal/result 接口推送 TMS(替代未建设的 D103),或定时 C103-4 查询兜底联动 → * approved 恢复流程,rejected 联动合同审批驳回。 *

- * 结果推送报文 {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 records = StringUtil.isBlank(contractManage.getChangeRecordJson()) - ? new ArrayList<>() : new ArrayList<>(JSONUtil.toList(contractManage.getChangeRecordJson(), Object.class)); - Map record = new LinkedHashMap<>(); - record.put("changeDate", LocalDate.now().toString()); - record.put("handlerUserName", "合规系统回调"); - record.put("changeType", "金蝶同步结果"); - record.put("changeContent", changeContent); - record.put("status", contractManage.getApprovalStatus()); - record.put("statusName", HcsSyncConstant.approvalStatusName(contractManage.getApprovalStatus())); - records.add(record); - contractManage.setChangeRecordJson(JSONUtil.toJsonStr(records)); - } - - /** - * 按 ERP 合同编号定位合同(合规推送 contractCode,合同编号唯一) - */ - private ContractManage locateContractByNo(String contractCode) { - if (StringUtil.isBlank(contractCode)) { + private ContractManage locateContractByFdId(String requestId) { + if (StringUtil.isBlank(requestId)) { return null; } return contractManageMapper.selectOne(Wrappers.lambdaQuery() - .eq(ContractManage::getContractNo, contractCode.trim()) + .eq(ContractManage::getHcsFdId, requestId.trim()) .last("limit 1")); } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java index eb0604a2..b74880d9 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsLegalResultDTO.java @@ -51,9 +51,13 @@ public class HcsLegalResultDTO implements Serializable { */ private String sourceSystem; /** - * 业务单据ID(合同特批=TMS 合同ID,付款特批=TMS 付款申请ID) + * 定位单据ID(付款特批=TMS 付款申请ID;合同特批=合规合同ID,与 id 同值,按 blade_contract_manage.hcs_fd_id 匹配) */ private String requestId; + /** + * 合规侧单据ID(合同特批回传携带,与 requestId 同值=合规合同ID;付款特批回传不传,忽略) + */ + private String id; /** * 审批结果:APPROVED 通过 / REJECTED 驳回 */