校验问题

This commit is contained in:
2026-06-25 13:02:53 +08:00
parent fe3a3db911
commit cc6e368f44
@@ -41,6 +41,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@@ -62,6 +63,9 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
public class ContractLaunchServiceImpl implements ContractLaunchService { public class ContractLaunchServiceImpl implements ContractLaunchService {
/** 法务接口要求的日期时间格式:yyyy-MM-dd HH:mm:ss */
private static final DateTimeFormatter LAW_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private final ContractLaunchMapper contractLaunchMapper; private final ContractLaunchMapper contractLaunchMapper;
private final AdminSecurityManage adminSecurityManage; private final AdminSecurityManage adminSecurityManage;
private final SettlementPushService settlementPushService; private final SettlementPushService settlementPushService;
@@ -1266,6 +1270,9 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
if (contract.getCurrencyName() == null || contract.getCurrencyName().isBlank()) { if (contract.getCurrencyName() == null || contract.getCurrencyName().isBlank()) {
throw new ServiceException("币种不能为空"); throw new ServiceException("币种不能为空");
} }
if (contract.getPaymentMethod() == null || contract.getPaymentMethod().isBlank()) {
throw new ServiceException("付款方式不能为空");
}
if (contract.getSealType() == null || contract.getSealType().isBlank()) { if (contract.getSealType() == null || contract.getSealType().isBlank()) {
throw new ServiceException("签订方式不能为空"); throw new ServiceException("签订方式不能为空");
} }
@@ -1408,8 +1415,8 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
payload.put("contractSysId", contract.getContractSysId()); payload.put("contractSysId", contract.getContractSysId());
payload.put("selfCode", contract.getSelfCode()); payload.put("selfCode", contract.getSelfCode());
payload.put("contractName", contract.getContractName()); payload.put("contractName", contract.getContractName());
payload.put("startTime", contract.getEffectiveStart()); payload.put("startTime", formatLawDate(contract.getEffectiveStart()));
payload.put("endTime", contract.getEffectiveEnd()); payload.put("endTime", formatLawDate(contract.getEffectiveEnd()));
payload.put("amountExplain", contract.getAmountExplain()); payload.put("amountExplain", contract.getAmountExplain());
payload.put("isText", contract.getTextSource()); payload.put("isText", contract.getTextSource());
payload.put("primaryContent", contract.getPrimaryContent()); payload.put("primaryContent", contract.getPrimaryContent());
@@ -1438,10 +1445,18 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
.filter(this::isOppositeParty) .filter(this::isOppositeParty)
.map(item -> { .map(item -> {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
map.put("oppCharacter", "2".equals(item.getOppositeCharacter()) || "4".equals(item.getOppositeCharacter()) ? "ZZR" : "QY"); String oppChar = item.getOppositeCharacter();
// V9.5 要求 oppCharacter: ZZR(自然人) / QY(企业)
// 默认按境内组织处理,但若明确为个人则传 ZZR
if (oppChar == null || oppChar.isBlank()) {
map.put("oppCharacter", "QY");
} else {
map.put("oppCharacter", "2".equals(oppChar) || "4".equals(oppChar) ? "ZZR" : "QY");
}
map.put("credirCode", item.getCreditCode()); map.put("credirCode", item.getCreditCode());
map.put("idCard", item.getNaturalPersonIdNumber()); map.put("idCard", item.getNaturalPersonIdNumber());
map.put("oppositeName", item.getCompanyName()); // V9.5 contractOpposites 参数表无 oppositeName 字段,只有 contractName(合同名称,顶层字段)
// 此处不传 oppositeName
return map; return map;
}).collect(Collectors.toList())); }).collect(Collectors.toList()));
payload.put("contractKxPlans", contract.getPerformancePlans().stream().map(plan -> { payload.put("contractKxPlans", contract.getPerformancePlans().stream().map(plan -> {
@@ -1449,7 +1464,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
map.put("planWhere", plan.getPlanWhere()); map.put("planWhere", plan.getPlanWhere());
map.put("planMoney", plan.getPlanMoney()); map.put("planMoney", plan.getPlanMoney());
map.put("planDetail", plan.getPlanDetail()); map.put("planDetail", plan.getPlanDetail());
map.put("planTime", plan.getPlanTime()); map.put("planTime", formatLawDate(plan.getPlanTime()));
map.put("planMatter", plan.getPlanMatter()); map.put("planMatter", plan.getPlanMatter());
map.put("planDay", plan.getPlanDay()); map.put("planDay", plan.getPlanDay());
map.put("planSubjectCode", plan.getPlanSubjectCode()); map.put("planSubjectCode", plan.getPlanSubjectCode());
@@ -1484,28 +1499,29 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
payload.put("c_method", contract.getValuationMode()); payload.put("c_method", contract.getValuationMode());
// 合同标的额:计价方式=固定总价时必填 // 合同标的额:计价方式=固定总价时必填
if ("1".equals(contract.getValuationMode()) && contract.getContractAmount() != null) { if ("1".equals(contract.getValuationMode()) && contract.getContractAmount() != null) {
payload.put("c_subjectAMT", contract.getContractAmount()); payload.put("c_subjectAMT", String.valueOf(contract.getContractAmount()));
} else { } else {
payload.put("c_subjectAMT", ""); payload.put("c_subjectAMT", "");
} }
payload.put("c_currency", contract.getCurrencyName()); payload.put("c_currency", contract.getCurrencyName());
payload.put("c_estimatedAMT", "2".equals(contract.getValuationMode()) ? contract.getEstimatedAmount() : ""); payload.put("c_estimatedAMT", "2".equals(contract.getValuationMode()) && contract.getEstimatedAmount() != null
? String.valueOf(contract.getEstimatedAmount()) : "");
payload.put("c_amountExplain", contract.getAmountExplain()); payload.put("c_amountExplain", contract.getAmountExplain());
// 额外金额 // 额外金额
payload.put("c_additional", contract.getEwAmountType()); payload.put("c_additional", contract.getEwAmountType());
if (contract.getDjAmount() != null) payload.put("c_dAMT", contract.getDjAmount()); if (contract.getDjAmount() != null) payload.put("c_dAMT", String.valueOf(contract.getDjAmount()));
if (contract.getYjAmount() != null) payload.put("c_yAMT", contract.getYjAmount()); if (contract.getYjAmount() != null) payload.put("c_yAMT", String.valueOf(contract.getYjAmount()));
if (contract.getYfkAmount() != null) payload.put("c_yfkAMT", contract.getYfkAmount()); if (contract.getYfkAmount() != null) payload.put("c_yfkAMT", String.valueOf(contract.getYfkAmount()));
if (contract.getBzjAmount() != null) payload.put("c_bzjAMT", contract.getBzjAmount()); if (contract.getBzjAmount() != null) payload.put("c_bzjAMT", String.valueOf(contract.getBzjAmount()));
payload.put("c_type", contract.getContractTypeCode()); payload.put("c_type", contract.getContractTypeCode());
payload.put("c_termType", contract.getContractPeriodType()); payload.put("c_termType", contract.getContractPeriodType());
payload.put("c_termExplain", contract.getPeriodExplain()); payload.put("c_termExplain", contract.getPeriodExplain());
payload.put("c_termStart", contract.getEffectiveStart()); payload.put("c_termStart", formatLawDate(contract.getEffectiveStart()));
payload.put("c_termEnd", contract.getEffectiveEnd()); payload.put("c_termEnd", formatLawDate(contract.getEffectiveEnd()));
payload.put("c_qyztGAT", contract.getIsSgat()); payload.put("c_qyztGAT", contract.getIsSgat());
payload.put("c_qyztSW", contract.getContractNature()); payload.put("c_qyztSW", contract.getContractNature());
payload.put("c_executor", contract.getExecutorAccount()); payload.put("c_executor", contract.getExecutorAccount());
payload.put("c_openBidding", contract.getIsOpenBidding()); payload.put("c_openBidding", contract.getIsOpenBidding() == null ? "0" : String.valueOf(contract.getIsOpenBidding()));
// 关联招标号:公开招标选是时必填 // 关联招标号:公开招标选是时必填
if (Integer.valueOf(1).equals(contract.getIsOpenBidding()) && contract.getBiddingNo() != null) { if (Integer.valueOf(1).equals(contract.getIsOpenBidding()) && contract.getBiddingNo() != null) {
payload.put("c_biddingNo", contract.getBiddingNo()); payload.put("c_biddingNo", contract.getBiddingNo());
@@ -1514,15 +1530,15 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
} }
// c_currentBudget 仅在收支方向为付款(1)时传,与 V3.0 文档一致 // c_currentBudget 仅在收支方向为付款(1)时传,与 V3.0 文档一致
if ("1".equals(contract.getPaymentDirection())) { if ("1".equals(contract.getPaymentDirection())) {
payload.put("c_currentBudget", contract.getIsYearBudget()); payload.put("c_currentBudget", contract.getIsYearBudget() == null ? "0" : String.valueOf(contract.getIsYearBudget()));
} }
payload.put("c_major", contract.getIsMajorContract()); payload.put("c_major", contract.getIsMajorContract() == null ? "0" : String.valueOf(contract.getIsMajorContract()));
payload.put("c_signMethod", contract.getSealType()); payload.put("c_signMethod", contract.getSealType());
// payload.put("c_authAttachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_AUTH)); // payload.put("c_authAttachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_AUTH));
payload.put("c_creator", contract.getInitiator()); payload.put("c_creator", contract.getInitiator());
payload.put("c_creatorPhone", contract.getCreatorPhone()); payload.put("c_creatorPhone", contract.getCreatorPhone());
payload.put("c_createDept", contract.getInitiatorDept()); payload.put("c_createDept", contract.getOrgId());
payload.put("c_creationTime", contract.getCreateTime()); payload.put("c_creationTime", formatLawDate(contract.getCreateTime()));
payload.put("c_signExplain", contract.getContractGistRemark()); payload.put("c_signExplain", contract.getContractGistRemark());
// payload.put("c_zw", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_BODY)); // payload.put("c_zw", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_BODY));
// payload.put("c_attachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_OTHER)); // payload.put("c_attachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_OTHER));
@@ -1534,13 +1550,13 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
seal.put("seal_approveSame", contract.getSealApproveSame() != null ? contract.getSealApproveSame() : "1"); seal.put("seal_approveSame", contract.getSealApproveSame() != null ? contract.getSealApproveSame() : "1");
seal.put("seal_type", contract.getSealType()); seal.put("seal_type", contract.getSealType());
seal.put("seal_quantity", contract.getSealQuantity() == null ? "1" : String.valueOf(contract.getSealQuantity())); seal.put("seal_quantity", contract.getSealQuantity() == null ? "1" : String.valueOf(contract.getSealQuantity()));
seal.put("seal_date", contract.getSealDate()); seal.put("seal_date", formatLawDate(contract.getSealDate()));
payload.put("c_seal", seal); payload.put("c_seal", seal);
// 签订信息 // 签订信息
Map<String, Object> sign = new LinkedHashMap<>(); Map<String, Object> sign = new LinkedHashMap<>();
sign.put("sign_isSign", "1"); sign.put("sign_isSign", "1");
sign.put("sign_date", contract.getSignDate()); sign.put("sign_date", formatLawDate(contract.getSignDate()));
sign.put("sign_activeDate", contract.getActiveDate()); sign.put("sign_activeDate", formatLawDate(contract.getActiveDate()));
// sign.put("sign_attachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_SIGNED)); // sign.put("sign_attachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_SIGNED));
sign.put("sign_executor", contract.getExecutorAccount()); sign.put("sign_executor", contract.getExecutorAccount());
payload.put("c_sign", sign); payload.put("c_sign", sign);
@@ -1556,7 +1572,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
map.put("lx_id", plan.getId() == null ? null : String.valueOf(plan.getId())); map.put("lx_id", plan.getId() == null ? null : String.valueOf(plan.getId()));
map.put("lx_item", plan.getPlanMatter()); map.put("lx_item", plan.getPlanMatter());
map.put("lx_condition", plan.getPlanWhere()); map.put("lx_condition", plan.getPlanWhere());
map.put("lx_nodeDate", plan.getPlanTime()); map.put("lx_nodeDate", formatLawDate(plan.getPlanTime()));
map.put("lx_remindDays", plan.getPlanDay() == null ? null : String.valueOf(plan.getPlanDay())); map.put("lx_remindDays", plan.getPlanDay() == null ? null : String.valueOf(plan.getPlanDay()));
if (amountRequired && plan.getPlanMoney() != null) { if (amountRequired && plan.getPlanMoney() != null) {
map.put("lx_amount", plan.getPlanMoney()); map.put("lx_amount", plan.getPlanMoney());
@@ -1934,6 +1950,13 @@ public class ContractLaunchServiceImpl implements ContractLaunchService {
} }
} }
/**
* 格式化日期为法务接口要求的格式:yyyy-MM-dd HH:mm:ss
*/
private String formatLawDate(LocalDateTime dateTime) {
return dateTime == null ? null : dateTime.format(LAW_DATE_FORMATTER);
}
@SafeVarargs @SafeVarargs
private final <T> T firstNonNull(T... values) { private final <T> T firstNonNull(T... values) {
if (values == null) { if (values == null) {