From cc6e368f44a49455e547d2016ead696037eb9f4b Mon Sep 17 00:00:00 2001 From: zhouxiaofeng <2946471396@qq.com> Date: Thu, 25 Jun 2026 13:02:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ContractLaunchServiceImpl.java | 67 +++++++++++++------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java index b821ba0..3046434 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java @@ -41,6 +41,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -62,6 +63,9 @@ import java.util.stream.Collectors; @RequiredArgsConstructor 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 AdminSecurityManage adminSecurityManage; private final SettlementPushService settlementPushService; @@ -1266,6 +1270,9 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { if (contract.getCurrencyName() == null || contract.getCurrencyName().isBlank()) { throw new ServiceException("币种不能为空"); } + if (contract.getPaymentMethod() == null || contract.getPaymentMethod().isBlank()) { + throw new ServiceException("付款方式不能为空"); + } if (contract.getSealType() == null || contract.getSealType().isBlank()) { throw new ServiceException("签订方式不能为空"); } @@ -1408,8 +1415,8 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { payload.put("contractSysId", contract.getContractSysId()); payload.put("selfCode", contract.getSelfCode()); payload.put("contractName", contract.getContractName()); - payload.put("startTime", contract.getEffectiveStart()); - payload.put("endTime", contract.getEffectiveEnd()); + payload.put("startTime", formatLawDate(contract.getEffectiveStart())); + payload.put("endTime", formatLawDate(contract.getEffectiveEnd())); payload.put("amountExplain", contract.getAmountExplain()); payload.put("isText", contract.getTextSource()); payload.put("primaryContent", contract.getPrimaryContent()); @@ -1438,10 +1445,18 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { .filter(this::isOppositeParty) .map(item -> { Map 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("idCard", item.getNaturalPersonIdNumber()); - map.put("oppositeName", item.getCompanyName()); + // V9.5 contractOpposites 参数表无 oppositeName 字段,只有 contractName(合同名称,顶层字段) + // 此处不传 oppositeName return map; }).collect(Collectors.toList())); payload.put("contractKxPlans", contract.getPerformancePlans().stream().map(plan -> { @@ -1449,7 +1464,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { map.put("planWhere", plan.getPlanWhere()); map.put("planMoney", plan.getPlanMoney()); map.put("planDetail", plan.getPlanDetail()); - map.put("planTime", plan.getPlanTime()); + map.put("planTime", formatLawDate(plan.getPlanTime())); map.put("planMatter", plan.getPlanMatter()); map.put("planDay", plan.getPlanDay()); map.put("planSubjectCode", plan.getPlanSubjectCode()); @@ -1484,28 +1499,29 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { payload.put("c_method", contract.getValuationMode()); // 合同标的额:计价方式=固定总价时必填 if ("1".equals(contract.getValuationMode()) && contract.getContractAmount() != null) { - payload.put("c_subjectAMT", contract.getContractAmount()); + payload.put("c_subjectAMT", String.valueOf(contract.getContractAmount())); } else { payload.put("c_subjectAMT", ""); } 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_additional", contract.getEwAmountType()); - if (contract.getDjAmount() != null) payload.put("c_dAMT", contract.getDjAmount()); - if (contract.getYjAmount() != null) payload.put("c_yAMT", contract.getYjAmount()); - if (contract.getYfkAmount() != null) payload.put("c_yfkAMT", contract.getYfkAmount()); - if (contract.getBzjAmount() != null) payload.put("c_bzjAMT", contract.getBzjAmount()); + if (contract.getDjAmount() != null) payload.put("c_dAMT", String.valueOf(contract.getDjAmount())); + if (contract.getYjAmount() != null) payload.put("c_yAMT", String.valueOf(contract.getYjAmount())); + if (contract.getYfkAmount() != null) payload.put("c_yfkAMT", String.valueOf(contract.getYfkAmount())); + if (contract.getBzjAmount() != null) payload.put("c_bzjAMT", String.valueOf(contract.getBzjAmount())); payload.put("c_type", contract.getContractTypeCode()); payload.put("c_termType", contract.getContractPeriodType()); payload.put("c_termExplain", contract.getPeriodExplain()); - payload.put("c_termStart", contract.getEffectiveStart()); - payload.put("c_termEnd", contract.getEffectiveEnd()); + payload.put("c_termStart", formatLawDate(contract.getEffectiveStart())); + payload.put("c_termEnd", formatLawDate(contract.getEffectiveEnd())); payload.put("c_qyztGAT", contract.getIsSgat()); payload.put("c_qyztSW", contract.getContractNature()); 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) { payload.put("c_biddingNo", contract.getBiddingNo()); @@ -1514,15 +1530,15 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { } // c_currentBudget 仅在收支方向为付款(1)时传,与 V3.0 文档一致 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_authAttachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_AUTH)); payload.put("c_creator", contract.getInitiator()); payload.put("c_creatorPhone", contract.getCreatorPhone()); - payload.put("c_createDept", contract.getInitiatorDept()); - payload.put("c_creationTime", contract.getCreateTime()); + payload.put("c_createDept", contract.getOrgId()); + payload.put("c_creationTime", formatLawDate(contract.getCreateTime())); payload.put("c_signExplain", contract.getContractGistRemark()); // payload.put("c_zw", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_BODY)); // 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_type", contract.getSealType()); 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); // 签订信息 Map sign = new LinkedHashMap<>(); sign.put("sign_isSign", "1"); - sign.put("sign_date", contract.getSignDate()); - sign.put("sign_activeDate", contract.getActiveDate()); + sign.put("sign_date", formatLawDate(contract.getSignDate())); + sign.put("sign_activeDate", formatLawDate(contract.getActiveDate())); // sign.put("sign_attachs", buildCollectionFilePayloadList(contract, ContractLaunchConstants.FILE_CATEGORY_SIGNED)); sign.put("sign_executor", contract.getExecutorAccount()); 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_item", plan.getPlanMatter()); 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())); if (amountRequired && plan.getPlanMoney() != null) { 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 private final T firstNonNull(T... values) { if (values == null) {