Files
fe_service_ebtp_frontend/src/pages/ZZhaoMu/JudgingPanel/index.tsx
2023-06-06 15:19:16 +08:00

1975 lines
80 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, 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';
import { getProId, getProMethod, getDefId, getSessionProjectData, getRoomReturnURL, getSessionUserData } from '@/utils/session';
import './judgList.less';
import '@/assets/xsy_style.less';
import FileDown from '@/utils/Download';
import { DownOutlined, EllipsisOutlined, QuestionCircleOutlined, UploadOutlined } from '@ant-design/icons';
import { btnAuthority } from '@/utils/authority';
import RiskPrevention from '@/utils/RiskPrevention';
import { history } from 'umi';
import { downloadPath } from '@/utils/DownloadUtils';
import ExpertPhotoUpload from '@/components/ElecBidEvaluation/ExpertPhotoUpload';
import { getUserPhoto, unlockAccount } 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;
const proId = getProId();
const roomType = "2";
const roomId = props.location?.state?.roomId;
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<ActionType>();
const [spin, spinSet] = useState<any>(false);
const [loading, loadingSet] = useState<any>(false);
const [modalVis, setModalVis] = useState<boolean>(false);//新增评委会
const [updateData, updateDataSet] = useState<any>();//评委会modal数据
const [memberVis, setMemberVis] = useState<boolean>(false);
const [open, openSet] = useState<boolean>(false);//评委会里是否有开启评审的评审室 true有开启的 false无
const [allEnd, allEndSet] = useState<boolean>(true);//评委会关联标段的评审室是否都关闭了
// const [yushen, yushenSet] = useState<boolean>(false);//是否预审
// const [readOnly, readOnlySet] = useState<boolean>(true);//只读
const [disabled, disabledSet] = useState<boolean>(true);//禁用
// const [manNum, manNumSet] = useState<number>(5);//人数
const [riskVisible, setRiskVisible] = useState<boolean>(false);//风控弹窗 2021.9.7 zhoujianlong
const [riskData, setRiskData] = useState<any[]>([]);//风控数据 2021.9.7 zhoujianlong
const [selectEvalVisible, setSelectEvalVisible] = useState<boolean>(false);//电子评标室-评标室预约选择 2022.8.26 zhoujianlong
const [selectEvalData, setSelectEvalData] = useState<any>();//电子评标室-评标室预约选择-数据 2022.8.26 zhoujianlong
const [initEvalTime, setInitEvalTime] = useState<any>();//电子评标室-时间输入框默认时间(跟随标段) 2022.9.27 zhoujianlong
// const [userPhotoId, setUserPhotoId] = useState<string>("");//电子评标室-录入外部专家-相片id 2022.8.29 zhoujianlong
const [appoType, setAppoType] = useState<string>("0");//电子评标室-预约框状态 2022.8.29 zhoujianlong
const [isReserve, setIsReserve] = useState<string>("0");//电子评标室-是否预约电子评标室 2022.9.23 zhoujianlong 0-不预约 1-预约
const userData = getSessionUserData();//当前登录人用户信息
const [assistVisible, setAssistVisible] = useState<boolean>(false);//协办管理visible 2022.10.10 zhoujianlong
//外协管理
const [assistList, setAssistList] = useState<any>([]);//外协人员数据 assistList
const [assistNumber, setAssistNumber] = useState<string>("");//外协人员数量 assistNumber
// function getShouName() {
// const method = getDefId();
// let num = 3;
// if (method === 'procurement_mode_1' || method === 'procurement_mode_2' || method === 'procurement_mode_3') {//招标
// num = 5;
// }
// manNumSet(num);
// }
//创建控制
// const [activeKey, activeKeySet] = useState('1');
//创建评委会小组
const saveG = async (fields: any) => {
const hide = message.loading('正在配置');
try {
const success = await saveGroup({ ...fields }).then((res) => {
if (res?.code == 4004 && res?.success == false) { //2021.9.7 zhoujianlong 新增评委会保存增加风控
const data = res?.data?.result == undefined ? [] : res?.data?.result
setRiskData(data)
setRiskVisible(true)
}
return res.success
});
hide();
if (success) {
message.success('配置成功');
}
return true;
} catch (error) {
hide();
message.error('配置失败请重试!');
return false;
}
};
//主页表格
const [dataSource, dataSourceSet] = useState<any>();//主列表数据
const [btnDis, btnDisSet] = useState<boolean>(true);//创建评审室按钮
const columns: ProColumns<any>[] = [
{ title: '序号', valueType: 'index', width: 50, },
// {
// title: '评审小组分类', dataIndex: 'juryType', width: '10%',
// valueEnum: {
// '1': { text: '资格预审评审', },
// '2': { text: '招标项目评审', },
// }
// },
{ title: '包件名称', dataIndex: 'sectionName', },
{ title: '专家数量', dataIndex: 'expertNumber', width: 80, },
{ title: '采购人代表数量', dataIndex: 'representativeNumber', width: 120, },
{ title: '是否预约电子评标室', dataIndex: 'reserveStatus', width: 150, valueEnum: { 1: "是", 0: "否" } },
{ title: "评审地点", dataIndex: 'evalLocation', width: '18%', 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%', },
{
title: '操作', dataIndex: 'option', width: '16%',
valueType: 'option',
render: (_, record) => {
if (record.status == 0 || record.status == 2) {
return (
<>
{returnCheck(record, false)}
<Popconfirm
placement="topRight"
title={"确定删除么?"}
onConfirm={async () => {
spinSet(true)
await del({ id: record.id });
getPage();
spinSet(false)
}}
okText="确定"
cancelText="取消"
>
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='text'></Button>
</Popconfirm>
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='text' onClick={async () => {
spinSet(true)
await apply({ id: record.id });
getPage();
spinSet(false)
}}></Button>
</>
)
} else if (record.status == 1) {//已提交申请
return (
<>{returnCheck(record, true)}</>
)
} else if (record.status == 3) {
return (
<>
{returnCheck(record, true)}
<Button type='text' onClick={async () => {
await queryOpenStatus(record.id);
categorySet(record.juryCategoryVOList);
juryIdSet(record.id);
memberCountSet(memberCount + 1);
setMemberVis(true);
}}></Button>
{record.assistNumber != null && <Button type='text' onClick={async () => {
await queryOpenStatus(record.id);
setAssistList(record.assistList.map((item: any, index: any) => { item.key = index; return item }));
setAssistNumber(record.assistNumber);
juryIdSet(record.id);
setAssistVisible(true);
}}></Button>}
{record.elecEvalRoomReserve && (record.elecEvalRoomReserve.status == -1 || record.elecEvalRoomReserve.status == 0) && <Button type='text' onClick={() => {
setSelectEvalData({ ...record.elecEvalRoomReserve, areaAddress: record.evalLocation });
setAppoType("1");
setSelectEvalVisible(true);
}}></Button>}
</>
);
} else {
return (<></>)
}
}
},
];
useEffect(() => {
getPage();
// getShouName();//人数判断
}, [])
async function getPage() {
spinSet(true);
getList(roomId).then(res => {
if (res?.data != undefined) {
dataSourceSet([res.data]);
} else {
dataSourceSet([]);
}
btnDisSet(res.data != undefined);
})
spinSet(false);
}
function returnCheck(record: any, check: any) {//返回操作列查看、修改按钮
return (
<Button
hidden={!check && btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])}
type='text'
onClick={() => {
updateDataSet(record);
//剔除代表
let list = [...record.juryCategoryVOList];
list.map((item: any, index: any) => {
if (item.category == 1) {
list.splice(index, 1);
}
});
cqDataSet(list);
setModalVis(true);
disabledSet(check);
// readOnlySet(check);
setSelectEvalData({ ...record.elecEvalRoomReserve, areaAddress: record.evalLocation });
}}>{check ? '查看' : '修改'}</Button>
)
}
//删除
const del = async (fields: any) => {
const hide = message.loading('正在删除');
try {
const success = await delOne({ ...fields }).then((res) => {
return res.success
});
hide();
if (success) {
message.success('删除成功');
return true;
} else {
message.error('删除失败');
return false;
}
} catch (error) {
hide();
message.error('删除失败请重试!');
getPage();
return false;
}
};
//提交申请
const apply = async (fields: any) => {
const hide = message.loading('正在提交');
try {
const success = await await applyFor({ ...fields }).then((res) => {
return res.success
});
hide();
if (success) {
message.success('提交成功');
return true;
} else {
message.error('提交失败');
return false;
}
} catch (error) {
hide();
message.error('提交失败请重试!');
getPage();
return false;
}
};
function disabledDate(current: any) {//日期选择
// Can not select days before today and today
return current && current < moment().startOf('day');
}
const rule = (mes: any) => {//创建修改 规则
return [
{
required: true,
message: `请录入${mes}`,
},
]
}
//评标地点 评标室更多信息
const evalLocationTitle = (detail: any, updateData: any) => {
return (
<div className="eval-location-title">
<p>{updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.areaAddress : updateData?.evalLocation}</p>
<p>{detail?.numberInMeeting}</p>
<p>{detail?.contactName}</p>
<p>{detail?.contactTel}</p>
</div>
)
}
//说明
const sectionNameValue = (detail: any, evalLocation: any, reserveStatus: any) => {
const address = reserveStatus == 1 ? detail?.areaAddress : evalLocation;
const content = (
<Paragraph>
<blockquote style={{ width: '300px' }}>
<div className="eval-location-title">
<p>{address}</p>
<p>{detail?.numberInMeeting}</p>
<p>{detail?.contactName}</p>
<p>{detail?.contactTel}</p>
</div>
</blockquote>
</Paragraph>
)
let text = address.length > 30 ? address.slice(0, 30) + "..." : address;
return (
detail != null ? (
<span>
<Popover content={content} trigger={["hover"]} placement="bottom">
<span style={{ cursor: 'pointer' }}>
{text}
<QuestionCircleOutlined style={{ marginLeft: '4px' }} />
</span>
</Popover>
</span>
) : (
<span>{text}</span>
)
)
}
//专家账号解锁
const unlockExportAccount = async (record: any, juryId: any, proId: any) => {
try {
const res = await unlockAccount(record.id, juryId, proId);
if (res.success) {
message.success(res.data);
}
} catch (error) {
}
}
useEffect(() => {//给表单赋值
updateData && setIsReserve(String(updateData?.reserveStatus));//赋值给是否预约电子评标室
updateData && String(updateData?.reserveStatus) == "1" && getEarliestTime(openTime, 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.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,
assistNumber: updateData?.reserveStatus == 1 ? updateData.assistNumber : null,
})
}, [updateData]);
const group = () => {//评审小组modal
return (
<>
<Modal
visible={modalVis}
style={{ overflowX: 'hidden', position: 'relative', }}
bodyStyle={{ maxHeight: "500px", overflowY: 'auto', overflowX: 'hidden', minHeight: '420px', width: '1000px', }}
width={'1000px'}
centered
maskClosable={false}
title="创建评审小组"
footer={renderFooter()}
onCancel={() => {
setModalVis(false);
updateDataSet({});
// cqDataSet([]);
// updateKeySet(-1);
// activeKeySet('1');
}}
>
{/* <Tabs size="large" style={{ backgroundColor: '#fff' }} activeKey={activeKey} onChange={changeTabs}>
<TabPane tab="评委会基本信息" key="1">
{tab1()}
</TabPane>
<TabPane tab="抽取条件设置" key="2">
{tab2()}
</TabPane>
</Tabs>
{cqDrawer()} */}
{tab1()}
</Modal>
</>
)
}
// function changeTabs(key: any) {
// if (key == 1) {
// activeKeySet(key);
// } else {
// nextStep()
// }
// }
//人数校验
function checkMan(count: number, expCon: any) {
let res = true;
const defId = getDefId();//16
const method = getProMethod();//9
const yushenType = getSessionProjectData().openTenderForm;
let manNumT = 5;
if (method === 'procurement_mode_1' || method === 'procurement_mode_2') {
if (false && yushenType == 'open_tender_form_2') {//资格预审 自愿招标为3
manNumT = 3;
}
if (expCon < count * 2 / 3) {
res = false;
message.error("专家人数不少于评委会总人数2/3")
}
} else if (method === 'procurement_mode_3') {//比选
if (expCon < count * 2 / 5) {
res = false;
message.error("专家人数不少于评委会总人数2/5")
}
} else if (method === 'procurement_mode_4') {//招募
manNumT = 1;
if (count < manNumT) {
res = false;
message.error(`评委会总人数需大于1`)
} else {
return true;
}
} else if (method === 'procurement_mode_5') {//竞谈
if (manNumT = 5) {//最低价
manNumT = 3;
}
if (expCon < count * 1 / 3) {
res = false;
message.error("专家人数不少于评委会总人数1/3")
}
} else if (method === 'procurement_mode_6') {//单一
manNumT = 3;
} else if (method === 'procurement_mode_9') {//单一
manNumT = 3;
} else if (defId == 'inquiry') {//询价
manNumT = 3;
}
if (count < manNumT || count % 2 == 0) {//校验总人数
res = false;
message.error(`评委会总人数需大于等于${manNumT}人且为单数`)
}
return res
}
// async function nextStep() {//下一步
// const formVals = form.getFieldsValue();
// let verify = false;
// await form.validateFields().then(() => {
// let juryRoomListTem: any = [];
// juryRoomListTem.push({ roomId: roomId, sectionId: sectionId, roomType: roomType });
// verify = true;
// juryRoomListSet(juryRoomListTem);
// //采购人数需要大于5 需要取项目类型
// const count = parseInt(formVals.representativeNumber) + parseInt(formVals.expertNumber);
// if (verify) {
// verify = checkMan(count, parseInt(formVals.expertNumber));
// }
// const st = moment(formVals.startTime).format('yyyy-MM-DD HH:mm:ss');
// const et = moment(formVals.endTime).format('yyyy-MM-DD HH:mm:ss');
// if (st > et || st == et) {//校验时间
// verify = false;
// 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) {
// activeKeySet('2');
// }
// })
// }
//添加抽取drawer
const formLayoutDrawer = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, };
const tailLayoutDrawer = { wrapperCol: { offset: 8, span: 20 }, };
// const [juryRoomList, juryRoomListSet] = useState<any>([]);
const [cqData, cqDataSet] = useState<any>([]);//抽取表格,提交时需要
// const [addCq, addCqSet] = useState<any>(false);//添加抽取抽屉显示控制
// const [updateKey, updateKeySet] = useState<any>(-1);//触发修改存key
// const [formCq] = Form.useForm();
// const [display, displaySet] = useState<any>(true);
// const columnsCq: ProColumns<any>[] = [//抽取表格
// { title: '序号', valueType: 'index', width: 50, },
// {
// title: '专家分类', dataIndex: 'subCategory',
// valueEnum: {
// '1': { text: '技术', },
// '2': { text: '商务', },
// '3': { text: '法律', },
// '4': { text: '其它', },
// }
// },
// { title: '需抽数量', dataIndex: 'extractNumber', },
// {
// title: '抽取方式', dataIndex: 'extractMethod',
// valueEnum: {
// '1': { text: '外部录入', },
// '2': { text: '随机抽取', },
// }
// },
// { title: '抽取规则要求', dataIndex: 'cqRude', },
// {
// title: '操作', dataIndex: 'option', width: 100,
// valueType: 'option',
// render: (_, record) => {
// return (
// <>
// {
// !disabled ?
// <>
// <Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='text' onClick={() => {
// addCqSet(true);
// updateKeySet(record.key);
// formCq.setFieldsValue({ ...record });
// }}>修改</Button>
// <Popconfirm
// placement="topRight"
// title={"确定删除么?"}
// onConfirm={async () => {
// let dataTem = [...cqData];
// dataTem.map((item: any, index: any) => {
// if (item.key == record.key) {
// dataTem.splice(index, 1)
// }
// });
// cqDataSet(dataTem);
// }}
// okText="确定"
// cancelText="取消"
// >
// <Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='text' >删除</Button>
// </Popconfirm>
// </>
// : <></>
// }
// </>
// );
// }
// },
// ];
// const cqDrawer = () => {//添加抽取条件、修改
// return (
// <>
// <Drawer
// title="抽取条件"
// placement="right"
// width={'40%'}
// onClose={() => { addCqSet(false); updateKeySet(-1); formCq.resetFields(); }}
// visible={addCq}
// getContainer={false}
// style={{ position: 'absolute' }}
// >
// <Form {...formLayoutDrawer} form={formCq}>
// <Row>
// <Col span={24}>
// <FormItem name="subCategory" label="专家分类" rules={rule('专家分类')}>
// <Select style={{ width: "50%" }} >
// <Option value="1" title='技术'>技术</Option>
// <Option value="2" title='商务'>商务</Option>
// <Option value="3" title='法律'>法律</Option>
// <Option value="4" title='其它'>其它</Option>
// </Select>
// </FormItem>
// </Col>
// </Row>
// <Row>
// <Col span={24}>
// <FormItem name="extractNumber" label="需求数量" rules={[
// ...rule('需求数量'),
// {
// pattern: /^[0-9]+$/,
// message: '需求数量应为正整数',
// }
// ]}>
// <Input type='number' style={{ width: "50%" }} />
// </FormItem>
// </Col>
// </Row>
// <Row>
// <Col span={24}>
// <FormItem name="extractMethod" label="抽取方式" rules={rule('抽取方式')} initialValue='1'>
// <Select style={{ width: "50%" }}>
// <Option value="1" title='外部录入'>外部录入</Option>
// {/* <Option value="2" title='随机抽取'>随机抽取</Option> */}
// </Select>
// </FormItem>
// </Col>
// </Row>
// <div>
// {/* <Row>
// <Col span={24}>
// <FormItem name="cqbs" label="抽取倍数">
// <Select style={{ width: "40%" }} >
// <Option value="1倍">1倍</Option>
// </Select>
// </FormItem>
// </Col>
// </Row>
// <Row>
// <Col span={24}>
// <FormItem name="lxcq" label="是否轮询抽取">
// <Radio.Group>
// <Radio value={0}>否</Radio>
// <Radio value={1}>是</Radio>
// </Radio.Group>
// </FormItem>
// </Col>
// </Row>
// <Row>
// <Col span={24}>
// <FormItem name="zjly" label="专家来院">
// <Checkbox >中国联通</Checkbox>
// </FormItem>
// </Col>
// </Row>
// <Row>
// <Col span={24}>
// <FormItem name="area" label="所属地区">
// <Checkbox >中国联通</Checkbox>
// </FormItem>
// </Col>
// </Row>
// <Row>
// <Col span={24}>
// <FormItem name="zhuanye" label="评审专业">
// <Checkbox >中国联通</Checkbox>
// </FormItem>
// </Col>
// </Row> */}
// </div>
// <Row><Col span={24}><FormItem {...tailLayoutDrawer}>
// <Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" loading={loading} onClick={async () => {
// let formValsCq = formCq.getFieldsValue();
// let dataTem = [...cqData];
// let verify = false;
// loadingSet(true);
// await formCq.validateFields().then(() => {
// verify = true;
// let index = -1;
// index = cqData.findIndex((item: any) => item.key == updateKey);//技术的key对不上 查询cqData里对应的index
// for (const item of cqData) {
// if (cqData[index] != undefined) {//修改
// if (cqData[index].subCategory != formValsCq.subCategory && formValsCq.subCategory == item.subCategory) {
// verify = false; message.error('该类别已存在')
// }
// } else {
// if (formValsCq.subCategory == item.subCategory) {
// verify = false; message.error('该类别已存在')
// }
// }
// }
// }).catch((errorInfo) => {
// // message.error(errorInfo);
// loadingSet(false);
// });
// //如果 updateKey有值走修改
// if (verify) {
// if (updateKey != -1) {
// dataTem.map((item: any, index: any) => {
// if (item.key == updateKey) {
// dataTem[index] = { ...formValsCq, key: updateKey, category: 2 };
// }
// });
// cqDataSet(dataTem);
// addCqSet(false); updateKeySet(-1); formCq.resetFields();//清空
// } else {
// let num = 0;
// if (dataTem.length != 0) {
// num = dataTem[dataTem.length - 1].key + 1;
// }
// dataTem.push({ ...formValsCq, key: num, category: 2 });
// cqDataSet(dataTem);
// addCqSet(false); updateKeySet(-1); formCq.resetFields();
// }
// }
// loadingSet(false);
// }}>保存</Button>
// </FormItem></Col></Row>
// </Form>
// </Drawer>
// </>
// )
// }
const tab1 = () => {//cqtab1
return (
<>
<h3 className="first-title"></h3>
<Form {...formLayout} form={form}>
<Row>
<Col span={24}><FormItem
label="是否预约电子评标室"
required
{...form24Layout}
extra={<span style={{ color: '#b30000' }}></span>}
>
<Radio.Group onChange={onRadioChange} value={isReserve} disabled={disabled}>
<Radio value="1"></Radio>
<Radio value="0"></Radio>
</Radio.Group>
</FormItem></Col>
{isReserve == "1" && !disabled ? (//预约电子评标室
<Col span={12}>
<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={true} placeholder="评审地点" />
</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="evalLocation"
label="评审地点"
rules={[...rule('评审地点'), { type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
tooltip={(disabled && isReserve == "1") && evalLocationTitle(selectEvalData, updateData)}
>
<Input style={{ width: "90%" }} disabled={disabled} placeholder="评审地点" />
</FormItem>
</Col>
)}
{isReserve == "1" && (//预约电子评标室
<Col span={12}><FormItem
name="assistNumber"
label="外协人员数量"
rules={[{ type: 'string', message: '请输入正确内容' }, { pattern: /^([1-9]?\d|100)$/, message: '请输入正确数值' }]}
tooltip="在合规情况下临时可进入电子评标室人员,如视察领导等。"
>
<Input style={{ width: "90%" }} type="number" disabled={disabled} />
</FormItem></Col>
)}
<Col span={12}><FormItem
name="startTime"
label="预计评审开始时间"
rules={rule('开始时间')}
>
<DatePicker
format="YYYY-MM-DD HH:mm:ss"
disabledDate={disabledDate}
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
disabled={disabled || (isReserve == "1")}
showNow={false}
style={{ width: "90%" }}
/>
</FormItem></Col>
<Col span={12}><FormItem
name="endTime"
label="预计评审结束时间"
rules={rule('结束时间')}
>
<DatePicker
format="YYYY-MM-DD HH:mm:ss"
disabledDate={disabledDate}
showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }}
disabled={disabled || (isReserve == "1")}
showNow={false}
style={{ width: "90%" }}
/>
</FormItem></Col>
{isReserve == "1" && (//预约电子评标室
<>
<Col span={12}><FormItem
name="reserveBy"
label="预约人"
rules={[{ required: true, message: `请录入预约人` }, { max: 100, message: '内容超长' }]}
>
<Input style={{ width: "90%" }} disabled={true} placeholder="预约人" />
</FormItem></Col>
<Col span={12}><FormItem
name="reserveContactNumber"
label="预约人联系方式"
rules={[{ required: true, message: `请录入预约人联系方式` }, { max: 100, message: '内容超长' }]}
>
<Input type="number" style={{ width: "90%" }} disabled={true} placeholder="预约人联系方式" />
</FormItem></Col>
</>
)}
</Row>
</Form>
<h3 className="first-title"></h3>
<Form {...formLayout} form={form}>
{/* {
display ?
<Row style={{ marginTop: '20px', }}>
<Col span={12}>
<FormItem
name="juryType"
label="专家申请分类"
rules={rule('专家申请分类')} >
<Select style={{ width: "60%" }} disabled={disabled}>
<Option value="1" title='资格预审评审'>资格预审评审</Option>
<Option value="2" title='招标项目评审'>招标项目评审</Option>
</Select>
</FormItem>
</Col>
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={disabled} style={{ marginLeft: '-120px' }} type='primary' onClick={() => {
form.setFieldsValue({ juryType: '' }); displaySet(!display)
}}>{display ? '自行输入' : '选择分类'}</Button>
</Row>
: <Row style={{ marginTop: '20px', }}>
<Col span={12}>
<FormItem
name="juryType"
label="专家申请分类"
rules={rule('专家申请分类')} >
<Input style={{ width: "60%" }} disabled={disabled} />
</FormItem>
</Col>
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={disabled} style={{ marginLeft: '-120px' }} type='primary' onClick={() => {
form.setFieldsValue({ juryType: '' }); displaySet(!display)
}}>{display ? '自行输入' : '选择分类'}</Button>
</Row>
} */}
<Row>
<Col span={12}><FormItem
name="representativeNumber"
label="采购人代表数量"
rules={[...rule('采购人代表数量'), { pattern: /^([1-9]?\d|100)$/, message: '请输入正确数值' }]}
>
<Input style={{ width: "90%" }} type="number" disabled={disabled} placeholder="采购人代表数量" />
</FormItem></Col>
<Col span={12}><FormItem
name="expertNumber"
label="专家数量(不含代表)"
rules={[...rule('专家数量'), { pattern: /^([1-9]?\d|100)$/, message: '请输入正确数值' }]}
>
<Input style={{ width: "90%" }} type="number" disabled={disabled} placeholder="专家数量" />
</FormItem></Col>
<Col span={12}><FormItem
name="description"
label="申请要求"
rules={[{ type: 'string', message: '请输入正确内容' }, { max: 100, message: '内容超长' }]}
>
<Input style={{ width: "90%" }} disabled={disabled} />
</FormItem></Col>
</Row>
</Form>
</>
)
}
// const tab2 = () => {//cqtab2
// return (
// <>
// <div className='headerDiv'>
// <h3 className="first-title floatLeft">抽取条件</h3>
// <div className='rightDiv'>
// <Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={disabled} type='primary' onClick={() => { addCqSet(true) }}>添加抽取条件</Button>
// </div>
// </div>
// <ProTable
// columns={columnsCq}
// dataSource={cqData}
// search={false}
// pagination={false}
// options={false}
// bordered
// />
// <div className='headerDiv mt15'>
// <h3 className="first-title floatLeft">回避单位信息</h3>
// <div className='rightDiv'>
// <Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='primary'>添加回避单位</Button>
// </div>
// </div>
// <div className='headerDiv mt15'>
// <h3 className="first-title floatLeft">回避专家信息</h3>
// <div className='rightDiv'>
// <Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='primary'>添加回避专家</Button>
// </div>
// </div>
// </>
// )
// }
const renderFooter = () => {//评审小组footer
// if (activeKey === '1') {
// return (
// <>
// <Button onClick={() => {
// setModalVis(false);
// updateDataSet({});
// cqDataSet([]);
// updateKeySet(-1);
// activeKeySet('1');
// }}>取消</Button>
// <Button type="primary" onClick={async () => {
// nextStep();
// }}>
// 下一步
// </Button>
// </>
// );
// }
// if (activeKey === '2') {
// return (
// <>
// <Button style={{ float: 'left' }} onClick={() => { activeKeySet('1') }}>
// 上一步
// </Button>
// <Button onClick={() => {
// setModalVis(false);
// updateDataSet({});
// cqDataSet([]);
// updateKeySet(-1);
// activeKeySet('1');
// }}>{disabled ? '关闭' : '取消'}</Button>
// <Button hidden={disabled || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" loading={loading} onClick={async () => {
// loadingSet(true);
// let pass = true;
// const formVals = form.getFieldsValue();
// const count = parseInt(formVals.expertNumber);
// // const formValsCq = formCq.getFieldsValue();
// 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;
// let params = { ...formVals, projectId: proId, juryCategoryVOList: cqData, roomId: roomId, juryRoomList: juryRoomList, reserveStatus: 0 };
// if (updateData != undefined) {
// params['id'] = updateData.id;
// }
// let countCq = 0;
// cqData.map((item: any) => {
// countCq = countCq + parseInt(item.extractNumber);
// });
// if (count != countCq) {
// pass = false;
// 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) {
// const success = await saveG(params);
// if (success) {
// getPage();
// cqDataSet([]);
// updateKeySet(-1);
// }
// setModalVis(false);
// updateDataSet({});
// activeKeySet('1');
// }
// loadingSet(false);
// }}>
// 完成
// </Button>
// </>
// );
// } else {
// return (<></>)
// }
return (
<>
<Button onClick={() => {
setModalVis(false);
updateDataSet({});
// cqDataSet([]);
// updateKeySet(-1);
// activeKeySet('1');
}}>{disabled ? '关闭' : '取消'}</Button>
<Button hidden={disabled || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" loading={loading} onClick={() => {
let pass = false;
//原下一步逻辑开始
let juryRoomList: any = [];
juryRoomList.push({ roomId: roomId, sectionId: sectionId, roomType: roomType });
form.validateFields().then(async (formVals) => {
loadingSet(true);
pass = true;
//招标人数需要大于5 需要取项目类型
const bidCount = parseInt(formVals.representativeNumber) + parseInt(formVals.expertNumber);
if (pass) {
pass = checkMan(bidCount, parseInt(formVals.expertNumber));
}
const st = moment(formVals.startTime).format('yyyy-MM-DD HH:mm:ss');
const et = moment(formVals.endTime).format('yyyy-MM-DD HH:mm:ss');
if (st > et || st == et) {//校验时间
pass = false;
message.error("预计开始时间应早于预计结束时间")
}
//原下一步逻辑结束
// const formVals = form.getFieldsValue();
const count = parseInt(formVals.expertNumber);
// const formValsCq = formCq.getFieldsValue();
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;
const _cqData = cqData.length > 0 ? [{ ...cqData[0], extractNumber: count }] : [{ category: "2", extractMethod: "1", extractNumber: count, subCategory: "4" }]//抽取数量录入
let params = { ...formVals, juryRoomList: juryRoomList, projectId: proId, juryCategoryVOList: _cqData, reserveStatus: 0 };
if (updateData != undefined) {
params['id'] = updateData.id;
}
// let countCq = 0;
// _cqData.map((item: any) => {
// countCq = countCq + parseInt(item.extractNumber);
// });
// if (count != countCq) {
// pass = false;
// message.error(`抽取数量不等于设置的专家数量(${count})`);
// }
if (isReserve == "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) {
const success = await saveG(params);
if (success) {
// actionRef.current?.reload();
getPage();
// cqDataSet([]);
// updateKeySet(-1);
}
setModalVis(false);
updateDataSet({});
// activeKeySet('1');
}
loadingSet(false);
})
}}>
</Button>
</>
)
};
//成员管理
const [add, setAdd] = useState<boolean>(false);//录入外部专家Drawer显隐
const [changeMan, changeManSet] = useState<boolean>(false);//更换Drawer显隐
const [juryId, juryIdSet] = useState<any>('');//更换专家所需评委会id
const [reason, reasonSet] = useState<any>('');//更换专家原因
const [category, categorySet] = useState<any>([]);//类别 juryCategoryVOList
const [daibiao, daibiaoSet] = useState<any>({});//代表
const [jishu, jishuSet] = useState<any>({});//技术
const [shangwu, shangwuSet] = useState<any>({});//商务
const [falv, falvSet] = useState<any>({});//法律
const [qita, qitaSet] = useState<any>({});//其它
const [luru, luruSet] = useState<number>(0);//录入外部传类别
const [updateKeyMem, updateKeyMemSet] = useState<any>(-1);//触发修改存key
const [memberCount, memberCountSet] = useState<number>(0);//刷新成员管理页面
const [checkBoxs, checkBoxsSet] = useState<any>([]);//更换专家按钮组
const [checkBoxsStatus, checkBoxsStatusSet] = useState<any>({});//更换专家按钮组
const [changeMemberId, changeMemberIdSet] = useState<any>('');//更换专家id
const [changeBtn, changeBtnSet] = useState<any>(true);//更换按钮显隐
const [formMem] = Form.useForm();
function reset() {//重置
categorySet([]);
// daibiaoSet({});
// shangwuSet({});
// falvSet({});
// qitaSet({});
luruSet(0);
updateKeyMemSet(-1);
checkBoxsSet([]);
changeMemberIdSet('');
form.resetFields();
}
const columnsMember: ProColumns<any>[] = [//成员管理页面表格
{ title: '序号', valueType: 'index', width: 50, },
{ title: '专家姓名', dataIndex: 'name', },
{ title: '手机号码', dataIndex: 'mobile', },
{ title: '证件号码', dataIndex: 'certificate', },
{ title: '工作单位', dataIndex: 'workunit', },
{ title: '通知状态', dataIndex: 'status', },
{ title: '通知结果备注', dataIndex: 'remark', },
{
title: '照片',
dataIndex: 'faceId',
render: (_, record) => {
if (record.faceId) {
// return <a onClick={() => downloadFile({ uid: record.faceId })}>{record.name}</a>
return <Image height={80} width={60} src={downloadPath + '?fileId=' + record.faceId} />
};
return '-';
}
},
{
title: '操作', dataIndex: 'option', width: 180,
valueType: 'option',
render: (_, record) => {
return (
<>
<Button type='text' hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} onClick={() => {//修改
returnType(record.categoryId);
setAdd(true);
updateKeyMemSet(record.key);
changeBtnSet(true);
formMem.setFieldsValue({ ...record });
}}></Button>
<Popconfirm
placement="topRight"
title={"确定删除么?"}
onConfirm={() => { confirmMem(record); }}
okText="确定"
cancelText="取消"
>
<Button type='text' hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])}></Button>
</Popconfirm>
<Button type='text' hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase']) || record.changeStatus == 0 || record.changeStatus == undefined} onClick={() => {//更换
returnType(record.categoryId);
setAdd(true);
updateKeyMemSet(record.key);
changeMemberIdSet(record.id);
changeBtnSet(false);
formMem.setFieldsValue({ ...record });
}}></Button>
<Button type='text' hidden={!open || allEnd || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} onClick={async () => {
await rePassWord(record.id);
}}></Button>
<Button type='text' hidden={!open || allEnd || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} onClick={async () => {
unlockExportAccount(record, juryId, proId)
}}></Button>
</>
);
}
},
];
function returnType(inId: any) {//修改时根据record.categoryId判断类别
category != undefined ? category.map((item: any,) => {
if (item.id == inId) {
if (item.category == 1) {
luruSet(1);
} else if (item.category == 2 && item.subCategory == 1) {
luruSet(2);
} else if (item.category == 2 && item.subCategory == 2) {
luruSet(3);
} else if (item.category == 2 && item.subCategory == 3) {
luruSet(4);
} else if (item.category == 2 && item.subCategory == 4) {
luruSet(5);
}
}
}) : null;
}
function returnCate(luru: any) {//取data
switch (luru) {
case 1: return daibiao;
case 2: return jishu;
case 3: return shangwu;
case 4: return falv;
case 5: return qita;
default: break;
}
}
function dataSet(data: any, luru: any) {//塞data
let dataT = [];
switch (luru) {
case 1: dataT = daibiao; dataT.juryMemberList = data; daibiaoSet(dataT); break;
case 2: dataT = jishu; dataT.juryMemberList = data; jishuSet(dataT); break;
case 3: dataT = shangwu; dataT.juryMemberList = data; shangwuSet(dataT); break;
case 4: dataT = falv; dataT.juryMemberList = data; falvSet(dataT); break;
case 5: dataT = qita; dataT.juryMemberList = data; qitaSet(dataT); break;
default: break;
}
}
function returnHeader(name: any) {
return (
<h3 className="first-title">{name}</h3>
)
}
function returnCheckBox(type: any) {//更改选人
return (
<>
{type != undefined ?
type.map((item: any) => {
return (
<Checkbox checked={checkBoxsStatus[item.id]} name='checkBoxsChange' value={item.id} key={item.id} onChange={(e) => {
let data = [...checkBoxs];
let status = { ...checkBoxsStatus };
if (e.target.checked) {
data.push({ memberId: item.id });
status[item.id] = true;
} else {
data.map((item: any, index: any) => {
item.memberId == e.target.value ? data.splice(index, 1) : null;
})
status[item.id] = false;
}
checkBoxsStatusSet(status);
checkBoxsSet(data);
}}>{item.name}</Checkbox>
)
}) : null
}
</>
)
}
useEffect(() => {//拆类别
daibiaoSet({});
jishuSet({});
shangwuSet({});
falvSet({});
qitaSet({});
category.map((item: any) => {
if (item.category == 1) {
daibiaoSet(item);
} else {
if (item.subCategory == 1) {
jishuSet(item);
} else if (item.subCategory == 2) {
shangwuSet(item);
} else if (item.subCategory == 3) {
falvSet(item);
} else if (item.subCategory == 4) {
qitaSet(item);
}
}
});
}, [memberCount]);
async function queryOpenStatus(id: any) {//查是否开启评审 id:评委会id
await roomStatus(id).then((res) => {
if (res.data) {
openSet(res.data.anyOpenRoom);
allEndSet(res.data.allEndRoom);
}
})
}
const returnPanel = () => {//返回手风琴
return (
<>
{daibiao.juryMemberList != undefined ?
<Panel header={`采购人代表(最大人数:${daibiao.extractNumber})`} key="1">
<ProTable
key='proTable1'
columns={columnsMember}
dataSource={daibiao.juryMemberList}
bordered
style={{ padding: '16px' }}
options={false}
search={false}
pagination={false}
toolBarRender={() => [
<Button key="button" hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={daibiao.extractNumber == daibiao.length} type="primary"
onClick={() => {
if (returnCate(1).juryMemberList.length != returnCate(1).extractNumber) {
setAdd(true); luruSet(1); formMem.resetFields();
} else {
message.error('录入人数已满')
}
}}
> </Button>
]}
/>
</Panel>
: null}
{jishu.juryMemberList != undefined ?
<Panel header={`技术(最大人数:${jishu.extractNumber})`} key="2">
<ProTable
key='proTable2'
columns={columnsMember}
dataSource={jishu.juryMemberList}
bordered
style={{ padding: '16px' }}
options={false}
search={false}
pagination={false}
toolBarRender={() => [
<Button key="button" hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={jishu.extractNumber == jishu.length}
type="primary" onClick={() => {
if (returnCate(2).juryMemberList.length != returnCate(2).extractNumber) {
setAdd(true); luruSet(2); formMem.resetFields();
} else {
message.error('录入人数已满')
}
}}> </Button>
]}
/>
</Panel>
: null}
{shangwu.juryMemberList != undefined ?
<Panel header={`商务(最大人数:${shangwu.extractNumber})`} key="3">
<ProTable
key='proTable3'
columns={columnsMember}
dataSource={shangwu.juryMemberList}
bordered
style={{ padding: '16px' }}
options={false}
search={false}
pagination={false}
toolBarRender={() => [
<Button key="button" hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={shangwu.extractNumber == shangwu.length}
type="primary" onClick={() => {
if (returnCate(3).juryMemberList.length != returnCate(3).extractNumber) {
setAdd(true); luruSet(3); formMem.resetFields();
} else {
message.error('录入人数已满')
}
}}> </Button>
]}
/>
</Panel>
: null}
{falv.juryMemberList != undefined ?
<Panel header={`法律(最大人数:${falv.extractNumber})`} key="4">
<ProTable
key='proTable4'
columns={columnsMember}
dataSource={falv.juryMemberList}
bordered
style={{ padding: '16px' }}
options={false}
search={false}
pagination={false}
toolBarRender={() => [
<Button key="button" hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={falv.extractNumber == falv.length}
type="primary" onClick={() => {
if (returnCate(4).juryMemberList.length != returnCate(4).extractNumber) {
setAdd(true); luruSet(4); formMem.resetFields();
} else {
message.error('录入人数已满')
}
}}> </Button>
]}
/>
</Panel>
: null}
{qita.juryMemberList != undefined ?
<Panel header={`其它(最大人数:${qita.extractNumber})`} key="5">
<ProTable
key='proTable5'
columns={columnsMember}
dataSource={qita.juryMemberList}
bordered
style={{ padding: '16px' }}
options={false}
search={false}
pagination={false}
toolBarRender={() => [
<Button key="button" hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={qita.extractNumber == qita.length}
type="primary" onClick={() => {
if (returnCate(5).juryMemberList.length != returnCate(5).extractNumber) {
setAdd(true); luruSet(5); formMem.resetFields();
} else {
message.error('录入人数已满')
}
}}> </Button>
]}
/>
</Panel>
: null}
</>
)
}
function checkRe(data: any) {//查重
let pass = true;
!checkReRoot(daibiao, data, 1) ? pass = false : null;
!checkReRoot(jishu, data, 2) ? pass = false : null;
!checkReRoot(shangwu, data, 3) ? pass = false : null;
!checkReRoot(falv, data, 4) ? pass = false : null;
!checkReRoot(qita, data, 5) ? pass = false : null;
return pass;
}
function checkReRoot(type: any, data: any, updateType: any) {//查重
const { certificate, mobile, name } = data;
let pass = true;
if (certificate == '' || mobile == '' || name == '' || certificate == undefined || mobile == undefined || name == undefined) {
pass = false;
} else {
if (type.juryMemberList != undefined && updateType != luru) {
for (const item of type.juryMemberList) {
if (item.certificate == certificate) {//身份证号重复
pass = false;
message.error('身份证号重复');
break;
}
if (item.mobile == mobile) {//手机号重复
pass = false;
message.error('手机号重复');
break;
}
}
} else if (type.juryMemberList != undefined && updateType == luru) {
for (const item of type.juryMemberList) {
if (item.certificate == certificate && item.key != updateKeyMem) {//身份证号重复
pass = false;
message.error('身份证号重复');
break;
}
if (item.mobile == mobile && item.key != updateKeyMem) {//手机号重复
pass = false;
message.error('手机号重复');
break;
}
}
}
}
return pass;
}
const returnDrawerMem = () => {//成员管理抽屉(专家信息)添加、修改
return (
<>
<Drawer
title="录入外部专家"
placement="right"
width={'50%'}
onClose={() => {
setAdd(false);
changeBtnSet(true);
// formMem.resetFields();
}}
visible={add}
getContainer={false}
style={{ position: 'absolute' }}
>
<Form {...formLayoutDrawer} form={formMem}>
<Row><Col span={24}><FormItem
name="mobile"
label="手机号"
rules={[
...rule('手机号'),
{
pattern: /(^[1][3,4,5,6,7,8,9][0-9]{9}$)|(^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$)/,
message: '输入的电话号码不正确',
},
]}
>
<Input style={{ width: "60%" }} />
</FormItem></Col></Row>
<Row><Col span={24}><FormItem
name="name"
label="姓名"
rules={rule('姓名')}
>
<Input style={{ width: "60%" }} />
</FormItem></Col></Row>
<Row><Col span={24}><FormItem
name="workunit"
label="工作单位"
>
<Input style={{ width: "60%" }} />
</FormItem></Col></Row>
<Row><Col span={24}><FormItem
name="phone"
label="办公电话"
rules={[
{
pattern: /^\d+$|^\d+[.]?\d+$/,
message: '输入的电话号码不正确',
},
]}
>
<Input style={{ width: "60%" }} />
</FormItem></Col></Row>
<Row><Col span={24}><FormItem
name="certificateType"
label="证件类别"
initialValue={'1'}
>
<Select style={{ width: "60%" }} >
<Option value={'1'} title="居民身份证"></Option>
</Select>
</FormItem></Col></Row>
<Row><Col span={24}><FormItem
name="certificate"
label="证件号码"
rules={[
...rule('证件号码'),
{
pattern: /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
message: '输入的身份证号不正确',
},
]}
>
<Input style={{ width: "60%" }} onChange={onCertificateChange} />
</FormItem></Col></Row>
<Form.Item label="照片" style={{ marginBottom: 0 }}>
<Form.Item
name="faceId"
style={{ display: 'inline-block', width: '60%' }}
extra={<span style={{ color: '#b30000' }}>使</span>}
>
<ExpertPhotoUpload maxSize={200} />
</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
name="type"
label="通知方式"
>
<Select style={{ width: "60%" }}>
<Option key="1" value="人工通知">人工通知</Option>
</Select>
</FormItem></Col></Row> */}
<Row><Col span={24}><FormItem {...tailLayoutDrawer}>
<Button type="primary" loading={loading} hidden={!changeBtn || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} onClick={async () => {
loadingSet(true);
let pass = true;
let formValsMem = formMem.getFieldsValue();
const dataTem = [...returnCate(luru).juryMemberList];
await formMem.validateFields().then(() => {
pass = checkRe(formValsMem);
}).catch(() => {
pass = false;
});
if (pass) {
//如果 updateKey有值走修改
if (updateKeyMem != undefined && updateKeyMem != -1) {
dataTem.map((item: any, index: any) => {
if (item.key == updateKeyMem) {
dataTem[index] = { ...formValsMem, key: updateKeyMem, categoryId: returnCate(luru).id };
}
});
dataSet(dataTem, luru);
} else {
if (returnCate(luru).juryMemberList.length != returnCate(luru).extractNumber) {
let num = 0;
if (dataTem.length != 0) {
num = dataTem[dataTem.length - 1].key + 1;
}
dataTem.push({ ...formValsMem, key: num, categoryId: returnCate(luru).id });
dataSet(dataTem, luru);
} else {
message.error('录入人数已满!');
}
}
updateKeyMemSet(-1);
memberCountSet(memberCount + 1);
changeBtnSet(true);
setAdd(false);
}
loadingSet(false);
}}></Button>
<Button type="primary" loading={loading} hidden={changeBtn || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} onClick={async () => {
loadingSet(true);
let formValsMem = formMem.getFieldsValue();
const success = await changeMember({ ...formValsMem, oldId: changeMemberId }).then((res) => {
return res.success
});
if (success) { message.success('更改成功!') } else { message.error('更改失败!'); }
await queryVoList({ id: juryId }).then((res) => {
if (res.code == 200) {
categorySet(res.data.juryCategoryVOList);
memberCountSet(memberCount + 1);
}
});
getPage();
loadingSet(false);
changeBtnSet(true);
setAdd(false);
}}></Button>
</FormItem></Col></Row>
</Form>
</Drawer>
</>
)
}
const returnDrawerChange = () => {//更换专家抽屉
return (
<>
<Drawer
title="更换专家"
placement="left"
width={'50%'}
onClose={() => changeManSet(false)}
visible={changeMan}
getContainer={false}
style={{ position: 'absolute' }}
footer={<div>
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type='primary' style={{ float: 'right' }} loading={loading} onClick={async () => {
loadingSet(true);
const success = await changeEx({ changeMemberList: checkBoxs, juryId: juryId, reason: reason }).then((res) => {
return res.success
})
if (success) {
message.success('申请成功!');
changeManSet(false);
} else {
message.error('申请失败!');
}
await queryVoList({ id: juryId }).then((res) => {
if (res.code == 200) {
categorySet(res.data.juryCategoryVOList);
memberCountSet(memberCount + 1);
}
});
checkBoxsSet([]);
loadingSet(false);
}}></Button>&nbsp;&nbsp;
<Button style={{ float: 'right', marginRight: '10px' }} onClick={async () => { changeManSet(false); }}></Button>
</div>}
>
{daibiao.juryMemberList != undefined ? <>
{returnHeader('采购人代表')}
{returnCheckBox(daibiao.juryMemberList)}
</> : null}
{jishu.juryMemberList != undefined ? <>
{returnHeader('技术类专家')}
{returnCheckBox(jishu.juryMemberList)}
</> : null}
{shangwu.juryMemberList != undefined ? <>
{returnHeader('商务类专家')}
{returnCheckBox(shangwu.juryMemberList)}
</> : null}
{falv.juryMemberList != undefined ? <>
{returnHeader('法律类专家')}
{returnCheckBox(falv.juryMemberList)}
</> : null}
{qita.juryMemberList != undefined ? <>
{returnHeader('其它类专家')}
{returnCheckBox(qita.juryMemberList)}
</> : null}
<br /><br />
<TextArea onBlur={(e) => { reasonSet(e.target.value) }} />
</Drawer>
</>
)
}
const returnFooterMem = () => {//返回成员modal foot
return (
<>
<Button onClick={() => {
setMemberVis(false);
categorySet([]);
}}></Button>
<Button hidden={btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" disabled={open} loading={loading || spin} onClick={async () => {
loadingSet(true);
const params = [];
let chackNum: any = true;
if (daibiao.juryMemberList != undefined) {
if (daibiao.extractNumber == daibiao.juryMemberList.length) {
params.push(...daibiao.juryMemberList)
} else {
chackNum = false;
message.error('代表人数不符合规定!');
}
}
if (jishu.juryMemberList != undefined) {
if (jishu.extractNumber == jishu.juryMemberList.length) {
params.push(...jishu.juryMemberList)
} else {
chackNum = false;
message.error('技术类人数不符合规定!');
}
}
if (shangwu.juryMemberList != undefined) {
if (shangwu.extractNumber == shangwu.juryMemberList.length) {
params.push(...shangwu.juryMemberList)
} else {
chackNum = false;
message.error('商务类人数不符合规定!');
}
}
if (falv.juryMemberList != undefined) {
if (falv.extractNumber == falv.juryMemberList.length) {
params.push(...falv.juryMemberList)
} else {
chackNum = false;
message.error('法律类人数不符合规定!');
}
}
if (qita.juryMemberList != undefined) {
if (qita.extractNumber == qita.juryMemberList.length) {
params.push(...qita.juryMemberList)
} else {
chackNum = false;
message.error('其它类人数不符合规定!');
}
}
// jishu != undefined && jishu.extractNumber==jishu.juryMemberList.length ? params.push(...jishu.juryMemberList) : null;
// shangwu != undefined && shangwu.extractNumber==shangwu.juryMemberList.length ? params.push(...shangwu.juryMemberList) : null;
// falv != undefined && falv.extractNumber==falv.juryMemberList.length ? params.push(...falv.juryMemberList) : null;
// qita != undefined && qita.extractNumber==qita.juryMemberList.length ? params.push(...qita.juryMemberList) : null;
if (chackNum) {
const success = await saveMember({ juryMemberDTOList: params, roomId: roomId }).then((res) => {
return res.success
});
if (success) {
message.success('保存成功!');
categorySet([]);
setMemberVis(false);
getPage();
} else {
message.error('保存失败');
}
}
loadingSet(false);
}}></Button>
</>
)
}
//上传文件
const uploadProps = {
name: 'file',
action: '/api/biz-service-ebtp-rsms/v1/jury/template/import',
// headers: {
// authorization: 'authorization-text',
// },
data: {
juryId: juryId
},
accept: ".xls,.xlsx",
itemRender: () => { return null },
onChange(info: any) {
spinSet(true);
if (info.file.status === 'done') {
if (info.file?.response?.code == 200) {
if (info.file?.response?.data[0].juryMemberList != null) {
message.success(`${info.file.name} 导入成功`);
categorySet(info.file?.response?.data);
memberCountSet(memberCount + 1);
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 [oid, oidSet] = useState<any>('');
useEffect(() => {
juryTem().then(res => {
res?.code == 200 && oidSet(res.data?.documentCenterId);
})
}, [])
const member = () => {//返回成员管理Modal
return (
<>
<Modal
visible={memberVis}
maskClosable={false}
style={{ overflowX: 'hidden', maxHeight: modalHeight }}
width={"60%"}
centered
destroyOnClose
title="评审小组成员管理"
bodyStyle={{ maxHeight: modalHeight - 140, overflow: 'auto', minHeight: '300px', padding: '16px 0px 0px 0px' }}
footer={returnFooterMem()}
onCancel={() => {
setMemberVis(false);
reset();
}}
>
<Spin spinning={spin}>
<div className='headerDiv pl24 pr16' style={{ display: 'flex', justifyContent: 'space-between' }}>
<h3 className="first-title"></h3>
<div>
{/* <Button key="1" className='mR8' onClick={() => { }}>通知专家</Button> */}
<Button key="2" type='primary' className='mR8' hidden={!open || allEnd || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} onClick={() => {
checkBoxsSet([]);
checkBoxsStatusSet({});
changeManSet(true)
}}></Button>
<FileDown fileId={oid} btnName={'下载EXCEL模板'} style={{ margin: '2px 5px' }} />
<Upload {...uploadProps}>
<Button icon={<UploadOutlined />} hidden={open || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} disabled={spin} type="primary" key="4" style={{ margin: '2px 5px' }}>EXCEL模板</Button>
</Upload>
</div>
</div>
<div style={{ marginTop: '11px', marginLeft: '35px' }}>
<span style={{ color: '#b30000' }}>使</span>
</div>
<Collapse className='xsy-collapse' style={{ marginTop: '16px' }} defaultActiveKey={['1', '2', '3', '4', '5',]}>
{returnPanel()}
</Collapse>
</Spin>
{returnDrawerMem()}
{returnDrawerChange()}
</Modal>
</>
)
}
const confirmMem = async (record: any) => {
let type: number = 0;
category != undefined ? category.map((item: any,) => {//判断类别
if (item.id == record.categoryId) {
if (item.category == 1) {
type = 1;
} else if (item.category == 2 && item.subCategory == 1) {
type = 2;
} else if (item.category == 2 && item.subCategory == 2) {
type = 3;
} else if (item.category == 2 && item.subCategory == 3) {
type = 4;
} else if (item.category == 2 && item.subCategory == 4) {
type = 5;
}
}
}) : null;
const dataTem = [...returnCate(type).juryMemberList];
dataTem.map((item: any, index: any) => {
if (item.key == record.key) {
dataTem.splice(index, 1);
}
});
dataSet(dataTem, type);
memberCountSet(memberCount + 1);
}
//评标室预约回调
const returnEvalData = (value: any) => {
setSelectEvalVisible(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 });
} else {
formMem.setFieldsValue({ faceId: null });
}
}
})
})
}
//身份证号onchange
const onCertificateChange = (e: { target: { value: any; }; }) => {
const data = e.target.value;
if (data.length == 18) {
getExpertPhoto();
}
}
//是否预约电子评标室
const onRadioChange = (e: RadioChangeEvent) => {
setIsReserve(e.target.value);
setSelectEvalData(null);
form.resetFields(["evalLocation", "startTime", "endTime", "reserveBy", "reserveContactNumber"]);
getEarliestTime(openTime, e.target.value);
};
//评审开始时间处理
const getEarliestTime = (openTime: string | null | undefined, reserve: string) => {
let startTime = null;//开始时间小于17点正常17点+则为null
let endTime = null;
if (openTime) {
if (moment(openTime).hour() <= 15) {//结束时间小于16点正常+2h16-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 {
setInitEvalTime(null);
form.setFieldsValue({ startTime, endTime });
}
}
return (
<div className='bgCWhite' style={{ padding: '24px' }}>
<Spin spinning={spin}>
<div className='xsy-headerDiv'>
<h3 className="first-title floatLeft"></h3>
<div className='xsy-rightDiv'>
<Button key="button" hidden={btnDis || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" onClick={() => {
setModalVis(true);
// form.resetFields();
reset();
setSelectEvalData(null);
setInitEvalTime(null);
disabledSet(false);
setIsReserve("0");
getEarliestTime(openTime, "0");
// readOnlySet(false);
}}></Button>
<Button style={{ marginLeft: '10px' }} onClick={() => { history.push(getRoomReturnURL()) }}></Button>
</div>
</div>
<ProTable
key='proTable6'
// title={() => }
// headerTitle={<h3 className="first-title floatLeft">评审小组管理</h3>}
actionRef={actionRef}//action触发后更新表格
columns={columns}//表格
dataSource={dataSource}
size='small'
options={false}
search={false}
tableAlertRender={false}
pagination={{
defaultPageSize: 10,
showSizeChanger: false,
}}//默认显示条数
// toolBarRender={() => [
// <Button key="button" hidden={btnDis} type="primary" onClick={() => {
// setModalVis(true);
// // form.resetFields();
// reset();
// disabledSet(false); readOnlySet(false);
// }}>
// 创建评审小组
// </Button>,
// <Button style={{ marginLeft: '10px' }} onClick={() => { history.back() }}>返回</Button>
// ]}
// request={() => getList(roomId).then((res) => {
// let dataT: any = [];
// if (res.data != undefined) {
// btnDis = true;
// dataT.push(res.data);
// } else {
// btnDis = false;
// }
// const result = {
// data: dataT,
// total: res.data.total,
// success: res.data.success,
// pageSize: res.data.pageSize,
// current: res.data.current
// };
// return result;
// })}
/>
</Spin>
{group()}
{member()}
{/**风控组件 */}
{riskVisible && <RiskPrevention
modalVisible={riskVisible}
onCancel={() => {
setRiskVisible(false)
setRiskData([])
}}
data={riskData}
/>}
{/**电子评标室-评标室预约选择 */}
<BidEvalAppointment modalVisible={selectEvalVisible} onCancel={() => setSelectEvalVisible(false)} onSubmit={(value: any) => returnEvalData(value)} values={selectEvalData} initValue={initEvalTime} type={appoType} reload={() => getPage()} />
{/**协办管理 */}
<OutsourcingManage modalVisible={assistVisible} onCancel={() => setAssistVisible(false)} onSubmit={() => { setAssistVisible(false); actionRef.current?.reload(); }} open={open} assistData={assistList} assistNumber={assistNumber} juryId={juryId} />
</div>
)
}
export default JudgingPanel;