线下评审

This commit is contained in:
jlzhangyx5
2025-07-11 08:59:34 +08:00
parent 0a3fa905ca
commit 7a60b03f8c
4 changed files with 816 additions and 70 deletions

View File

@ -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',
},
//评审结果-组长
{

View File

@ -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>&nbsp;<Button size="small" key="viewReport" onClick={() => setPdfModalVisible(true)}></Button>&nbsp;</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) => {

View File

@ -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;

View File

@ -1,7 +1,7 @@
import React from 'react';
import Manager from './components/Manager';
/**
*
* -线
*/
const Index: React.FC = () => {
return (