增加两个字段

This commit is contained in:
2026-06-03 13:27:51 +08:00
parent d9b941d908
commit 1369b2e715
6 changed files with 76 additions and 10 deletions
@@ -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:合同专用章, 等) */
@@ -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<String, Object> buildArchivePayload(ContractLaunchDto contract, ContractLaunchArchiveDto archiveDto) {
Map<String, Object> payload = new LinkedHashMap<>();
@@ -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";
@@ -31,6 +31,8 @@
<result property="primaryContent" column="PRIMARY_CONTENT"/>
<result property="amountExplain" column="AMOUNT_EXPLAIN"/>
<result property="valuationMode" column="VALUATION_MODE"/>
<result property="needAmendments" column="NEED_AMENDMENTS"/>
<result property="estimatedAmount" column="ESTIMATED_AMOUNT"/>
<result property="sealType" column="SEAL_TYPE"/>
<result property="textSource" column="TEXT_SOURCE"/>
<result property="mandateType" column="MANDATE_TYPE"/>
@@ -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},
@@ -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;
/
+4
View File
@@ -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 '委托类型';