评审小组

This commit is contained in:
jlzhangyx5
2025-05-27 15:44:05 +08:00
parent da11195495
commit af8f783612
2 changed files with 94 additions and 27 deletions

View File

@ -53,7 +53,7 @@ const JudgingPanel: React.FC<{}> = () => {
const [editableKeys, setEditableRowKeys] = useState<any[]>([]); const [editableKeys, setEditableRowKeys] = useState<any[]>([]);
const [tableData, setTableData] = useState<DataSourceType[]>([]); const [tableData, setTableData] = useState<DataSourceType[]>([]);
function getShouName() { function getShouName() {
const method = getProMethod(); const method = 'procurement_mode_1';//getProMethod();//TODO zyx-假数据
let showNameT: any = { zbr: '', bb: '', pb: '', }//相关标段 标书费 保证金 服务费 let showNameT: any = { zbr: '', bb: '', pb: '', }//相关标段 标书费 保证金 服务费
// let num = 3; // let num = 3;
if (method === 'procurement_mode_1' || method === 'procurement_mode_2') {//招标 if (method === 'procurement_mode_1' || method === 'procurement_mode_2') {//招标
@ -101,8 +101,8 @@ const JudgingPanel: React.FC<{}> = () => {
const columns: ProColumns<any>[] = [ const columns: ProColumns<any>[] = [
{ title: '序号', valueType: 'index', width: 50, }, { title: '序号', valueType: 'index', width: 50, },
{ title: `${showName.bb}名称`, dataIndex: 'sectionName', }, { title: `${showName.bb}名称`, dataIndex: 'sectionName', },
{ title: '专家数量', dataIndex: 'expertNumber', width: 80 }, { title: '专家抽取数量', dataIndex: 'expertNumber', width: 120 },
{ title: `${showName.zbr}代表数量`, dataIndex: 'representativeNumber', width: 120 }, { title: `直接录入数量`, dataIndex: 'representativeNumber', width: 120 },
{ title: '预计开始时间', dataIndex: 'startTime', valueType: 'dateTime', width: '10%', }, { title: '预计开始时间', dataIndex: 'startTime', valueType: 'dateTime', width: '10%', },
{ title: '预计结束时间', dataIndex: 'endTime', valueType: 'dateTime', width: '10%', }, { title: '预计结束时间', dataIndex: 'endTime', valueType: 'dateTime', width: '10%', },
{ {
@ -163,23 +163,63 @@ const JudgingPanel: React.FC<{}> = () => {
<Button type='text' <Button type='text'
hidden={!check && btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} hidden={!check && btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])}
onClick={() => { onClick={() => {
updateDataSet(record); // queryVoList({ id: record.id }).then((res) => {
//剔除代表 // if (res.code == 200) {
let list = [...record.juryCategoryVOList]; // updateDataSet(res.data);
list.map((item: any, index: any) => { // console.log("res.data",res.data);
if (item.category == 1) { // }
list.splice(index, 1); // });
} // updateDataSet(record);
}); // console.log("record", record);
cqDataSet(list); // //剔除代表
setModalVis(true); // let list = [...record.juryCategoryVOList];
sectionCountSet(sectionCount + 1); // list.map((item: any, index: any) => {
// if (item.category == 1) {
// list.splice(index, 1);
// }
// });
// cqDataSet(list);
// setModalVis(true);
// sectionCountSet(sectionCount + 1);
handleUpdate(record);
disabledSet(check); disabledSet(check);
// readOnlySet(check); // checkSectionNameSet(record.sectionName);
checkSectionNameSet(record.sectionName);
}}>{check ? '查看' : '修改'}</Button> }}>{check ? '查看' : '修改'}</Button>
) )
} }
const handleUpdate = async (record: any) => {
form.resetFields();
const res = await queryVoList({ id: record.id });
// 提取专业抽取列表
const extractSpecialityList = res.data.extractSpecialityList || [];
// 设置表格数据
let specList = extractSpecialityList.map((item: any, index: number) => ({
...item,
uid: item.id || String(index + Date.now()) // 确保每个条目有唯一 key
}))
res.data.extractSpecialityList = specList;
setTableData(specList);
// 设置 editableKeys确保每一行都能编辑
setEditableRowKeys(specList.map((item: any, index: number) => item.uid));
// setEditableRowKeys(specList.map(item => item.uid));
updateDataSet(res.data);
//剔除代表
let list = [...res.data.juryCategoryVOList];
list.map((item: any, index: any) => {
if (item.category == 1) {
list.splice(index, 1);
}
});
cqDataSet(list);
setModalVis(true);
sectionCountSet(sectionCount + 1);
// readOnlySet(check);
checkSectionNameSet(res.data.sectionName);
};
//删除 //删除
const del = async (fields: any) => { const del = async (fields: any) => {
@ -342,6 +382,7 @@ const JudgingPanel: React.FC<{}> = () => {
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, 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, evalLocation: updateData != undefined ? updateData.reserveStatus == 1 ? updateData.elecEvalRoomReserve.areaAddress : updateData.evalLocation : null,
description: updateData != undefined ? updateData.description : null, description: updateData != undefined ? updateData.description : null,
extractSpecialityList: updateData != undefined ? updateData.extractSpecialityList : null,
}) })
}, [updateData]); }, [updateData]);
@ -360,6 +401,9 @@ const JudgingPanel: React.FC<{}> = () => {
onCancel={() => { onCancel={() => {
setModalVis(false); setModalVis(false);
updateDataSet({}); updateDataSet({});
setTableData([]);
setCheckedList([]);
form.resetFields();
}} }}
> >
{tab1()} {tab1()}
@ -440,10 +484,12 @@ const JudgingPanel: React.FC<{}> = () => {
message.error("所选标段评标委员会人数不一致"); message.error("所选标段评标委员会人数不一致");
return; return;
} }
console.log("checkedList", checkedList);
const juryNumber = parseInt(uniqueJuryNumbers[0]) || 0; const juryNumber = parseInt(uniqueJuryNumbers[0]) || 0;
const repNumber = parseInt(form.getFieldValue('representativeNumber')) || 0; const repNumber = parseInt(form.getFieldValue('representativeNumber')) || 0;
console.log(juryNumber, repNumber);
if (repNumber < 0 || repNumber > juryNumber) { if (repNumber < 0 || repNumber > juryNumber) {
message.error(`直接录入数量应在 0 ~ ${juryNumber} 之间`); message.error(`直接录入数量应在 0 ~ ${juryNumber} 之间`);
form.setFieldsValue({ representativeNumber: undefined, expertNumber: undefined }); form.setFieldsValue({ representativeNumber: undefined, expertNumber: undefined });
@ -451,6 +497,7 @@ const JudgingPanel: React.FC<{}> = () => {
} }
const expertNumber = Math.max(0, juryNumber - repNumber); const expertNumber = Math.max(0, juryNumber - repNumber);
(expertNumber === 0) && setTableData([]);
form.getFieldValue('representativeNumber') && form.setFieldsValue({ expertNumber }); form.getFieldValue('representativeNumber') && form.setFieldsValue({ expertNumber });
}; };
@ -458,8 +505,6 @@ const JudgingPanel: React.FC<{}> = () => {
useEffect(() => { useEffect(() => {
calculateExpertNumber(); calculateExpertNumber();
}, [form.getFieldValue('representativeNumber'), checkedList]); }, [form.getFieldValue('representativeNumber'), checkedList]);
const expertNumber = form.getFieldValue('expertNumber');
const shouldShowTable = expertNumber !== null && expertNumber !== undefined && Number(expertNumber) > 0;
const tab1 = () => {//cqtab1 const tab1 = () => {//cqtab1
return ( return (
<> <>
@ -583,7 +628,7 @@ const JudgingPanel: React.FC<{}> = () => {
<Col span={12}><FormItem <Col span={12}><FormItem
name="representativeNumber" name="representativeNumber"
label={`直接录入数量`} label={`直接录入数量`}
rules={[...rule(`直接录入代表数量`), { pattern: /^([1-9]?\d|100)$/, message: '请输入正确数值' }]} rules={[...rule(`直接录入数量`), { pattern: /^([1-9]?\d|100)$/, message: '请输入正确数值' }]}
{...formLayout} {...formLayout}
> >
<Input style={{ width: "90%" }} type="number" disabled={disabled} placeholder={`直接录入数量`} <Input style={{ width: "90%" }} type="number" disabled={disabled} placeholder={`直接录入数量`}
@ -623,6 +668,7 @@ const JudgingPanel: React.FC<{}> = () => {
rowKey="uid" rowKey="uid"
toolBarRender={false} toolBarRender={false}
columns={professColumns} columns={professColumns}
dataSource={tableData}
recordCreatorProps={{ recordCreatorProps={{
newRecordType: 'dataSource', newRecordType: 'dataSource',
hidden: disabled, hidden: disabled,
@ -641,7 +687,6 @@ const JudgingPanel: React.FC<{}> = () => {
setEditableRowKeys(keys); setEditableRowKeys(keys);
}, },
onValuesChange: (record, recordList) => { onValuesChange: (record, recordList) => {
console.log("", recordList)
setTableData(recordList); setTableData(recordList);
}, },
actionRender: (row, _, dom) => { actionRender: (row, _, dom) => {
@ -720,12 +765,23 @@ const JudgingPanel: React.FC<{}> = () => {
specNum += Number(item?.extractNumber); specNum += Number(item?.extractNumber);
} }
} }
console.log("expertNumber", schemaData?.expertNumber, "specNum", specNum);
if (Number(schemaData?.expertNumber) !== specNum) { if (Number(schemaData?.expertNumber) !== specNum) {
res = false; res = false;
message.error("抽取专业人数与专家需求人数不符!"); message.error("抽取专业人数与专家需求人数不符!");
} }
return res; return res;
} }
const checkSpecialityUnique = () => {
let res = true;
const specialityIds = tableData.map(item => item.specialityId).filter(Boolean);
const unique = [...new Set(specialityIds)];
if (specialityIds.length !== unique.length) {
res = false;
message.error('抽取专业名称不可重复选择');
}
return res;
};
const idToNameMap = Object.entries(professionalMap || {}).reduce((acc, [id, option]) => { const idToNameMap = Object.entries(professionalMap || {}).reduce((acc, [id, option]) => {
acc[id] = option.text; acc[id] = option.text;
return acc; return acc;
@ -750,6 +806,9 @@ const JudgingPanel: React.FC<{}> = () => {
<Button onClick={() => { <Button onClick={() => {
setModalVis(false); setModalVis(false);
updateDataSet({}); updateDataSet({});
setCheckedList([]);
setTableData([]);
form.resetFields();
}}>{disabled ? '关闭' : '取消'}</Button> }}>{disabled ? '关闭' : '取消'}</Button>
<Button hidden={disabled || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" loading={loading} onClick={() => { <Button hidden={disabled || btnAuthority(['ebtp-agency-project-manager', 'ebtp-purchase'])} type="primary" loading={loading} onClick={() => {
let pass = false; let pass = false;
@ -776,6 +835,11 @@ const JudgingPanel: React.FC<{}> = () => {
const bidCount = parseInt(formVals.representativeNumber) + parseInt(formVals.expertNumber); const bidCount = parseInt(formVals.representativeNumber) + parseInt(formVals.expertNumber);
if (pass) { if (pass) {
pass = checkMan(bidCount, parseInt(formVals.expertNumber)); pass = checkMan(bidCount, parseInt(formVals.expertNumber));
}
if (pass) {
pass = checkSpecialityUnique();
}
if (pass) {
pass = checkData(finalVals) pass = checkData(finalVals)
} }
const st = moment(formVals.startTime).format('yyyy-MM-DD HH:mm:ss'); const st = moment(formVals.startTime).format('yyyy-MM-DD HH:mm:ss');
@ -791,7 +855,7 @@ const JudgingPanel: React.FC<{}> = () => {
formVals.startTime != undefined ? formVals.startTime = formVals.startTime.format('yyyy-MM-DD HH:mm:ss') : null; formVals.startTime != undefined ? formVals.startTime = formVals.startTime.format('yyyy-MM-DD HH:mm:ss') : null;
formVals.endTime != undefined ? formVals.endTime = formVals.endTime.format('yyyy-MM-DD HH:mm:ss') : null; formVals.endTime != undefined ? formVals.endTime = formVals.endTime.format('yyyy-MM-DD HH:mm:ss') : null;
const _cqData = cqData.length > 0 ? [{ ...cqData[0], extractNumber: count }] : [{ category: "2", extractMethod: "2", extractNumber: count, subCategory: "4" }]//抽取数量录入 const _cqData = cqData.length > 0 ? [{ ...cqData[0], extractNumber: count }] : [{ category: "2", extractMethod: "2", extractNumber: count, subCategory: "4" }]//抽取数量录入
let params = { ...formVals, juryRoomList: juryRoomList, projectId: proId, juryCategoryVOList: _cqData, reserveStatus: 0,extractSpecialityList:enhancedData }; let params = { ...formVals, juryRoomList: juryRoomList, projectId: proId, juryCategoryVOList: _cqData, reserveStatus: 0, extractSpecialityList: enhancedData };
if (updateData != undefined) { if (updateData != undefined) {
params['id'] = updateData.id; params['id'] = updateData.id;
} }
@ -802,6 +866,9 @@ const JudgingPanel: React.FC<{}> = () => {
} }
setModalVis(false); setModalVis(false);
updateDataSet({}); updateDataSet({});
setCheckedList([]);
setTableData([]);
form.resetFields();
} }
loadingSet(false); loadingSet(false);
}) })
@ -1004,7 +1071,7 @@ const JudgingPanel: React.FC<{}> = () => {
return ( return (
<> <>
{daibiao.juryMemberList != undefined ? {daibiao.juryMemberList != undefined ?
<Panel header={`采购人代表(最大人数:${daibiao.extractNumber})`} key="1"> <Panel header={`直接录入数量(最大人数:${daibiao.extractNumber})`} key="1">
<ProTable <ProTable
key='proTable1' key='proTable1'
columns={columnsMember} columns={columnsMember}
@ -1350,7 +1417,7 @@ const JudgingPanel: React.FC<{}> = () => {
</div>} </div>}
> >
{daibiao.juryMemberList != undefined ? <> {daibiao.juryMemberList != undefined ? <>
{returnHeader('采购人代表')} {returnHeader('直接录入专家')}
{returnCheckBox(daibiao.juryMemberList)} {returnCheckBox(daibiao.juryMemberList)}
</> : null} </> : null}
{jishu.juryMemberList != undefined ? <> {jishu.juryMemberList != undefined ? <>
@ -1366,7 +1433,7 @@ const JudgingPanel: React.FC<{}> = () => {
{returnCheckBox(falv.juryMemberList)} {returnCheckBox(falv.juryMemberList)}
</> : null} </> : null}
{qita.juryMemberList != undefined ? <> {qita.juryMemberList != undefined ? <>
{returnHeader('其它类专家')} {returnHeader('抽取专家')}
{returnCheckBox(qita.juryMemberList)} {returnCheckBox(qita.juryMemberList)}
</> : null} </> : null}
<br /><br /> <br /><br />
@ -1391,7 +1458,7 @@ const JudgingPanel: React.FC<{}> = () => {
params.push(...daibiao.juryMemberList) params.push(...daibiao.juryMemberList)
} else { } else {
chackNum = false; chackNum = false;
message.error('代表人数不符合规定!'); message.error('直接录入人数不符合规定!');
} }
} }
if (jishu.juryMemberList != undefined) { if (jishu.juryMemberList != undefined) {
@ -1423,7 +1490,7 @@ const JudgingPanel: React.FC<{}> = () => {
params.push(...qita.juryMemberList) params.push(...qita.juryMemberList)
} else { } else {
chackNum = false; chackNum = false;
message.error('其它类人数不符合规定!'); message.error('抽取人数不符合规定!');
} }
} }

View File

@ -16,7 +16,7 @@ export async function getSecs(params?: any) {
} }
//删除 //删除
export async function delOne(params?: any) { export async function delOne(params?: any) {
return request(`/api/biz-service-ebtp-rsms/v1/jury/info/${params.id}`, { return request(`/api/biz-service-ebtp-rsms/v1/jury/info/del/${params.id}`, {
method: 'POST' method: 'POST'
}); });
} }