:fix: HCS合同推送相对方单位类型按客商档案内部组织优先判定
This commit is contained in:
+54
-11
@@ -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<HcsSignerDTO> buildSigners(ContractManage contractManage) {
|
||||
List<HcsSignerDTO> 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.<CustomerArchive>lambdaQuery()
|
||||
return customerArchiveMapper.selectOne(Wrappers.<CustomerArchive>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()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+4
@@ -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";
|
||||
}
|
||||
|
||||
+1
-1
@@ -54,7 +54,7 @@ public class HcsSignerDTO implements Serializable {
|
||||
*/
|
||||
private String fdNumber;
|
||||
/**
|
||||
* 单位类型:甲方=inner(内部主体),乙方=supplier(外部相对方)
|
||||
* 单位类型:我方签约主体=inner(内部主体,客商档案内部组织),外部相对方=customer
|
||||
*/
|
||||
private String fdType;
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user