:fix: 合同特批附件归口佐证材料区校验并更新特批附件文案

This commit is contained in:
刘泉佳
2026-10-21 15:48:41 +08:00
parent 1ba114e859
commit 41ee328455
2 changed files with 57 additions and 8 deletions
@@ -161,7 +161,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
prepare(contractManage);
validateDraft(contractManage);
validateTemporary(contractManage);
// 高风险/黑名单客商管控:必须上传特批说明附件(外部客商,内部组织默认无风险)
// 高风险/黑名单客商管控:必须上传特批附件(外部客商,内部组织默认无风险)
validateSpecExplanationOnSubmit(contractManage);
if (Func.isNotEmpty(contractManage.getId())) {
validateContractPartyCombinationUnique(contractManage);
@@ -185,7 +185,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
throw new ServiceException("仅草稿或已撤回/已驳回的临时合同允许提交临时合同审批");
}
validateTemporary(contractManage);
// 高风险/黑名单客商管控:必须上传特批说明附件(外部客商,内部组织默认无风险)
// 高风险/黑名单客商管控:必须上传特批附件(外部客商,内部组织默认无风险)
validateSpecExplanationOnSubmit(contractManage);
// 临时放开新增合同从草稿转临时合同时的组合重复校验。
// validateContractPartyCombinationUnique(contractManage);
@@ -205,7 +205,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
throw new ServiceException("仅临时合同或已撤回/已驳回的正式合同允许提交正式合同审批");
}
validateFormal(contractManage);
// 高风险/黑名单客商管控:必须上传特批说明附件(外部客商,内部组织默认无风险)
// 高风险/黑名单客商管控:必须上传特批附件(外部客商,内部组织默认无风险)
validateSpecExplanationOnSubmit(contractManage);
// 临时放开新增合同从临时转正式合同时的组合重复校验。
// validateContractPartyCombinationUnique(contractManage);
@@ -1118,7 +1118,8 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
/**
* 高风险/黑名单客商提交校验:甲/乙方为外部客商且高风险(C101-1 风险等级=2)或黑名单时,
* 必须已上传「特批说明」类型附件(fileType=特批说明,业务字典 contract_attachment_type);内部组织类型客商默认无风险
* 必须已上传「特批附件」类型附件(fileType=特批附件,业务字典 contract_supporting_attachment_type),
* 归口「附件(佐证材料等)」(attachmentsJson)区上传;用印材料(contractFileJson)历史已传行兼容放行;内部组织类型客商默认无风险
*
* @param contractManage 合同单
*/
@@ -1127,14 +1128,25 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
if (!risky) {
return;
}
boolean hasSpecExplanation = parseJsonArray(contractManage.getAttachmentsJson()).stream()
boolean hasSpecExplanation = this.hasSpecAttachment(contractManage.getAttachmentsJson())
|| this.hasSpecAttachment(contractManage.getContractFileJson());
if (!hasSpecExplanation) {
throw new ServiceException("合同相对方存在高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批");
}
}
/**
* 附件 JSON 中是否已存在特批附件(fileType=特批附件)
*
* @param attachmentsJson 附件元数据 JSON 数组
* @return 是否存在特批附件
*/
private boolean hasSpecAttachment(String attachmentsJson) {
return parseJsonArray(attachmentsJson).stream()
.filter(Map.class::isInstance)
.map(Map.class::cast)
.anyMatch(attachment -> HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION
.equals(Objects.toString(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD), null)));
if (!hasSpecExplanation) {
throw new ServiceException("合同相对方存在高风险/黑名单客商,必须上传「特批说明」类型附件后再提交审批");
}
}
/**
@@ -0,0 +1,37 @@
-- 特批附件归口「附件(佐证材料等)」区上传(产品口径 2026-10-17)。
-- ① 下架用印材料字典 contract_attachment_type 中的特批附件(隐藏,逻辑删除,幂等);
-- ② 新建佐证材料附件类型字典 contract_supporting_attachment_type:特批附件/其他文件。
-- 佐证材料区此前取不到字典时前端走兜底选项,落库后各环境与前端兜底保持一致。
-- ① 用印材料字典下架特批附件
UPDATE blade_dict_biz
SET is_deleted = 1
WHERE code = 'contract_attachment_type' AND dict_key = '特批附件' AND tenant_id = '000000' AND is_deleted = 0;
-- ② 佐证材料附件类型字典父项
INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted)
SELECT 2099700000000000001, '000000', 0, 'contract_supporting_attachment_type', '-1', '佐证材料附件类型', 1, NULL, 0, 1, 0
WHERE NOT EXISTS (
SELECT 1 FROM blade_dict_biz
WHERE code = 'contract_supporting_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0
);
-- ③ 子项:特批附件(高风险/黑名单客商合同必传,fileType=特批附件)
INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted)
SELECT 2099700000000000002, '000000',
(SELECT id FROM blade_dict_biz WHERE code = 'contract_supporting_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1),
'contract_supporting_attachment_type', '特批附件', '特批附件', 1, NULL, 0, 1, 0
WHERE NOT EXISTS (
SELECT 1 FROM blade_dict_biz
WHERE code = 'contract_supporting_attachment_type' AND dict_key = '特批附件' AND tenant_id = '000000' AND is_deleted = 0
);
-- ④ 子项:其他文件(佐证材料历史唯一类型)
INSERT INTO blade_dict_biz (id, tenant_id, parent_id, code, dict_key, dict_value, sort, remark, is_sealed, status, is_deleted)
SELECT 2099700000000000003, '000000',
(SELECT id FROM blade_dict_biz WHERE code = 'contract_supporting_attachment_type' AND dict_key = '-1' AND tenant_id = '000000' AND is_deleted = 0 LIMIT 1),
'contract_supporting_attachment_type', '其他文件', '其他文件', 2, NULL, 0, 1, 0
WHERE NOT EXISTS (
SELECT 1 FROM blade_dict_biz
WHERE code = 'contract_supporting_attachment_type' AND dict_key = '其他文件' AND tenant_id = '000000' AND is_deleted = 0
);