:fix: 合同特批附件归口佐证材料区校验并更新特批附件文案
This commit is contained in:
+20
-8
@@ -161,7 +161,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
|||||||
prepare(contractManage);
|
prepare(contractManage);
|
||||||
validateDraft(contractManage);
|
validateDraft(contractManage);
|
||||||
validateTemporary(contractManage);
|
validateTemporary(contractManage);
|
||||||
// 高风险/黑名单客商管控:必须上传特批说明附件(外部客商,内部组织默认无风险)
|
// 高风险/黑名单客商管控:必须上传特批附件(外部客商,内部组织默认无风险)
|
||||||
validateSpecExplanationOnSubmit(contractManage);
|
validateSpecExplanationOnSubmit(contractManage);
|
||||||
if (Func.isNotEmpty(contractManage.getId())) {
|
if (Func.isNotEmpty(contractManage.getId())) {
|
||||||
validateContractPartyCombinationUnique(contractManage);
|
validateContractPartyCombinationUnique(contractManage);
|
||||||
@@ -185,7 +185,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
|||||||
throw new ServiceException("仅草稿或已撤回/已驳回的临时合同允许提交临时合同审批");
|
throw new ServiceException("仅草稿或已撤回/已驳回的临时合同允许提交临时合同审批");
|
||||||
}
|
}
|
||||||
validateTemporary(contractManage);
|
validateTemporary(contractManage);
|
||||||
// 高风险/黑名单客商管控:必须上传特批说明附件(外部客商,内部组织默认无风险)
|
// 高风险/黑名单客商管控:必须上传特批附件(外部客商,内部组织默认无风险)
|
||||||
validateSpecExplanationOnSubmit(contractManage);
|
validateSpecExplanationOnSubmit(contractManage);
|
||||||
// 临时放开新增合同从草稿转临时合同时的组合重复校验。
|
// 临时放开新增合同从草稿转临时合同时的组合重复校验。
|
||||||
// validateContractPartyCombinationUnique(contractManage);
|
// validateContractPartyCombinationUnique(contractManage);
|
||||||
@@ -205,7 +205,7 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
|||||||
throw new ServiceException("仅临时合同或已撤回/已驳回的正式合同允许提交正式合同审批");
|
throw new ServiceException("仅临时合同或已撤回/已驳回的正式合同允许提交正式合同审批");
|
||||||
}
|
}
|
||||||
validateFormal(contractManage);
|
validateFormal(contractManage);
|
||||||
// 高风险/黑名单客商管控:必须上传特批说明附件(外部客商,内部组织默认无风险)
|
// 高风险/黑名单客商管控:必须上传特批附件(外部客商,内部组织默认无风险)
|
||||||
validateSpecExplanationOnSubmit(contractManage);
|
validateSpecExplanationOnSubmit(contractManage);
|
||||||
// 临时放开新增合同从临时转正式合同时的组合重复校验。
|
// 临时放开新增合同从临时转正式合同时的组合重复校验。
|
||||||
// validateContractPartyCombinationUnique(contractManage);
|
// validateContractPartyCombinationUnique(contractManage);
|
||||||
@@ -1118,7 +1118,8 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 高风险/黑名单客商提交校验:甲/乙方为外部客商且高风险(C101-1 风险等级=2)或黑名单时,
|
* 高风险/黑名单客商提交校验:甲/乙方为外部客商且高风险(C101-1 风险等级=2)或黑名单时,
|
||||||
* 必须已上传「特批说明」类型附件(fileType=特批说明,业务字典 contract_attachment_type);内部组织类型客商默认无风险
|
* 必须已上传「特批附件」类型附件(fileType=特批附件,业务字典 contract_supporting_attachment_type),
|
||||||
|
* 归口「附件(佐证材料等)」(attachmentsJson)区上传;用印材料(contractFileJson)历史已传行兼容放行;内部组织类型客商默认无风险
|
||||||
*
|
*
|
||||||
* @param contractManage 合同单
|
* @param contractManage 合同单
|
||||||
*/
|
*/
|
||||||
@@ -1127,14 +1128,25 @@ public class ContractManageServiceImpl extends BaseServiceImpl<ContractManageMap
|
|||||||
if (!risky) {
|
if (!risky) {
|
||||||
return;
|
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)
|
.filter(Map.class::isInstance)
|
||||||
.map(Map.class::cast)
|
.map(Map.class::cast)
|
||||||
.anyMatch(attachment -> HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION
|
.anyMatch(attachment -> HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION
|
||||||
.equals(Objects.toString(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD), null)));
|
.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
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user