线下评审

This commit is contained in:
jlzhangyx5
2025-07-11 17:03:59 +08:00
parent 4dcd59ef37
commit 2e0d53f0e2
4 changed files with 231 additions and 38 deletions

View File

@ -1,22 +1,21 @@
import { getReviewResult, unlockReportIF, unlockResult } from '@/pages/Evaluation/expert/ReviewResults/GroupLeader/service'; import { getReviewResult } from '@/pages/Evaluation/expert/ReviewResults/GroupLeader/service';
import { getDictName, getURLInformation, isEmpty, isNotEmpty } from '@/utils/CommonUtils'; import { getDictName, isEmpty, isNotEmpty } from '@/utils/CommonUtils';
import ProTable from '@ant-design/pro-table'; 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 { Button, Col, Collapse, message, Popover, Row, Spin, Typography, Upload, Form } from 'antd';
import React, { useEffect, useRef, useState } from 'react'; import React, { useEffect, useRef, useState } from 'react';
import Weboffice from "@/pages/webOffice/weboffice"; import { finishFlow, getAssessRoomStatus, queryReviewReport, saveAssessRoomInfo } from '../../service';
import { finishFlow, getAssessRoomStatus, queryReviewReport, reviewReportSave, reviewReportSend, saveSignPdfReport } from '../../service';
import { commonMessage } from '@/utils/MessageUtils'; import { commonMessage } from '@/utils/MessageUtils';
import { getDefId, getDicData, getProMethod, getRoomId, getSessionRoleData, getSessionUserData, getUserToken } from '@/utils/session'; import { getDefId, getDicData, getProMethod, getRoomId, getSessionRoleData } from '@/utils/session';
import { btnAuthority } from '@/utils/authority'; import { btnAuthority } from '@/utils/authority';
import WebOffice0609, { WebOfficeRefProps } from '@/pages/webOffice/weboffice0609'; import { WebOfficeRefProps } from '@/pages/webOffice/weboffice0609';
import PdfModal from '@/utils/PdfModal/PdfModal'; import PdfModal from '@/utils/PdfModal/PdfModal';
import ReviewReportUpload from '@/utils/ReviewReportUpload'; import ReviewReportUpload from '@/utils/ReviewReportUpload';
import { getFileListByBid } from '@/utils/DownloadUtils'; import { getFileListByBid } from '@/utils/DownloadUtils';
import MACAddressPrompt from '@/pages/Evaluation/BidControl/BidControlManager/components/MACAddressPrompt'; import MACAddressPrompt from '@/pages/Evaluation/BidControl/BidControlManager/components/MACAddressPrompt';
import RiskModal from '@/components/RiskModal'; import RiskModal from '@/components/RiskModal';
import { isLeaderConfirm } from '@/components/BiddingRoom/service'; import { isLeaderConfirm } from '@/components/BiddingRoom/service';
import FileDown from '@/utils/Download'; import ReviewFileUpload from './ReviewFileUpload';
import ExtendUpload from '@/utils/ExtendUpload'; import OtherFileUpload from './OtherFileUpload';
const { Panel } = Collapse; const { Panel } = Collapse;
const { Paragraph, Text } = Typography; const { Paragraph, Text } = Typography;
@ -68,14 +67,18 @@ const Manager: React.FC = () => {
const candidateType = bidMethodDict == 'procurement_mode_1' || bidMethodDict == 'procurement_mode_2' ? '中标' : '中选';//初始化中标中选字段 const candidateType = bidMethodDict == 'procurement_mode_1' || bidMethodDict == 'procurement_mode_2' ? '中标' : '中选';//初始化中标中选字段
//评审报告附件modal visible //评审报告附件modal visible
const [reportUploadVisible, setReportUploadVisible] = useState<boolean>(false); const [reportUploadVisible, setReportUploadVisible] = useState<boolean>(false);
//专家打分表附件modal visible
const [reviewUploadVisible, setReviewUploadVisible] = useState<boolean>(false);
//其他文件附件modal visible
const [otherUploadVisible, setOtherUploadVisible] = useState<boolean>(false);
//评审报告附件id //评审报告附件id
const [reportUploadId, setReportUploadId] = useState<string>(''); const [reportUploadId, setReportUploadId] = useState<string>('');
//评审报告附件列表 //评审报告附件列表
const [reportFileList, setReportFileList] = useState<any[]>([]); const [reportFileList, setReportFileList] = useState<any[]>([]);
//专家打分表附件列表 //专家打分表附件列表
const [offlineReviewFile, setOfflineReviewFile] = useState<string>(''); const [offlineReviewFileId, setOfflineReviewFileId] = useState<string>('');
//其他文件附件列表 //其他文件附件列表
const [offlineOtherFile, setOfflineOtherFile] = useState<string>(''); const [offlineOtherFileId, setOfflineOtherFileId] = useState<string>('');
//评审结果编辑综合得分展开关闭 //评审结果编辑综合得分展开关闭
const [expandTotalScore, setExpandTotalScore] = useState<boolean>(true); const [expandTotalScore, setExpandTotalScore] = useState<boolean>(true);
//评审结果数据 //评审结果数据
@ -212,26 +215,26 @@ const Manager: React.FC = () => {
dataIndex: 'winnerCandidate', dataIndex: 'winnerCandidate',
render: (_: any, record: any) => winnerCandidate[_] render: (_: any, record: any) => winnerCandidate[_]
}, },
{ // {
title: `是否拟${candidateType}`, // title: `是否拟${candidateType}人`,
dataIndex: 'winnerBidder', // dataIndex: 'winnerBidder',
valueType: 'text', // valueType: 'text',
width: 120, // width: 120,
valueEnum: { // valueEnum: {
0: { text: '否' }, // 0: { text: '否' },
1: { text: '是' }, // 1: { text: '是' },
}, // },
}, // },
{ // {
title: '拟签约金额(不含增值税)(元)', // title: '拟签约金额(不含增值税)(元)',
width: 130, // width: 130,
dataIndex: 'contractedMoney', // dataIndex: 'contractedMoney',
}, // },
{ // {
title: '增值税金额(元)', // title: '增值税金额(元)',
width: 130, // width: 130,
dataIndex: 'taxRatePrice', // dataIndex: 'taxRatePrice',
}, // },
]; ];
//预审 //预审
const columns2: any[] = [ const columns2: any[] = [
@ -633,6 +636,36 @@ const Manager: React.FC = () => {
}) })
} }
} }
/**
* 保存专家打分表文件
*/
const saveReviewFile = (fileId: string) => {
if (isNotEmpty(fileId)) {
let param = { assessRoomId: assessId, offlineReviewFile: fileId }
saveAssessRoomInfo(param).then(res => {
if (res?.success && !res?.data) {
message.success('上传成功');
} else {
message.error(res?.message);
}
})
}
}
/**
* 保存其他文件
*/
const saveOtherFile = (fileId: string) => {
if (isNotEmpty(fileId)) {
let param = { assessRoomId: assessId, offlineOtherFile: fileId }
saveAssessRoomInfo(param).then(res => {
if (res?.success && !res?.data) {
message.success('上传成功');
} else {
message.error(res?.message);
}
})
}
}
const [spin, spinSet] = useState<any>(false); const [spin, spinSet] = useState<any>(false);
//上传文件 //上传文件
@ -670,11 +703,6 @@ const Manager: React.FC = () => {
} }
}, },
}; };
const [form] = Form.useForm();
const layout = {
labelCol: { span: 4 },
wrapperCol: { span: 20 },
};
return ( return (
<> <>
<Collapse defaultActiveKey={['1', '2', '3', '4']}> <Collapse defaultActiveKey={['1', '2', '3', '4']}>
@ -712,11 +740,11 @@ const layout = {
</Panel> </Panel>
<Panel header="专家打分表上传" key="3"> <Panel header="专家打分表上传" key="3">
{ evaluationRoom.status == '3' && !evaluationRoom.offlineReviewFile ? null : <Button key="upload" onClick={() => setReportUploadVisible(true)}>{!evaluationRoom.offlineReviewFile ? '查看附件' : '上传附件'}</Button>} { evaluationRoom.status == '3' && !evaluationRoom.offlineReviewFile ? '无' : <Button key="upload" onClick={() => setReviewUploadVisible(true)}>{evaluationRoom.status == '3' ? '查看附件' : '上传附件'}</Button>}
</Panel> </Panel>
<Panel header="其他文件上传" key="4"> <Panel header="其他文件上传" key="4">
{ evaluationRoom.status == '3' && !evaluationRoom.offlineOtherFile ? null : <Button key="upload" onClick={() => setReportUploadVisible(true)}>{!reviewReport ? '查看附件' : '上传附件'}</Button>} { evaluationRoom.status == '3' && !evaluationRoom.offlineOtherFile ? '无' : <Button key="upload" onClick={() => setOtherUploadVisible(true)}>{evaluationRoom.status == '3' ? '查看附件' : '上传附件'}</Button>}
</Panel> </Panel>
</Collapse> </Collapse>
@ -742,6 +770,42 @@ const layout = {
fileId={reportUploadId} fileId={reportUploadId}
readOnly={!reviewReport} readOnly={!reviewReport}
/>} />}
{reviewUploadVisible && <ReviewFileUpload
modalVisible={reviewUploadVisible}
onCancel={(value?: string) => {
console.log("value", value);
if (value) {
setOfflineReviewFileId(value);
}
setReviewUploadVisible(false);
} }
fileId={offlineReviewFileId}
readOnly={!evaluationRoom}
onOk={function (value?: string): void {
console.log("value", value);
if (value) {
saveReviewFile(value);
}
} }
/>}
{otherUploadVisible && <OtherFileUpload
modalVisible={otherUploadVisible}
onCancel={(value?: string) => {
console.log("value", value);
if (value) {
setOfflineOtherFileId(value);
}
setOtherUploadVisible(false);
} }
fileId={offlineOtherFileId}
readOnly={!evaluationRoom}
onOk={function (value?: string): void {
console.log("value", value);
if (value) {
saveOtherFile(value);
}
} }
/>}
<RiskModal modalVisible={riskVisible} onCancel={() => { setRiskVisible(false) }} isResult={true} role={role} /> <RiskModal modalVisible={riskVisible} onCancel={() => { setRiskVisible(false) }} isResult={true} role={role} />
</> </>
); );

View File

@ -0,0 +1,59 @@
import React from 'react';
import { Form, Modal } from 'antd';
import ExtendUpload from '@/utils/ExtendUpload';
interface OtherFileUploadProps {
modalVisible: boolean;//modal visible
onCancel: (value?: string) => void//modal submit
onOk: (value?: string) => void//modal submit
fileId: string;//upload fileId
readOnly: boolean;//readonly status true-readonly false-not readonly
}
const layout = {
labelCol: { span: 4 },
wrapperCol: { span: 20 },
};
const modalHeight = window.innerHeight * 96 / 100;
/**
* 评审室-评审结果评审报告上传附件
* @param props
* @returns
*/
const OtherFileUpload: React.FC<OtherFileUploadProps> = (props) => {
const { modalVisible, onCancel, onOk, fileId, readOnly } = props;
console.log("readOnly",readOnly);
const [form] = Form.useForm();
return (
<Modal
destroyOnClose
title={`${readOnly ? '下载' : '上传'}附件`}
visible={modalVisible}
onCancel={() => onCancel(form.getFieldValue('annexId'))}
onOk={() => onOk(form.getFieldValue('annexId'))}
// okButtonProps={{ hidden: true }}
cancelText="返回"
style={{ maxHeight: modalHeight }}
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto' }}
centered
>
<Form name="complex-form" {...layout} form={form}>
<Form.Item
name="annexId"
label="附件"
extra={readOnly ? null : '每个文件最大20MB不限制数量'}
>
<ExtendUpload bid={fileId} btnName="上传" maxSize={20} uploadProps={{ name: "file", disabled: readOnly }}>
</ExtendUpload>
</Form.Item>
</Form>
</Modal>
);
};
export default OtherFileUpload;

View File

@ -0,0 +1,59 @@
import React from 'react';
import { Form, Modal } from 'antd';
import ExtendUpload from '@/utils/ExtendUpload';
interface ReviewFileUploadProps {
modalVisible: boolean;//modal visible
onCancel: (value?: string) => void//modal submit
onOk: (value?: string) => void//modal submit
fileId: string;//upload fileId
readOnly: boolean;//readonly status true-readonly false-not readonly
}
const layout = {
labelCol: { span: 4 },
wrapperCol: { span: 20 },
};
const modalHeight = window.innerHeight * 96 / 100;
/**
* 评审室-评审结果评审报告上传附件
* @param props
* @returns
*/
const ReviewFileUpload: React.FC<ReviewFileUploadProps> = (props) => {
const { modalVisible, onCancel, onOk, fileId, readOnly } = props;
console.log("readOnly",readOnly);
const [form] = Form.useForm();
return (
<Modal
destroyOnClose
title={`${readOnly ? '下载' : '上传'}附件`}
visible={modalVisible}
onCancel={() => onCancel(form.getFieldValue('annexId'))}
onOk={() => onOk(form.getFieldValue('annexId'))}
// okButtonProps={{ hidden: true }}
cancelText="返回"
style={{ maxHeight: modalHeight }}
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto' }}
centered
>
<Form name="complex-form" {...layout} form={form}>
<Form.Item
name="annexId"
label="附件"
extra={readOnly ? null : '每个文件最大20MB不限制数量'}
>
<ExtendUpload bid={fileId} btnName="上传" maxSize={20} uploadProps={{ name: "file", disabled: readOnly }}>
</ExtendUpload>
</Form.Item>
</Form>
</Modal>
);
};
export default ReviewFileUpload;

View File

@ -51,6 +51,17 @@ export function finishFlow(id: any) {
export function getAssessRoomStatus(id: any) { export function getAssessRoomStatus(id: any) {
return request('/api/biz-service-ebtp-process/v1/bizassessroom/info/' + id); return request('/api/biz-service-ebtp-process/v1/bizassessroom/info/' + id);
} }
/**
* 保存评审室信息
* @param id
*/
export function saveAssessRoomInfo(data: any) {
return request('/api/biz-service-ebtp-rsms/v1/bizassessroom', {
method: 'post',
data: data,
});
}
/** /**
* 生成签名报告 * 生成签名报告
* @param id * @param id