import ProTable, { ActionType, ProColumns, } from "@ant-design/pro-table"; import { Button, Card, Col, DatePicker, Descriptions, Form, Input, message, Modal, Progress, Row, Spin } from "antd"; import React, { useEffect, useMemo, useRef, useState } from "react"; import styles from './index.less'; import './index.less'; import { getList, jieMi, jmRate, singBid, endTimeUp, updatePrice, queryFx, confirmOffer } from './service'; import { getSessionUserData, getSessionRoleData, getProMethod } from '@/utils/session'; import { getURLInformation } from '@/utils/CommonUtils' import '@/assets/xsy_style.less' import logo from '@/images/opening/logo.svg' import moment from "moment"; import { ipassDecrypt } from "@/utils/IpassVerification"; import { btnAuthority } from "@/utils/authority"; import { AsymDecrypt } from "@/utils/zwPlugin"; import FileDown from "@/utils/Download"; import { getBiddingDocumentsDecryptList, selectParam1, selectParam2 } from "@/pages/Evaluation/BiddingDocumentsDecrypt/service"; import { DownloadOutlined } from "@ant-design/icons"; const Room: React.FC<{}> = () => { const [spin, spinSet] = useState(false); const FormItem = Form.Item; const { TextArea } = Input; const formLayout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; const modalHeight = window.innerHeight * 96 / 100; const roomType = getURLInformation('roomType');//预审1 后审2 //控制字段 角色、开标状态、唱标阶段、是否需要ipass解密 // const proId = 1111111; const juese = getSessionRoleData().roleCode//ebtp-agency-project-manager 代理 ebtp-supplier 供应商 ebtp-agency-project-manager 代理 ebtp-supplier 供应商 const userId = getSessionUserData().userId//当前登陆人id const tendererName = getSessionUserData().organizationName//当前登陆人 公司名 const tenderId = getSessionUserData().organizationId//当前登陆人 公司id const actionRef = useRef(); const [count, countSet] = useState(0); //开标室启动器 // const [turnSort, turnSortSet] = useState(1); //开标室启动器 const [projectName, projectNameSet] = useState(''); //项目名称 const [projectNo, projectNoSet] = useState(''); //项目编号 const [sectionName, sectionNameSet] = useState(''); //标包名称 const [sectionNo, sectionNoSet] = useState(''); //标包编号 const [openTime, openTimeSet] = useState(''); //开标时间 const [openState, openStateSet] = useState();//是否开标 const [range, rangeSet] = useState();//是否唱标 const [jm, jmSet] = useState();//是否解密 const [queryHaveData, queryHaveDataSet] = useState(false);//是否解密 const [rangeOver, rangeOverSet] = useState();//是否唱标结束 const [important, importantSet] = useState(false);//是否重大项目 const [turnId, turnIdSet] = useState('');//轮次id const [configId, configIdSet] = useState('');//唱标配置id const [openRoom, openRoomSet] = useState('');//开标室id const [signTime, signTimeSet] = useState({});//供应商签名信息 const [haveComplete, haveCompleteSet] = useState(false);//当前供应商是否有解密成功的文件 const [repairVis, repairVisSet] = useState(false);//补录报价显隐 const [subentryVis, handleSubentryVis] = useState(false);//分项报价显隐 const [tdocId, tdocIdSet] = useState('');//tdocId 分项报价表用 const [gysId, gysIdSet] = useState('');//gysId 分项报价表导出用 const [jmTimeVis, jmTimeVisSet] = useState(false);//解密时限显隐 const [endTime, endTimeSet] = useState('');//解密时限 const [endTimeVis, endTimeVisSet] = useState(true);//解密时限提示显隐 const [rateVis, handleRateVis] = useState(false); //进度显隐 const [rateCount, rateCountSet] = useState(0); //查询进度启动器 const [jmFileCount, jmFileCountSet] = useState(0);//文件总数 const [jmComplete, jmCompleteSet] = useState(0);//已解密成功 const [jmWait, jmWaitSet] = useState(0);//未解密 const [jmFail, jmFailSet] = useState(0);//解密失败 const [isJm, isJmSet] = useState(0);//是否解密中 0-未解密 1-解密中或者解密完成 const [tFile, tFileSet] = useState([]);//供应商解密存秘钥 const [dis, disSet] = useState(false); const [assessRoomId, assessRoomIdSet] = useState(''); const [turnSort, turnSortSet] = useState(''); const [jmStatus, jmStatusSet] = useState(-1);//解密状态decryptButton 0-显示解密按钮(未解密,有解密失败) 1-解密中 2-不显示解密按钮(解密已全部完成) const [jmFlag, jmFlagSet] = useState(0);//当前是否触发过解密操作 0-未解密(没点过) 1-解密中(点过) const time_ = 2000; //设置解密间隔时间 //开标室表格 const [columnsKb, columnsKbSet] = useState([]); const [columnsKbData, columnsKbDataSet] = useState([]); const method = getProMethod();//项目类型字典项 let showNameT: any = { tbdw: '', tbr: '', bd: '', kb: '', tb: '' }//投标人供应商 if (method === 'procurement_mode_1' || method === 'procurement_mode_2') {//招标 showNameT = { tbdw: '投标单位', tbr: '投标人', bd: '标段', kb: '开标', tb: '投标' }; } else { showNameT = { tbdw: '供应商', tbr: '供应商', bd: '采购包', kb: '开启', tb: '应答' } } //唱标 const sing = async (fields: any) => { try { const success = await singBid({ ...fields }).then((res) => { return res.success }); if (success) { message.success('操作成功!'); getTableData(); return true; } else { return false; } } catch (error) { message.error('失败请重试!'); return false; } }; //设置解密时限 const endTimeConfig = async (fields: any) => { try { const success = await endTimeUp({ ...fields }).then((res) => { return res.success }); if (success) { message.success('设置成功!'); return true; } else { return false; } } catch (error) { message.error('设置失败请重试!'); return false; } }; //开标室表格按钮 const tools = [ endTime != '' && important && !range ? : null, endTime === '' && important && !range ? : null, endTimeVis && important && !range ? : null, !range && !rangeOver && (jmStatus == 0 || jmStatus == 1) && !important ?//代理解密 : null, !range && !rangeOver && (jmStatus == 0 || jmStatus == 1) && important && endTime != '' && jm ?//供应商解密 : null, !range && (jmStatus == 0 || jmStatus == 1) && !rangeOver ?//代理解密进度 : null, !range && (jmStatus == 0 || jmStatus == 1) && !rangeOver && important && endTime != '' && jm ?//供应商解密进度 : null, jmFlag == 1 && jmStatus != 1 && !rangeOver && !range && roomType === '2' ?//代理唱标 : null, range && !rangeOver ?//代理唱标结束 : null, jmFlag == 1 && jmStatus != 1 && !rangeOver && roomType === '1' ?//代理开标结束 : null, range && signTime[userId] && haveComplete ?//供应商确认报价 : null, jmFlag == 1 && jmStatus != 1 && , range && (juese === 'ebtp-agency-project-manager' || juese === 'ebtp-purchase') && roomType !== '1' && ]; //取参数 function getQueryString(name: any) { let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); let r = window.location.search.substr(1).match(reg); return r !== null ? unescape(r[2]) : null; } //进页面执行 useEffect(() => { getTableData(); }, [count]); //查询进度 useEffect(() => { if (rateVis) { queryRate(); setTimeout(async () => { rateCountSet(rateCount + 1); }, time_); } }, [rateCount, rateVis]); async function queryRate() {//查询解密进度 await jmRate({ tdocId: tdocId }).then((res) => { if (res?.code == 200) { let data = res.data; let all: number, comp: number, fail: number, wait: number = 0, isJm: number = 0; all = data['-1'] != undefined ? parseInt(data['-1']) : 0; comp = data['1'] != undefined ? parseInt(data['1']) : 0; fail = data['2'] != undefined ? parseInt(data['2']) : 0; wait = data['0'] != undefined ? parseInt(data['0']) : 0; isJm = data['-2'] != undefined ? parseInt(data['-2']) : 0;//是否解密中 0-未解密 1-解密中 jmCompleteSet(comp); jmFailSet(fail); jmFileCountSet(all); jmWaitSet(wait); isJmSet(isJm); // comp == all && setTimeout(() => {//全解密 成功自动关窗 // handleRateVis(false); // }, 1000); } }); } //取表格数据 const getTableData = async () => { if (count == 0) { spinSet(true); } let assessRoomId: any = ""; let turnSort: any = ''; let commpanyId = getSessionUserData().organizationId; juese == 'ebtp-agency-project-manager' ? commpanyId = '' : null; if (getQueryString("aa") != null) { assessRoomId = getQueryString("aa") } if (getQueryString("bb") != null) { turnSort = getQueryString("bb") } let column: any = []; let tFileT: any = []; let data: any = []; let category: any[] = []; let projectName: any, projectNo: any, sectionName: any, sectionNo: any, openTime: any, turnId: any, configId: any, openRoomId: any, tdocId1: any = ''; let openState: any, decryptStatus: any = false; let rangeT: any, rangeOverT: any, important: any, endTimeVisT: any = true; let signTimeT = {};//签名信息 let decryptEndDateT = '';//解密时限 let decryptButton = -1; let decryptFlag = 0; await getList({ assessRoomId: assessRoomId, turnSort: turnSort, commpanyId: commpanyId, id: tdocId }).then((res) => {//roomType: roomType //拼记录表信息 if (res?.code == 200) { projectName = res.data.singConfig.projectName; projectNo = res.data.singConfig.projectNo; sectionName = res.data.singConfig.sectionName; sectionNo = res.data.singConfig.sectionNo; openTime = res.data.singConfig.openTime; openState = res.data.singConfig.openState == 1 || res.data.singConfig.openState == 3 ? true : false; rangeT = res.data.singConfig.whetherRange == 1 ? true : false; rangeOverT = res.data.singConfig.whetherRangeOver == 1 ? true : false; decryptStatus = res.data.tdoc.decryptStatus;//true gys可以解密 turnId = res.data.singConfig.turnId; configId = res.data.singConfig.id; openRoomId = res.data.singConfig.openRoomId; important = res.data.singConfig.passDecode === '0' ? true : false; decryptEndDateT = res.data.tdoc.decryptEndDate == null ? '' : res.data.tdoc.decryptEndDate; endTimeVisT = res.data.tdoc.decryptEndDate == null ? true : false; decryptButton = res.data.decryptButton; decryptFlag = res.data.decryptFlag; projectNameSet(projectName); projectNoSet(projectNo); sectionNameSet(sectionName); sectionNoSet(sectionNo); openTimeSet(openTime); openStateSet(openState); rangeSet(rangeT); rangeOverSet(rangeOverT); jmSet(decryptStatus); turnIdSet(turnId); configIdSet(configId); openRoomSet(openRoomId); importantSet(important); endTimeSet(decryptEndDateT); endTimeVisSet(endTimeVisT); assessRoomIdSet(assessRoomId); turnSortSet(turnSort); jmStatusSet(decryptButton); jmFlagSet(decryptFlag); } //拼表格 if (res?.code == 200) { //取tdoc id 分项报价用 tdocId1 = res.data.tdoc.id; column.push({ title: '序号', dataIndex: 'index', valueType: 'index', width: 80 }); column.push({ title: showNameT.tbdw, dataIndex: 'companyName', }); res.data.title.map((item: any, index: any) => { column.push({ title: item.name, dataIndex: item.id, }); category.push(item.id); }); column.push({ title: '签名信息', dataIndex: 'bidUserName', width: 200, hideInTable: roomType === '1' }); column.push({ title: '操作', dataIndex: 'option', width: 140, hideInTable: roomType === '1', valueType: 'option', render: (_: any, record: any) => { return ( <> { rangeT && record.quoteId != null ? <> : null } { !rangeT && record.quoteDecryptStatus == 2 && record.quoteId != null ? : null } ) } }); //拼data let haveCompleteT = false; res.data.suppliers != undefined ? res.data.suppliers.map((item1: any, index: any) => { let oneGys = {}; signTimeT[item1.bidUserId] = item1.signTime == null ? true : false;//控制显示 确认报价按钮 item1.signTime == null ? item1.signTime = '未签名' : null; oneGys["key"] = index; oneGys["companyName"] = item1.companyName; oneGys["bidUserName"] = item1.bidUserName + "\n(" + item1.signTime + ")"; oneGys["sectionName"] = sectionName; oneGys["tendererId"] = item1.id;//投标人id,补录报价用 oneGys["contentDataId"] = item1.quoteId;//数据表id,补录报价用 oneGys["newPrice"] = item1.newPrice;//数据表id,补录报价用 oneGys["newPriceRemark"] = item1.newPriceRemark;//数据表id,补录报价用 oneGys["quoteDecryptStatus"] = item1.quoteDecryptStatus; oneGys["quoteId"] = item1.quoteId; if (item1.companyId == tenderId) { category.map((item2: any, index: any) => { oneGys[item2] = item1.dataMap[item2]; if (!haveCompleteT) { haveCompleteT = item1.dataMap[item2] === '解密成功'; } }); } else { category.map((item2: any, index: any) => { oneGys[item2] = item1.dataMap[item2]; }); } tFileT = item1.tfileList; data.push(oneGys); }) : null; columnsKbSet(column); columnsKbDataSet(data); tdocIdSet(tdocId1); signTimeSet(signTimeT); tFileSet(tFileT); spinSet(false); haveCompleteSet(haveCompleteT); } queryHaveDataSet(res?.code == 200); }); //查询进度 // if (!rateVis) { // await jmRate({ tdocId: tdocId }).then((res) => { // if (res?.code == 200) { // let data = res.data; // let all: number, comp: number, fail: number, wait: number = 0; // if (data != undefined) { // all = data['-1'] != undefined ? parseInt(data['-1']) : 0; // comp = data['1'] != undefined ? parseInt(data['1']) : 0; // fail = data['2'] != undefined ? parseInt(data['2']) : 0; // wait = data['0'] != undefined ? parseInt(data['0']) : 0; // jmCompleteSet(comp); // jmFailSet(fail); // jmFileCountSet(all); // jmWaitSet(wait); // } // } // }); // } //供应商未唱标结束就轮询 代理唱标结束之前轮询 if (((juese === 'ebtp-supplier' && !rangeOverT) || (juese === 'ebtp-agency-project-manager' && !rangeOverT)) && !rateVis) { setTimeout(() => { countSet(count + 1); }, time_); } } //开标记录表 const kbjl = () => { return ( <>
开标报价记录
{projectName} {projectNo} {sectionName} {sectionNo} {openTime}
tools} pagination={false} options={false} rowClassName='xsy-table-header' />
) } //补录报价 const [formBlbj] = Form.useForm(); function checkFive(money: any) {//检查小数点后4位 不能超4位 let pass = true let x = String(money).indexOf('.') + 1; //小数点的位置 let y = String(money).length - x; //小数的位数 y > 4 && x != 0 ? pass = false : null; return pass } function moreThan0(val: any) { if (val != "--" && val != "++" && val !== "" && val != undefined && !(val < 0)) { return true } else { return false } } const blbj = () => { return ( repairVisSet(false)} onOk={async () => { spinSet(true); let verify = false; await formBlbj.validateFields().then(() => { verify = true; if (!checkFive(formBlbj.getFieldsValue().newPrice)) { verify = false; message.error('报价最多四位小数'); } if (!moreThan0(formBlbj.getFieldsValue().newPrice)) { verify = false; message.error('报价应大于0'); } }) if (verify) { const { newPrice, contentDataId, tendererId, remark } = formBlbj.getFieldsValue(); const success = await updatePrice({ evaluatingContent: newPrice, contTid: contentDataId, tendererId: tendererId, tdocId: tdocId, remark: remark, tendererName: tendererName, // roomType: roomType }).then((res) => { return res.success }); if (success) { message.success('补录成功!'); repairVisSet(false); } else { message.error('补录失败!') } getTableData(); } spinSet(false); }} >