diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 588e493c..4766bbd5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -524,29 +524,56 @@ public class HcsContractSyncSupport { } /** - * signer 相对方(签署方):甲/乙双方,甲方 fdType=inner(内部主体),乙方 fdType=supplier(外部相对方) + * signer 相对方(签署方):甲/乙双方。fdType 档案优先:客商档案为内部组织(customerKind=internal/内部组织) + * 的一方为我方签约主体传 inner,另一方传 customer(外部相对方,2026-10-14 联调口径); + * 双方均非内部组织或查不到档案时按合同类别推定(承运商合同甲=inner,客户合同乙=inner,其余 customer); + * 丙方(三方合同)TMS 无签约主体字段来源,暂不支持 */ private List buildSigners(ContractManage contractManage) { List signers = new ArrayList<>(); - // 甲方相对方:fdStanding=甲,内部主体 fdType=inner(编号按名称反查,反查不到留空,§9-U6) - signers.add(signer("甲", HcsConstant.SIGNER_FD_TYPE_INNER, contractManage.getPartyA())); - // 乙方相对方:fdStanding=乙,外部相对方 fdType=supplier - signers.add(signer("乙", HcsConstant.SIGNER_FD_TYPE_SUPPLIER, contractManage.getPartyB())); + // 甲乙方各反查一次客商档案,编号与内部组织判定共用查询结果 + CustomerArchive partyAArchive = queryCustomerArchive(contractManage.getPartyA()); + CustomerArchive partyBArchive = queryCustomerArchive(contractManage.getPartyB()); + boolean partyAInternal = isInternalCustomer(partyAArchive); + boolean partyBInternal = isInternalCustomer(partyBArchive); + String partyAType; + String partyBType; + if (partyAInternal || partyBInternal) { + // 档案命中:内部组织一方=我方签约主体(inner),外部一方统一 customer + partyAType = partyAInternal ? HcsConstant.SIGNER_FD_TYPE_INNER : HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + partyBType = partyBInternal ? HcsConstant.SIGNER_FD_TYPE_INNER : HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + } else if ("承运商合同".equals(contractManage.getContractCategory())) { + // 兜底:档案未命中内部组织,按类别推定——我方为付款/发包方,签约主体在甲方 + partyAType = HcsConstant.SIGNER_FD_TYPE_INNER; + partyBType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + } else if ("客户合同".equals(contractManage.getContractCategory())) { + // 兜底:我方为收款/承运方,签约主体在乙方 + partyAType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + partyBType = HcsConstant.SIGNER_FD_TYPE_INNER; + } else { + // 兜底:其他类别双方统一 customer(2026-10-14 联调口径) + partyAType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + partyBType = HcsConstant.SIGNER_FD_TYPE_CUSTOMER; + } + // 甲方相对方:fdStanding=甲(编号按名称反查,反查不到留空,§9-U6) + signers.add(signer("甲", partyAType, contractManage.getPartyA(), partyAArchive)); + // 乙方相对方:fdStanding=乙 + signers.add(signer("乙", partyBType, contractManage.getPartyB(), partyBArchive)); return signers; } /** - * 单个相对方:甲方传 fdType=inner(内部主体),乙方传 fdType=supplier(外部相对方) + * 单个相对方:fdType 由签约主体落位规则决定(我方主体 inner,外部相对方 customer) */ - private HcsSignerDTO signer(String fdStanding, String fdType, String partyName) { + private HcsSignerDTO signer(String fdStanding, String fdType, String partyName, CustomerArchive customerArchive) { HcsSignerDTO signer = new HcsSignerDTO(); // 签署地位:甲 / 乙 signer.setFdStanding(fdStanding); // 相对方名称:TMS 甲乙方名称 signer.setFdName(partyName); // 相对方编号:按名称反查 CustomerArchive 客商编码,反查不到留空(§9-U6) - signer.setFdNumber(queryCustomerCode(partyName)); - // 单位类型:甲方 inner 内部主体 / 乙方 supplier 外部相对方 + signer.setFdNumber(customerArchive == null ? null : customerArchive.getCustomerCode()); + // 单位类型:inner 内部主体(我方签约主体)/ customer 外部相对方 signer.setFdType(fdType); return signer; } @@ -649,14 +676,30 @@ public class HcsContractSyncSupport { * 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null) */ private String queryCustomerCode(String partyName) { + CustomerArchive customerArchive = queryCustomerArchive(partyName); + return customerArchive == null ? null : customerArchive.getCustomerCode(); + } + + /** + * 按名称反查客商档案(全称或简称精确匹配,查不到返回 null) + */ + private CustomerArchive queryCustomerArchive(String partyName) { if (StringUtil.isBlank(partyName)) { return null; } - CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.lambdaQuery() + return customerArchiveMapper.selectOne(Wrappers.lambdaQuery() .and(wrapper -> wrapper.eq(CustomerArchive::getFullName, partyName).or().eq(CustomerArchive::getShortName, partyName)) .eq(CustomerArchive::getIsDeleted, 0) .last("limit 1")); - return customerArchive == null ? null : customerArchive.getCustomerCode(); + } + + /** + * 内部组织客商判定(集团内我方签约主体,档案登记 customerKind=internal/内部组织) + */ + private boolean isInternalCustomer(CustomerArchive customerArchive) { + return customerArchive != null + && (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()) + || "内部组织".equals(customerArchive.getCustomerKind())); } /** diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java index a6fa8bbd..83ca8ddb 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/constant/HcsConstant.java @@ -56,4 +56,8 @@ public class HcsConstant { * signer 相对方单位类型:乙方=supplier(外部相对方) */ public static final String SIGNER_FD_TYPE_SUPPLIER = "supplier"; + /** + * signer 相对方单位类型:客户=customer + */ + public static final String SIGNER_FD_TYPE_CUSTOMER = "customer"; } diff --git a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java index db087154..6f5df361 100644 --- a/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java +++ b/blade-third-party-api/blade-hcs-api/src/main/java/org/springblade/hcs/dto/HcsSignerDTO.java @@ -54,7 +54,7 @@ public class HcsSignerDTO implements Serializable { */ private String fdNumber; /** - * 单位类型:甲方=inner(内部主体),乙方=supplier(外部相对方) + * 单位类型:我方签约主体=inner(内部主体,客商档案内部组织),外部相对方=customer */ private String fdType; /**