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 ef580dba..ec573299 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 @@ -242,7 +242,7 @@ public class HcsSyncController { return ref; }) .toList(); - return R.data(hcsContractSpecSyncSupport.applySpec(contractId, attachments, AuthUtil.getUserAccount())); + return R.data(hcsContractSpecSyncSupport.applySpec(contractId, attachments)); } /** 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 63933d32..820df7fb 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 @@ -88,17 +88,16 @@ public class HcsContractSpecSyncSupport { * * @param contractId 合同ID * @param attachments 特批附件引用(fdId=C103-2 合规附件ID,fdFileName=文件名) - * @param loginName 当前操作人登录名 * @return 结果描述 */ - public String applySpec(Long contractId, List attachments, String loginName) { + public String applySpec(Long contractId, List attachments) { ContractManage contractManage = requireAppliableContract(contractId); if (attachments == null || attachments.isEmpty()) { throw new ServiceException("请先上传特批申请材料(含内部审批流程附件)"); } HcsSpecContractSaveDTO param = new HcsSpecContractSaveDTO(); - // 【必填】操作人登录名:当前登录人(§9-U2) - param.setFdLoginName(loginName); + // 【必填】操作人登录名:配置 thirdParty.hcs.operator-login-name(默认 srvadmin,§9-U2) + param.setFdLoginName(hcsProperties.getOperatorLoginName()); // 【必填】合规合同ID:blade_contract_manage.hcs_fd_id(非名称,照 C106-3 fd_contract_name 惯例) param.setFdContractId(requireContractFdId(contractManage)); // 【必填】合同编号 diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java index 089bd915..262e547e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsExeStageSyncSupport.java @@ -36,8 +36,6 @@ import org.springblade.hcs.dto.HcsExeplanVO; import org.springblade.hcs.dto.HcsResult; import org.springblade.hcs.exception.HcsException; import org.springblade.hcs.feign.IHcsClient; -import org.springblade.system.cache.UserCache; -import org.springblade.system.pojo.entity.User; import org.springblade.transport.constant.HcsSyncConstant; import org.springblade.transport.mapper.ContractManageMapper; import org.springblade.transport.mapper.HcsContractExeStageMapper; @@ -116,8 +114,8 @@ public class HcsExeStageSyncSupport { param.setFdContractId(contractManage.getHcsFdId()); // 【必填】外部系统标识:fd_sources,配置 thirdParty.hcs.src-system(D14) param.setFdOuterSystem(hcsProperties.getSrcSystem()); - // 【必填】操作人登录名:合同承办人登录名(§9-U2) - param.setFdLoginName(requireLoginName(contractManage)); + // 【必填】操作人登录名:配置 thirdParty.hcs.operator-login-name(默认 srvadmin,§9-U2) + param.setFdLoginName(hcsProperties.getOperatorLoginName()); // 【必填】计划整体操作类型:首次同步 add,已同步过(有履约计划ID)update param.setFdEopExeplanOperateType(StringUtil.isBlank(contractManage.getHcsExeplanId()) ? "add" : "update"); // 履约计划ID:已同步过则传(回填自首次同步返回) @@ -248,20 +246,6 @@ public class HcsExeStageSyncSupport { } } - /** - * 合同承办人登录名(fdLoginName 必填) - */ - private String requireLoginName(ContractManage contractManage) { - if (contractManage.getHandlerUserId() == null) { - throw new HcsException("C103-9 履约规则同步失败,合同承办人未维护(contractNo=" + contractManage.getContractNo() + ")"); - } - User user = UserCache.getUser(contractManage.getHandlerUserId()); - if (user == null || StringUtil.isBlank(user.getAccount())) { - throw new HcsException("C103-9 履约规则同步失败,承办人登录名解析不到(§9-U2)"); - } - return user.getAccount(); - } - /** * LocalDateTime → 毫秒时间戳 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java index 1b5aeaf6..516e90cc 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsPaymentSyncSupport.java @@ -196,7 +196,7 @@ public class HcsPaymentSyncSupport { payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); payment.setHcsRetryCount(0); payment.setHcsSyncTime(LocalDateTime.now()); - payment.setHcsSyncMsg(message); + payment.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); paymentApplicationMapper.updateById(payment); log.info("HCS付款申请推送成功:paymentNo={},{}", payment.getPaymentNo(), message); } @@ -208,7 +208,7 @@ public class HcsPaymentSyncSupport { payment.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); payment.setHcsRetryCount(payment.getHcsRetryCount() == null ? 1 : payment.getHcsRetryCount() + 1); payment.setHcsSyncTime(LocalDateTime.now()); - payment.setHcsSyncMsg(message); + payment.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); paymentApplicationMapper.updateById(payment); log.error("HCS付款申请推送失败:paymentNo={},retryCount={},{}", payment.getPaymentNo(), payment.getHcsRetryCount(), message); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java index 103d138b..6a645871 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsProjectSyncSupport.java @@ -271,7 +271,7 @@ public class HcsProjectSyncSupport { projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_SYNCED); projectApply.setHcsRetryCount(0); projectApply.setHcsSyncTime(LocalDateTime.now()); - projectApply.setHcsSyncMsg(message); + projectApply.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); projectApplyMapper.updateById(projectApply); log.info("HCS项目立项推送成功:projectCode={},fdId={},{}", projectApply.getProjectCode(), fdId, message); } @@ -283,7 +283,7 @@ public class HcsProjectSyncSupport { projectApply.setHcsSyncStatus(HcsSyncConstant.HCS_STATUS_FAILED); projectApply.setHcsRetryCount(projectApply.getHcsRetryCount() == null ? 1 : projectApply.getHcsRetryCount() + 1); projectApply.setHcsSyncTime(LocalDateTime.now()); - projectApply.setHcsSyncMsg(message); + projectApply.setHcsSyncMsg(HcsSyncConstant.truncateMsg(message)); projectApplyMapper.updateById(projectApply); log.error("HCS项目立项推送失败:projectCode={},retryCount={},{}", projectApply.getProjectCode(), projectApply.getHcsRetryCount(), message); } @@ -300,10 +300,9 @@ public class HcsProjectSyncSupport { } /** - * 项目经办人登录名(curUser 必填) + * 操作人登录名(curUser/fd_head/fd_taker/fd_creator 统一取配置,§9-U2) */ private String requireLoginName(ProjectApply projectApply, String scene) { - // TODO 测试线联调:登录名固定取 srvadmin,联调通过后恢复经办人解析与校验 return resolveLoginName(projectApply.getHandlerUserId()); } @@ -316,16 +315,10 @@ public class HcsProjectSyncSupport { } /** - * 按用户ID 解析登录名(UserCache 惯例) + * 操作人登录名(thirdParty.hcs.operator-login-name,默认 srvadmin) */ private String resolveLoginName(Long userId) { - // TODO 测试线联调:登录名固定取 srvadmin(curUser/fd_head/fd_taker/fd_creator 统一生效),联调通过后恢复按 UserCache 解析 - return "srvadmin"; - /*if (userId == null) { - return null; - } - User user = UserCache.getUser(userId); - return user == null ? null : user.getAccount();*/ + return hcsProperties.getOperatorLoginName(); } /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java index 72a3876b..8230051c 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/config/HcsProperties.java @@ -61,6 +61,21 @@ public class HcsProperties { * 来源系统标识(fd_sources,D14 约定值 TMS) */ private String srcSystem = "WLTMS"; + /** + * 操作人登录名(fdLoginName / curUser.fdLoginName,全部合同接口共用,§9-U2) + */ + private String operatorLoginName = "srvadmin"; + /** + * Mock 开关(thirdParty.hcs.mockEnabled):true 时 IHcsClient 切换为本地 JSON 桩 + * ({mockDir}/{方法名}.json,见 {@link org.springblade.hcs.mock.HcsClientMock}), + * 供联调前本地自测;生产环境必须为 false + */ + private boolean mockEnabled = false; + /** + * Mock 桩文件目录(与 mockEnabled 配套):存放各接口出参桩 {方法名}.json(源自 HCS 接口文档出参示例), + * 每次调用现读,改文件即生效;默认本机开发目录,其他环境经 Nacos 按需覆盖 + */ + private String mockDir = "F:/home/tms/mock/hcs"; /** * 创建单位 fdId(HCS 组织主数据固定值,fd_creator_unit 等组织引用,各合同接口共用) */ @@ -161,10 +176,6 @@ public class HcsProperties { * TMS 合同类别 -> HCS 模板ID(fdTemplateId,§9-U7 待合规方提供模板清单) */ private Map templateMapping = new HashMap<>(); - /** - * TMS 结算方式 -> 付款|收款(fdSettlementType,§9-U3 字典映射待联调) - */ - private Map settlementTypeMapping = new HashMap<>(); /** * TMS 审核状态 -> HCS 合同状态(xformFields CONTRACT_STATUS 必填,draft/approving/approved 等,§9-U3 待联调后配置) */ diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java index 6b841977..93c87dff 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsContractDetailVO.java @@ -301,7 +301,7 @@ public class HcsContractDetailVO implements Serializable { */ private Boolean fdSepcailContract; /** - * 合同结算模式:open=开口合同; close=闭口合同 + * 合同结算模式:open=开口合同; close=闭口合同。开口合同指合同签订时不明确约定总金额、总数量、具体收付款日期,按实际发生的供货量、业务量结算的合同 */ private String fdContractGwNature; /** diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 0644883f..a33c6293 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -74,6 +74,8 @@ thirdParty: key-auth: ${HCS_KEY_AUTH:3F7e8yI6RV8S53mJ9tYa0672r3W4n279} # 来源系统标识(fd_sources,约定值 WLTMS) src-system: ${HCS_SRC_SYSTEM:WLTMS} + # 操作人登录名(fdLoginName / curUser.fdLoginName,全部合同接口共用,默认 srvadmin) + operator-login-name: ${HCS_OPERATOR_LOGIN_NAME:srvadmin} # 创建单位 fdId(fd_creator_unit 等组织引用,HCS 组织主数据固定值,项目立项、合同等接口共用;与 name 任一为空回退单据开题部门名称仅传名称) creator-unit-id: ${HCS_CREATOR_UNIT_ID:1j56etj23w358wne0ow2k5214nk4f24213w0} # 创建单位名称(与 creator-unit-id 配套) @@ -94,11 +96,10 @@ thirdParty: template-code: ${HCS_PROJECT_TEMPLATE_CODE:template_15x0og} # 合同(C103-1/11) contract: - # TMS 合同类别 -> HCS 模板ID(§9-U7 待合规方提供模板清单) - template-mapping: {} - # TMS 结算方式 -> 付款|收款(§9-U3 字典映射待联调) - settlement-type-mapping: {} - # TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) + # TMS 合同类别 -> HCS 模板ID(§9-U7 合规方提供模板清单;中文键必须用 "[...]" 括号记法,否则绑定失败) + template-mapping: + "[承运商合同]": "1jvnp5s7mw13gw5q4w4g9qin1n1a2rn14gw0" + # 币种:TMS 币种码 -> HCS 币种名称(照金蝶 RMB->CNY 映射惯例) currency-name-mapping: {"RMB": "人民币"} # 合同 fdSepcailContract 固定 false(D15,配置项预留) special-contract-enabled: ${HCS_CONTRACT_SPECIAL_ENABLED:false}