feat: 合同客商风险管控前端接入——风险提示条与特批说明附件类型

1. 合同表单甲乙方选择后风险提示移至基本信息备注后(橙黄提示条+红色风险客商提示文案,按设计稿),改用后端 risky 统一判定(修复原 fdRiskLevel 等级值匹配不中的问题),展示后端 riskTip 完整风险明细
2. 合同详情基本信息备注后新增风险客商提示行(按推送留痕 hcs_risk_level/hcs_black_status 判定)
3. 附件类型兜底选项增加特批说明(高风险/黑名单客商合同必传,与后端 fileType 校验对齐;正式选项需在业务字典 contract_attachment_type 配置)
This commit is contained in:
刘泉佳
2026-10-11 18:08:27 +08:00
parent 8640238cbe
commit 9e5f53702f
2 changed files with 53 additions and 19 deletions
@@ -176,6 +176,8 @@ const CONTRACT_ATTACHMENT_TYPE_OTHER = '其他文件';
export const defaultContractAttachmentTypeOptions = [ export const defaultContractAttachmentTypeOptions = [
{ label: '合同文件', value: '合同文件' }, { label: '合同文件', value: '合同文件' },
{ label: '双章归档文件', value: '双章归档文件' }, { label: '双章归档文件', value: '双章归档文件' },
// 高风险/黑名单客商合同必传,后端按 fileType=特批说明 校验与转传特批(与后端 HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION 对齐)
{ label: '特批说明', value: '特批说明' },
{ label: '其他文件', value: CONTRACT_ATTACHMENT_TYPE_OTHER }, { label: '其他文件', value: CONTRACT_ATTACHMENT_TYPE_OTHER },
]; ];
/** @deprecated 兼容旧引用,实际选项由业务字典 contract_attachment_type 动态加载 */ /** @deprecated 兼容旧引用,实际选项由业务字典 contract_attachment_type 动态加载 */
+51 -19
View File
@@ -184,6 +184,9 @@
<el-descriptions-item label="备注" :span="3">{{ <el-descriptions-item label="备注" :span="3">{{
detailValue('remark') detailValue('remark')
}}</el-descriptions-item> }}</el-descriptions-item>
<el-descriptions-item v-if="detailRiskTipText" label="风险客商提示" :span="3">
<span style="color: #f56c6c">{{ detailRiskTipText }}</span>
</el-descriptions-item>
</el-descriptions> </el-descriptions>
</section> </section>
@@ -480,14 +483,6 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="partyRiskText" label=" " label-width="24">
<el-alert
:title="partyRiskText"
type="warning"
:closable="false"
class="contract-manage-form__risk-alert"
/>
</el-form-item>
<el-form-item label="签订日期" prop="signDate"> <el-form-item label="签订日期" prop="signDate">
<el-date-picker <el-date-picker
v-model="form.signDate" v-model="form.signDate"
@@ -612,6 +607,11 @@
placeholder="请输入备注" placeholder="请输入备注"
/> />
</el-form-item> </el-form-item>
<!-- 风险客商提示(基本信息备注后):外部客商高风险/黑名单时展示,文案由后端 riskTip 拼装 -->
<div v-if="partyRiskText" class="contract-manage-form__risk-tip">
<div class="contract-manage-form__risk-tip-title">风险客商提示:</div>
<div class="contract-manage-form__risk-tip-content">{{ partyRiskText }}</div>
</div>
</section> </section>
<contract-attachment-section <contract-attachment-section
@@ -1493,20 +1493,31 @@ export default {
const endDate = this.detailRow.endDate || '-'; const endDate = this.detailRow.endDate || '-';
return `${startDate} 至 ${endDate}`; return `${startDate} 至 ${endDate}`;
}, },
// 高风险/黑名单客商签约提示(C101-1,签约前提示;强制拦截在合规推送链路) // 高风险/黑名单客商签约提示(C101-1,签约前提示;强制拦截在后端提交校验与推送链路)
partyRiskText() { partyRiskText() {
const parts = []; const parts = [];
['partyA', 'partyB'].forEach(prop => { ['partyA', 'partyB'].forEach(prop => {
const risk = this.partyRisk[prop]; const risk = this.partyRisk[prop];
if (!risk) return; if (!risk?.risky) return;
const name = this.form[prop] || ''; // riskTip 由后端按风险项拼装(【公司名称】:黑名单;涉诉;被执行人等),缺失时兜底通用提示
const label = prop === 'partyA' ? '甲方' : '乙方'; parts.push(
if (risk.blacklist) parts.push(`${label}[${name}]为黑名单客商`); risk.riskTip ||
else if (['高', '高风险', 'high'].includes(String(risk.riskLevel).trim())) `${prop === 'partyA' ? '甲方' : '乙方'}[${this.form[prop] || ''}]为高风险/黑名单客商`
parts.push(`${label}[${name}]为高风险客商`); );
}); });
if (!parts.length) return ''; if (!parts.length) return '';
return `${parts.join(';')},按集团规定不可直接签约,审批通过后需在合同详情发起特批`; return `${parts.join(';')},按集团规定不可直接签约,提交前须上传「特批说明」类型附件,审批通过后将自动发起合同特批`;
},
// 详情风险客商提示(基本信息备注后展示):按推送留痕 hcs_risk_level/hcs_black_status 判定(甲乙取高/任一),文案与后端 riskTip 一致
detailRiskTipText() {
const riskLevel = String(this.detailRow.hcsRiskLevel || '').trim();
const blacklist = String(this.detailRow.hcsBlackStatus || '').toLowerCase() === 'yes';
if (riskLevel !== '2' && !blacklist) return '';
const parties = [this.detailRow.partyA, this.detailRow.partyB]
.map(name => String(name || '').trim())
.filter(Boolean)
.join('、');
return `【${parties || '相对方'}】:被列入外部黑名单;涉贪污受贿裁判相关提及方(3年以上及其他);被执行人信息;买卖合同纠纷;劳动纠纷;重大纠纷`;
}, },
detailLegalSealText() { detailLegalSealText() {
const value = this.detailRow.legalSealFlag; const value = this.detailRow.legalSealFlag;
@@ -2227,7 +2238,7 @@ export default {
if (requestId === this.contractPartyRequestId) this.contractPartyLoading = false; if (requestId === this.contractPartyRequestId) this.contractPartyLoading = false;
}); });
}, },
// C101-1 客商风险查询(展示用,强校验在后端推送/付款链路):失败静默不阻塞填写 // C101-1 客商风险查询(展示用,强校验在后端提交/推送链路):失败静默不阻塞填写
queryPartyRisk(prop) { queryPartyRisk(prop) {
const name = this.form[prop]; const name = this.form[prop];
const code = name ? this.contractPartyCodeMap[name] : null; const code = name ? this.contractPartyCodeMap[name] : null;
@@ -2241,8 +2252,10 @@ export default {
this.partyRisk = { this.partyRisk = {
...this.partyRisk, ...this.partyRisk,
[prop]: { [prop]: {
riskLevel: risk.fdRiskLevel || '', customerKind: risk.customerKind || '',
blacklist: String(risk.fdBlackStatus || '').toLowerCase() === 'yes', // risky 由后端统一判定:外部客商高风险(等级=2)或黑名单;内部组织客商默认无风险恒为 false
risky: risk.risky === true,
riskTip: risk.riskTip || '',
}, },
}; };
}) })
@@ -3088,6 +3101,25 @@ export default {
width: 100%; width: 100%;
} }
// 风险客商提示条(基本信息备注后):橙黄背景 + 红色文字(设计稿 2026-10)
.contract-manage-form__risk-tip {
margin: 0 0 18px;
padding: 10px 16px;
background: #faecd8;
border-radius: 4px;
.contract-manage-form__risk-tip-title {
color: #f56c6c;
font-weight: 600;
line-height: 22px;
}
.contract-manage-form__risk-tip-content {
color: #f56c6c;
line-height: 22px;
}
}
.contract-manage-page { .contract-manage-page {
&__expiry-search { &__expiry-search {
display: flex; display: flex;