Merge branch 'master' into 'uat-export-face-recog'
Master merge to Uat export face recog See merge request eshop/fe_service_ebtp_frontend!232
This commit is contained in:
@ -31,6 +31,6 @@ export default [
|
||||
},
|
||||
{//单一来源简化流程 选择供应商及上传应答文件
|
||||
path: '/ProjectLayout/SimpleUpload',
|
||||
component: './BidEvaluation/components/SimpleUpload'
|
||||
component: './BidEvaluation/components/simpleUpload'
|
||||
}
|
||||
];
|
||||
|
@ -150,7 +150,7 @@ export default [
|
||||
path: '/notice',
|
||||
routes: [
|
||||
{ name: 'noticeList', path: '/notice/noticeList', component: './notice/noticeList/components/NoticeList' },//通知公告查看-所有角色
|
||||
{ name: 'noticeManage', path: '/notice/noticeManage', component: './notice/noticeManage/components/noticeManage' },//通知公告管理-系统管理员
|
||||
{ name: 'noticeManage', path: '/notice/noticeManage', component: './notice/noticeManage/components/NoticeManage' },//通知公告管理-系统管理员
|
||||
]
|
||||
},
|
||||
{//委托
|
||||
@ -161,12 +161,12 @@ export default [
|
||||
{//管理员-代理
|
||||
name: 'manager',
|
||||
path: '/Project/EntrustAssign/Manager',
|
||||
component: './Project/EntrustAssign/Manager',
|
||||
component: './Project/EntrustAssign/manager',
|
||||
},
|
||||
{//项目经理-代理
|
||||
name: 'operator',
|
||||
path: '/Project/EntrustAssign/Operator',
|
||||
component: './Project/EntrustAssign/Operator',
|
||||
component: './Project/EntrustAssign/operator',
|
||||
},
|
||||
{//采购经理的委托管理
|
||||
name: 'mandatoryAdministration',
|
||||
|
@ -1,12 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
|
||||
<title>招标采购中心 | 文档控件编辑器</title>
|
||||
<script type="text/javascript" src="officecontrol/jquery.js"></script>
|
||||
<script type="text/javascript" src="officecontrol/ntko4Path.20220624.js"></script>
|
||||
<link href="officecontrol/ntkoStyle.css" rel="stylesheet" type="text/css"/>
|
||||
<link href="officecontrol/ntkoStyle.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var path; //文档地址
|
||||
@ -57,12 +58,13 @@
|
||||
|
||||
<!--AfterPublishAsPDFToURL-->
|
||||
|
||||
<body onload="path=getQueryString('path');fileName=getQueryString('fileName');fileType=getQueryString('fileType');init(path);">
|
||||
<body
|
||||
onload="path=getQueryString('path');fileName=getQueryString('fileName');fileType=getQueryString('fileType');init(path);">
|
||||
|
||||
<script type="text/javascript" for="TANGER_OCX" event="OnDocumentOpened(File, Document)">
|
||||
<script type="text/javascript" for="TANGER_OCX" event="OnDocumentOpened(File, Document)">
|
||||
|
||||
</script>
|
||||
<div style="
|
||||
</script>
|
||||
<div style="
|
||||
background-color: #b30000;
|
||||
color:white;
|
||||
height: 56px;
|
||||
@ -70,35 +72,37 @@
|
||||
display: flex;
|
||||
position: relative;
|
||||
">
|
||||
<div style="font-size: 16px; font-weight: 600;">
|
||||
<img src="logo.svg" style="height: 30px; position: absolute; top: 13px; margin-left: 20px; margin-right: 10px;"/>
|
||||
<span style="position: absolute; left: 70px; font-size: 16px; font-weight: 600; display: inline-block;">中国联通智慧供应链平台 | 招标采购中心</span>
|
||||
<div style="font-size: 16px; font-weight: 600;">
|
||||
<img src="logo.svg" style="height: 30px; position: absolute; top: 13px; margin-left: 20px; margin-right: 10px;" />
|
||||
<span
|
||||
style="position: absolute; left: 70px; font-size: 16px; font-weight: 600; display: inline-block;">中国联通智慧供应链平台 |
|
||||
招标采购中心</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="elementPosition">
|
||||
<button type="button" class="btnStyle btnStyle02" onclick="generalProp(2)">另存为</button>
|
||||
<button type="button" class="btnStyle btnStyle02" onclick="generalProp(4)">打印</button>
|
||||
<button type="button" class="btnStyle btnStyle02" onclick="closeBTN()">关闭</button>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
<div class="elementPosition">
|
||||
<button type="button" class="btnStyle btnStyle02" onclick="generalProp(2)">另存为</button>
|
||||
<button type="button" class="btnStyle btnStyle02" onclick="generalProp(4)">打印</button>
|
||||
<button type="button" class="btnStyle btnStyle02" onclick="closeBTN()">关闭</button>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
|
||||
function closeBTN() {
|
||||
window.open('', '_parent', '');
|
||||
window.close();
|
||||
}
|
||||
//调用文档通用属性方法 1-打开 2-保存(另存为) 4-打印
|
||||
function generalProp(param) {
|
||||
var name = DocfileCode;
|
||||
if(fileName != null) {
|
||||
name = fileName;
|
||||
function closeBTN() {
|
||||
window.open('', '_parent', '');
|
||||
window.close();
|
||||
}
|
||||
TANGER_OCX.WebFileName = name + "." + fileType;//文档默认名称
|
||||
TANGER_OCX.ShowDialog(param)
|
||||
}
|
||||
</script>
|
||||
<div class="divBody">
|
||||
<script type="text/javascript" src="officecontrol/ntkoofficecontrol.min.20220624.js"></script>
|
||||
</div>
|
||||
//调用文档通用属性方法 1-打开 2-保存(另存为) 4-打印
|
||||
function generalProp(param) {
|
||||
var name = '新建文本文档';
|
||||
if (fileName != null) {
|
||||
name = fileName;
|
||||
}
|
||||
TANGER_OCX.WebFileName = name + "." + fileType;//文档默认名称
|
||||
TANGER_OCX.ShowDialog(param)
|
||||
}
|
||||
</script>
|
||||
<div class="divBody">
|
||||
<script type="text/javascript" src="officecontrol/ntkoofficecontrol.min.20220624.js"></script>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
@ -1,4 +1,4 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import React, { useEffect, useMemo, useState } from 'react';
|
||||
import { Button, Card, Collapse, Form, Input, List, message, Popover, Select, Space, Spin, Typography } from "antd";
|
||||
import ProTable from "@ant-design/pro-table";
|
||||
import { getBidAssessmentResultList, getBidAssessmentResultsList, pushBidAssessmentResult, saveResult } from "./service"
|
||||
@ -11,19 +11,21 @@ import { isEmpty } from '@/utils/CommonUtils';
|
||||
const BidAssessmentResults: React.FC<{}> = (props) => {
|
||||
const [Refresh, setRefresh] = useState<number>(0);
|
||||
const { Panel } = Collapse;
|
||||
const [pageloading, setPageloading] = useState<boolean>(false);
|
||||
const [ListData, setListData] = useState<any>();
|
||||
const [ListData, setListData] = useState<any[]>([]);
|
||||
const [assessRoomId, setAssessRoomId] = useState<any>();
|
||||
const [currentTable, setCurrentTable] = useState<boolean>(false);
|
||||
const [proID, setProID] = useState<any>(getProId);
|
||||
const [spintype, setSpintype] = useState<boolean>(false);
|
||||
//单一来源简化
|
||||
const [form] = Form.useForm();
|
||||
//查询条件-包件名称
|
||||
const [name, setName] = useState<string>('');
|
||||
//折叠面板
|
||||
const [collapseActiveKeys, setCollapseActiveKeys] = useState<any[]>(['0']);
|
||||
|
||||
const FormItem = Form.Item;
|
||||
const { Option } = Select;
|
||||
const { Paragraph, Text } = Typography;
|
||||
const firstRvwResult = ['否', '是'];
|
||||
const [contractedMoney, contractedMoneySet] = useState('')
|
||||
const proID = getProId();//项目id
|
||||
let name1 = "中标";
|
||||
let name2 = "评标";
|
||||
let name3 = "标段";
|
||||
@ -69,10 +71,6 @@ const BidAssessmentResults: React.FC<{}> = (props) => {
|
||||
type4 = true;
|
||||
type5 = true;
|
||||
}
|
||||
//综合得分展开关闭
|
||||
const [expandTotalScore, setExpandTotalScore] = useState<boolean>(proDict == "procurement_mode_7" ? false : true);
|
||||
//查询条件-包件名称
|
||||
const [name, setName] = useState<string>('');
|
||||
|
||||
useEffect(() => {
|
||||
setSpintype(true);
|
||||
@ -82,26 +80,10 @@ const BidAssessmentResults: React.FC<{}> = (props) => {
|
||||
setListData(res.data);
|
||||
}
|
||||
}).finally(() => {
|
||||
setSpintype(false)
|
||||
setSpintype(false);
|
||||
})
|
||||
}, [proID, Refresh])
|
||||
|
||||
//初审详审原因render
|
||||
const rvwResultRender = (field: any, reason: any) => {
|
||||
const content = (
|
||||
<Paragraph>
|
||||
<blockquote style={{ width: '300px' }}>{reason}</blockquote>
|
||||
</Paragraph>
|
||||
)
|
||||
return isEmpty(field) || field == '-' ? '-' : (
|
||||
<span>
|
||||
{firstRvwResult[field]}
|
||||
{field == 0 && <Popover content={content} trigger="hover" placement="topLeft">
|
||||
<Text code style={{ cursor: 'pointer' }}>说明</Text>
|
||||
</Popover>}
|
||||
</span>)
|
||||
}
|
||||
|
||||
/*推送评标结果*/
|
||||
const pushResult = (record: any) => {
|
||||
setSpintype(true);
|
||||
@ -111,56 +93,356 @@ const BidAssessmentResults: React.FC<{}> = (props) => {
|
||||
setRefresh(Refresh + 1);
|
||||
}
|
||||
}).finally(() => {
|
||||
setSpintype(false)
|
||||
setSpintype(false);
|
||||
})
|
||||
}
|
||||
|
||||
/*推送列表查看*/
|
||||
const getResultList = (record: any) => {
|
||||
setAssessRoomId(record.assesRoomId);
|
||||
setCurrentTable(true);
|
||||
}
|
||||
|
||||
//折叠面板change
|
||||
const onCollapseChange = (key: any) => {
|
||||
setCollapseActiveKeys(key);
|
||||
};
|
||||
|
||||
//确认评审结果ListRender封装
|
||||
const ResultListRender = (props: { item: any, setRefresh: () => void, getResultList: (record: any) => void, ListData: any, pushResult: (record: any) => void }) => {
|
||||
const { item, setRefresh, getResultList, ListData, pushResult } = props;
|
||||
//单一来源简化
|
||||
const [form] = Form.useForm();
|
||||
//综合得分展开关闭
|
||||
const [expandTotalScore, setExpandTotalScore] = useState<boolean>(proDict == "procurement_mode_7" ? false : true);
|
||||
|
||||
//单一简化
|
||||
function returnInput(name: any, name2: any, val: any, must: boolean, pattern?: boolean, hid?: boolean) {
|
||||
let rule = [
|
||||
{ required: must },
|
||||
{ pattern: /^.{0,21}$/, message: '超长' }
|
||||
];
|
||||
pattern && rule.push({ pattern: /(^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d{1,4})?$)/, message: '请输入正确数值(最多4位小数)' });
|
||||
return (
|
||||
<Form form={form}>
|
||||
<FormItem
|
||||
name={name}
|
||||
hidden={hid}
|
||||
messageVariables={{ label: name2 }}
|
||||
rules={rule}
|
||||
initialValue={val}
|
||||
>
|
||||
<Input
|
||||
readOnly={ListData[0].status == 3}
|
||||
placeholder={'请输入' + name2}
|
||||
/>
|
||||
</FormItem>
|
||||
</Form>
|
||||
)
|
||||
}
|
||||
function returnSelect(name: any, val: any) {
|
||||
return (
|
||||
<Form form={form}>
|
||||
<FormItem
|
||||
name={name}
|
||||
initialValue={val === 0 ? '否' : '是'}
|
||||
>
|
||||
<Select>
|
||||
<Option value="否" title='否'>否</Option>
|
||||
<Option value="是" title='是'>是</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
</Form>
|
||||
|
||||
)
|
||||
}
|
||||
|
||||
//初审详审原因render
|
||||
const rvwResultRender = (field: any, reason: any) => {
|
||||
const content = (
|
||||
<Paragraph>
|
||||
<blockquote style={{ width: '300px' }}>{reason}</blockquote>
|
||||
</Paragraph>
|
||||
)
|
||||
return isEmpty(field) || field == '-' ? '-' : (
|
||||
<span>
|
||||
{firstRvwResult[field]}
|
||||
{field == 0 && <Popover content={content} trigger="hover" placement="topLeft">
|
||||
<Text code style={{ cursor: 'pointer' }}>说明</Text>
|
||||
</Popover>}
|
||||
</span>)
|
||||
}
|
||||
|
||||
//单一简化
|
||||
function returnInput(name: any, name2: any, val: any, must: boolean, pattern?: boolean, hid?: boolean) {
|
||||
let rule = [
|
||||
{ required: must },
|
||||
{ pattern: /^.{0,21}$/, message: '超长' }
|
||||
];
|
||||
pattern && rule.push({ pattern: /(^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d{1,4})?$)/, message: '请输入正确数值(最多4位小数)' });
|
||||
return (
|
||||
<Form form={form}>
|
||||
<FormItem
|
||||
name={name}
|
||||
hidden={hid}
|
||||
messageVariables={{ label: name2 }}
|
||||
rules={rule}
|
||||
initialValue={val}
|
||||
>
|
||||
<Input
|
||||
readOnly={ListData[0].status == 3}
|
||||
placeholder={'请输入' + name2}
|
||||
/>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<List
|
||||
grid={{
|
||||
gutter: 16,
|
||||
xs: 1,
|
||||
sm: 1,
|
||||
md: 1,
|
||||
lg: 1,
|
||||
xl: 1,
|
||||
xxl: 1,
|
||||
}}
|
||||
itemLayout="vertical"
|
||||
rowKey="assesRoomId"
|
||||
dataSource={item.assesList}
|
||||
renderItem={(item1: any, index: any) => {
|
||||
//标段上的报价类型确认 1-% 0-元
|
||||
let sectionQuot = item?.quotationMethodDict == 'quotation_method_2' || item?.quotationMethodDict == 'quotation_method_3' ? '1' : '0'
|
||||
const columns: any = [
|
||||
{
|
||||
title: '排名',
|
||||
dataIndex: 'sort',
|
||||
valueType: 'text',
|
||||
width: 50,
|
||||
},
|
||||
{
|
||||
title: '供应商名称',
|
||||
dataIndex: 'companyName',
|
||||
valueType: 'text',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
hideInTable: type1,
|
||||
title: proDict == 'procurement_mode_7' ? '报价总金额净价(元)' : sectionQuot == '1' ? '报价(%)' : '报价(元)',
|
||||
dataIndex: 'price',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('price', '报价', record.price, true, true)
|
||||
} else {
|
||||
return record.price
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type2,
|
||||
title: proDict == 'procurement_mode_7' ? '报价总金额含税价(元)' : sectionQuot == '1' ? '评审价(%)' : '评审价(元)',
|
||||
dataIndex: 'priceReview',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('priceReview', '评审价', record.priceReview, true, true)
|
||||
} else {
|
||||
return record.priceReview
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '商务分',
|
||||
dataIndex: 'businessScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('businessScore', '商务分', record.businessScore, false, true)
|
||||
} else {
|
||||
return record.businessScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '技术分',
|
||||
width: 60,
|
||||
dataIndex: 'technicalScore',
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('technicalScore', '技术分', record.technicalScore, false, true)
|
||||
} else {
|
||||
return record.technicalScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '服务分',
|
||||
width: 60,
|
||||
dataIndex: 'serviceScore',
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('serviceScore', '服务分', record.serviceScore, false, true)
|
||||
} else {
|
||||
return record.serviceScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '价格分',
|
||||
width: 60,
|
||||
dataIndex: 'priceScore',
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('priceScore', '价格分', record.priceScore, false, true)
|
||||
} else {
|
||||
return record.priceScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: (
|
||||
<span>
|
||||
综合得分
|
||||
<Text keyboard onClick={() => setExpandTotalScore(!expandTotalScore)} style={{ cursor: 'pointer', color: '#1890ff' }}>{expandTotalScore ? "展开" : "收起"}</Text>
|
||||
</span>
|
||||
),
|
||||
dataIndex: 'totalScore',
|
||||
width: 120,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('totalScore', '综合得分', record.totalScore, false, true)
|
||||
} else {
|
||||
return record.totalScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: defId === 'negotiation_single_simple',
|
||||
title: '是否通过初步评审',
|
||||
dataIndex: 'firstRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.firstRvwReason)
|
||||
},
|
||||
{
|
||||
hideInTable: type5 || defId === 'negotiation_single_simple',
|
||||
title: '是否通过详审',
|
||||
dataIndex: 'detailRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.detailRvwReason)
|
||||
},
|
||||
{
|
||||
hideInTable: type5 || defId === 'negotiation_single_simple',
|
||||
title: '应答是否有效',
|
||||
width: 80,
|
||||
dataIndex: 'answerValid',
|
||||
render: (_: any, record: any) => {
|
||||
return record.answerValid === 1 ? '是' : record.answerValid === 0 ? '否' : '-'
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '是否' + name1 + '候选人',
|
||||
dataIndex: 'winnerCandidate',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnSelect('winnerCandidate', record.winnerCandidate)
|
||||
} else {
|
||||
return record.winnerCandidate === 1 ? '是' : '否'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type5 || defId === 'negotiation_single_simple',
|
||||
title: '是否拟' + name1 + '人',
|
||||
width: 80,
|
||||
dataIndex: 'winnerBidder',
|
||||
render: (_: any, record: any) => {
|
||||
return record.winnerBidder === 1 ? '是' : record.winnerBidder === 0 ? '否' : '-'
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type3,
|
||||
title: '拟签约金额(不含增值税)(元)',
|
||||
width: 150,
|
||||
dataIndex: 'contractedMoney',
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return (
|
||||
<>
|
||||
{returnInput('contractedMoney', '拟签约金额', record.contractedMoney, false, true)}
|
||||
{returnInput('id', '供应商id', record.id, false, false, true)}
|
||||
{returnInput('resultId', '结果id', record.resultId, false, false, true)}
|
||||
{returnInput('companyId', '公司id', record.companyId, false, false, true)}
|
||||
{returnInput('companyName', '公司名称', record.companyName, false, false, true)}
|
||||
</>
|
||||
)
|
||||
} else {
|
||||
return record.contractedMoney
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type4,
|
||||
title: '增值税金额(元)',
|
||||
width: 150,
|
||||
dataIndex: 'taxRatePrice',
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('taxRatePrice', '增值税金额', record.taxRatePrice, false, true)
|
||||
} else {
|
||||
return record.taxRatePrice
|
||||
}
|
||||
}
|
||||
},
|
||||
]
|
||||
return (
|
||||
<ProTable
|
||||
size={"small"}
|
||||
key={index}
|
||||
scroll={{ x: true }}
|
||||
search={false}
|
||||
options={false}
|
||||
columns={columns}
|
||||
dataSource={item1.reviewList}
|
||||
toolbar={{
|
||||
title: item1.againEvaluationSort == 'null' || isEmpty(item1.againEvaluationSort) ? null : `第${item1.againEvaluationSort}次重审`,
|
||||
}}
|
||||
rowKey="id"
|
||||
toolBarRender={(record: any) => [
|
||||
<>
|
||||
<Button
|
||||
hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase']) || defId != 'negotiation_single_simple' || item1.pushStatus == "1"}
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
form.validateFields().then(async () => {
|
||||
await saveResult({
|
||||
id: form.getFieldValue("resultId"),
|
||||
suppliers: [
|
||||
{
|
||||
...form.getFieldsValue(),
|
||||
"winnerCandidate": form.getFieldValue("winnerCandidate") == '是' ? '1' : '0',
|
||||
"firstRvwResult": form.getFieldValue("firstRvwResult") == '是' ? '1' : '0',
|
||||
"detailRvwResult": form.getFieldValue("detailRvwResult") == '是' ? '1' : '0',
|
||||
"answerValid": form.getFieldValue("answerValid") == '是' ? '1' : '0',
|
||||
"winnerBidder": form.getFieldValue("winnerBidder") == '是' ? '1' : '0',
|
||||
}
|
||||
]
|
||||
}).then((res) => {
|
||||
if (res.success) { message.success('保存成功!'); setRefresh(); }
|
||||
})
|
||||
})
|
||||
}}
|
||||
>保存</Button>
|
||||
{
|
||||
defId === 'negotiation_single_simple' ?
|
||||
<Button
|
||||
hidden={
|
||||
btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase']) ||
|
||||
!item1.reviewList[0].price ||
|
||||
!item1.reviewList[0].priceReview
|
||||
}
|
||||
disabled={item1.pushStatus == "1" ? true : false} key={"1"}
|
||||
onClick={() => pushResult(item1)} type="primary">确认{name2}结果</Button>
|
||||
:
|
||||
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={item1.pushStatus == "1" ? true : false} key={"1"} onClick={() => pushResult(item1)} type="primary"> 确认{name2}结果 </Button>
|
||||
}
|
||||
<Button key={"2"} onClick={() => getResultList(item1)}>查看日志</Button>
|
||||
</>
|
||||
]}
|
||||
pagination={{
|
||||
defaultPageSize: 10,
|
||||
showSizeChanger: false,
|
||||
}}
|
||||
/>
|
||||
)
|
||||
}}
|
||||
>
|
||||
</List>
|
||||
)
|
||||
}
|
||||
function returnSelect(name: any, val: any) {
|
||||
return (
|
||||
<Form form={form}>
|
||||
<FormItem
|
||||
name={name}
|
||||
initialValue={val === 0 ? '否' : '是'}
|
||||
>
|
||||
<Select>
|
||||
<Option value="否" title='否'>否</Option>
|
||||
<Option value="是" title='是'>是</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
</Form>
|
||||
|
||||
)
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<Spin spinning={spintype}>
|
||||
@ -177,296 +459,13 @@ const BidAssessmentResults: React.FC<{}> = (props) => {
|
||||
}}>重置</Button>
|
||||
</Space>
|
||||
</div>
|
||||
<List
|
||||
grid={{
|
||||
gutter: 16,
|
||||
xs: 1,
|
||||
sm: 1,
|
||||
md: 1,
|
||||
lg: 1,
|
||||
xl: 1,
|
||||
xxl: 1,
|
||||
}}
|
||||
style={{ paddingTop: "24px;" }}
|
||||
itemLayout="vertical"
|
||||
rowKey="sectionId"
|
||||
dataSource={ListData}
|
||||
renderItem={(item: any, index: any) => (
|
||||
<Collapse defaultActiveKey={index == 0 ? item.sectionId : ""} className="calibration-panel">
|
||||
<Panel
|
||||
header={item.sectionName} key={item.sectionId}>
|
||||
<List
|
||||
grid={{
|
||||
gutter: 16,
|
||||
xs: 1,
|
||||
sm: 1,
|
||||
md: 1,
|
||||
lg: 1,
|
||||
xl: 1,
|
||||
xxl: 1,
|
||||
}}
|
||||
itemLayout="vertical"
|
||||
rowKey="assesRoomId"
|
||||
dataSource={item.assesList}
|
||||
renderItem={(item1: any, index: any) => {
|
||||
//标段上的报价类型确认 1-% 0-元
|
||||
let sectionQuot = item?.quotationMethodDict == 'quotation_method_2' || item?.quotationMethodDict == 'quotation_method_3' ? '1' : '0'
|
||||
const columns: any = [
|
||||
{
|
||||
title: '排名',
|
||||
dataIndex: 'sort',
|
||||
valueType: 'text',
|
||||
width: 50,
|
||||
},
|
||||
{
|
||||
title: '供应商名称',
|
||||
dataIndex: 'companyName',
|
||||
valueType: 'text',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
hideInTable: type1,
|
||||
title: proDict == 'procurement_mode_7' ? '报价总金额净价(元)' : sectionQuot == '1' ? '报价(%)' : '报价(元)',
|
||||
dataIndex: 'price',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('price', '报价', record.price, true, true)
|
||||
} else {
|
||||
return record.price
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type2,
|
||||
title: proDict == 'procurement_mode_7' ? '报价总金额含税价(元)' : sectionQuot == '1' ? '评审价(%)' : '评审价(元)',
|
||||
dataIndex: 'priceReview',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('priceReview', '评审价', record.priceReview, true, true)
|
||||
} else {
|
||||
return record.priceReview
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '商务分',
|
||||
dataIndex: 'businessScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('businessScore', '商务分', record.businessScore, false, true)
|
||||
} else {
|
||||
return record.businessScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '技术分',
|
||||
width: 60,
|
||||
dataIndex: 'technicalScore',
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('technicalScore', '技术分', record.technicalScore, false, true)
|
||||
} else {
|
||||
return record.technicalScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '服务分',
|
||||
width: 60,
|
||||
dataIndex: 'serviceScore',
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('serviceScore', '服务分', record.serviceScore, false, true)
|
||||
} else {
|
||||
return record.serviceScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '价格分',
|
||||
width: 60,
|
||||
dataIndex: 'priceScore',
|
||||
hideInTable: expandTotalScore,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('priceScore', '价格分', record.priceScore, false, true)
|
||||
} else {
|
||||
return record.priceScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
title: (
|
||||
<span>
|
||||
综合得分
|
||||
<Text keyboard onClick={() => setExpandTotalScore(!expandTotalScore)} style={{ cursor: 'pointer', color: '#1890ff' }}>{expandTotalScore ? "展开" : "收起"}</Text>
|
||||
</span>
|
||||
),
|
||||
dataIndex: 'totalScore',
|
||||
width: 120,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('totalScore', '综合得分', record.totalScore, false, true)
|
||||
} else {
|
||||
return record.totalScore
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: defId === 'negotiation_single_simple',
|
||||
title: '是否通过初步评审',
|
||||
dataIndex: 'firstRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.firstRvwReason)
|
||||
},
|
||||
{
|
||||
hideInTable: type5 || defId === 'negotiation_single_simple',
|
||||
title: '是否通过详审',
|
||||
dataIndex: 'detailRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.detailRvwReason)
|
||||
},
|
||||
{
|
||||
hideInTable: type5 || defId === 'negotiation_single_simple',
|
||||
title: '应答是否有效',
|
||||
width: 80,
|
||||
dataIndex: 'answerValid',
|
||||
render: (_: any, record: any) => {
|
||||
return record.answerValid === 1 ? '是' : record.answerValid === 0 ? '否' : '-'
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '是否' + name1 + '候选人',
|
||||
dataIndex: 'winnerCandidate',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnSelect('winnerCandidate', record.winnerCandidate)
|
||||
} else {
|
||||
return record.winnerCandidate === 1 ? '是' : '否'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type5 || defId === 'negotiation_single_simple',
|
||||
title: '是否拟' + name1 + '人',
|
||||
width: 80,
|
||||
dataIndex: 'winnerBidder',
|
||||
render: (_: any, record: any) => {
|
||||
return record.winnerBidder === 1 ? '是' : record.winnerBidder === 0 ? '否' : '-'
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type3,
|
||||
title: '拟签约金额(不含增值税)(元)',
|
||||
width: 150,
|
||||
dataIndex: 'contractedMoney',
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return (
|
||||
<>
|
||||
{returnInput('contractedMoney', '拟签约金额', record.contractedMoney, false, true)}
|
||||
{returnInput('id', '供应商id', record.id, false, false, true)}
|
||||
{returnInput('resultId', '结果id', record.resultId, false, false, true)}
|
||||
{returnInput('companyId', '公司id', record.companyId, false, false, true)}
|
||||
{returnInput('companyName', '公司名称', record.companyName, false, false, true)}
|
||||
</>
|
||||
)
|
||||
} else {
|
||||
return record.contractedMoney
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
hideInTable: type4,
|
||||
title: '增值税金额(元)',
|
||||
width: 150,
|
||||
dataIndex: 'taxRatePrice',
|
||||
render: (_: any, record: any) => {
|
||||
if (defId === 'negotiation_single_simple' && record.pushStatus == "0") {
|
||||
return returnInput('taxRatePrice', '增值税金额', record.taxRatePrice, false, true)
|
||||
} else {
|
||||
return record.taxRatePrice
|
||||
}
|
||||
}
|
||||
},
|
||||
]
|
||||
return (
|
||||
<ProTable
|
||||
size={"small"}
|
||||
loading={pageloading}
|
||||
scroll={{ x: true }}
|
||||
search={false}
|
||||
options={false}
|
||||
columns={columns}
|
||||
dataSource={item1.reviewList}
|
||||
toolbar={{
|
||||
title: item1.againEvaluationSort == 'null' || isEmpty(item1.againEvaluationSort) ? null : `第${item1.againEvaluationSort}次重审`,
|
||||
}}
|
||||
rowKey="id"
|
||||
toolBarRender={(record: any) => [
|
||||
<>
|
||||
<Button
|
||||
hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase']) || defId != 'negotiation_single_simple' || item1.pushStatus == "1"}
|
||||
type="primary"
|
||||
disabled={spintype}
|
||||
onClick={async () => {
|
||||
setSpintype(true);
|
||||
await form.validateFields().then(async () => {
|
||||
await saveResult({
|
||||
id: form.getFieldValue("resultId"),
|
||||
suppliers: [
|
||||
{
|
||||
...form.getFieldsValue(),
|
||||
"winnerCandidate": form.getFieldValue("winnerCandidate") == '是' ? '1' : '0',
|
||||
"firstRvwResult": form.getFieldValue("firstRvwResult") == '是' ? '1' : '0',
|
||||
"detailRvwResult": form.getFieldValue("detailRvwResult") == '是' ? '1' : '0',
|
||||
"answerValid": form.getFieldValue("answerValid") == '是' ? '1' : '0',
|
||||
"winnerBidder": form.getFieldValue("winnerBidder") == '是' ? '1' : '0',
|
||||
}
|
||||
]
|
||||
}).then((res) => {
|
||||
if (res.success) { message.success('保存成功!') }
|
||||
})
|
||||
}).finally(() => setSpintype(false));
|
||||
}}
|
||||
>保存</Button>
|
||||
{
|
||||
defId === 'negotiation_single_simple' ?
|
||||
<Button
|
||||
hidden={
|
||||
btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase']) ||
|
||||
!item1.reviewList[0].price ||
|
||||
!item1.reviewList[0].priceReview
|
||||
}
|
||||
disabled={item1.pushStatus == "1" ? true : false} key={"1"}
|
||||
onClick={() => pushResult(item1)} type="primary" loading={spintype}>确认{name2}结果</Button>
|
||||
:
|
||||
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={item1.pushStatus == "1" ? true : false} key={"1"} onClick={() => pushResult(item1)} type="primary"> 确认{name2}结果 </Button>
|
||||
}
|
||||
<Button key={"2"} onClick={() => getResultList(item1)}>查看日志</Button>
|
||||
</>
|
||||
]}
|
||||
pagination={{
|
||||
defaultPageSize: 10,
|
||||
showSizeChanger: false,
|
||||
}}
|
||||
/>
|
||||
)
|
||||
}}
|
||||
>
|
||||
</List>
|
||||
</Panel>
|
||||
</Collapse>
|
||||
)}
|
||||
/>
|
||||
<Collapse activeKey={collapseActiveKeys} onChange={onCollapseChange} className="calibration-panel">
|
||||
{ListData.map((item, index) => (
|
||||
<Panel header={item.sectionName} key={index}>
|
||||
<ResultListRender item={item} setRefresh={() => { setRefresh(Refresh + 1); }} getResultList={getResultList} ListData={ListData} pushResult={pushResult} />
|
||||
</Panel>
|
||||
))}
|
||||
</Collapse>
|
||||
<CurrentTable assessRoomId={assessRoomId} ChangeNoticeListVisible={currentTable}
|
||||
onCancel={() => setCurrentTable(false)} />
|
||||
</Card>
|
||||
|
@ -0,0 +1,45 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { Collapse } from 'antd';
|
||||
import { getRiskSupplierList } from '../service';
|
||||
import { getRoomId, getSessionProjectData } from '@/utils/session';
|
||||
|
||||
interface ViewRiskSupplierModalProps {
|
||||
modalVisible: boolean;
|
||||
values: any;
|
||||
onCancel: any;
|
||||
}
|
||||
|
||||
const ViewRiskSupplierModal: React.FC<ViewRiskSupplierModalProps> = (props) => {
|
||||
|
||||
const [riskSupplierData, setRiskSupplierData] = useState({});
|
||||
|
||||
useEffect(() => {
|
||||
getRiskSupplierInfo();
|
||||
}, [])
|
||||
|
||||
const getRiskSupplierInfo = async () => {
|
||||
let roomId = getRoomId();//sessionStorage.getItem('roomId');//sessionStorage.getItem('roomId')
|
||||
let projectId = getSessionProjectData().id;
|
||||
|
||||
//黑名单
|
||||
await getRiskSupplierList(projectId, roomId).then((res) => {
|
||||
if (res.success == true && res.data.success==false) {
|
||||
setRiskSupplierData(res.data.data.result[0].regulationData[0].message);
|
||||
} else {
|
||||
setRiskSupplierData("暂无数据");
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Collapse >
|
||||
<Collapse.Panel header="风控中心-风险限定供应商" key="1">
|
||||
{riskSupplierData}
|
||||
</Collapse.Panel>
|
||||
</Collapse>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ViewRiskSupplierModal;
|
@ -1,72 +1,20 @@
|
||||
import React, { useState,useRef, useEffect } from 'react';
|
||||
import { Tabs,Table, Spin, message, Popconfirm,Card,Collapse, Modal, Button} from 'antd';
|
||||
import ProTable, { ActionType, ProColumns } from '@ant-design/pro-table';
|
||||
import React, { useState } from 'react';
|
||||
import ViewRishFormModal from './components/ViewRishFormModal';
|
||||
import ViewQuoteWarningFormModal from './components/ViewQuoteWarningFormModal';
|
||||
import { getRoomId, getSessionUserData } from '@/utils/session';
|
||||
import ViewBlacklistFormModal from './components/ViewBlacklistFormModal';
|
||||
import ViewReviewResultFormModal from './components/ViewReviewResultFormModal';
|
||||
import ViewJuryScoringRemindFormModal from './components/ViewJuryScoringRemindFormModal';
|
||||
import ViewJuryScoringAnalysisFormModal from './components/ViewJuryScoringAnalysisFormModal';
|
||||
import ViewRiskSupplierModal from './components/ViewRiskSupplierModal';
|
||||
import BidDocSmartCheckFormModal from './components/BidDocSmartCheckFormModal';
|
||||
|
||||
function callback(key) {
|
||||
//getSessionUserData.roleIds;
|
||||
}
|
||||
|
||||
const title2 = [
|
||||
{
|
||||
title: '序号',
|
||||
dataIndex: 'num',
|
||||
key: 'num',
|
||||
},
|
||||
{
|
||||
title: '投标人及报价',
|
||||
dataIndex: 'tbrbj',
|
||||
key: 'tbrbj',
|
||||
},
|
||||
{
|
||||
title: '预警信息',
|
||||
dataIndex: 'yjxx',
|
||||
key: 'yjxx',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
dataIndex: 'cz',
|
||||
key: 'cz',
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
|
||||
const columns: ProColumns<any>[] = [
|
||||
{ title: '序号', dataIndex: 'num', width: 50, },
|
||||
{ title: '供应商名称', dataIndex: 'gysmc', },
|
||||
{ title: 'IP地址',width: '20%', dataIndex: 'ip', },
|
||||
{ title: 'MAC地址', dataIndex: 'mac', },
|
||||
{ title: '上传时间', dataIndex: 'uploadTime',},
|
||||
];
|
||||
|
||||
const columnsMac: ProColumns<any>[] = [
|
||||
{ title: '序号', dataIndex: 'num', width: 50, },
|
||||
{ title: '供应商名称', dataIndex: 'gysmc', },
|
||||
{ title: '相同的MAC地址', dataIndex: 'mac', },
|
||||
];
|
||||
|
||||
const columns2: ProColumns<any>[] = [
|
||||
{ title: '序号', dataIndex: 'num', width: 50, },
|
||||
{ title: '投标人及报价', dataIndex: 'tbrbj', },
|
||||
{ title: '预警信息', dataIndex: 'yjxx', },
|
||||
{ title: '操作', dataIndex: '', },
|
||||
];
|
||||
|
||||
|
||||
const Sing: React.FC<{}> = () => {
|
||||
//ip mac
|
||||
const [ViewRishFormVisible, setViewRishFormVisible] = useState<any>(false);
|
||||
//查看详情窗口record
|
||||
const [ViewRishValues, setViewRishValues] = useState<any>({});
|
||||
|
||||
|
||||
//一致性
|
||||
const [ViewQuoteWarningFormVisible, setViewQuoteWarningFormVisible] = useState<any>(false);
|
||||
//查看详情窗口record
|
||||
@ -86,45 +34,45 @@ const Sing: React.FC<{}> = () => {
|
||||
const [ViewJuryScoringRemindFormVisible, setViewJuryScoringRemindFormVisible] = useState<any>(false);
|
||||
//查看详情窗口record
|
||||
const [ViewJuryScoringRemindValues, setViewJuryScoringRemindValues] = useState<any>({});
|
||||
|
||||
|
||||
//评审专家打分偏离度分析
|
||||
const [ViewJuryScoringAnalysisFormVisible, setViewJuryScoringAnalysisFormVisible] = useState<any>(false);
|
||||
//查看详情窗口record
|
||||
const [ViewJuryScoringAnalysisValues, setViewJuryScoringAnalysisValues] = useState<any>({});
|
||||
//风控中心-风险限定供应商
|
||||
const [BidRiskSupplierVisible, setBidRiskSupplierVisible] = useState<any>(false);
|
||||
//风控中心-风险限定供应商record
|
||||
const [BidRiskSupplierValues, setRiskSupplierValues] = useState<any>({});
|
||||
|
||||
//投标文件智能审查
|
||||
const [BidDocSmartCheckFormVisible, setBidDocSmartCheckFormVisible] = useState<any>(false);
|
||||
//查看详情窗口record
|
||||
const [BidDocSmartCheckValues, setBidDocSmartCheckValues] = useState<any>({});
|
||||
|
||||
|
||||
const getWarningList = async() => {
|
||||
}
|
||||
return (
|
||||
<>
|
||||
{
|
||||
ViewRishFormModal ? (
|
||||
<ViewRishFormModal
|
||||
modalVisible={ViewRishFormVisible}
|
||||
values={ViewRishValues}
|
||||
onCancel={() => {
|
||||
setViewRishFormVisible(!ViewRishFormVisible);
|
||||
setViewRishValues({});
|
||||
}}
|
||||
>
|
||||
</ViewRishFormModal>
|
||||
) : null
|
||||
}
|
||||
{
|
||||
ViewQuoteWarningFormModal ? (
|
||||
<ViewQuoteWarningFormModal
|
||||
modalVisible={ViewQuoteWarningFormVisible}
|
||||
values={ViewQuoteWarningValues}
|
||||
onCancel={() => {
|
||||
setViewQuoteWarningFormVisible(!ViewQuoteWarningFormVisible);
|
||||
setViewQuoteWarningValues({});
|
||||
}}
|
||||
>
|
||||
{
|
||||
ViewRishFormModal ? (
|
||||
<ViewRishFormModal
|
||||
modalVisible={ViewRishFormVisible}
|
||||
values={ViewRishValues}
|
||||
onCancel={() => {
|
||||
setViewRishFormVisible(!ViewRishFormVisible);
|
||||
setViewRishValues({});
|
||||
}}
|
||||
>
|
||||
</ViewRishFormModal>
|
||||
) : null
|
||||
}
|
||||
{
|
||||
ViewQuoteWarningFormModal ? (
|
||||
<ViewQuoteWarningFormModal
|
||||
modalVisible={ViewQuoteWarningFormVisible}
|
||||
values={ViewQuoteWarningValues}
|
||||
onCancel={() => {
|
||||
setViewQuoteWarningFormVisible(!ViewQuoteWarningFormVisible);
|
||||
setViewQuoteWarningValues({});
|
||||
}}
|
||||
>
|
||||
|
||||
</ViewQuoteWarningFormModal>
|
||||
) : null
|
||||
@ -193,6 +141,19 @@ const Sing: React.FC<{}> = () => {
|
||||
>
|
||||
</BidDocSmartCheckFormModal>
|
||||
) : null
|
||||
}
|
||||
{
|
||||
ViewRiskSupplierModal ? (
|
||||
<ViewRiskSupplierModal
|
||||
modalVisible={BidRiskSupplierVisible}
|
||||
values={BidRiskSupplierValues}
|
||||
onCancel={() => {
|
||||
setBidRiskSupplierVisible(!BidRiskSupplierVisible);
|
||||
setRiskSupplierValues({});
|
||||
}}
|
||||
>
|
||||
</ViewRiskSupplierModal>
|
||||
) : null
|
||||
}
|
||||
</>
|
||||
)
|
||||
|
@ -120,7 +120,16 @@ export async function replace(a: any,b: any,c: any){
|
||||
return a.replace(b,c);
|
||||
}
|
||||
|
||||
|
||||
//风险限定供应商
|
||||
export async function getRiskSupplierList(projectId: any, assessRoomId: any) {
|
||||
return request('/api/biz-service-ebtp-rsms/v1/riskcenter/querySupplierLimit', {
|
||||
method: 'post',
|
||||
data: {
|
||||
"assessRoomId": assessRoomId,
|
||||
"projectId": projectId
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -100,7 +100,7 @@ const FileDecode: React.FC<{}> = () => {
|
||||
if (JSON.stringify(record) == "{}") {
|
||||
return '';
|
||||
} else {
|
||||
const status = record?.registerInfoVOList[0].decryptStatus;
|
||||
const status = record?.quoteOrOther == "1" ? record?.registerInfoVOList[0].decryptOtherStatus : record?.registerInfoVOList[0].decryptStatus;
|
||||
if (status == null || status === '1') { return '未解密' }
|
||||
else if (status === '2') { return '解密成功' }
|
||||
else if (status === '3') { return '解密失败' }
|
||||
@ -124,7 +124,7 @@ const FileDecode: React.FC<{}> = () => {
|
||||
title: '操作', width: 80,
|
||||
render: (_: any, record: any) => {
|
||||
if (JSON.stringify(record) !== "{}" && jm) {
|
||||
const status = record?.registerInfoVOList[0].decryptStatus;
|
||||
const status = record?.quoteOrOther == "1" ? record?.registerInfoVOList[0].decryptOtherStatus : record?.registerInfoVOList[0].decryptStatus;
|
||||
if (record?.decryptEndDate !== '' && record?.decryptEndDate !== null && status !== '2') {
|
||||
return <Button type='primary' disabled={dis} onClick={async () => {
|
||||
spinSet(true); disSet(true);
|
||||
|
@ -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<string>('');
|
||||
//评审报告附件列表
|
||||
const [reportFileList, setReportFileList] = useState<any[]>([]);
|
||||
//风控弹窗 2022.7.27 zhoujianlong
|
||||
const [riskVisible, setRiskVisible] = useState<boolean>(false);
|
||||
//风控数据 2022.7.27 zhoujianlong
|
||||
const [riskData, setRiskData] = useState<any[]>([]);
|
||||
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 && <RiskPreventionSoft
|
||||
modalVisible={riskVisible}
|
||||
onCancel={() => {
|
||||
setRiskVisible(false);
|
||||
setRiskData([]);
|
||||
}}
|
||||
onSubmit={() => submit()}
|
||||
data={riskData}
|
||||
/>}
|
||||
</Card>
|
||||
</Spin>
|
||||
</>
|
||||
|
@ -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,
|
||||
});
|
||||
}
|
||||
|
@ -1,19 +0,0 @@
|
||||
import React, { useEffect,useState } from 'react';
|
||||
import {} from '@/utils/CommonUtils'
|
||||
|
||||
|
||||
const BidOpeningFormModal: React.FC<{}> = () =>{
|
||||
|
||||
useEffect(() => {
|
||||
window.open("../bidOpening/bidOpening.html?roomType=2");
|
||||
},[])
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
</>
|
||||
//<div dangerouslySetInnerHTML={{ __html: '<!DOCTYPE html><html lang="en"><script type="text/javascript"src="../jquery.js"></script><head><meta charset="UTF-8"><title>开标大厅-招标采购中心</title><link href="css/bidOpening.css"rel="stylesheet"type="text/css"></head><body><!--内容区--><div><!--红头--><div class="headerArea"><img src="images/logo.svg"alt=""width="30"class="headerPic"/><h2>中国联通智慧供应链平台|招标采购中心</h2></div><!--<!--开标大厅--><div class="openMeeting"><!--上部--><div class="meetingTop"><!--当前时间--><div class="bidLeft"><p>当前时间:</p><p id="dateTime"><span></span>/<span></span>/<span></span><span></span>:<span></span>:<span></span></p></div><!--<div class="tableBlock"><table class="bidOpeningTable"cellpadding="0"cellspacing="0"><thead><tr><th width="10%">序号</th><th width="20%">标段名称</th><th width="15%">标段编号</th><th width="15%">开标时间</th><th width="10%">开标状态</th><th width="*">操作</th></tr></thead><tbody id="dataDev"><tr style="height: 0px;"><th width="10%"></th><th width="21%"></th><th width="15%"></th><th width="15%"></th><th width="10%"></th><th width="*"></th></tr></tbody></table></div></div><!--<!--下部--><div class="meetingBottom"><img src="images/elementPic.png"alt=""/></div><!--</div><!--</div><!--<script>var tpId="1111111";$.ajax({url:"http://10.242.31.158:8100/biz-service-ebtp-opening/v1/bizbidopenroom/openRoomList/"+tpId,data:{pageNo:"1",pageSize:"100",roomType:"2"},type:"GET",success:function(re){var list=re.data.records;var tr="";for(var i=0;i<list.length;i++){tr=tr+"<tr>";tr=tr+"<td>"+(i+1)+"</td>";tr=tr+"<td>"+(list[i].sectionName)+"</td>";tr=tr+"<td>"+(list[i].sectionNo)+"</td>";tr=tr+"<td>"+(list[i].opingTime)+"</td>";tr=tr+"<td>"+(getRoomStateValue(list[i].roomState))+"</td>";tr=tr+"<td>";if(list[i].roomState>0){tr=tr+"<button type="button" onClick=onClickToOpenRoom("+list[i].id+","+list[i].turnSort+","+list[i].roomType+","+list[i].roomState+") class="bidBtn01">在线唱标</button>"}tr=tr+"<button type="button" onClick=onClickDown("+list[i].sectionId+") class="bidBtn02">导出投标记录</button></td>";tr=tr+"</tr>"}$("#dataDev").html("");$("#dataDev").append("<tr style="height: 0px;" id="dataTr"></tr>");$("#dataTr").append("<th width="10%"></th>").append("<th width="21%"></th>").append("<th width="15%"></th>").append("<th width="15%"></th>").append("<th width="10%"></th>").append("<th width="*"></th>");$("#dataDev").append(tr)}});function getRoomStateValue(state){var value="";if(state=="0"){value="未开标"}if(state=="1"){value="开标"}if(state=="2"){value="唱标"}if(state=="3"){value="唱标结束"}if(state=="4"){value="取消开标"}return value}function time(){var date=new Date();var n=date.getFullYear();var y=date.getMonth()+1;y=y<10?"0"+y:y;var t=date.getDate();t=t<10?"0"+t:t;var h=date.getHours();h=h<10?"0"+h:h;var m=date.getMinutes();m=m<10?"0"+m:m;var s=date.getSeconds();s=s<10?"0"+s:s;$("#dateTime span").eq(0).html(n);$("#dateTime span").eq(1).html(y);$("#dateTime span").eq(2).html(t);$("#dateTime span").eq(3).html(h);$("#dateTime span").eq(4).html(m);$("#dateTime span").eq(5).html(s);for(var i=0;i<$("#dateTime").length;i++){if($("div").eq(i).text().length==1){$("div").eq(i).html(function(index,html){return 0+html})}}}time();setInterval(time,1000);function onClickToOpenRoom(aa,bb,roomType,roomState){if(roomState>0){window.open("http://10.242.31.158:18022/room/index?aa="+aa+"&bb="+bb+"&roomType="+roomType)}}function onClickDown(bsId){window.open("http://10.242.31.158:8100/biz-service-ebtp-opening/v1/bizbidopenroom/exportTenderRecords/"+bsId)}</script></body></html>' }} />
|
||||
);
|
||||
};
|
||||
|
||||
export default BidOpeningFormModal;
|
@ -242,7 +242,7 @@ const Sing: React.FC<{}> = () => {
|
||||
<div className='xsy-headerDiv pd24'>
|
||||
<h3 className="first-title floatLeft">{showNameT.kb}列表</h3>
|
||||
<div className='xsy-rightDiv-struct'>
|
||||
<Button type="primary" onClick={() => window.open(`../bidOpening/bidOpening.html?&roomType=${roomType}`)}>虚拟大厅</Button>
|
||||
<Button type="primary" onClick={() => window.open(`/bidOpening/bidOpening.html?&roomType=${roomType}`)}>虚拟大厅</Button>
|
||||
</div>
|
||||
</div>
|
||||
<ProTable
|
||||
|
@ -699,9 +699,12 @@ const Room: React.FC<{}> = () => {
|
||||
|
||||
//解密时限
|
||||
function onOkJmsx(value: any) {
|
||||
endTimeSet(value.format('yyyy-MM-DD HH:mm:ss'));
|
||||
// endTimeSet(value.format('yyyy-MM-DD HH:mm:ss'));
|
||||
setTime.current = value.format('yyyy-MM-DD HH:mm:ss');
|
||||
}
|
||||
const [sxLoading, sxLoadingSet] = useState<boolean>(false);
|
||||
//设置解密时限存储
|
||||
const setTime = useRef<string>('')
|
||||
const jmTime = () => {
|
||||
return (
|
||||
<Modal
|
||||
@ -715,14 +718,14 @@ const Room: React.FC<{}> = () => {
|
||||
onCancel={() => { jmTimeVisSet(false); }}
|
||||
onOk={async () => {
|
||||
sxLoadingSet(true);
|
||||
if (endTime != '') {
|
||||
await endTimeConfig({ id: tdocId, decryptEndDate: endTime });
|
||||
if (setTime.current != '') {
|
||||
await endTimeConfig({ id: tdocId, decryptEndDate: setTime.current });
|
||||
jmTimeVisSet(false);
|
||||
countSet(count + 1);
|
||||
} else {
|
||||
message.error('您未设置解密截止时间')
|
||||
}
|
||||
sxLoadingSet(false);
|
||||
countSet(count + 1);
|
||||
}}
|
||||
>
|
||||
<Spin spinning={sxLoading}>
|
||||
@ -733,7 +736,7 @@ const Room: React.FC<{}> = () => {
|
||||
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
|
||||
// disabled={disabled}
|
||||
showNow={false}
|
||||
onOk={onOkJmsx}
|
||||
onChange={onOkJmsx}
|
||||
/>
|
||||
</Spin>
|
||||
</Modal>
|
||||
|
@ -4,7 +4,7 @@ import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table';
|
||||
import { proTableValueEnum, returnDictVal } from '@/utils/CommonUtils';
|
||||
import { getPage, queryEntrust } from './service';
|
||||
import './styles.less';
|
||||
import { getDicData, getSessionUserData } from '@/utils/session';
|
||||
import { getDicData, getSessionRoleData, getSessionUserData } from '@/utils/session';
|
||||
|
||||
const entrust: React.FC<{}> = () => {
|
||||
const modalHeight = window.innerHeight * 96 / 100;
|
||||
@ -20,6 +20,7 @@ const entrust: React.FC<{}> = () => {
|
||||
const [form] = Form.useForm();
|
||||
//人员信息
|
||||
const userData = getSessionUserData();
|
||||
const roleData = getSessionRoleData();
|
||||
//protable actionRef
|
||||
const actionRef = useRef<ActionType>();
|
||||
//显隐 查看及分派弹窗
|
||||
@ -390,11 +391,11 @@ const entrust: React.FC<{}> = () => {
|
||||
...params,
|
||||
basePageRequest: { pageNo: pageData.pageNo, pageSize: pageData.pageSize },
|
||||
}
|
||||
if (userData?.roleIds == 'ebtp-purchase') {//采购经理
|
||||
if (roleData?.roleCode == 'ebtp-purchase') {//采购经理
|
||||
req['purchasingManager'] = userData?.userId
|
||||
} else if (userData?.roleIds == 'ebtp-agency-admin') {//代理机构业务管理员
|
||||
} else if (roleData?.roleCode == 'ebtp-agency-admin') {//代理机构业务管理员
|
||||
req['agencyCompany'] = userData?.organizationId
|
||||
} else if (userData?.roleIds == 'ebtp-agency-project-manager') {//代理机构业务经理 项目经理
|
||||
} else if (roleData?.roleCode == 'ebtp-agency-project-manager') {//代理机构业务经理 项目经理
|
||||
req['projectManager'] = userData?.userId
|
||||
} else {
|
||||
return []
|
||||
|
99
src/utils/RiskPreventionSoft/index.tsx
Normal file
99
src/utils/RiskPreventionSoft/index.tsx
Normal file
@ -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<any>;
|
||||
}
|
||||
|
||||
const modalHeight = window.innerHeight * 96 / 100;
|
||||
|
||||
/**
|
||||
* 风险防控通用(软控)
|
||||
* @param props
|
||||
* @returns
|
||||
*/
|
||||
const RiskPreventionSoft: React.FC<RiskPreventionSoftProps> = (props) => {
|
||||
const { modalVisible, onCancel, onSubmit, data } = props;
|
||||
|
||||
const columns: ProColumns<any[]>[] = [
|
||||
{
|
||||
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 (
|
||||
<Modal
|
||||
destroyOnClose
|
||||
title="风控中心校验结果"
|
||||
visible={modalVisible}
|
||||
width={'60%'}
|
||||
style={{ maxHeight: modalHeight }}
|
||||
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', padding: '8px 24px 16px' }}
|
||||
centered
|
||||
onCancel={() => onCancel()}
|
||||
onOk={() => {
|
||||
onSubmit();
|
||||
onCancel();
|
||||
}}
|
||||
>
|
||||
<div>
|
||||
<Tag icon={<ExclamationCircleOutlined />} color="warning" className="risk-top-tag">
|
||||
当前业务操作受以下风控规则限制
|
||||
</Tag>
|
||||
{data.map(ite => ite?.result.map((item: any) => (
|
||||
<div>
|
||||
<div className="risk-table-title">
|
||||
<span className="table-scene-name">场景名称:<span>{item.sceneName}</span></span>
|
||||
<span>{item.publishDepartName}</span>
|
||||
</div>
|
||||
<ProTable<any>
|
||||
columns={columns}
|
||||
dataSource={item.regulationData}
|
||||
rowKey="regulationId"
|
||||
size='small'
|
||||
pagination={false}
|
||||
toolBarRender={false}
|
||||
search={false}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
))}
|
||||
</div>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
|
||||
export default RiskPreventionSoft;
|
19
src/utils/RiskPreventionSoft/riskStyle.less
Normal file
19
src/utils/RiskPreventionSoft/riskStyle.less
Normal file
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user