9.7 还原重评,多轮招募

This commit is contained in:
jl-zhoujl2
2022-09-07 17:07:08 +08:00
parent e0f3fd574b
commit 5710e80cde
2 changed files with 229 additions and 161 deletions

View File

@ -1,11 +1,10 @@
import { echoDateTimeFormatter, saveDateTimeFormatter } from '@/utils/DateUtils'; import { echoDateTimeFormatter, saveDateTimeFormatter } from '@/utils/DateUtils';
import ExtendUpload from '@/utils/ExtendUpload'; import ExtendUpload from '@/utils/ExtendUpload';
import { getProMethod } from '@/utils/session'; import { getProMethod } from '@/utils/session';
import { Button, DatePicker, Form, Input, message, Modal, Radio, Spin } from 'antd'; import { DatePicker, Form, Input, message, Modal, Radio, Spin } from 'antd';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import moment from 'moment'; import moment from 'moment';
import { isEmpty } from '@/utils/CommonUtils'; import { isEmpty } from '@/utils/CommonUtils';
import BidEvalAppointment from '@/components/ElecBidEvaluation/BidEvalAppointment';
interface AddEvaluationItemsProps { interface AddEvaluationItemsProps {
title?: string; title?: string;
modalVisible?: boolean; modalVisible?: boolean;
@ -47,12 +46,6 @@ const AddEvaluationItems: React.FC<AddEvaluationItemsProps> = (props) => {
const [sectionType, setSectionType] = useState<any>('评审'); const [sectionType, setSectionType] = useState<any>('评审');
//loading //loading
const [saveLoading, setSaveLoading] = useState<boolean>(false); const [saveLoading, setSaveLoading] = useState<boolean>(false);
//电子评标室-评标室预约选择 2022.8.26 zhoujianlong
const [selectEvalVisible, setSelectEvalVisible] = useState<boolean>(false);
//电子评标室-评标室预约选择不可选状态控制 true-不可填写 false-可填写 2022.8.26 zhoujianlong
const [selectEvalDisabled, setSelectEvalDisabled] = useState<boolean>(true);
//电子评标室-评标室预约选择-数据 2022.8.26 zhoujianlong
const [selectEvalData, setSelectEvalData] = useState<any>();
useEffect(() => { useEffect(() => {
//名称确定 //名称确定
if (MethodDict == 'procurement_mode_1' || MethodDict == 'procurement_mode_2') { if (MethodDict == 'procurement_mode_1' || MethodDict == 'procurement_mode_2') {
@ -108,28 +101,7 @@ const AddEvaluationItems: React.FC<AddEvaluationItemsProps> = (props) => {
form.submit(); form.submit();
}; };
//评标室预约回调
const returnEvalData = (value: any) => {
console.log('value', value)
setSelectEvalVisible(false);
setSelectEvalDisabled(false);
setSelectEvalData(value);
form.setFieldsValue({
evaluationStartTime: value.reserveStartDate,
evaluationEndTime: value.reserveEndDate,
evaluationPlace: value.areaAddress,
reserveBy: value.reserveBy,
reserveContactNumber: value.reserveContactNumber,
})
}
//评标室预约-选择评标室
const selectEvalClick = () => {
setSelectEvalVisible(true);
}
return ( return (
<>
<Modal <Modal
destroyOnClose destroyOnClose
title={title} title={title}
@ -163,20 +135,6 @@ const AddEvaluationItems: React.FC<AddEvaluationItemsProps> = (props) => {
<Form.Item label={`重新${sectionType}原因`} name="reason" rules={[{ required: true }, { max: 500, message: "最大不能超过500字" }]}> <Form.Item label={`重新${sectionType}原因`} name="reason" rules={[{ required: true }, { max: 500, message: "最大不能超过500字" }]}>
<TextArea rows={4} maxLength={1000} placeholder={`请填写重新${sectionType}原因`} /> <TextArea rows={4} maxLength={1000} placeholder={`请填写重新${sectionType}原因`} />
</Form.Item> </Form.Item>
<Form.Item label={`重新${sectionType}地点`} style={{ marginBottom: 0 }} required>
<Form.Item
name="evaluationPlace"
rules={[{ required: true }, { max: 100, message: "最大不能超过100字" }]}
style={{ display: 'inline-block', width: 'calc(60% - 8px)' }}
>
<Input placeholder={`请填写重新${sectionType}地点`} maxLength={200} />
</Form.Item>
<Form.Item
style={{ display: 'inline-block', width: 'calc(40% - 8px)', margin: '0 8px' }}
>
<Button type='primary' onClick={() => selectEvalClick()}></Button>
</Form.Item>
</Form.Item>
<Form.Item <Form.Item
label={`预计重新${sectionType}开始时间`} label={`预计重新${sectionType}开始时间`}
name="evaluationStartTime" name="evaluationStartTime"
@ -205,18 +163,11 @@ const AddEvaluationItems: React.FC<AddEvaluationItemsProps> = (props) => {
/> />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="reserveBy" label={`重新${sectionType}地点`}
label="预约人" name="evaluationPlace"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人` }, { max: 100, message: '内容超长' }]} rules={[{ required: true }, { max: 100, message: "最大不能超过100字" }]}
> >
<Input disabled={selectEvalDisabled} /> <Input placeholder={`请填写重新${sectionType}地点`} maxLength={200} />
</Form.Item>
<Form.Item
name="reserveContactNumber"
label="预约人联系方式"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人联系方式` }, { max: 100, message: '内容超长' }]}
>
<Input type="number" disabled={selectEvalDisabled} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label={`${sectionType}专家是否与上次一致`} label={`${sectionType}专家是否与上次一致`}
@ -243,9 +194,6 @@ const AddEvaluationItems: React.FC<AddEvaluationItemsProps> = (props) => {
</Form> </Form>
</Spin> </Spin>
</Modal> </Modal>
{/**电子评标室-评标室预约选择 */}
<BidEvalAppointment modalVisible={selectEvalVisible} onCancel={() => setSelectEvalVisible(false)} onSubmit={(value: any) => returnEvalData(value)} values={selectEvalData} />
</>
); );
}; };
export default AddEvaluationItems; export default AddEvaluationItems;

View File

@ -12,6 +12,10 @@ import { UploadOutlined } from '@ant-design/icons';
import { btnAuthority } from '@/utils/authority'; import { btnAuthority } from '@/utils/authority';
import RiskPrevention from '@/utils/RiskPrevention'; import RiskPrevention from '@/utils/RiskPrevention';
import { history } from 'umi'; import { history } from 'umi';
import { downloadFile } from '@/utils/DownloadUtils';
import ExpertPhotoUpload from '@/components/ElecBidEvaluation/ExpertPhotoUpload';
import { getUserPhoto } from '@/pages/Tender/ProjectManager/JudgingPanel/List/service';
import BidEvalAppointment from '@/components/ElecBidEvaluation/BidEvalAppointment';
const JudgingPanel: React.FC<{}> = () => { const JudgingPanel: React.FC<{}> = () => {
const modalHeight = window.innerHeight * 96 / 100; const modalHeight = window.innerHeight * 96 / 100;
@ -40,6 +44,11 @@ const JudgingPanel: React.FC<{}> = () => {
const [manNum, manNumSet] = useState<number>(5);//人数 const [manNum, manNumSet] = useState<number>(5);//人数
const [riskVisible, setRiskVisible] = useState<boolean>(false);//风控弹窗 2021.9.7 zhoujianlong const [riskVisible, setRiskVisible] = useState<boolean>(false);//风控弹窗 2021.9.7 zhoujianlong
const [riskData, setRiskData] = useState<any[]>([]);//风控数据 2021.9.7 zhoujianlong const [riskData, setRiskData] = useState<any[]>([]);//风控数据 2021.9.7 zhoujianlong
const [selectEvalVisible, setSelectEvalVisible] = useState<boolean>(false);//电子评标室-评标室预约选择 2022.8.26 zhoujianlong
const [selectEvalDisabled, setSelectEvalDisabled] = useState<boolean>(true);//电子评标室-评标室预约选择不可选状态控制 true-不可填写 false-可填写 2022.8.26 zhoujianlong
const [selectEvalData, setSelectEvalData] = useState<any>();//电子评标室-评标室预约选择-数据 2022.8.26 zhoujianlong
// const [userPhotoId, setUserPhotoId] = useState<string>("");//电子评标室-录入外部专家-相片id 2022.8.29 zhoujianlong
const [appoType, setAppoType] = useState<string>("0");//电子评标室-预约框状态 2022.8.29 zhoujianlong
function getShouName() { function getShouName() {
const method = getDefId(); const method = getDefId();
let num = 3; let num = 3;
@ -137,6 +146,11 @@ const JudgingPanel: React.FC<{}> = () => {
memberCountSet(memberCount + 1); memberCountSet(memberCount + 1);
setMemberVis(true); setMemberVis(true);
}}></Button> }}></Button>
{record.elecEvalRoomReserve && (record.elecEvalRoomReserve.status == -1 || record.elecEvalRoomReserve.status == 0) && <Button type='text' onClick={() => {
setSelectEvalData(record.elecEvalRoomReserve)
setAppoType("1");
setSelectEvalVisible(true);
}}></Button>}
</> </>
); );
} else { } else {
@ -244,14 +258,19 @@ const JudgingPanel: React.FC<{}> = () => {
} }
useEffect(() => {//给表单赋值 useEffect(() => {//给表单赋值
if (updateData?.reserveStatus == 1) {
setSelectEvalDisabled(false);
}
form.setFieldsValue({ form.setFieldsValue({
juryType: updateData != undefined ? updateData.juryType : null, juryType: updateData != undefined ? updateData.juryType : null,
representativeNumber: updateData != undefined ? updateData.representativeNumber : null, representativeNumber: updateData != undefined ? updateData.representativeNumber : null,
expertNumber: updateData != undefined ? updateData.expertNumber : null, expertNumber: updateData != undefined ? updateData.expertNumber : null,
startTime: updateData != undefined ? moment(updateData.startTime, 'yyyy-MM-DD HH:mm:ss') : 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 ? moment(updateData.endTime, '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.evalLocation : null,
description: updateData != undefined ? updateData.description : null, description: updateData != undefined ? updateData.description : null,
reserveBy: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveBy : null,
reserveContactNumber: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveContactNumber : null,
}) })
}, [updateData]); }, [updateData]);
@ -359,12 +378,20 @@ const JudgingPanel: React.FC<{}> = () => {
if (verify) { if (verify) {
verify = checkMan(count, parseInt(formVals.expertNumber)); verify = checkMan(count, parseInt(formVals.expertNumber));
} }
const st = formVals.startTime.format('yyyy-MM-DD HH:mm:ss'); const st = moment(formVals.startTime).format('yyyy-MM-DD HH:mm:ss');
const et = formVals.endTime.format('yyyy-MM-DD HH:mm:ss'); const et = moment(formVals.endTime).format('yyyy-MM-DD HH:mm:ss');
if (st > et || st == et) {//校验时间 if (st > et || st == et) {//校验时间
verify = false; verify = false;
message.error("预计开始时间应早于预计结束时间") message.error("预计开始时间应早于预计结束时间")
} }
if (selectEvalData?.reserveStatus == "1") {//预约了评标室
const selectStartTime = moment(selectEvalData.reserveStartDate).format('yyyy-MM-DD HH:mm:ss');
const selectEndTime = moment(selectEvalData.reserveEndDate).format('yyyy-MM-DD HH:mm:ss');
if (selectStartTime != st || selectEndTime != et) {
verify = false;
message.error("预约时间需与选择评标室中的预约时间相等");
}
}
if (verify) { if (verify) {
activeKeySet('2'); activeKeySet('2');
} }
@ -634,8 +661,29 @@ const JudgingPanel: React.FC<{}> = () => {
> >
<Input style={{ width: "90%" }} disabled={disabled} /> <Input style={{ width: "90%" }} disabled={disabled} />
</FormItem></Col> </FormItem></Col>
</Row> <Col span={12}>
<Row> <Form.Item label="评审地点" style={{ marginBottom: 0 }} required>
<FormItem
name="evalLocation"
rules={[...rule('评审地点'), { type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
style={{ display: 'inline-block', width: 'calc(60% - 8px)' }}
>
<Input style={{ width: "100%" }} disabled={disabled || !selectEvalDisabled} />
</FormItem>
<Form.Item
style={{ display: 'inline-block', width: 'calc(40% - 8px)', margin: '0 8px' }}
>
<Button type='primary' onClick={() => selectEvalClick()} disabled={disabled}></Button>
</Form.Item>
</Form.Item>
</Col>
<Col span={12}><FormItem
name="description"
label="申请要求"
rules={[{ type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
>
<Input style={{ width: "90%" }} disabled={disabled} />
</FormItem></Col>
<Col span={12}><FormItem <Col span={12}><FormItem
name="startTime" name="startTime"
label="预计评审开始时间" label="预计评审开始时间"
@ -647,6 +695,7 @@ const JudgingPanel: React.FC<{}> = () => {
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }} showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
disabled={disabled} disabled={disabled}
showNow={false} showNow={false}
style={{ width: "90%" }}
/> />
</FormItem></Col> </FormItem></Col>
<Col span={12}><FormItem <Col span={12}><FormItem
@ -660,22 +709,22 @@ const JudgingPanel: React.FC<{}> = () => {
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }} showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
disabled={disabled} disabled={disabled}
showNow={false} showNow={false}
style={{ width: "90%" }}
/> />
</FormItem></Col> </FormItem></Col>
</Row>
<Row>
<Col span={12}><FormItem <Col span={12}><FormItem
name="evalLocation" name="reserveBy"
label="评审地点" label="预约人"
rules={rule('评审地点')} rules={[{ required: !selectEvalDisabled, message: `请录入预约人` }, { max: 100, message: '内容超长' }]}
> >
<Input style={{ width: "90%" }} disabled={disabled} /> <Input style={{ width: "90%" }} disabled={disabled || selectEvalDisabled} />
</FormItem></Col> </FormItem></Col>
<Col span={12}><FormItem <Col span={12}><FormItem
name="description" name="reserveContactNumber"
label="申请要求" label="预约人联系方式"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人联系方式` }, { max: 100, message: '内容超长' }]}
> >
<Input style={{ width: "90%" }} disabled={disabled} /> <Input type="number" style={{ width: "90%" }} disabled={disabled || selectEvalDisabled} />
</FormItem></Col> </FormItem></Col>
</Row> </Row>
</Form> </Form>
@ -754,7 +803,7 @@ const JudgingPanel: React.FC<{}> = () => {
// const formValsCq = formCq.getFieldsValue(); // const formValsCq = formCq.getFieldsValue();
formVals.startTime != undefined ? formVals.startTime = formVals.startTime.format('yyyy-MM-DD HH:mm:ss') : null; formVals.startTime != undefined ? formVals.startTime = formVals.startTime.format('yyyy-MM-DD HH:mm:ss') : null;
formVals.endTime != undefined ? formVals.endTime = formVals.endTime.format('yyyy-MM-DD HH:mm:ss') : null; formVals.endTime != undefined ? formVals.endTime = formVals.endTime.format('yyyy-MM-DD HH:mm:ss') : null;
let params = { ...formVals, projectId: proId, juryCategoryVOList: cqData, roomId: roomId, juryRoomList: juryRoomList, }; let params = { ...formVals, projectId: proId, juryCategoryVOList: cqData, roomId: roomId, juryRoomList: juryRoomList, reserveStatus: 0 };
if (updateData != undefined) { if (updateData != undefined) {
params['id'] = updateData.id; params['id'] = updateData.id;
} }
@ -766,6 +815,16 @@ const JudgingPanel: React.FC<{}> = () => {
pass = false; pass = false;
message.error(`抽取数量不等于设置的专家数量(${count})`); message.error(`抽取数量不等于设置的专家数量(${count})`);
} }
if (selectEvalData?.reserveStatus == "1") {//预约了评标室
params.reserveStatus = 1;
const evalRoomReserveVO = {
...selectEvalData,
reserveStartDate: params.startTime,
reserveEndDate: params.endTime,
reserveSectionList: juryRoomList.map((item: any) => ({ sectionId: item.sectionId, assessRoomId: item.roomId })),
}
params["evalRoomReserveVO"] = evalRoomReserveVO;
}
if (pass) { if (pass) {
const success = await saveG(params); const success = await saveG(params);
if (success) { if (success) {
@ -827,6 +886,16 @@ const JudgingPanel: React.FC<{}> = () => {
{ title: '工作单位', dataIndex: 'workunit', }, { title: '工作单位', dataIndex: 'workunit', },
{ title: '通知状态', dataIndex: 'status', }, { title: '通知状态', dataIndex: 'status', },
{ title: '通知结果备注', dataIndex: 'remark', }, { title: '通知结果备注', dataIndex: 'remark', },
{
title: '照片',
dataIndex: 'faceId',
render: (_, record) => {
if (record.faceId) {
return <a onClick={() => downloadFile({ uid: record.faceId })}>{record.name}</a>
};
return '-';
}
},
{ {
title: '操作', dataIndex: 'option', width: 180, title: '操作', dataIndex: 'option', width: 180,
valueType: 'option', valueType: 'option',
@ -1148,7 +1217,7 @@ const JudgingPanel: React.FC<{}> = () => {
onClose={() => { onClose={() => {
setAdd(false); setAdd(false);
changeBtnSet(true); changeBtnSet(true);
formMem.resetFields(); // formMem.resetFields();
}} }}
visible={add} visible={add}
getContainer={false} getContainer={false}
@ -1215,6 +1284,19 @@ const JudgingPanel: React.FC<{}> = () => {
> >
<Input style={{ width: "60%" }} /> <Input style={{ width: "60%" }} />
</FormItem></Col></Row> </FormItem></Col></Row>
<Form.Item label="照片" style={{ marginBottom: 0 }}>
<Form.Item
name="faceId"
style={{ display: 'inline-block', width: '60%' }}
>
<ExpertPhotoUpload maxSize={60} />
</Form.Item>
<Form.Item
style={{ display: 'inline-block', width: '40%', position: "relative", right: '24%' }}
>
<Button type='primary' onClick={() => getExpertPhoto()}></Button>
</Form.Item>
</Form.Item>
{/* <Row><Col span={24}><FormItem {/* <Row><Col span={24}><FormItem
name="type" name="type"
label="通知方式" label="通知方式"
@ -1536,6 +1618,41 @@ const JudgingPanel: React.FC<{}> = () => {
memberCountSet(memberCount + 1); memberCountSet(memberCount + 1);
} }
//评标室预约回调
const returnEvalData = (value: any) => {
setSelectEvalVisible(false);
setSelectEvalDisabled(false);
setSelectEvalData(value);
form.setFieldsValue({
startTime: value.reserveStartDate,
endTime: value.reserveEndDate,
evalLocation: value.areaAddress,
reserveBy: value.reserveBy,
reserveContactNumber: value.reserveContactNumber,
})
}
//评标室预约-选择评标室
const selectEvalClick = () => {
setAppoType("0");
setSelectEvalVisible(true);
}
//录入外部专家-获取照片
const getExpertPhoto = () => {
formMem.validateFields(["certificate"]).then(value => {
getUserPhoto(value.certificate).then(res => {//获取照片
if (res?.code == 200) {
const data = res?.data;
if (data) {
formMem.setFieldsValue({ faceId: data });
message.info("获取专家照片成功");
} else {
message.info("当前专家无照片,请上传");
}
}
})
})
}
return ( return (
<div className='bgCWhite' style={{ padding: '24px' }}> <div className='bgCWhite' style={{ padding: '24px' }}>
<Spin spinning={spin}> <Spin spinning={spin}>
@ -1546,6 +1663,7 @@ const JudgingPanel: React.FC<{}> = () => {
setModalVis(true); setModalVis(true);
// form.resetFields(); // form.resetFields();
reset(); reset();
setSelectEvalData(null);
disabledSet(false); readOnlySet(false); disabledSet(false); readOnlySet(false);
}}></Button> }}></Button>
<Button style={{ marginLeft: '10px' }} onClick={() => { history.push(getRoomReturnURL()) }}></Button> <Button style={{ marginLeft: '10px' }} onClick={() => { history.push(getRoomReturnURL()) }}></Button>
@ -1607,6 +1725,8 @@ const JudgingPanel: React.FC<{}> = () => {
}} }}
data={riskData} data={riskData}
/>} />}
{/**电子评标室-评标室预约选择 */}
<BidEvalAppointment modalVisible={selectEvalVisible} onCancel={() => setSelectEvalVisible(false)} onSubmit={(value: any) => returnEvalData(value)} values={selectEvalData} type={appoType} reload={() => actionRef.current?.reload()} />
</div> </div>
) )
} }