Files
fe_service_ebtp_frontend/src/pages/ZZhaoMu/JudgingPanel/index.tsx

1733 lines
67 KiB
TypeScript
Raw Normal View History

2022-03-10 14:24:13 +08:00
import React, { useEffect, useRef, useState } from 'react';
import { Button, Checkbox, Col, Collapse, DatePicker, Drawer, Form, Input, message, Modal, Popconfirm, Row, Select, Spin, Tabs, Upload } 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 } from '@/utils/session';
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 { btnAuthority } from '@/utils/authority';
import RiskPrevention from '@/utils/RiskPrevention';
import { history } from 'umi';
2022-09-07 17:07:08 +08:00
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';
2022-03-10 14:24:13 +08:00
const JudgingPanel: React.FC<{}> = () => {
const modalHeight = window.innerHeight * 96 / 100;
const proId = getProId();
const roomType = getURLInformation('roomType');
const roomId = getURLInformation('roomId');
const sectionId = getURLInformation('secId');
const formLayout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, };
const FormItem = Form.Item;
const [form] = Form.useForm();
const { Option } = Select;
const { Panel } = Collapse;
const { TextArea } = Input;
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
2022-09-07 17:07:08 +08:00
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
2022-03-10 14:24:13 +08:00
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: 'expertNumber', width: '8%', },
{ title: '采购人代表数量', dataIndex: 'representativeNumber', width: '12%', },
{ title: '包件名称', dataIndex: 'sectionName', },
{ 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>
2022-09-07 17:07:08 +08:00
{record.elecEvalRoomReserve && (record.elecEvalRoomReserve.status == -1 || record.elecEvalRoomReserve.status == 0) && <Button type='text' onClick={() => {
setSelectEvalData(record.elecEvalRoomReserve)
setAppoType("1");
setSelectEvalVisible(true);
}}></Button>}
2022-03-10 14:24:13 +08:00
</>
);
} 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);
}}>{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}`,
},
]
}
useEffect(() => {//给表单赋值
2022-09-07 17:07:08 +08:00
if (updateData?.reserveStatus == 1) {
setSelectEvalDisabled(false);
}
2022-03-10 14:24:13 +08:00
form.setFieldsValue({
juryType: updateData != undefined ? updateData.juryType : null,
representativeNumber: updateData != undefined ? updateData.representativeNumber : null,
expertNumber: updateData != undefined ? updateData.expertNumber : null,
2022-09-07 17:07:08 +08:00
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,
2022-03-10 14:24:13 +08:00
evalLocation: updateData != undefined ? updateData.evalLocation : null,
description: updateData != undefined ? updateData.description : null,
2022-09-07 17:07:08 +08:00
reserveBy: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveBy : null,
reserveContactNumber: updateData?.reserveStatus == 1 ? updateData.elecEvalRoomReserve.reserveContactNumber : null,
2022-03-10 14:24:13 +08:00
})
}, [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()}
</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 (roomType == '1' && 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));
}
2022-09-07 17:07:08 +08:00
const st = moment(formVals.startTime).format('yyyy-MM-DD HH:mm:ss');
const et = moment(formVals.endTime).format('yyyy-MM-DD HH:mm:ss');
2022-03-10 14:24:13 +08:00
if (st > et || st == et) {//校验时间
verify = false;
message.error("预计开始时间应早于预计结束时间")
}
2022-09-07 17:07:08 +08:00
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("预约时间需与选择评标室中的预约时间相等");
}
}
2022-03-10 14:24:13 +08:00
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}>
{/* {
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%" }} disabled={disabled} />
</FormItem></Col>
<Col span={12}><FormItem
name="expertNumber"
label="专家数量(不含代表)"
rules={[...rule('专家数量'), { pattern: /^([1-9]?\d|100)$/, message: '请输入正确数值' }]}
>
<Input style={{ width: "90%" }} disabled={disabled} />
</FormItem></Col>
2022-09-07 17:07:08 +08:00
<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={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>
2022-03-10 14:24:13 +08:00
<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}
showNow={false}
2022-09-07 17:07:08 +08:00
style={{ width: "90%" }}
2022-03-10 14:24:13 +08:00
/>
</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}
showNow={false}
2022-09-07 17:07:08 +08:00
style={{ width: "90%" }}
2022-03-10 14:24:13 +08:00
/>
</FormItem></Col>
<Col span={12}><FormItem
2022-09-07 17:07:08 +08:00
name="reserveBy"
label="预约人"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人` }, { max: 100, message: '内容超长' }]}
2022-03-10 14:24:13 +08:00
>
2022-09-07 17:07:08 +08:00
<Input style={{ width: "90%" }} disabled={disabled || selectEvalDisabled} />
2022-03-10 14:24:13 +08:00
</FormItem></Col>
<Col span={12}><FormItem
2022-09-07 17:07:08 +08:00
name="reserveContactNumber"
label="预约人联系方式"
rules={[{ required: !selectEvalDisabled, message: `请录入预约人联系方式` }, { max: 100, message: '内容超长' }]}
2022-03-10 14:24:13 +08:00
>
2022-09-07 17:07:08 +08:00
<Input type="number" style={{ width: "90%" }} disabled={disabled || selectEvalDisabled} />
2022-03-10 14:24:13 +08:00
</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;
2022-09-07 17:07:08 +08:00
let params = { ...formVals, projectId: proId, juryCategoryVOList: cqData, roomId: roomId, juryRoomList: juryRoomList, reserveStatus: 0 };
2022-03-10 14:24:13 +08:00
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})`);
}
2022-09-07 17:07:08 +08:00
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;
}
2022-03-10 14:24:13 +08:00
if (pass) {
const success = await saveG(params);
if (success) {
getPage();
cqDataSet([]);
updateKeySet(-1);
}
setModalVis(false);
updateDataSet({});
activeKeySet('1');
}
loadingSet(false);
}}>
</Button>
</>
);
} else {
return (<></>)
}
};
//成员管理
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', },
2022-09-07 17:07:08 +08:00
{
title: '照片',
dataIndex: 'faceId',
render: (_, record) => {
if (record.faceId) {
return <a onClick={() => downloadFile({ uid: record.faceId })}>{record.name}</a>
};
return '-';
}
},
2022-03-10 14:24:13 +08:00
{
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>
</>
);
}
},
];
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} 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);
2022-09-07 17:07:08 +08:00
// formMem.resetFields();
2022-03-10 14:24:13 +08:00
}}
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%" }} />
</FormItem></Col></Row>
2022-09-07 17:07:08 +08:00
<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>
2022-03-10 14:24:13 +08:00
{/* <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 props = {
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'>
<h3 className="first-title floatLeft"></h3>
<div className='rightDiv'>
{/* <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>
2022-04-01 20:06:34 +08:00
<FileDown fileId={oid} btnName={'下载EXCEL模板'} style={{ margin: '2px 5px' }} />
2022-03-10 14:24:13 +08:00
<Upload {...props}>
<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>
<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);
}
2022-09-07 17:07:08 +08:00
//评标室预约回调
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("当前专家无照片,请上传");
}
}
})
})
}
2022-03-10 14:24:13 +08:00
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();
2022-09-07 17:07:08 +08:00
setSelectEvalData(null);
2022-03-10 14:24:13 +08:00
disabledSet(false); 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}
/>}
2022-09-07 17:07:08 +08:00
{/**电子评标室-评标室预约选择 */}
<BidEvalAppointment modalVisible={selectEvalVisible} onCancel={() => setSelectEvalVisible(false)} onSubmit={(value: any) => returnEvalData(value)} values={selectEvalData} type={appoType} reload={() => actionRef.current?.reload()} />
2022-03-10 14:24:13 +08:00
</div>
)
}
export default JudgingPanel;