diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java b/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java index 089facd..004c6e9 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/dto/ContractLaunchDto.java @@ -121,6 +121,12 @@ public class ContractLaunchDto implements Serializable { /** 计价方式(0:无金额, 1:固定总价, 2:预估总价, 3:无法预估总价, 4:固定单价) */ private String valuationMode; + /** 是否需修订条款(1:是, 0:否) */ + private String needAmendments; + + /** 预估金额(计价方式为预估总价时填写) */ + private Double estimatedAmount; + // ==================== 签署相关 ==================== /** 签订方式(GZ:公章, HTZYZ:合同专用章, 等) */ 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 f876c70..8a2d2dc 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/service/ContractLaunchServiceImpl.java @@ -600,6 +600,8 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { target.setPrimaryContent(source.getPrimaryContent()); target.setAmountExplain(source.getAmountExplain()); target.setValuationMode(source.getValuationMode()); + target.setNeedAmendments(source.getNeedAmendments()); + target.setEstimatedAmount(source.getEstimatedAmount()); target.setSealType(source.getSealType()); target.setTextSource(source.getTextSource()); target.setMandateType(source.getMandateType()); @@ -881,6 +883,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { contract.setPaymentMethod(trim(contract.getPaymentMethod())); contract.setPrimaryContent(trim(contract.getPrimaryContent())); contract.setAmountExplain(trim(contract.getAmountExplain())); + contract.setNeedAmendments(trim(contract.getNeedAmendments())); contract.setAssistDepartmentName(trim(contract.getAssistDepartmentName())); contract.setExecutorAccount(trim(contract.getExecutorAccount())); contract.setPeriodExplain(trim(contract.getPeriodExplain())); @@ -891,6 +894,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { contract.setDateType(trim(contract.getDateType())); contract.setPushUrl(trim(contract.getPushUrl())); contract.setEwAmountType(trim(contract.getEwAmountType())); + contract.setBiddingNo(trim(contract.getBiddingNo())); if (contract.getDateType() == null || contract.getDateType().isBlank()) { contract.setDateType("0"); } @@ -903,6 +907,9 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { if (contract.getPaymentDirection() == null || contract.getPaymentDirection().isBlank()) { contract.setPaymentDirection("0"); } + if (contract.getNeedAmendments() == null || contract.getNeedAmendments().isBlank()) { + contract.setNeedAmendments("0"); + } if (contract.getPushUrl() == null || contract.getPushUrl().isBlank()) { contract.setPushUrl("/contract/launch/callback/law/approve"); } @@ -951,6 +958,9 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { if (contract.getPartyList() == null || contract.getPartyList().isEmpty()) { throw new ServiceException("至少需要维护一个合同方"); } + if ("2".equals(contract.getValuationMode()) && contract.getEstimatedAmount() == null) { + throw new ServiceException("预估总价合同必须填写预估金额"); + } boolean hasPartyA = contract.getPartyList().stream().anyMatch(item -> "A".equalsIgnoreCase(item.getRoleCode())); boolean hasCounterparty = contract.getPartyList().stream().anyMatch(item -> !"A".equalsIgnoreCase(item.getRoleCode())); if (!hasPartyA) { @@ -959,6 +969,17 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { if (!hasCounterparty) { throw new ServiceException("至少维护一个相对方"); } + if (Integer.valueOf(1).equals(contract.getIsOpenBidding()) + && (contract.getBiddingNo() == null || contract.getBiddingNo().isBlank())) { + throw new ServiceException("公开招标时必须填写关联招标号"); + } + if (requiresAuthAttachment(contract.getSealType()) + && (contract.getFileList() == null || contract.getFileList().stream().noneMatch(item -> + ContractLaunchConstants.FILE_CATEGORY_AUTH.equals(item.getFileCategory()) + && item.getFilePath() != null + && !item.getFilePath().isBlank()))) { + throw new ServiceException("当前签订方式必须上传授权委托书附件"); + } } private boolean canEdit(String status) { @@ -1109,11 +1130,15 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { payload.put("c_weNames", contract.getSigningSubjectCode() != null && !contract.getSigningSubjectCode().isBlank() ? contract.getSigningSubjectCode() : contract.getOrgId()); - // TODO: c_oppositeNames 应传集团返回的相对方ID,多个用逗号分隔,当前暂时传摘要占位 - payload.put("c_oppositeNames", contract.getCounterpartySummary()); + payload.put("c_oppositeNames", contract.getPartyList().stream() + .filter(item -> !"A".equalsIgnoreCase(item.getRoleCode())) + .map(item -> item.getOppositeId() != null && !item.getOppositeId().isBlank() + ? item.getOppositeId() + : item.getPartnerId() == null ? null : String.valueOf(item.getPartnerId())) + .filter(Objects::nonNull) + .collect(Collectors.joining(","))); payload.put("c_textSource", contract.getTextSource()); - // c_needAmendments(是否需修订条款):DTO 暂无此字段,默认传 0(否) - payload.put("c_needAmendments", "0"); + payload.put("c_needAmendments", contract.getNeedAmendments()); payload.put("c_mainContent", contract.getPrimaryContent()); payload.put("c_direction", contract.getPaymentDirection()); payload.put("c_method", contract.getValuationMode()); @@ -1124,8 +1149,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { payload.put("c_subjectAMT", null); } payload.put("c_currency", contract.getCurrencyName()); - // TODO: c_estimatedAMT(预估金额)DTO 暂无此字段,计价方式=预估总价时需传 - payload.put("c_estimatedAMT", null); + payload.put("c_estimatedAMT", "2".equals(contract.getValuationMode()) ? contract.getEstimatedAmount() : null); payload.put("c_amountExplain", contract.getAmountExplain()); // 额外金额 payload.put("c_additional", contract.getEwAmountType()); @@ -1151,8 +1175,7 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { payload.put("c_currentBudget", contract.getIsYearBudget()); payload.put("c_major", contract.getIsMajorContract()); payload.put("c_signMethod", contract.getSealType()); - // TODO: c_authAttachs(授权委托书附件)当前暂无此数据,传空数组 - payload.put("c_authAttachs", Collections.emptyList()); + 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()); @@ -1183,6 +1206,10 @@ public class ContractLaunchServiceImpl implements ContractLaunchService { return payload; } + private boolean requiresAuthAttachment(String sealType) { + return "GZBSQRQZ".equals(sealType) || "HTZYZBSQRQZ".equals(sealType); + } + /** 构建归档报文(pushArchive 接口的 payload) */ private Map buildArchivePayload(ContractLaunchDto contract, ContractLaunchArchiveDto archiveDto) { Map payload = new LinkedHashMap<>(); diff --git a/src/main/java/com/nbport/zgwl/contractlaunch/utils/ContractLaunchConstants.java b/src/main/java/com/nbport/zgwl/contractlaunch/utils/ContractLaunchConstants.java index a418d1f..ab7fffa 100644 --- a/src/main/java/com/nbport/zgwl/contractlaunch/utils/ContractLaunchConstants.java +++ b/src/main/java/com/nbport/zgwl/contractlaunch/utils/ContractLaunchConstants.java @@ -29,6 +29,7 @@ public final class ContractLaunchConstants { public static final String FILE_CATEGORY_BODY = "body"; public static final String FILE_CATEGORY_OTHER = "other"; public static final String FILE_CATEGORY_GIST = "gist"; + public static final String FILE_CATEGORY_AUTH = "auth"; public static final String FILE_CATEGORY_SIGNED = "signed"; public static final String FILE_CATEGORY_ARCHIVE = "archive"; diff --git a/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml b/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml index 3b10884..5436f63 100644 --- a/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml +++ b/src/main/resources/mapper/contractlaunch/ContractLaunchMapper.xml @@ -31,6 +31,8 @@ + + @@ -248,7 +250,7 @@ TEMPLATE_ID, TEMPLATE_CODE, TEMPLATE_NAME, STATUS, APPROVE_STATUS, APPROVE_MESSAGE, SEAL_CONTRACT_ID, SEAL_CONTRACT_STATUS, CONTRACT_AMOUNT, CURRENCY_NAME, CONTRACT_PERIOD_TYPE, PERIOD_EXPLAIN, EFFECTIVE_START, EFFECTIVE_END, - PAYMENT_METHOD, PRIMARY_CONTENT, AMOUNT_EXPLAIN, VALUATION_MODE, SEAL_TYPE, + PAYMENT_METHOD, PRIMARY_CONTENT, AMOUNT_EXPLAIN, VALUATION_MODE, NEED_AMENDMENTS, ESTIMATED_AMOUNT, SEAL_TYPE, TEXT_SOURCE, MANDATE_TYPE, CARGO_TYPE, ASSIST_DEPARTMENT_NAME, EXECUTOR_ACCOUNT, CREATOR_PHONE, SELF_CODE, MAIN_CONTRACT_CODE, SIGNING_SUBJECT_CODE, DATE_TYPE, IS_ADDIT, IS_ELECTRON, PAYMENT_DIRECTION, PUSH_URL, IS_MAJOR_CONTRACT, IS_OPEN_BIDDING, IS_YEAR_BUDGET, IS_SHARE, @@ -268,7 +270,7 @@ #{templateId}, #{templateCode}, #{templateName}, #{status}, #{approveStatus}, #{approveMessage}, #{sealContractId}, #{sealContractStatus}, #{contractAmount}, #{currencyName}, #{contractPeriodType}, #{periodExplain}, #{effectiveStart}, #{effectiveEnd}, - #{paymentMethod}, #{primaryContent}, #{amountExplain}, #{valuationMode}, #{sealType}, + #{paymentMethod}, #{primaryContent}, #{amountExplain}, #{valuationMode}, #{needAmendments}, #{estimatedAmount}, #{sealType}, #{textSource}, #{mandateType}, #{cargoType}, #{assistDepartmentName}, #{executorAccount}, #{creatorPhone}, #{selfCode}, #{mainContractCode}, #{signingSubjectCode}, #{dateType}, #{isAddit}, #{isElectron}, #{paymentDirection}, #{pushUrl}, #{isMajorContract}, #{isOpenBidding}, #{isYearBudget}, #{isShare}, @@ -313,6 +315,8 @@ PRIMARY_CONTENT = #{primaryContent}, AMOUNT_EXPLAIN = #{amountExplain}, VALUATION_MODE = #{valuationMode}, + NEED_AMENDMENTS = #{needAmendments}, + ESTIMATED_AMOUNT = #{estimatedAmount}, SEAL_TYPE = #{sealType}, TEXT_SOURCE = #{textSource}, MANDATE_TYPE = #{mandateType}, diff --git a/zgwl_contract_launch_collect_patch_oracle.sql b/zgwl_contract_launch_collect_patch_oracle.sql new file mode 100644 index 0000000..6535fee --- /dev/null +++ b/zgwl_contract_launch_collect_patch_oracle.sql @@ -0,0 +1,24 @@ +DECLARE + v_count NUMBER; +BEGIN + SELECT COUNT(1) + INTO v_count + FROM USER_TAB_COLUMNS + WHERE TABLE_NAME = 'SEAL_CONTRACT_LAUNCH_MAIN' + AND COLUMN_NAME = 'NEED_AMENDMENTS'; + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'ALTER TABLE SEAL_CONTRACT_LAUNCH_MAIN ADD NEED_AMENDMENTS VARCHAR2(4 CHAR) DEFAULT ''0'''; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.NEED_AMENDMENTS IS ''是否需修订条款:1是 0否'''; + END IF; + + SELECT COUNT(1) + INTO v_count + FROM USER_TAB_COLUMNS + WHERE TABLE_NAME = 'SEAL_CONTRACT_LAUNCH_MAIN' + AND COLUMN_NAME = 'ESTIMATED_AMOUNT'; + IF v_count = 0 THEN + EXECUTE IMMEDIATE 'ALTER TABLE SEAL_CONTRACT_LAUNCH_MAIN ADD ESTIMATED_AMOUNT NUMBER(20, 2)'; + EXECUTE IMMEDIATE 'COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.ESTIMATED_AMOUNT IS ''预估金额'''; + END IF; +END; +/ diff --git a/zgwl_contract_launch_oracle.sql b/zgwl_contract_launch_oracle.sql index e7cbf8d..7f5220a 100644 --- a/zgwl_contract_launch_oracle.sql +++ b/zgwl_contract_launch_oracle.sql @@ -115,6 +115,8 @@ CREATE TABLE SEAL_CONTRACT_LAUNCH_MAIN ( PRIMARY_CONTENT VARCHAR2(2000 CHAR), AMOUNT_EXPLAIN VARCHAR2(2000 CHAR), VALUATION_MODE VARCHAR2(10 CHAR), + NEED_AMENDMENTS VARCHAR2(4 CHAR) DEFAULT '0', + ESTIMATED_AMOUNT NUMBER(20, 2), SEAL_TYPE VARCHAR2(50 CHAR), TEXT_SOURCE VARCHAR2(50 CHAR), MANDATE_TYPE VARCHAR2(50 CHAR), @@ -299,6 +301,8 @@ COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.PAYMENT_METHOD IS '付款方式'; COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.PRIMARY_CONTENT IS '合同主要内容'; COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.AMOUNT_EXPLAIN IS '金额说明'; COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.VALUATION_MODE IS '计价方式'; +COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.NEED_AMENDMENTS IS '是否需修订条款:1是 0否'; +COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.ESTIMATED_AMOUNT IS '预估金额'; COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.SEAL_TYPE IS '签订方式'; COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.TEXT_SOURCE IS '文本来源'; COMMENT ON COLUMN SEAL_CONTRACT_LAUNCH_MAIN.MANDATE_TYPE IS '委托类型';