diff --git a/src/components/ElecBidEvaluation/BidEvalAppointment.tsx b/src/components/ElecBidEvaluation/BidEvalAppointment.tsx index 3fc5e3f..1e68dd8 100644 --- a/src/components/ElecBidEvaluation/BidEvalAppointment.tsx +++ b/src/components/ElecBidEvaluation/BidEvalAppointment.tsx @@ -6,6 +6,7 @@ import { dateFormat, disabledDate, otherDisabledDateTime, validateMessages } fro import moment from 'moment'; import { dateTimeFormatter } from '@/utils/DateUtils'; import { getProId } from '@/utils/session'; +import { isEmpty } from '@/utils/CommonUtils'; interface BidEvalAppointmentProps { modalVisible: boolean; @@ -186,14 +187,22 @@ const BidEvalAppointment: React.FC = (props) => { } useEffect(() => { - setSelectedRowKeys([]); - setSelectedRecord(null); - setDisabledMap({}); + if (values?.areaId) { + setSelectedRowKeys([values.areaId]); + setSelectedRecord({ areaNumber: values?.numberInMeeting, ...values, id: values.areaId }); + form.setFieldsValue({ ...values, reserveStartDate: moment(values.reserveStartDate), reserveEndDate: moment(values.reserveEndDate) }); + } else { + setSelectedRowKeys([]); + setSelectedRecord(null); + setDisabledMap({}); + } }, [values]) useEffect(() => { - initValue && form.setFieldsValue({ ...initValue, reserveStartDate: initValue.startTime, reserveEndDate: initValue.endTime }); - }, [initValue, modalVisible]) + if (initValue && isEmpty(values)) { + form.setFieldsValue({ ...initValue, reserveStartDate: initValue.startTime, reserveEndDate: initValue.endTime }); + } + }, [initValue, values, modalVisible]) useEffect(() => { selectedRowKeys.length > 0 && getDisabledTime(selectedRowKeys); @@ -234,8 +243,10 @@ const BidEvalAppointment: React.FC = (props) => { columns={columns} actionRef={actionRef} bordered={false} - params={{ areaType: "eval_room" }} + loading={false} + params={{ areaType: "eval_room", chooseAreaId: values?.areaId }} request={async (params) => { + setLoading(true); return await getBidEvalRoom(params).then(res => { if (res?.code == 200) { return { @@ -250,6 +261,8 @@ const BidEvalAppointment: React.FC = (props) => { total: 0, } } + }).finally(() => { + setLoading(false); }) }} rowKey="id" @@ -278,7 +291,6 @@ const BidEvalAppointment: React.FC = (props) => { form={form} labelCol={{ span: 8 }} wrapperCol={{ span: 16 }} - preserve={false} validateMessages={validateMessages} > = () => { break; } } - history.replace({ pathname: "/ElecEvaluation/AppointmentManage", state: { redirect: true } }); + setTimeout(() => { + history.replace({ pathname: "/ElecEvaluation/AppointmentManage", state: { redirect: true } }); + }, 500); }, []); return ( diff --git a/src/pages/Tender/ProjectManager/JudgingPanel/List/OutsourcingManage.tsx b/src/pages/Tender/ProjectManager/JudgingPanel/List/OutsourcingManage.tsx index 605bf3c..424d23b 100644 --- a/src/pages/Tender/ProjectManager/JudgingPanel/List/OutsourcingManage.tsx +++ b/src/pages/Tender/ProjectManager/JudgingPanel/List/OutsourcingManage.tsx @@ -13,15 +13,15 @@ interface OutsourcingManageProps { onCancel: () => void, onSubmit: () => void,//保存回调 open: boolean,//评委会里是否有开启评标的评审室 true有开启的 false无 - assistData: any[],//协办人数据 - assistNumber: string,//协办人数量 + assistData: any[],//外协人数据 + assistNumber: string,//外协人数量 juryId: string,//评委会id } const formLayoutDrawer = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; const tailLayoutDrawer = { wrapperCol: { offset: 8, span: 20 }, }; /** - * 协办管理 + * 外协管理 * @param props * @returns */ @@ -34,11 +34,11 @@ const OutsourcingManage: React.FC = (props) => { //loading const [loading, setLoading] = useState(false); - //录入协办人员 drawerVisible + //录入外协人员 drawerVisible const [add, setAdd] = useState(false); - //协办人员数据 + //外协人员数据 const [dataSource, setDataSource] = useState([]); - //协办人员-修改存key + //外协人员-修改存key const [updateKeyMem, updateKeyMemSet] = useState(-1); //删除回调 const confirmMem = async (record: any) => { @@ -113,7 +113,7 @@ const OutsourcingManage: React.FC = (props) => { width={"60%"} centered destroyOnClose - title="协办人员管理" + title="外协人员管理" bodyStyle={{ maxHeight: modalHeight - 140, minHeight: modalHeight * 0.6, overflow: 'auto', padding: '16px 0px 0px 0px' }} okButtonProps={{ hidden: btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase']), disabled: open, loading: loading }} cancelText="取消" @@ -138,18 +138,20 @@ const OutsourcingManage: React.FC = (props) => { setLoading(false); }) } else { - message.error('协办人数不符合规定!'); + message.error('外协人数不符合规定!'); } }} onCancel={onCancel} >
-

协办人员管理

+

外协人员管理

+
+
+ 外协人员为在合规情况下可临时进入电子评标室人员,如视察领导等,请提前维护相关信息,避免无法进入电子评标室。
- - + = (props) => { message.error('录入人数已满') } }} - > 录入协办人员 + > 录入外协人员 ]} />
{ setAdd(false) }} @@ -254,6 +256,7 @@ const OutsourcingManage: React.FC = (props) => { 若预约了电子评标室,请提前维护外协人员照片,避免无法进入电子评标室。} > diff --git a/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx b/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx index 2e3ec9b..b558d51 100644 --- a/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx +++ b/src/pages/Tender/ProjectManager/JudgingPanel/List/index.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Checkbox, Col, Collapse, DatePicker, Drawer, Form, Input, message, Modal, Popconfirm, Row, Select, Spin, Upload, Image, Radio, RadioChangeEvent } from 'antd' +import { Button, Checkbox, Col, Collapse, DatePicker, Drawer, Form, Input, message, Modal, Popconfirm, Row, Select, Spin, Upload, Image, Radio, RadioChangeEvent, Tooltip, Popover, Typography } from 'antd' import ProTable, { ActionType, ProColumns } from '@ant-design/pro-table'; import { getList, getSecs, saveGroup, delOne, saveMember, changeEx, queryVoList, changeMember, applyFor, roomStatus, juryTem, rePassWord, getUserPhoto } from './service'; import moment from 'moment'; @@ -8,7 +8,7 @@ import { getURLInformation } from '@/utils/CommonUtils'; import './judgList.less'; import '@/assets/xsy_style.less'; import FileDown from '@/utils/Download'; -import { UploadOutlined } from '@ant-design/icons'; +import { DownOutlined, EllipsisOutlined, UploadOutlined } from '@ant-design/icons'; import { btnAuthority } from '@/utils/authority'; import RiskPrevention from '@/utils/RiskPrevention'; import BidEvalAppointment from '@/components/ElecBidEvaluation/BidEvalAppointment'; @@ -16,6 +16,7 @@ import { downloadPath } from '@/utils/DownloadUtils'; import ExpertPhotoUpload from '@/components/ElecBidEvaluation/ExpertPhotoUpload'; import { sortBy } from 'lodash'; import OutsourcingManage from './OutsourcingManage'; +import { dateTimeFormatter } from '@/utils/DateUtils'; const JudgingPanel: React.FC<{}> = () => { const modalHeight = window.innerHeight * 96 / 100; @@ -23,11 +24,13 @@ const JudgingPanel: React.FC<{}> = () => { const roomType = getURLInformation('roomType'); // const tailLayout = { wrapperCol: { offset: 8, span: 20 }, }; const formLayout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; + const form24Layout = { labelCol: { span: 4 }, wrapperCol: { span: 20 }, }; const FormItem = Form.Item; const [form] = Form.useForm(); const { Option } = Select; const { Panel } = Collapse; const { TextArea } = Input; + const { Paragraph, Text, Link, Title } = Typography; const CheckboxGroup = Checkbox.Group; // const { TabPane } = Tabs; const actionRef = useRef(); @@ -53,7 +56,7 @@ const JudgingPanel: React.FC<{}> = () => { const [initEvalTime, setInitEvalTime] = useState();//电子评标室-时间输入框默认时间(跟随标段) 2022.9.27 zhoujianlong // const [userPhotoId, setUserPhotoId] = useState("");//电子评标室-录入外部专家-相片id 2022.8.29 zhoujianlong const [appoType, setAppoType] = useState("0");//电子评标室-预约框状态 2022.8.29 zhoujianlong - const [isReserve, setIsReserve] = useState("0");//电子评标室-是否预约评标室 2022.9.23 zhoujianlong 0-不预约 1-预约 + const [isReserve, setIsReserve] = useState("0");//电子评标室-是否预约电子评标室 2022.9.23 zhoujianlong 0-不预约 1-预约 const userData = getSessionUserData();//当前登录人用户信息 const [assistVisible, setAssistVisible] = useState(false);//协办管理visible 2022.10.10 zhoujianlong @@ -118,6 +121,8 @@ const JudgingPanel: React.FC<{}> = () => { { title: '专家数量', dataIndex: 'expertNumber', width: '8%', }, { title: `${showName.zbr}代表数量`, dataIndex: 'representativeNumber', width: '12%', }, { title: `${showName.bb}名称`, dataIndex: 'sectionName', }, + { title: '是否预约电子评标室', dataIndex: 'reserveStatus', width: '10%', valueEnum: { 1: "是", 0: "否" } }, + { title: `${showName.pb}地点`, dataIndex: 'evalLocation', width: '15%', ellipsis: true, render: (_: any, record: any) => sectionNameValue(record.elecEvalRoomReserve, record.evalLocation, record.reserveStatus) }, { title: '预计开始时间', dataIndex: 'startTime', valueType: 'dateTime', width: '10%', }, { title: '预计结束时间', dataIndex: 'endTime', valueType: 'dateTime', width: '10%', }, { @@ -173,10 +178,10 @@ const JudgingPanel: React.FC<{}> = () => { setAssistVisible(true); }}>外协管理} {record.elecEvalRoomReserve && (record.elecEvalRoomReserve.status == -1 || record.elecEvalRoomReserve.status == 0) && } + }}>电子评标室预约修改} ); } else { @@ -203,7 +208,7 @@ const JudgingPanel: React.FC<{}> = () => { sectionCountSet(sectionCount + 1); disabledSet(check); // readOnlySet(check); - setSelectEvalData(record.elecEvalRoomReserve) + setSelectEvalData({ ...record.elecEvalRoomReserve, areaAddress: record.evalLocation }) checkSectionNameSet(record.sectionName); }}>{check ? '查看' : '修改'} ) @@ -283,6 +288,47 @@ const JudgingPanel: React.FC<{}> = () => { }, ] } + //评标地点 评标室更多信息 + const evalLocationTitle = (detail: any, updateData: any) => { + return ( +
+

详细地址:{updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.areaAddress : updateData?.evalLocation}

+

可容纳人数:{detail?.numberInMeeting}

+

联系人:{detail?.contactName}

+

联系电话:{detail?.contactTel}

+
+ ) + } + //说明 + const sectionNameValue = (detail: any, evalLocation: any, reserveStatus: any) => { + const address = reserveStatus == 1 ? detail?.areaAddress : evalLocation; + const content = ( + +
+
+

详细地址:{address}

+

可容纳人数:{detail?.numberInMeeting}

+

联系人:{detail?.contactName}

+

联系电话:{detail?.contactTel}

+
+
+
+ ) + let text = address.length > 30 ? address.slice(0, 30) + "..." : address; + return ( + detail != null ? ( + + + {text} + + + + ) : ( + {text} + ) + ) + } + useEffect(() => {//获取标包信息 @@ -317,14 +363,14 @@ const JudgingPanel: React.FC<{}> = () => { }, [sectionCount]); useEffect(() => {//给表单赋值 - updateData && setIsReserve(String(updateData?.reserveStatus));//赋值给是否预约评标室 + updateData && setIsReserve(String(updateData?.reserveStatus));//赋值给是否预约电子评标室 form.setFieldsValue({ juryType: updateData != undefined ? updateData.juryType : null, representativeNumber: updateData != undefined ? updateData.representativeNumber : null, expertNumber: updateData != undefined ? updateData.expertNumber : null, startTime: updateData != undefined ? updateData.reserveStatus == 1 ? moment(updateData.elecEvalRoomReserve.reserveStartDate, 'yyyy-MM-DD HH:mm:ss') : moment(updateData.startTime, 'yyyy-MM-DD HH:mm:ss') : null, endTime: updateData != undefined ? updateData.reserveStatus == 1 ? moment(updateData.elecEvalRoomReserve.reserveEndDate, 'yyyy-MM-DD HH:mm:ss') : moment(updateData.endTime, 'yyyy-MM-DD HH:mm:ss') : null, - evalLocation: updateData != undefined ? updateData.evalLocation : null, + evalLocation: updateData != undefined ? updateData.reserveStatus == 1 ? updateData.elecEvalRoomReserve.areaAddress : updateData.evalLocation : null, description: updateData != undefined ? updateData.description : null, reserveBy: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveBy : null, reserveContactNumber: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveContactNumber : null, @@ -744,18 +790,109 @@ const JudgingPanel: React.FC<{}> = () => { -

预约评标室

-
+

预约电子评标室

+ - 注:若选择预约电子评标室,请提前做好相关准备,并按预约时间进入评标场所,系统将下发相关人员名单并获取相关数据} > + {isReserve == "1" && !disabled ? (//预约电子评标室 + + + + + + + + + + + ) : ( + + + evalLocationTitle(selectEvalData, updateData)}> + + + } /> + + + )} + {isReserve == "1" && (//预约电子评标室 + + + + )} + + + + + + + {isReserve == "1" && (//预约电子评标室 + <> + + + + + + + + )}

专家申请基本信息

@@ -813,34 +950,7 @@ const JudgingPanel: React.FC<{}> = () => { > - {isReserve == "1" ? (//预约评标室 - - - - - - - - - - - ) : ( - - - - - - )} + = () => { > - {isReserve == "1" && (//预约评标室 - - - - )} - - - - - - - {isReserve == "1" && (//预约评标室 - <> - - - - - - - - )} @@ -1553,6 +1608,7 @@ const JudgingPanel: React.FC<{}> = () => { 评审专家照片为专家进入电子评标室报道及人脸识别认证使用,若预约了电子评标室,请维护专家照片。} > @@ -1829,9 +1885,9 @@ const JudgingPanel: React.FC<{}> = () => { }} > -
-

评审小组成员管理

-
+
+

评审小组成员管理

+
{/* */}
+
+ 评审专家照片为专家进入电子评标室报道及人脸识别认证使用,若预约了电子评标室,请尽量提前维护专家照片。 +
{returnPanel()} @@ -1922,7 +1981,7 @@ const JudgingPanel: React.FC<{}> = () => { getExpertPhoto(); } } - //是否预约评标室 + //是否预约电子评标室 const onRadioChange = (e: RadioChangeEvent) => { setIsReserve(e.target.value); setSelectEvalData(null); @@ -1933,8 +1992,17 @@ const JudgingPanel: React.FC<{}> = () => { const getEarliestTime = (packageData: any[], selectData: any[], reserve: string) => { let selectPackageData = packageData.filter(item => selectData.includes(item.sectionId)); let sortable = sortBy(selectPackageData, item => item.openTime);//按照开标时间排序 - let startTime = sortable?.[0]?.openTime ? moment(sortable[0].openTime).startOf("hour").add(1, 'h') : null; - let endTime = sortable?.[0]?.openTime ? moment(sortable[0].openTime).startOf("hour").add(3, 'h') : null; + let startTime = null;//开始时间小于17点正常,17点+则为null + let endTime = null; + if (sortable?.[0]?.openTime) { + if (moment(sortable[0].openTime).hour() <= 15) {//结束时间小于16点正常+2h,16-17点只能给18点,17点+则为null + startTime = moment(sortable[0].openTime).startOf("hour").add(1, 'h'); + endTime = moment(sortable[0].openTime).startOf("hour").add(3, 'h'); + } else if (moment(sortable[0].openTime).hour() == 16) { + startTime = moment().startOf("hour").hour(17); + endTime = moment().startOf("hour").hour(18); + } + } if (reserve == "1") {//预约了评标室 setInitEvalTime({ startTime, endTime, reserveBy: userData?.fullName, reserveContactNumber: userData?.mobilePhone, }); } else { diff --git a/src/pages/Tender/ProjectManager/JudgingPanel/List/judgList.less b/src/pages/Tender/ProjectManager/JudgingPanel/List/judgList.less index 28de55d..3aafd3f 100644 --- a/src/pages/Tender/ProjectManager/JudgingPanel/List/judgList.less +++ b/src/pages/Tender/ProjectManager/JudgingPanel/List/judgList.less @@ -1,40 +1,52 @@ @import '~antd/lib/style/themes/default.less'; -.headerDiv{ +.headerDiv { // padding: 16px 24px 0px 0px; margin-left: 0px; - width:100%; + width: 100%; // border-bottom: solid; // border-bottom-color: rgb(187,16,39); // border-width: 1px; - height:32px; + height: 32px; } -.leftDiv{ - font-size: middle; + +.leftDiv { + font-size: middle; font-weight: normal; - background-color: rgb(187,16,39); + background-color: rgb(187, 16, 39); padding: 3px 8px; width: 130px; float: left; - height:30px; + height: 30px; text-align: center; } -.rightDiv{ + +.rightDiv { float: right; - height:30px; + height: 30px; text-align: center; } -.mt15{ + +.mt15 { margin-top: 15px; } -.pl24{ + +.pl24 { padding-left: 24px; } -.pr16{ + +.pr16 { padding-right: 16px; } -.xsy-collapse{ - .ant-collapse-content-box{ - padding:0px 0px 16px 0px + +.xsy-collapse { + .ant-collapse-content-box { + padding: 0px 0px 16px 0px + } +} + +.eval-location-title { + &>p { + margin-bottom: 0; } } \ No newline at end of file diff --git a/src/pages/ZZhaoMu/JudgingPanel/index.tsx b/src/pages/ZZhaoMu/JudgingPanel/index.tsx index ff07b3a..429b4dd 100644 --- a/src/pages/ZZhaoMu/JudgingPanel/index.tsx +++ b/src/pages/ZZhaoMu/JudgingPanel/index.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef, useState } from 'react'; -import { Button, Checkbox, Col, Collapse, DatePicker, Drawer, Form, Input, message, Modal, Popconfirm, Row, Select, Spin, Upload, Image, RadioChangeEvent, Radio } from 'antd' +import { Button, Checkbox, Col, Collapse, DatePicker, Drawer, Form, Input, message, Modal, Popconfirm, Row, Select, Spin, Upload, Image, RadioChangeEvent, Radio, Typography, Popover, Tooltip } from 'antd' import ProTable, { ActionType, ProColumns } from '@ant-design/pro-table'; import { getList, saveGroup, delOne, saveMember, changeEx, queryVoList, changeMember, applyFor, roomStatus, juryTem, rePassWord } from './service'; import moment from 'moment'; @@ -7,7 +7,7 @@ import { getProId, getProMethod, getDefId, getSessionProjectData, getRoomReturnU import './judgList.less'; import '@/assets/xsy_style.less'; import FileDown from '@/utils/Download'; -import { UploadOutlined } from '@ant-design/icons'; +import { DownOutlined, EllipsisOutlined, UploadOutlined } from '@ant-design/icons'; import { btnAuthority } from '@/utils/authority'; import RiskPrevention from '@/utils/RiskPrevention'; import { history } from 'umi'; @@ -16,6 +16,7 @@ import ExpertPhotoUpload from '@/components/ElecBidEvaluation/ExpertPhotoUpload' import { getUserPhoto } from '@/pages/Tender/ProjectManager/JudgingPanel/List/service'; import BidEvalAppointment from '@/components/ElecBidEvaluation/BidEvalAppointment'; import OutsourcingManage from '@/pages/Tender/ProjectManager/JudgingPanel/List/OutsourcingManage'; +import { dateTimeFormatter } from '@/utils/DateUtils'; const JudgingPanel: React.FC<{}> = (props: any) => { const modalHeight = window.innerHeight * 96 / 100; @@ -25,11 +26,13 @@ const JudgingPanel: React.FC<{}> = (props: any) => { const sectionId = props.location?.state?.secId; const openTime = props.location?.state?.openTime;//开始评审时间 const formLayout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; + const form24Layout = { labelCol: { span: 4 }, wrapperCol: { span: 20 }, }; const FormItem = Form.Item; const [form] = Form.useForm(); const { Option } = Select; const { Panel } = Collapse; const { TextArea } = Input; + const { Paragraph, Text, Link, Title } = Typography; // const { TabPane } = Tabs; const actionRef = useRef(); const [spin, spinSet] = useState(false); @@ -50,7 +53,7 @@ const JudgingPanel: React.FC<{}> = (props: any) => { const [initEvalTime, setInitEvalTime] = useState();//电子评标室-时间输入框默认时间(跟随标段) 2022.9.27 zhoujianlong // const [userPhotoId, setUserPhotoId] = useState("");//电子评标室-录入外部专家-相片id 2022.8.29 zhoujianlong const [appoType, setAppoType] = useState("0");//电子评标室-预约框状态 2022.8.29 zhoujianlong - const [isReserve, setIsReserve] = useState("0");//电子评标室-是否预约评标室 2022.9.23 zhoujianlong 0-不预约 1-预约 + const [isReserve, setIsReserve] = useState("0");//电子评标室-是否预约电子评标室 2022.9.23 zhoujianlong 0-不预约 1-预约 const userData = getSessionUserData();//当前登录人用户信息 const [assistVisible, setAssistVisible] = useState(false);//协办管理visible 2022.10.10 zhoujianlong //外协管理 @@ -106,6 +109,8 @@ const JudgingPanel: React.FC<{}> = (props: any) => { { title: '专家数量', dataIndex: 'expertNumber', width: '8%', }, { title: '采购人代表数量', dataIndex: 'representativeNumber', width: '12%', }, { title: '包件名称', dataIndex: 'sectionName', }, + { title: '是否预约电子评标室', dataIndex: 'reserveStatus', width: '10%', valueEnum: { 1: "是", 0: "否" } }, + { title: "评审地点", dataIndex: 'evalLocation', width: '15%', ellipsis: true, render: (_: any, record: any) => sectionNameValue(record.elecEvalRoomReserve, record.evalLocation, record.reserveStatus) }, { title: '预计开始时间', dataIndex: 'startTime', valueType: 'dateTime', width: '10%', }, { title: '预计结束时间', dataIndex: 'endTime', valueType: 'dateTime', width: '10%', }, { @@ -161,10 +166,10 @@ const JudgingPanel: React.FC<{}> = (props: any) => { setAssistVisible(true); }}>外协管理} {record.elecEvalRoomReserve && (record.elecEvalRoomReserve.status == -1 || record.elecEvalRoomReserve.status == 0) && } + }}>电子评标室预约修改} ); } else { @@ -207,7 +212,7 @@ const JudgingPanel: React.FC<{}> = (props: any) => { setModalVis(true); disabledSet(check); // readOnlySet(check); - setSelectEvalData(record.elecEvalRoomReserve); + setSelectEvalData({ ...record.elecEvalRoomReserve, areaAddress: record.evalLocation }); }}>{check ? '查看' : '修改'} ) } @@ -272,8 +277,49 @@ const JudgingPanel: React.FC<{}> = (props: any) => { ] } + //评标地点 评标室更多信息 + const evalLocationTitle = (detail: any, updateData: any) => { + return ( +
+

详细地址:{updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.areaAddress : updateData?.evalLocation}

+

可容纳人数:{detail?.numberInMeeting}

+

联系人:{detail?.contactName}

+

联系电话:{detail?.contactTel}

+
+ ) + } + //说明 + const sectionNameValue = (detail: any, evalLocation: any, reserveStatus: any) => { + const address = reserveStatus == 1 ? detail?.areaAddress : evalLocation; + const content = ( + +
+
+

详细地址:{address}

+

可容纳人数:{detail?.numberInMeeting}

+

联系人:{detail?.contactName}

+

联系电话:{detail?.contactTel}

+
+
+
+ ) + let text = address.length > 30 ? address.slice(0, 30) + "..." : address; + return ( + detail != null ? ( + + + {text} + + + + ) : ( + {text} + ) + ) + } + useEffect(() => {//给表单赋值 - updateData && setIsReserve(String(updateData?.reserveStatus));//赋值给是否预约评标室 + updateData && setIsReserve(String(updateData?.reserveStatus));//赋值给是否预约电子评标室 updateData && String(updateData?.reserveStatus) == "1" && getEarliestTime(openTime, String(updateData?.reserveStatus));//初始化赋值数据 form.setFieldsValue({ juryType: updateData != undefined ? updateData.juryType : null, @@ -281,7 +327,7 @@ const JudgingPanel: React.FC<{}> = (props: any) => { expertNumber: updateData != undefined ? updateData.expertNumber : null, startTime: updateData != undefined ? updateData.reserveStatus == 1 ? moment(updateData.elecEvalRoomReserve.reserveStartDate, 'yyyy-MM-DD HH:mm:ss') : moment(updateData.startTime, 'yyyy-MM-DD HH:mm:ss') : null, endTime: updateData != undefined ? updateData.reserveStatus == 1 ? moment(updateData.elecEvalRoomReserve.reserveEndDate, 'yyyy-MM-DD HH:mm:ss') : moment(updateData.endTime, 'yyyy-MM-DD HH:mm:ss') : null, - evalLocation: updateData != undefined ? updateData.evalLocation : null, + evalLocation: updateData != undefined ? updateData.reserveStatus == 1 ? updateData.elecEvalRoomReserve.areaAddress : updateData.evalLocation : null, description: updateData != undefined ? updateData.description : null, reserveBy: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveBy : null, reserveContactNumber: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveContactNumber : null, @@ -628,18 +674,109 @@ const JudgingPanel: React.FC<{}> = (props: any) => { const tab1 = () => {//cqtab1 return ( <> -

预约评标室

-
+

预约电子评标室

+ - 注:若选择预约电子评标室,请提前做好相关准备,并按预约时间进入评标场所,系统将下发相关人员名单并获取相关数据} > + {isReserve == "1" && !disabled ? (//预约电子评标室 + + + + + + + + + + + ) : ( + + + evalLocationTitle(selectEvalData, updateData)}> + + + } /> + + + )} + {isReserve == "1" && (//预约电子评标室 + + + + )} + + + + + + + {isReserve == "1" && (//预约电子评标室 + <> + + + + + + + + )}

专家申请基本信息

@@ -691,34 +828,7 @@ const JudgingPanel: React.FC<{}> = (props: any) => { > - {isReserve == "1" ? (//预约评标室 - - - - - - - - - - - ) : ( - - - - - - )} + = (props: any) => { > - {isReserve == "1" && (//预约评标室 - - - - )} - - - - - - - {isReserve == "1" && (//预约评标室 - <> - - - - - - - - )} @@ -1421,6 +1476,7 @@ const JudgingPanel: React.FC<{}> = (props: any) => { 评审专家照片为专家进入电子评标室报道及人脸识别认证使用,若预约了电子评标室,请维护专家照片。} > @@ -1697,9 +1753,9 @@ const JudgingPanel: React.FC<{}> = (props: any) => { }} > -
-

评审小组成员管理

-
+
+

评审小组成员管理

+
{/* */}
+
+ 评审专家照片为专家进入电子评标室报道及人脸识别认证使用,若预约了电子评标室,请尽量提前维护专家照片。 +
{returnPanel()} @@ -1790,7 +1849,7 @@ const JudgingPanel: React.FC<{}> = (props: any) => { getExpertPhoto(); } } - //是否预约评标室 + //是否预约电子评标室 const onRadioChange = (e: RadioChangeEvent) => { setIsReserve(e.target.value); setSelectEvalData(null); @@ -1799,8 +1858,17 @@ const JudgingPanel: React.FC<{}> = (props: any) => { }; //评审开始时间处理 const getEarliestTime = (openTime: string | null | undefined, reserve: string) => { - let startTime = openTime ? moment(openTime).startOf("hour").add(1, 'h') : null; - let endTime = openTime ? moment(openTime).startOf("hour").add(3, 'h') : null; + let startTime = null;//开始时间小于17点正常,17点+则为null + let endTime = null; + if (openTime) { + if (moment(openTime).hour() <= 15) {//结束时间小于16点正常+2h,16-17点只能给18点,17点+则为null + startTime = moment(openTime).startOf("hour").add(1, 'h'); + endTime = moment(openTime).startOf("hour").add(3, 'h'); + } else if (moment(openTime).hour() == 16) { + startTime = moment().startOf("hour").hour(17); + endTime = moment().startOf("hour").hour(18); + } + } if (reserve == "1") {//预约了评标室 setInitEvalTime({ startTime, endTime, reserveBy: userData?.fullName, reserveContactNumber: userData?.mobilePhone, }); } else {