线下评审
This commit is contained in:
@ -40,8 +40,8 @@ export default [//评标
|
||||
},
|
||||
//评审结果-线下评审-项目经理
|
||||
{
|
||||
path: '/EvaRoom/Evaluation/projectManager/ReviewResults/ManagerEntry',
|
||||
component: './Evaluation/projectManager/ReviewResults/ManagerEntry',
|
||||
path: '/EvaRoom/Evaluation/projectManager/ReviewResults/ManagerOffline',
|
||||
component: './Evaluation/projectManager/ReviewResults/ManagerOffline',
|
||||
},
|
||||
//评审结果-组长
|
||||
{
|
||||
|
@ -1,14 +1,15 @@
|
||||
import { getReviewResult, unlockReportIF, unlockResult } from '@/pages/Evaluation/expert/ReviewResults/GroupLeader/service';
|
||||
import { getDictName, isEmpty, isNotEmpty } from '@/utils/CommonUtils';
|
||||
import ProTable from '@ant-design/pro-table';
|
||||
import { Button, Card, Col, Collapse, message, Modal, Popover, Row, Space, Spin, Typography } from 'antd';
|
||||
import { Button, Card, Col, Collapse, message, Modal, Popover, Row, Space, Spin, Typography, Checkbox } from 'antd';
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
import Weboffice from "@/pages/webOffice/weboffice";
|
||||
import { finishFlow, getAssessRoomStatus, queryReviewReport, reviewReportSave, reviewReportSend } from '../../service';
|
||||
import { finishFlow, getAssessRoomStatus, queryReviewReport, reviewReportSave, reviewReportSend, saveSignPdfReport } from '../../service';
|
||||
import { commonMessage } from '@/utils/MessageUtils';
|
||||
import { getDefId, getDicData, getProMethod, getRoomId, getSessionRoleData } from '@/utils/session';
|
||||
import { btnAuthority } from '@/utils/authority';
|
||||
import WebOffice0609, { WebOfficeRefProps } from '@/pages/webOffice/weboffice0609';
|
||||
import PdfModal from '@/utils/PdfModal/PdfModal';
|
||||
import ReviewReportUpload from '@/utils/ReviewReportUpload';
|
||||
import { getFileListByBid } from '@/utils/DownloadUtils';
|
||||
import MACAddressPrompt from '@/pages/Evaluation/BidControl/BidControlManager/components/MACAddressPrompt';
|
||||
@ -33,7 +34,7 @@ const Manager: React.FC = () => {
|
||||
//评审 报告 数据
|
||||
const [resultReportData, setResultReportData] = useState<any>({});
|
||||
//评审报告按钮点击禁用状态
|
||||
const [reviewReport, setReviewReport] = useState<boolean | null>(null);
|
||||
const [reviewReport, setReviewReport] = useState<string>('');
|
||||
//评审室
|
||||
const [evaluationRoom, setEvaluationRoom] = useState<any>({});
|
||||
//获取字典
|
||||
@ -49,14 +50,18 @@ const Manager: React.FC = () => {
|
||||
const defId = getDefId();
|
||||
//表头
|
||||
const [column, setColumn] = useState<any[]>([]);
|
||||
//是否点击保存
|
||||
const [saveFlag, setSaveFlag] = useState<boolean>(false);
|
||||
//资格审查方式
|
||||
const [ptcpMode, setPtcpMode] = useState<string>();
|
||||
//评审结果状态
|
||||
const [reviewResultStatus, setReviewResultStatus] = useState<string>();
|
||||
//报价类型 %-百分比类型(折扣率,优惠率)元-数值类型(总价,单价)
|
||||
const [quotationMethod, setQuotationMethod] = useState<string>('元');
|
||||
//评审报告-专家在线签名选择
|
||||
const [signatureSelect, setSignatureSelect] = useState<boolean>(false);
|
||||
//评审报告-PDF弹窗控制
|
||||
const [pdfModalVisible, setPdfModalVisible] = useState<boolean>(false);
|
||||
//评审报告-生成文档
|
||||
const [generatingLoading, setGeneratingLoading] = useState<boolean>(false);
|
||||
//初始化显示字段
|
||||
const candidateType = bidMethodDict == 'procurement_mode_1' || bidMethodDict == 'procurement_mode_2' ? '中标' : '中选';//初始化中标中选字段
|
||||
//评审报告附件modal visible
|
||||
@ -517,6 +522,7 @@ const Manager: React.FC = () => {
|
||||
const roleType = 3;
|
||||
|
||||
const [docFileCode, setDocFileCode] = useState<string>('');//文档id
|
||||
const [pdfFileCode, setPdfFileCode] = useState<string>('');//pdf文档id
|
||||
const [ids, setIds] = useState<string>('');//评审报告id
|
||||
const [docReadOnly] = useState<string>("false");//是否可编辑
|
||||
const [docSaveBtn] = useState<string>("compact");//保存按钮是否展示
|
||||
@ -555,11 +561,14 @@ const Manager: React.FC = () => {
|
||||
let data = res.data;
|
||||
setResultReportData(data);
|
||||
setDocFileCode(isEmpty(data.reportTextId) ? '' : data.reportTextId);
|
||||
setPdfFileCode(isEmpty(data.signDocId) ? '' : data.signDocId)
|
||||
setReportUploadId(isEmpty(data?.annexId) ? '' : data?.annexId)
|
||||
getFileList(data?.annexId)//获取文件列表
|
||||
setIds(data?.id)
|
||||
setExpertTableData(data.expertList);
|
||||
setReviewReport(String(data.status) === '0');
|
||||
setReviewReport(String(data.status));
|
||||
setSignatureSelect(String(data.signStatus) == '1')
|
||||
setIds(data?.id)
|
||||
}
|
||||
})
|
||||
//查询评审室状态
|
||||
@ -625,7 +634,7 @@ const Manager: React.FC = () => {
|
||||
|
||||
|
||||
const verificationOffice = () => {
|
||||
if (ref.current?.DocFileCode == '') {
|
||||
if (ref.current?.DocFileCode == '' || ref.current?.PDFFileCode == '') {
|
||||
message.warn("您未编辑office文件!");
|
||||
return false;
|
||||
}
|
||||
@ -637,28 +646,44 @@ const Manager: React.FC = () => {
|
||||
const saveReport = () => {
|
||||
if (verificationOffice()) {
|
||||
let reportTextId = ref.current?.DocFileCode;
|
||||
let signDocId = ref.current?.PDFFileCode;
|
||||
let params = {
|
||||
id: resultReportData.id,
|
||||
reportTextId: reportTextId,
|
||||
signDocId: signDocId,
|
||||
annexId: reportUploadId
|
||||
}
|
||||
reviewReportSave(params).then(res => {
|
||||
let flag = commonMessage(res);
|
||||
setSaveFlag(flag);
|
||||
init();
|
||||
commonMessage(res);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 评审报告-专家在线签名onChange
|
||||
* @param event
|
||||
*/
|
||||
const onSignatureChange = (event: any) => {
|
||||
setSignatureSelect(event.target.checked)
|
||||
}
|
||||
|
||||
//生成pdf报告
|
||||
const toSignPdfReport = () => {
|
||||
setGeneratingLoading(true)
|
||||
saveSignPdfReport(resultReportData.id).then(res => {
|
||||
commonMessage(res);
|
||||
init();
|
||||
}).finally(() => {
|
||||
setGeneratingLoading(false)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送专家确认
|
||||
*/
|
||||
const sendExpertConfirmation = () => {
|
||||
if (verificationOffice()) {
|
||||
if (!saveFlag) {
|
||||
message.warn('请先点击保存按钮,才能发送专家确认');
|
||||
return;
|
||||
}
|
||||
reviewReportSend(resultReportData.id).then(res => {
|
||||
reviewReportSend(resultReportData.id,{signStatus: signatureSelect ? '1' : '0'}).then(res => {
|
||||
commonMessage(res);
|
||||
init();
|
||||
})
|
||||
@ -769,62 +794,33 @@ const Manager: React.FC = () => {
|
||||
<Row justify="end" style={{ marginBottom: '8px' }}>
|
||||
<Col>
|
||||
<Space>
|
||||
<Checkbox key="signcheck" onChange={onSignatureChange} checked={signatureSelect} disabled={reviewReport != '0'}>专家在线签名</Checkbox>
|
||||
{/* <Button type="primary" disabled={!reviewReport} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} onClick={saveReport}>保存</Button> */}
|
||||
{!reviewReport && reportFileList.length == 0 ? null : <Button key="upload" onClick={() => setReportUploadVisible(true)}>{!reviewReport ? '查看附件' : '上传附件'}</Button>}
|
||||
<Button type="primary" disabled={!reviewReport} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} onClick={saveReport}>保存</Button>
|
||||
{/* <Button type="primary" disabled={!reviewReport} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} onClick={saveReport}>保存</Button> */}
|
||||
{/* <Button type="primary" disabled={!reviewReport} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])}>更换模板</Button> */}
|
||||
<Button type="primary" disabled={!reviewReport} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} onClick={sendExpertConfirmation}>发送专家确认</Button>
|
||||
<Button type="primary" key="report" disabled={reviewReport != '2'} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} loading={generatingLoading} onClick={() => toSignPdfReport()}>{signatureSelect ? '生成签名文档' : '生成报告文档'}</Button>
|
||||
<Button type="primary" key="confirm" disabled={reviewReport != '0'} hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} onClick={sendExpertConfirmation}>发送专家确认</Button>
|
||||
</Space>
|
||||
</Col>
|
||||
</Row>
|
||||
{
|
||||
reviewReport !== null && (
|
||||
<>
|
||||
{
|
||||
reviewReport ? (
|
||||
<Card style={{ textAlign: "center" }}>
|
||||
{
|
||||
ids != '' && isNotEmpty(evaluationRoom?.id) ? (
|
||||
// <Weboffice
|
||||
// memberBtnName="编辑"
|
||||
// readonly={"false"}
|
||||
// btnStyle={docSaveBtn}
|
||||
// btnName={"保存"}
|
||||
// DocfileCode={docFileCode}
|
||||
// ref={WebofficeRef}
|
||||
// onRef={onRef}
|
||||
// />
|
||||
<WebOffice0609
|
||||
readOnly={false}
|
||||
DOCFileCode={docFileCode}
|
||||
webOfficeRef={ref}
|
||||
fileName={`${evaluationRoom.sectionName}-${evaluationRoom.sectionNum}-${evaluationRoom.roomType == 1 ? '预审' : ''}评审报告${defId == 'recruit_multi' ? `第${evaluationRoom.roomSort}轮` : ''}${evaluationRoom.reviewMark == 1 ? `(第${evaluationRoom.reviewSort}次重新评审)` : ''}`}
|
||||
/>
|
||||
) : null
|
||||
}
|
||||
</Card>
|
||||
) : (
|
||||
<Card style={{ textAlign: "center" }}>
|
||||
{ids !== '' ? (
|
||||
// <Weboffice
|
||||
// memberBtnName="查看"
|
||||
// readonly={'true'}
|
||||
// btnStyle={docSaveBtn}
|
||||
// DocfileCode={docFileCode}
|
||||
// ref={WebofficeRef}
|
||||
// onRef={onRef}
|
||||
// />
|
||||
<WebOffice0609
|
||||
readOnly={true}
|
||||
DOCFileCode={docFileCode}
|
||||
webOfficeRef={ref}
|
||||
/>
|
||||
) : null}
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
</>
|
||||
)
|
||||
}
|
||||
<Card style={{ textAlign: "center" }}>
|
||||
{
|
||||
reviewReport != '3' ? (ids != '' && isNotEmpty(evaluationRoom?.id) ? (
|
||||
<WebOffice0609
|
||||
readOnly={reviewReport != '0'}
|
||||
DOCFileCode={docFileCode}
|
||||
PDFFileCode={pdfFileCode}
|
||||
webOfficeRef={ref}
|
||||
afterSaveFunc={saveReport}
|
||||
savePDF={true}
|
||||
fileName={`${evaluationRoom.sectionName}-${evaluationRoom.sectionNum}-${evaluationRoom.roomType == 1 ? '预审' : ''}评审报告${defId == 'recruit_multi' ? `第${evaluationRoom.roomSort}轮` : ''}${evaluationRoom.reviewMark == 1 ? `(第${evaluationRoom.reviewSort}次重新评审)` : ''}`}
|
||||
/>
|
||||
) : null) : (
|
||||
<span>评审报告已生成,点击 <Button size="small" key="viewReport" onClick={() => setPdfModalVisible(true)}>查看评审报告</Button> 即可查看和下载评审报告文档</span>
|
||||
)
|
||||
}
|
||||
</Card>
|
||||
|
||||
</Panel>
|
||||
|
||||
@ -836,11 +832,12 @@ const Manager: React.FC = () => {
|
||||
<Row justify="end">
|
||||
<Col>
|
||||
<Button style={{ margin: '6px 5px 5px 0px' }}
|
||||
disabled={!(reviewResultStatus == "2" && resultReportData.status == '2' && evaluationRoom.status == '2')}
|
||||
disabled={!(reviewResultStatus == "2" && resultReportData.status == '3' && evaluationRoom.status == '2')}
|
||||
hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])}
|
||||
type="primary" onClick={endOfBidEvaluation}>结束评审</Button>
|
||||
</Col>
|
||||
</Row>
|
||||
{pdfModalVisible && <PdfModal modalVisible={pdfModalVisible} fileId={resultReportData.signDocId} onCancel={() => setPdfModalVisible(false)} downLoadFileName="评审报告"/>}
|
||||
{reportUploadVisible && <ReviewReportUpload
|
||||
modalVisible={reportUploadVisible}
|
||||
onCancel={(value?: string) => {
|
||||
|
@ -0,0 +1,749 @@
|
||||
import { getReviewResult, unlockReportIF, unlockResult } from '@/pages/Evaluation/expert/ReviewResults/GroupLeader/service';
|
||||
import { getDictName, getURLInformation, isEmpty, isNotEmpty } from '@/utils/CommonUtils';
|
||||
import ProTable from '@ant-design/pro-table';
|
||||
import { Button, Card, Col, Collapse, message, Modal, Popover, Row, Space, Spin, Typography, Checkbox, Upload, Form } from 'antd';
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
import Weboffice from "@/pages/webOffice/weboffice";
|
||||
import { finishFlow, getAssessRoomStatus, queryReviewReport, reviewReportSave, reviewReportSend, saveSignPdfReport } from '../../service';
|
||||
import { commonMessage } from '@/utils/MessageUtils';
|
||||
import { getDefId, getDicData, getProMethod, getRoomId, getSessionRoleData, getSessionUserData, getUserToken } from '@/utils/session';
|
||||
import { btnAuthority } from '@/utils/authority';
|
||||
import WebOffice0609, { WebOfficeRefProps } from '@/pages/webOffice/weboffice0609';
|
||||
import PdfModal from '@/utils/PdfModal/PdfModal';
|
||||
import ReviewReportUpload from '@/utils/ReviewReportUpload';
|
||||
import { getFileListByBid } from '@/utils/DownloadUtils';
|
||||
import MACAddressPrompt from '@/pages/Evaluation/BidControl/BidControlManager/components/MACAddressPrompt';
|
||||
import RiskModal from '@/components/RiskModal';
|
||||
import { isLeaderConfirm } from '@/components/BiddingRoom/service';
|
||||
import FileDown from '@/utils/Download';
|
||||
import ExtendUpload from '@/utils/ExtendUpload';
|
||||
|
||||
const { Panel } = Collapse;
|
||||
const { Paragraph, Text } = Typography;
|
||||
|
||||
const firstRvwResult = ['否', '是'];
|
||||
const winnerCandidate = ['否', '是'];
|
||||
/**
|
||||
* 项目经理
|
||||
*/
|
||||
const Manager: React.FC = () => {
|
||||
//供应商table数据
|
||||
const [supplierTableData, setSupplierTableData] = useState<any[]>([]);
|
||||
//评审结果加载
|
||||
const [resultReviewLoading, setResultReviewLoading] = useState<boolean>(false);
|
||||
//专家确认情况table数据
|
||||
const [expertTableData, setExpertTableData] = useState<any[]>([]);
|
||||
//评审 报告 数据
|
||||
const [resultReportData, setResultReportData] = useState<any>({});
|
||||
//评审报告按钮点击禁用状态
|
||||
const [reviewReport, setReviewReport] = useState<string>('');
|
||||
//评审室
|
||||
const [evaluationRoom, setEvaluationRoom] = useState<any>({});
|
||||
//获取字典
|
||||
const getDict: any = getDicData();
|
||||
const dictData = JSON.parse(getDict);
|
||||
//1预审 2后审
|
||||
const [roomType, setRoomType] = useState<string>("2");
|
||||
//1预审名(资审) 2后审名(评审)
|
||||
const [roomTypeName, setRoomTypeName] = useState<string>("");
|
||||
//采购方式
|
||||
const bidMethodDict = getProMethod();
|
||||
//流程id
|
||||
const defId = getDefId();
|
||||
//表头
|
||||
const [column, setColumn] = useState<any[]>([]);
|
||||
//资格审查方式
|
||||
const [ptcpMode, setPtcpMode] = useState<string>();
|
||||
//评审结果状态
|
||||
const [reviewResultStatus, setReviewResultStatus] = useState<string>();
|
||||
//报价类型 %-百分比类型(折扣率,优惠率)元-数值类型(总价,单价)
|
||||
const [quotationMethod, setQuotationMethod] = useState<string>('元');
|
||||
//评审报告-专家在线签名选择
|
||||
const [signatureSelect, setSignatureSelect] = useState<boolean>(false);
|
||||
//评审报告-PDF弹窗控制
|
||||
const [pdfModalVisible, setPdfModalVisible] = useState<boolean>(false);
|
||||
//评审报告-生成文档
|
||||
const [generatingLoading, setGeneratingLoading] = useState<boolean>(false);
|
||||
//初始化显示字段
|
||||
const candidateType = bidMethodDict == 'procurement_mode_1' || bidMethodDict == 'procurement_mode_2' ? '中标' : '中选';//初始化中标中选字段
|
||||
//评审报告附件modal visible
|
||||
const [reportUploadVisible, setReportUploadVisible] = useState<boolean>(false);
|
||||
//评审报告附件id
|
||||
const [reportUploadId, setReportUploadId] = useState<string>('');
|
||||
//评审报告附件列表
|
||||
const [reportFileList, setReportFileList] = useState<any[]>([]);
|
||||
//专家打分表附件列表
|
||||
const [offlineReviewFile, setOfflineReviewFile] = useState<string>('');
|
||||
//其他文件附件列表
|
||||
const [offlineOtherFile, setOfflineOtherFile] = useState<string>('');
|
||||
//评审结果编辑综合得分展开关闭
|
||||
const [expandTotalScore, setExpandTotalScore] = useState<boolean>(true);
|
||||
//评审结果数据
|
||||
const [resultData, resultDataSet] = useState<any>({})
|
||||
//风险提示文字弹窗控制
|
||||
const [riskVisible, setRiskVisible] = useState(false);
|
||||
//获取角色
|
||||
const role = getSessionRoleData().roleCode;
|
||||
useEffect(() => {
|
||||
if (JSON.stringify(resultData) === '{}') {
|
||||
init();
|
||||
}
|
||||
getColumns()
|
||||
}, [expandTotalScore, resultData]);
|
||||
|
||||
//初审详审原因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 columns: any[] = [
|
||||
{
|
||||
title: '排名',
|
||||
fixed: 'left',
|
||||
width: 50,
|
||||
dataIndex: 'sort',
|
||||
},
|
||||
{
|
||||
title: '供应商名称',
|
||||
dataIndex: 'companyName',
|
||||
width: 110,
|
||||
render: (_: any, record: any) => {
|
||||
if (record.problemInfoList != null) {
|
||||
let count = 0;
|
||||
record.problemInfoList.forEach((ele: any) => {
|
||||
if (ele.problemType == 1) {//MAC地址重复
|
||||
count += 1;
|
||||
}
|
||||
});
|
||||
if (count > 0) {
|
||||
return (
|
||||
<>
|
||||
{_}
|
||||
{<MACAddressPrompt type='other' companyName={_} />}
|
||||
</>
|
||||
)
|
||||
}
|
||||
return _;
|
||||
}
|
||||
return _;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: `报价(${quotationMethod})`,
|
||||
dataIndex: 'price',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: `评审价(${quotationMethod})`,
|
||||
dataIndex: 'priceReview',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '商务分',
|
||||
dataIndex: 'businessScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '技术分',
|
||||
dataIndex: 'technicalScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '服务分',
|
||||
dataIndex: 'serviceScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '价格分',
|
||||
dataIndex: 'priceScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: (
|
||||
<span>
|
||||
综合得分
|
||||
<Text keyboard onClick={() => setExpandTotalScore(!expandTotalScore)} style={{ cursor: 'pointer', color: '#1890ff' }}>{expandTotalScore ? "展开" : "收起"}</Text>
|
||||
</span>
|
||||
),
|
||||
dataIndex: 'totalScore',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '是否通过初步评审',
|
||||
dataIndex: 'firstRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.firstRvwReason)
|
||||
},
|
||||
{
|
||||
title: '是否通过详审',
|
||||
dataIndex: 'detailRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.detailRvwReason)
|
||||
},
|
||||
{
|
||||
title: '应答是否有效',
|
||||
dataIndex: 'answerValid',
|
||||
valueType: 'text',
|
||||
width: 100,
|
||||
valueEnum: {
|
||||
0: { text: '否' },
|
||||
1: { text: '是' },
|
||||
},
|
||||
},
|
||||
{
|
||||
title: `是否${candidateType}候选人`,
|
||||
width: 120,
|
||||
dataIndex: 'winnerCandidate',
|
||||
render: (_: any, record: any) => winnerCandidate[_]
|
||||
},
|
||||
{
|
||||
title: `是否拟${candidateType}人`,
|
||||
dataIndex: 'winnerBidder',
|
||||
valueType: 'text',
|
||||
width: 120,
|
||||
valueEnum: {
|
||||
0: { text: '否' },
|
||||
1: { text: '是' },
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '拟签约金额(不含增值税)(元)',
|
||||
width: 130,
|
||||
dataIndex: 'contractedMoney',
|
||||
},
|
||||
{
|
||||
title: '增值税金额(元)',
|
||||
width: 130,
|
||||
dataIndex: 'taxRatePrice',
|
||||
},
|
||||
];
|
||||
//预审
|
||||
const columns2: any[] = [
|
||||
{
|
||||
title: '排名',
|
||||
fixed: 'left',
|
||||
width: 50,
|
||||
dataIndex: 'sort',
|
||||
},
|
||||
{
|
||||
title: '供应商名称',
|
||||
dataIndex: 'companyName',
|
||||
width: 110,
|
||||
render: (_: any, record: any) => {
|
||||
if (record.problemInfoList != null) {
|
||||
let count = 0;
|
||||
record.problemInfoList.forEach((ele: any) => {
|
||||
if (ele.problemType == 1) {//MAC地址重复
|
||||
count += 1;
|
||||
}
|
||||
});
|
||||
if (count > 0) {
|
||||
return (
|
||||
<>
|
||||
{_}
|
||||
{<MACAddressPrompt type='other' companyName={_} />}
|
||||
</>
|
||||
)
|
||||
}
|
||||
return _;
|
||||
}
|
||||
return _;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '商务分',
|
||||
dataIndex: 'businessScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '技术分',
|
||||
dataIndex: 'technicalScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '服务分',
|
||||
dataIndex: 'serviceScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '价格分',
|
||||
dataIndex: 'priceScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: (
|
||||
<span>
|
||||
综合得分
|
||||
<Text keyboard onClick={() => setExpandTotalScore(!expandTotalScore)} style={{ cursor: 'pointer', color: '#1890ff' }}>{expandTotalScore ? "展开" : "收起"}</Text>
|
||||
</span>
|
||||
),
|
||||
dataIndex: 'totalScore',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '资格审查方式',
|
||||
width: 100,
|
||||
dataIndex: 'ptcpMode',
|
||||
render: (_: any, record: any) => getDictName(dictData['ptcp_mode=section'], ptcpMode)
|
||||
},
|
||||
{
|
||||
title: '是否通过初步评审',
|
||||
dataIndex: 'firstRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.firstRvwReason)
|
||||
},
|
||||
{
|
||||
title: '是否通过详审',
|
||||
dataIndex: 'detailRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.detailRvwReason)
|
||||
},
|
||||
{
|
||||
title: '应答是否有效',
|
||||
dataIndex: 'answerValid',
|
||||
valueType: 'text',
|
||||
width: 100,
|
||||
valueEnum: {
|
||||
0: { text: '否' },
|
||||
1: { text: '是' },
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '审核结果',
|
||||
width: 120,
|
||||
dataIndex: 'winnerCandidate',
|
||||
valueEnum: {
|
||||
0: { text: '不通过' },
|
||||
1: { text: '通过' },
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
//询价字段 procurement_mode_7
|
||||
const enquiryColumns = [
|
||||
{
|
||||
title: '排名',
|
||||
fixed: 'left',
|
||||
width: 70,
|
||||
dataIndex: 'sort',
|
||||
},
|
||||
{
|
||||
title: '供应商名称',
|
||||
dataIndex: 'companyName',
|
||||
width: 210,
|
||||
render: (_: any, record: any) => {
|
||||
if (record.problemInfoList != null) {
|
||||
let count = 0;
|
||||
record.problemInfoList.forEach((ele: any) => {
|
||||
if (ele.problemType == 1) {//MAC地址重复
|
||||
count += 1;
|
||||
}
|
||||
});
|
||||
if (count > 0) {
|
||||
return (
|
||||
<>
|
||||
{_}
|
||||
{<MACAddressPrompt type='other' companyName={_} />}
|
||||
</>
|
||||
)
|
||||
}
|
||||
return _;
|
||||
}
|
||||
return _;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '报价总金额净价(元)',
|
||||
dataIndex: 'price',
|
||||
width: 170,
|
||||
},
|
||||
{
|
||||
title: '报价总金额含税价(元)',
|
||||
dataIndex: 'priceReview',
|
||||
width: 170,
|
||||
},
|
||||
{
|
||||
title: '商务分',
|
||||
dataIndex: 'businessScore',
|
||||
},
|
||||
{
|
||||
title: '技术分',
|
||||
dataIndex: 'technicalScore',
|
||||
},
|
||||
{
|
||||
title: '服务分',
|
||||
dataIndex: 'serviceScore',
|
||||
},
|
||||
{
|
||||
title: '价格分',
|
||||
dataIndex: 'priceScore',
|
||||
},
|
||||
{
|
||||
title: '综合得分',
|
||||
dataIndex: 'totalScore',
|
||||
},
|
||||
{
|
||||
title: '是否通过初步评审',
|
||||
width: 130,
|
||||
dataIndex: 'firstRvwResult',
|
||||
valueType: 'text',
|
||||
valueEnum: {
|
||||
0: { text: '否' },
|
||||
1: { text: '是' },
|
||||
},
|
||||
// render: (_: any) => firstRvwResult[_],
|
||||
},
|
||||
{
|
||||
title: `是否${candidateType}候选人`,
|
||||
width: 120,
|
||||
dataIndex: 'winnerCandidate',
|
||||
render: (_: any, record: any) => winnerCandidate[_]
|
||||
},
|
||||
];
|
||||
|
||||
//招募
|
||||
const columns4: any[] = [
|
||||
{
|
||||
title: '排名',
|
||||
fixed: 'left',
|
||||
width: 50,
|
||||
dataIndex: 'sort',
|
||||
},
|
||||
{
|
||||
title: '供应商名称',
|
||||
dataIndex: 'companyName',
|
||||
width: 110,
|
||||
render: (_: any, record: any) => {
|
||||
if (record.problemInfoList != null) {
|
||||
let count = 0;
|
||||
record.problemInfoList.forEach((ele: any) => {
|
||||
if (ele.problemType == 1) {//MAC地址重复
|
||||
count += 1;
|
||||
}
|
||||
});
|
||||
if (count > 0) {
|
||||
return (
|
||||
<>
|
||||
{_}
|
||||
{<MACAddressPrompt type='other' companyName={_} />}
|
||||
</>
|
||||
)
|
||||
}
|
||||
return _;
|
||||
}
|
||||
return _;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '商务分',
|
||||
dataIndex: 'businessScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '技术分',
|
||||
dataIndex: 'technicalScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: '服务分',
|
||||
dataIndex: 'serviceScore',
|
||||
width: 60,
|
||||
hideInTable: expandTotalScore,
|
||||
},
|
||||
{
|
||||
title: (
|
||||
<span>
|
||||
综合得分
|
||||
<Text keyboard onClick={() => setExpandTotalScore(!expandTotalScore)} style={{ cursor: 'pointer', color: '#1890ff' }}>{expandTotalScore ? "展开" : "收起"}</Text>
|
||||
</span>
|
||||
),
|
||||
dataIndex: 'totalScore',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '是否通过初步评审',
|
||||
dataIndex: 'firstRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.firstRvwReason)
|
||||
},
|
||||
{
|
||||
title: '是否通过详审',
|
||||
dataIndex: 'detailRvwResult',
|
||||
width: 100,
|
||||
render: (_: any, record: any) => rvwResultRender(_, record.detailRvwReason)
|
||||
},
|
||||
{
|
||||
title: '应答是否有效',
|
||||
dataIndex: 'answerValid',
|
||||
valueType: 'text',
|
||||
width: 100,
|
||||
valueEnum: {
|
||||
0: { text: '否' },
|
||||
1: { text: '是' },
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '是否入围候选人',
|
||||
width: 120,
|
||||
dataIndex: 'winnerCandidate',
|
||||
render: (_: any, record: any) => winnerCandidate[_]
|
||||
},
|
||||
{
|
||||
title: '是否拟入围人',
|
||||
dataIndex: 'winnerBidder',
|
||||
valueType: 'text',
|
||||
width: 120,
|
||||
valueEnum: {
|
||||
0: { text: '否' },
|
||||
1: { text: '是' },
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
//评审室id
|
||||
const assessId = getRoomId();
|
||||
//角色—1、组长;2、专家;3、项目经理
|
||||
const roleType = 3;
|
||||
|
||||
const [docFileCode, setDocFileCode] = useState<string>('');//文档id
|
||||
const [pdfFileCode, setPdfFileCode] = useState<string>('');//pdf文档id
|
||||
const [ids, setIds] = useState<string>('');//评审报告id
|
||||
const [docReadOnly] = useState<string>("false");//是否可编辑
|
||||
const [docSaveBtn] = useState<string>("compact");//保存按钮是否展示
|
||||
/*weboffice 相关*/
|
||||
const ref = useRef<WebOfficeRefProps>();
|
||||
// const WebofficeRef = useRef<Weboffice>(null);
|
||||
// const onRef = (ref: any) => {
|
||||
// /* this.child = ref;*/
|
||||
// }
|
||||
|
||||
/**
|
||||
* 初始化数据
|
||||
*/
|
||||
const init = () => {
|
||||
setResultReviewLoading(true);
|
||||
getReviewResult(assessId).then(res => {
|
||||
setResultReviewLoading(false);
|
||||
if (res.code === 200) {
|
||||
let data = res.data;
|
||||
let roomType = String(data.roomType);
|
||||
let quotationMethodDict = data?.quotationMethodDict == "quotation_method_2" || data?.quotationMethodDict == "quotation_method_3" ? '%' : '元'
|
||||
setQuotationMethod(quotationMethodDict)
|
||||
setRoomType(roomType);
|
||||
setRoomTypeName(roomType === '1' ? '资审' : '评审');
|
||||
//供应商数据
|
||||
let suppliers = isEmpty(data.suppliers) ? [] : data.suppliers;
|
||||
setPtcpMode(data.ptcpMode);
|
||||
setSupplierTableData(suppliers);
|
||||
setReviewResultStatus(data.status);
|
||||
resultDataSet(data);
|
||||
}
|
||||
});
|
||||
//获取评审报告
|
||||
queryReviewReport(assessId).then(res => {
|
||||
if (res.code === 200) {
|
||||
let data = res.data;
|
||||
setResultReportData(data);
|
||||
setDocFileCode(isEmpty(data.reportTextId) ? '' : data.reportTextId);
|
||||
setPdfFileCode(isEmpty(data.signDocId) ? '' : data.signDocId)
|
||||
setReportUploadId(isEmpty(data?.annexId) ? '' : data?.annexId)
|
||||
getFileList(data?.annexId)//获取文件列表
|
||||
setIds(data?.id)
|
||||
setExpertTableData(data.expertList);
|
||||
setReviewReport(String(data.status));
|
||||
setSignatureSelect(String(data.signStatus) == '1')
|
||||
setIds(data?.id)
|
||||
}
|
||||
})
|
||||
//查询评审室状态
|
||||
getAssessRoomStatus(assessId).then(res => {
|
||||
if (res.code === 200) {
|
||||
setEvaluationRoom(res.data);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const verificationOffice = () => {
|
||||
if (ref.current?.DocFileCode == '' || ref.current?.PDFFileCode == '') {
|
||||
message.warn("您未编辑office文件!");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束评审
|
||||
*/
|
||||
const endOfBidEvaluation = () => {
|
||||
isLeaderConfirm({ assessRoomId: assessId }).then(result => {//供应商股权关系-专家组长是否确认风险
|
||||
if (result?.success && !result?.data) {
|
||||
setRiskVisible(true);
|
||||
} else {
|
||||
finishFlow(assessId).then(res => {
|
||||
commonMessage(res);
|
||||
init();
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取表头
|
||||
*/
|
||||
const getColumns = () => {
|
||||
//询价
|
||||
if (bidMethodDict === 'procurement_mode_7') {
|
||||
setColumn([...enquiryColumns])
|
||||
} else if (bidMethodDict === 'procurement_mode_4') {
|
||||
setColumn([...columns4])
|
||||
} else {
|
||||
setColumn([...roomType === '2' ? columns : columns2]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件列表(有id的情况下)
|
||||
*/
|
||||
const getFileList = (fileId: string) => {
|
||||
if (isNotEmpty(fileId)) {
|
||||
getFileListByBid(fileId).then(res => {
|
||||
setReportFileList(res)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const [spin, spinSet] = useState<any>(false);
|
||||
//上传文件
|
||||
const props = {
|
||||
name: 'file',
|
||||
action: '/api/biz-service-ebtp-rsms/v1/reviewresult/importResultTemp',
|
||||
// headers: {
|
||||
// authorization: 'authorization-text',
|
||||
// },
|
||||
data: {
|
||||
assessRoomId: assessId
|
||||
},
|
||||
accept: ".xlsx",
|
||||
itemRender: () => { return null },
|
||||
onChange(info: any) {
|
||||
spinSet(true);
|
||||
if (info.file.status === 'done') {
|
||||
if (info.file?.response?.code == 200) {
|
||||
console.log("info.file?.response",info.file?.response)
|
||||
if (info.file?.response?.data) {
|
||||
message.success(`${info.file.name} 导入成功`);
|
||||
init();
|
||||
spinSet(false);
|
||||
} else {
|
||||
message.error('导入数据为空,请确认');
|
||||
spinSet(false);
|
||||
}
|
||||
} else {
|
||||
message.error(info.file?.response?.message);
|
||||
spinSet(false);
|
||||
}
|
||||
} else if (info.file.status === 'error') {
|
||||
message.error(`${info.file.name} 导入失败`);
|
||||
spinSet(false);
|
||||
}
|
||||
},
|
||||
};
|
||||
const [form] = Form.useForm();
|
||||
const layout = {
|
||||
labelCol: { span: 4 },
|
||||
wrapperCol: { span: 20 },
|
||||
};
|
||||
return (
|
||||
<>
|
||||
<Collapse defaultActiveKey={['1', '2', '3', '4']}>
|
||||
<Panel header={roomTypeName + '结果表'} key="1">
|
||||
<Spin spinning={resultReviewLoading}>
|
||||
<ProTable
|
||||
columns={column}
|
||||
dataSource={supplierTableData}
|
||||
scroll={{ x: 1300 }}
|
||||
pagination={false}
|
||||
search={false}
|
||||
options={false}
|
||||
rowKey="id"
|
||||
size="small"
|
||||
toolBarRender={() => [
|
||||
// (supplierTableData.length !== 0 && Number(evaluationRoom.status) < 3) && <Button type="primary" hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])} onClick={unlock}>评审结果解锁</Button>,
|
||||
|
||||
<Button
|
||||
// hidden={supplierTableData.length === 0}
|
||||
type="primary"
|
||||
onClick={() => { window.location.href = "/api/biz-service-ebtp-rsms/v1/reviewresult/downloadResultTemp?assessRoomId=" + assessId }}>
|
||||
下载模板文件
|
||||
</Button>,
|
||||
<Upload {...props}>
|
||||
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={spin} type="primary" key="4" style={{ margin: '2px 5px' }}>导入EXCEL模板</Button>
|
||||
</Upload>
|
||||
]}
|
||||
/>
|
||||
</Spin>
|
||||
</Panel>
|
||||
|
||||
<Panel header="评审报告上传" key="2">
|
||||
{!reviewReport && reportFileList.length == 0 ? null : <Button key="upload" onClick={() => setReportUploadVisible(true)}>{!reviewReport ? '查看附件' : '上传附件'}</Button>}
|
||||
|
||||
</Panel>
|
||||
|
||||
<Panel header="专家打分表上传" key="3">
|
||||
{ evaluationRoom.status == '3' && !evaluationRoom.offlineReviewFile ? null : <Button key="upload" onClick={() => setReportUploadVisible(true)}>{!evaluationRoom.offlineReviewFile ? '查看附件' : '上传附件'}</Button>}
|
||||
</Panel>
|
||||
|
||||
<Panel header="其他文件上传" key="4">
|
||||
{ evaluationRoom.status == '3' && !evaluationRoom.offlineOtherFile ? null : <Button key="upload" onClick={() => setReportUploadVisible(true)}>{!reviewReport ? '查看附件' : '上传附件'}</Button>}
|
||||
</Panel>
|
||||
</Collapse>
|
||||
|
||||
<Row justify="end">
|
||||
<Col>
|
||||
<Button style={{ margin: '6px 5px 5px 0px' }}
|
||||
disabled={!(reviewResultStatus == "2" && resultReportData.status == '3' && evaluationRoom.status == '2')}
|
||||
hidden={btnAuthority(["ebtp-agency-project-manager", "ebtp-purchase"])}
|
||||
type="primary" onClick={endOfBidEvaluation}>结束评审</Button>
|
||||
</Col>
|
||||
</Row>
|
||||
{pdfModalVisible && <PdfModal modalVisible={pdfModalVisible} fileId={resultReportData.signDocId} onCancel={() => setPdfModalVisible(false)} downLoadFileName="评审报告" />}
|
||||
{reportUploadVisible && <ReviewReportUpload
|
||||
modalVisible={reportUploadVisible}
|
||||
onCancel={(value?: string) => {
|
||||
console.log("value",value)
|
||||
if (value) {
|
||||
setReportUploadId(value)
|
||||
getFileList(value)
|
||||
}
|
||||
setReportUploadVisible(false)
|
||||
}}
|
||||
fileId={reportUploadId}
|
||||
readOnly={!reviewReport}
|
||||
/>}
|
||||
<RiskModal modalVisible={riskVisible} onCancel={() => { setRiskVisible(false) }} isResult={true} role={role} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
export default Manager;
|
@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import Manager from './components/Manager';
|
||||
/**
|
||||
* 项目经理
|
||||
* 项目经理-线下评审
|
||||
*/
|
||||
const Index: React.FC = () => {
|
||||
return (
|
Reference in New Issue
Block a user