From 2fdd3092f423f3b1363be01e8b3165bdcbad04b9 Mon Sep 17 00:00:00 2001 From: jl-zhoujl2 Date: Fri, 29 Jul 2022 10:28:53 +0800 Subject: [PATCH] =?UTF-8?q?7.27=20=E4=B8=93=E5=AE=B6=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E8=AF=84=E5=AE=A1=E7=BB=93=E6=9E=9C=E9=A3=8E=E6=8E=A7=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GroupLeader/components/GroupLeader.tsx | 72 ++++++++++++-- .../ReviewResults/GroupLeader/service.ts | 14 ++- src/utils/RiskPreventionSoft/index.tsx | 99 +++++++++++++++++++ src/utils/RiskPreventionSoft/riskStyle.less | 19 ++++ 4 files changed, 192 insertions(+), 12 deletions(-) create mode 100644 src/utils/RiskPreventionSoft/index.tsx create mode 100644 src/utils/RiskPreventionSoft/riskStyle.less diff --git a/src/pages/Evaluation/expert/ReviewResults/GroupLeader/components/GroupLeader.tsx b/src/pages/Evaluation/expert/ReviewResults/GroupLeader/components/GroupLeader.tsx index dca25b4..9ea200a 100644 --- a/src/pages/Evaluation/expert/ReviewResults/GroupLeader/components/GroupLeader.tsx +++ b/src/pages/Evaluation/expert/ReviewResults/GroupLeader/components/GroupLeader.tsx @@ -1,7 +1,7 @@ import { Button, Card, Col, Collapse, Divider, Form, Input, message, Modal, Popover, Row, Space, Spin, Tooltip, Typography } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; import '@/utils/lq.style.less'; -import { getReviewResult, saveToExpertConfirm, submitReviewResult, submitToExpertConfirm, unlockResult } from '../service'; +import { beforeRiskControl, getReviewResult, saveToExpertConfirm, submitReviewResult, submitToExpertConfirm, unlockResult } from '../service'; import { commonMessage } from '@/utils/MessageUtils'; import { getDictName, isEmpty, isNotEmpty } from '@/utils/CommonUtils'; import ProTable, { EditableProTable } from '@ant-design/pro-table'; @@ -16,10 +16,12 @@ import ReviewReportUpload from '@/utils/ReviewReportUpload'; import { ExclamationCircleOutlined } from '@ant-design/icons'; import { getFileListByBid } from '@/utils/DownloadUtils'; import MACAddressPrompt from '@/pages/Evaluation/BidControl/BidControlManager/components/MACAddressPrompt'; +import RiskPreventionSoft from '@/utils/RiskPreventionSoft'; const { Panel } = Collapse; const { TextArea } = Input; const { Paragraph, Text } = Typography; +const { confirm, warning } = Modal; const firstRvwResult = ['否', '是']; //是否中标候选人 @@ -125,6 +127,10 @@ const GroupLeader: React.FC = () => { const [reportUploadId, setReportUploadId] = useState(''); //评审报告附件列表 const [reportFileList, setReportFileList] = useState([]); + //风控弹窗 2022.7.27 zhoujianlong + const [riskVisible, setRiskVisible] = useState(false); + //风控数据 2022.7.27 zhoujianlong + const [riskData, setRiskData] = useState([]); useEffect(() => { init(); }, []); @@ -1194,7 +1200,8 @@ const GroupLeader: React.FC = () => { // } verificationMoneyIsEdit(data); } - function submit(data: any) { + //提交接口调用 + function submit() { setSpinning(true); let suppliers = JSON.parse(JSON.stringify(supplierTableData))//2021.10.14 zhoujianlong 改为深拷贝,解决保存字段闪烁问题 suppliers.forEach((item: any) => { @@ -1202,11 +1209,23 @@ const GroupLeader: React.FC = () => { item.detailRvwResult = isEmpty(item?.detailRvwResult) ? null : parseInt(item?.detailRvwResult) item.winnerBidder = isEmpty(item?.winnerBidder) ? null : parseInt(item?.winnerBidder) }); - data.suppliers = suppliers + let data: any = { + id: resultReviewForm.getFieldValue('id'), + remarks: resultReviewForm.getFieldValue('remarks'), + suppliers: [...suppliers] + } // 提交专家确认 submitToExpertConfirm(data).then(res => { - commonMessage(res); - init(); + if (res?.code == 200) { + commonMessage(res); + init(); + } else { + message.destroy(); + warning({ + title: res?.message, + centered: true, + }); + } }).finally(() => { setSpinning(false); }) @@ -1239,10 +1258,9 @@ const GroupLeader: React.FC = () => { let res = false; let gys: any = []; if (roomType === '1' || bidMethodDict === 'procurement_mode_7' || bidMethodDict === 'procurement_mode_4') {//预审 询价 招募不需要金额 - submit(params); + verificationRiskControl(params); return; } - const { confirm } = Modal; function showConfirm() { confirm({ title: `您有供应商未填写【拟签约金额】或【增值税金额】,请确认是否提交`, @@ -1257,7 +1275,7 @@ const GroupLeader: React.FC = () => { } , onOk() { - submit(params) + verificationRiskControl(params); }, }); } @@ -1269,11 +1287,35 @@ const GroupLeader: React.FC = () => { } }) if (res) { - showConfirm() + showConfirm(); } else { - submit(params); + verificationRiskControl(params); } } + /** + * 风控中心校验 + * @param params + */ + const verificationRiskControl = (params: any) => { + let suppliers = JSON.parse(JSON.stringify(supplierTableData))//2021.10.14 zhoujianlong 改为深拷贝,解决保存字段闪烁问题 + suppliers.forEach((item: any) => { + item.winnerCandidate = saveWinnerCandidate(item.winnerCandidate) + item.detailRvwResult = isEmpty(item?.detailRvwResult) ? null : parseInt(item?.detailRvwResult) + item.winnerBidder = isEmpty(item?.winnerBidder) ? null : parseInt(item?.winnerBidder) + }); + params.suppliers = suppliers + params["evalMethodDict"] = evalMethodDict; + beforeRiskControl(params).then(res => { + if (res?.code == 200) { + if (res?.data.length > 0) { + setRiskData(res?.data); + setRiskVisible(true); + } else { + submit(); + } + } + }) + } /** * 验证增值税金额是否能高于拟签约的金额 @@ -1604,6 +1646,16 @@ const GroupLeader: React.FC = () => { fileId={reportUploadId} readOnly={true} />} + {/**风控组件 */} + {riskVisible && { + setRiskVisible(false); + setRiskData([]); + }} + onSubmit={() => submit()} + data={riskData} + />} diff --git a/src/pages/Evaluation/expert/ReviewResults/GroupLeader/service.ts b/src/pages/Evaluation/expert/ReviewResults/GroupLeader/service.ts index 20b8ce3..98e7cbc 100644 --- a/src/pages/Evaluation/expert/ReviewResults/GroupLeader/service.ts +++ b/src/pages/Evaluation/expert/ReviewResults/GroupLeader/service.ts @@ -53,7 +53,7 @@ export function submitReviewResult(id: any) { * 评审结果解锁 * @param id */ - export function unlockResult(id: any) { +export function unlockResult(id: any) { return request(`/api/biz-service-ebtp-rsms/v1/reviewresult/unlock/result/${id}`, { method: 'post', }); @@ -62,8 +62,18 @@ export function submitReviewResult(id: any) { * 评审报告解锁 * @param id */ - export function unlockReportIF(id: any) { +export function unlockReportIF(id: any) { return request(`/api/biz-service-ebtp-evaluation/v1/review/report/unlock/${id}`, { method: 'post', }); } +/** + * 提交前风险防控校验接口 + * @param data + */ +export function beforeRiskControl(data: any) { + return request("/api/biz-service-ebtp-rsms/v1/riskcenter/getRemindResult", { + method: 'post', + data: data, + }); +} diff --git a/src/utils/RiskPreventionSoft/index.tsx b/src/utils/RiskPreventionSoft/index.tsx new file mode 100644 index 0000000..04a4fbf --- /dev/null +++ b/src/utils/RiskPreventionSoft/index.tsx @@ -0,0 +1,99 @@ +import React from 'react'; +import { Modal, Tag } from 'antd'; +import { ExclamationCircleOutlined } from '@ant-design/icons'; +import type { ProColumns } from '@ant-design/pro-table'; +import ProTable from '@ant-design/pro-table'; +import './riskStyle.less' + +interface RiskPreventionSoftProps { + modalVisible: boolean; + onCancel: () => void; + onSubmit: () => void; + data: Array; +} + +const modalHeight = window.innerHeight * 96 / 100; + +/** + * 风险防控通用(软控) + * @param props + * @returns + */ +const RiskPreventionSoft: React.FC = (props) => { + const { modalVisible, onCancel, onSubmit, data } = props; + + const columns: ProColumns[] = [ + { + dataIndex: 'regulationStrategy', + title: '规则响应策略', + width: '13%', + valueEnum: { + hard: { text: '强控', status: 'Error' }, + soft: { text: '软控', status: 'Warning' }, + alarm: { text: '预警', status: 'Processing' } + }, + }, + { + dataIndex: 'regulationName', + title: '规则模型名称', + width: '13%', + }, + { + dataIndex: 'regulationRank', + title: '风险响应等级', + width: '13%', + valueEnum: { + first: { text: '风险一级' }, + second: { text: '风险二级' }, + third: { text: '风险三级' } + }, + }, + { + dataIndex: 'message', + title: '规则相应内容', + }, + ]; + + return ( + onCancel()} + onOk={() => { + onSubmit(); + onCancel(); + }} + > +
+ } color="warning" className="risk-top-tag"> + 当前业务操作受以下风控规则限制 + + {data.map(ite => ite?.result.map((item: any) => ( +
+
+ 场景名称:{item.sceneName} + {item.publishDepartName} +
+ + columns={columns} + dataSource={item.regulationData} + rowKey="regulationId" + size='small' + pagination={false} + toolBarRender={false} + search={false} + /> +
+ ) + ))} +
+
+ ); +}; + +export default RiskPreventionSoft; diff --git a/src/utils/RiskPreventionSoft/riskStyle.less b/src/utils/RiskPreventionSoft/riskStyle.less new file mode 100644 index 0000000..39813bd --- /dev/null +++ b/src/utils/RiskPreventionSoft/riskStyle.less @@ -0,0 +1,19 @@ +.risk-top-tag { + font-size: 14px; + width: 100%; + padding: 8px 16px; +} + +.risk-table-title { + height: 40px; + line-height: 40px; + display: flex; + justify-content: space-between; + font-weight: bold; + .table-scene-name { + color: #7c7c7c; + } + :last-child { + color: #000; + } +} \ No newline at end of file