1.11 第十四版,修改

This commit is contained in:
jl-zhoujl2
2023-01-11 16:28:42 +08:00
parent bf1d8a3a03
commit 873bbd1181
9 changed files with 144 additions and 88 deletions

View File

@ -51,7 +51,11 @@ export default [
path: '/401', path: '/401',
component: './401', component: './401',
}, },
{
exact: true,
path: '/404',
component: './404',
},
{//开标室 {//开标室
path: '/room', path: '/room',
component: '../layouts/RoomLayout', component: '../layouts/RoomLayout',

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

View File

@ -6,12 +6,12 @@ const NoFoundPage: React.FC<{}> = () => (
<Result <Result
status="404" status="404"
title="404" title="404"
subTitle="Sorry, the page you visited does not exist." subTitle="对不起,您访问的页面不存在。"
extra={ // extra={
<Button type="primary" onClick={() => history.push('/')}> // <Button type="primary" onClick={() => history.push('/')}>
Back Home // Back Home
</Button> // </Button>
} // }
/> />
); );

View File

@ -87,7 +87,7 @@ const MonitorException: React.FC<{}> = () => {
data.decryptExceptionList[i]["projectName"] = data.decryptExceptionList[i].projectRecord?.projectName; data.decryptExceptionList[i]["projectName"] = data.decryptExceptionList[i].projectRecord?.projectName;
data.decryptExceptionList[i]["ownerContactName"] = data.decryptExceptionList[i].projectRecord?.ownerContactName; data.decryptExceptionList[i]["ownerContactName"] = data.decryptExceptionList[i].projectRecord?.ownerContactName;
data.decryptExceptionList[i]["ownerContactTel"] = data.decryptExceptionList[i].projectRecord?.ownerContactTel; data.decryptExceptionList[i]["ownerContactTel"] = data.decryptExceptionList[i].projectRecord?.ownerContactTel;
data.decryptExceptionList[i]["tenderAgencyName"] = data.decryptExceptionList[i].projectRecord?.tenderAgencyName; data.decryptExceptionList[i]["appManagerName"] = data.decryptExceptionList[i].projectRecord?.appManagerName;
data.decryptExceptionList[i]["appManagerTel"] = data.decryptExceptionList[i].projectRecord?.appManagerTel; data.decryptExceptionList[i]["appManagerTel"] = data.decryptExceptionList[i].projectRecord?.appManagerTel;
data.decryptExceptionList[i]["recruitStartTime"] = data.decryptExceptionList[i].projectRecord?.recruitStartTime; data.decryptExceptionList[i]["recruitStartTime"] = data.decryptExceptionList[i].projectRecord?.recruitStartTime;
data.decryptExceptionList[i]["bidMethodDict"] = data.decryptExceptionList[i].projectRecord?.bidMethodDict; data.decryptExceptionList[i]["bidMethodDict"] = data.decryptExceptionList[i].projectRecord?.bidMethodDict;
@ -100,7 +100,7 @@ const MonitorException: React.FC<{}> = () => {
data.macSameList[i]["projectName"] = data.macSameList[i].projectRecord?.projectName; data.macSameList[i]["projectName"] = data.macSameList[i].projectRecord?.projectName;
data.macSameList[i]["ownerContactName"] = data.macSameList[i].projectRecord?.ownerContactName; data.macSameList[i]["ownerContactName"] = data.macSameList[i].projectRecord?.ownerContactName;
data.macSameList[i]["ownerContactTel"] = data.macSameList[i].projectRecord?.ownerContactTel; data.macSameList[i]["ownerContactTel"] = data.macSameList[i].projectRecord?.ownerContactTel;
data.macSameList[i]["tenderAgencyName"] = data.macSameList[i].projectRecord?.tenderAgencyName; data.macSameList[i]["appManagerName"] = data.macSameList[i].projectRecord?.appManagerName;
data.macSameList[i]["appManagerTel"] = data.macSameList[i].projectRecord?.appManagerTel; data.macSameList[i]["appManagerTel"] = data.macSameList[i].projectRecord?.appManagerTel;
data.macSameList[i]["recruitStartTime"] = data.macSameList[i].projectRecord?.recruitStartTime; data.macSameList[i]["recruitStartTime"] = data.macSameList[i].projectRecord?.recruitStartTime;
data.macSameList[i]["bidMethodDict"] = data.macSameList[i].projectRecord?.bidMethodDict; data.macSameList[i]["bidMethodDict"] = data.macSameList[i].projectRecord?.bidMethodDict;
@ -238,7 +238,7 @@ const MonitorException: React.FC<{}> = () => {
onHeaderCell, onHeaderCell,
render: (_: any, record: any) => { render: (_: any, record: any) => {
return ( return (
<a onClick={() => { setExceptionType(null); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#fff" }}></a> <a onClick={() => { setExceptionType(null); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#1b7ef2" }}></a>
) )
}, },
}, },
@ -301,7 +301,7 @@ const MonitorException: React.FC<{}> = () => {
onHeaderCell, onHeaderCell,
render: (_: any, record: any) => { render: (_: any, record: any) => {
return ( return (
<a onClick={() => { setExceptionType("解密异常"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#fff" }}></a> <a onClick={() => { setExceptionType("解密异常"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#1b7ef2" }}></a>
) )
}, },
}, },
@ -364,7 +364,7 @@ const MonitorException: React.FC<{}> = () => {
onHeaderCell, onHeaderCell,
render: (_: any, record: any) => { render: (_: any, record: any) => {
return ( return (
<a onClick={() => { setExceptionType("评标结束后3日内未发布公示"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#fff" }}></a> <a onClick={() => { setExceptionType("评标结束后3日内未发布公示"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#1b7ef2" }}></a>
) )
}, },
}, },
@ -427,7 +427,7 @@ const MonitorException: React.FC<{}> = () => {
onHeaderCell, onHeaderCell,
render: (_: any, record: any) => { render: (_: any, record: any) => {
return ( return (
<a onClick={() => { setExceptionType("开启评审后3日未结束评标"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#fff" }}></a> <a onClick={() => { setExceptionType("开启评审后3日未结束评标"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#1b7ef2" }}></a>
) )
}, },
}, },
@ -490,7 +490,7 @@ const MonitorException: React.FC<{}> = () => {
onHeaderCell, onHeaderCell,
render: (_: any, record: any) => { render: (_: any, record: any) => {
return ( return (
<a onClick={() => { setExceptionType("MAC地址重复"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#fff" }}></a> <a onClick={() => { setExceptionType("MAC地址重复"); setModalListData([record]); setModalListVisible(true); }} className='monitor-extra-pointer' style={{ color: "#1b7ef2" }}></a>
) )
}, },
}, },
@ -517,7 +517,7 @@ const MonitorException: React.FC<{}> = () => {
</div> </div>
<ScreenLabel title="开标后六小时未开启评审" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType(null); setModalListData(noOpenAssessListData); setModalListVisible(true); }}>more</span>} /> <ScreenLabel title="开标后六小时未开启评审" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType(null); setModalListData(noOpenAssessListData); setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card"> <div className="monitor-exception-card">
<ScrollTable dataSource={noOpenAssessListData} columns={columns} ynum={266} selectKey={selectKey} /> <ScrollTable dataSource={noOpenAssessListData} columns={columns} ynum={266} rowKey="sectionId" selectKey={selectKey} />
</div> </div>
</div> </div>
</Col> </Col>
@ -525,11 +525,11 @@ const MonitorException: React.FC<{}> = () => {
<div className="monitor-center-main"> <div className="monitor-center-main">
<ScreenLabel title="解密异常项目列表" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("解密异常"); setModalListData(decryptData?.decryptExceptionList ? decryptData?.decryptExceptionList : []); setModalListVisible(true); }}>more</span>} /> <ScreenLabel title="解密异常项目列表" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("解密异常"); setModalListData(decryptData?.decryptExceptionList ? decryptData?.decryptExceptionList : []); setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card"> <div className="monitor-exception-card">
<ScrollTable dataSource={decryptData?.decryptExceptionList} columns={columnsSecond} selectKey={selectKey} ynum={266} /> <ScrollTable dataSource={decryptData?.decryptExceptionList} columns={columnsSecond} rowKey="id" selectKey={selectKey} ynum={266} />
</div> </div>
<ScreenLabel title="开启评审后3日未结束评标" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("开启评审后3日未结束评标"); setModalListData(threeDayNoEndData); setModalListVisible(true); }}>more</span>} /> <ScreenLabel title="开启评审后3日未结束评标" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("开启评审后3日未结束评标"); setModalListData(threeDayNoEndData); setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card"> <div className="monitor-exception-card">
<ScrollTable dataSource={threeDayNoEndData} columns={columnsForth} ynum={266} selectKey={selectKey} /> <ScrollTable dataSource={threeDayNoEndData} columns={columnsForth} ynum={266} rowKey="id" selectKey={selectKey} />
</div> </div>
</div> </div>
</Col> </Col>
@ -537,11 +537,11 @@ const MonitorException: React.FC<{}> = () => {
<div className="monitor-right-main"> <div className="monitor-right-main">
<ScreenLabel title="MAC地址重复项目列表" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("MAC地址重复"); setModalListData(decryptData?.macSameList ? decryptData?.macSameList : []); setModalListVisible(true); }}>more</span>} /> <ScreenLabel title="MAC地址重复项目列表" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("MAC地址重复"); setModalListData(decryptData?.macSameList ? decryptData?.macSameList : []); setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card"> <div className="monitor-exception-card">
<ScrollTable dataSource={decryptData?.macSameList} columns={columnsFifth} ynum={266} selectKey={selectKey} /> <ScrollTable dataSource={decryptData?.macSameList} columns={columnsFifth} ynum={266} rowKey="id" selectKey={selectKey} />
</div> </div>
<ScreenLabel title="评标结束后3日内未发布公示" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("评标结束后3日内未发布公示"); setModalListData(threeDaysUnSendAnnoList); setModalListVisible(true); }}>more</span>} /> <ScreenLabel title="评标结束后3日内未发布公示" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType("评标结束后3日内未发布公示"); setModalListData(threeDaysUnSendAnnoList); setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card"> <div className="monitor-exception-card">
<ScrollTable dataSource={threeDaysUnSendAnnoList} columns={columnsThird} ynum={266} selectKey={selectKey} /> <ScrollTable dataSource={threeDaysUnSendAnnoList} columns={columnsThird} ynum={266} rowKey="bidSectName" selectKey={selectKey} />
</div> </div>
</div> </div>
</Col> </Col>

View File

@ -9,6 +9,7 @@ import Frame10118 from '@/assets/monitor/Frame-10118.png';
import Frame10119 from '@/assets/monitor/Frame-10119.png'; import Frame10119 from '@/assets/monitor/Frame-10119.png';
import Frame10120 from '@/assets/monitor/Frame-10120.png'; import Frame10120 from '@/assets/monitor/Frame-10120.png';
import Frame10121 from '@/assets/monitor/Frame-10121.png'; import Frame10121 from '@/assets/monitor/Frame-10121.png';
import titleIcon from '@/assets/monitor/title-icon.png';
import left from '@/assets/monitor/left.png'; import left from '@/assets/monitor/left.png';
import right from '@/assets/monitor/right.png'; import right from '@/assets/monitor/right.png';
import { CaretRightOutlined, DownOutlined } from '@ant-design/icons'; import { CaretRightOutlined, DownOutlined } from '@ant-design/icons';
@ -583,10 +584,10 @@ export const ScreenTitle = (props: { title: string, children: any }) => {
export const ModalList = (props: { modalVisible: boolean, onCancel: () => void, exceptionType?: string, exceptionData: any[] }) => { export const ModalList = (props: { modalVisible: boolean, onCancel: () => void, exceptionType?: string, exceptionData: any[] }) => {
const { modalVisible, onCancel, exceptionType, exceptionData } = props; const { modalVisible, onCancel, exceptionType, exceptionData } = props;
const modalHeight = window.innerHeight * 96 / 100; const modalHeight = window.innerHeight * 96 / 100;
const labelStyle = { color: "#29F1FA", fontWeight: "bold" }; const labelStyle = { color: "#29F0F9", fontWeight: "bold", width: "100px" };
const contentStyle = { color: "#fff" }; const contentStyle = { color: "#fff", paddingLeft: "20px" };
const titleStyle = { color: "#1b7ef2", fontWeight: "bold", marginBottom: '24px' }; const titleStyle = { color: "#01C2FF", fontWeight: 700, marginBottom: 0 };
const dividerStyle = { borderColor: "#999", margin: "12px 0 24px" }; // const dividerStyle = { borderColor: "#999", margin: "12px 0 24px" };
//初始化字典 //初始化字典
let dic: any = getDicData(); let dic: any = getDicData();
let dicData: any = JSON.parse(dic); let dicData: any = JSON.parse(dic);
@ -598,34 +599,39 @@ export const ModalList = (props: { modalVisible: boolean, onCancel: () => void,
onCancel={() => onCancel()} onCancel={() => onCancel()}
width={"60%"} width={"60%"}
style={{ maxHeight: modalHeight }} style={{ maxHeight: modalHeight }}
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', }} bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', padding: "20px 24px 24px" }}
centered centered
footer={null} footer={null}
> >
<h3 style={titleStyle}></h3> <h3 style={titleStyle}></h3>
{exceptionData.length > 0 ? exceptionData.map((item, index) => { {exceptionData.length > 0 ? exceptionData.map((item, index) => {
return <> return (
{index == 0 ? null : <Divider style={dividerStyle} />} <div key={index} className={exceptionData.length > 1 ? 'modal-list-block' : 'modal-list-block modal-list-block-border0'}>
<div className='modal-list-pname'>
<img src={titleIcon} /><span>{item?.projectName}</span>
<div>{item?.bidSectName || item?.sectionName}</div>
</div>
<div className='modal-list-desc'>
<Descriptions> <Descriptions>
<Descriptions.Item label="异常类型" labelStyle={labelStyle} contentStyle={contentStyle}>{isNotEmpty(exceptionType) ? exceptionType : item?.exType}</Descriptions.Item> <Descriptions.Item label="异常类型" labelStyle={labelStyle} contentStyle={contentStyle}>{isNotEmpty(exceptionType) ? exceptionType : item?.exType}</Descriptions.Item>
<Descriptions.Item label="项目名称" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.projectName}</Descriptions.Item> <Descriptions.Item label="开标时间" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.openTime || item?.recruitStartTime || item?.openingTime}</Descriptions.Item>
<Descriptions.Item label="标段名称" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.bidSectName || item?.sectionName}</Descriptions.Item> <Descriptions.Item label="采购预算" labelStyle={labelStyle} contentStyle={contentStyle}>{isNotEmpty(item?.budgetAmount) ? Number(item?.budgetAmount).toFixed(2) : isNotEmpty(item?.bidSectContractPrice) ? Number(item?.bidSectContractPrice).toFixed(2) : "0"}</Descriptions.Item>
<Descriptions.Item label="省分" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.provinceName || item?.regionDictName || item?.province}</Descriptions.Item> <Descriptions.Item label="省分" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.provinceName || item?.regionDictName || item?.province}</Descriptions.Item>
<Descriptions.Item label="采购经理" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.ownerContactName}</Descriptions.Item> <Descriptions.Item label="采购经理" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.ownerContactName}</Descriptions.Item>
<Descriptions.Item label="采购经理电话" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.ownerContactTel}</Descriptions.Item> <Descriptions.Item label="采购经理电话" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.ownerContactTel}</Descriptions.Item>
<Descriptions.Item label="标段状态" labelStyle={labelStyle} contentStyle={contentStyle}>{(item?.state || item?.sectionState || item?.sectionStatus) == 9 ? "异常处理" : changeDict(item?.bidMethodDict ? dicData[`business_module=${item?.bidMethodDict}`] : [], item?.businessModule)}</Descriptions.Item> <Descriptions.Item label="标段状态" labelStyle={labelStyle} contentStyle={contentStyle}>{(item?.state || item?.sectionState || item?.sectionStatus) == 9 ? "异常处理" : changeDict(item?.bidMethodDict ? dicData[`business_module=${item?.bidMethodDict}`] : [], item?.businessModule)}</Descriptions.Item>
<Descriptions.Item label="招标代理机构" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.tenderAgencyName}</Descriptions.Item> <Descriptions.Item label="招标代理" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.appManagerName}</Descriptions.Item>
<Descriptions.Item label="代理机构电话" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.appManagerTel}</Descriptions.Item> <Descriptions.Item label="代理机构电话" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.appManagerTel}</Descriptions.Item>
<Descriptions.Item label="开标时间" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.openTime || item?.recruitStartTime || item?.openingTime}</Descriptions.Item>
<Descriptions.Item label="采购预算" labelStyle={labelStyle} contentStyle={contentStyle}>{isNotEmpty(item?.budgetAmount) ? Number(item?.budgetAmount).toFixed(2) : isNotEmpty(item?.bidSectContractPrice) ? Number(item?.bidSectContractPrice).toFixed(2) : "0"}</Descriptions.Item>
</Descriptions> </Descriptions>
</> </div>
</div>
)
}) : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} className="monitor-modal-empty" />} }) : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} className="monitor-modal-empty" />}
<div className='monitor-modal-btn'> {/* <div className='monitor-modal-btn'>
<div className='modal-list-btn' onClick={() => onCancel()}> <div className='modal-list-btn' onClick={() => onCancel()}>
<span>确 定</span> <span>确 定</span>
</div> </div>
</div> </div> */}
</Modal> </Modal>
) )
} }
@ -1363,7 +1369,7 @@ export const GraphChart = (props: { type: string, chartData: any[], chartColor?:
} }
}, 10000) }, 10000)
} }
if (type == "mapTwice") {//地图自动轮播tooltip if (type == "mapTwice" || type == "mapThird") {//地图自动轮播tooltip
let index = 1; let index = 1;
autoSelect(0); autoSelect(0);
if (chartData.length > 1) { if (chartData.length > 1) {
@ -1391,6 +1397,7 @@ export const authCheck = () => {
//获取角色列表 //获取角色列表
const authorityList: any[] | undefined = getSessionUserData()?.authorityList; const authorityList: any[] | undefined = getSessionUserData()?.authorityList;
if (isEmpty(authorityList)) { if (isEmpty(authorityList)) {
history.replace({ pathname: "/404" });
return false; return false;
} }
if (authorityList?.findIndex(item => item.roleCode == "ebtp-watcher") == -1) {//监看人员校验 if (authorityList?.findIndex(item => item.roleCode == "ebtp-watcher") == -1) {//监看人员校验
@ -1423,6 +1430,8 @@ const MonitorHome: React.FC<{}> = () => {
const [todayInfoData, setTodayInfoData] = useState<any>(); const [todayInfoData, setTodayInfoData] = useState<any>();
//权限校验 //权限校验
const auth = useRef<boolean>(authCheck()); const auth = useRef<boolean>(authCheck());
//定时器秒数
const _time = 20000;
const bidStatusMap = ["准备评标", "正在评标", "评标结束", ""]; const bidStatusMap = ["准备评标", "正在评标", "评标结束", ""];
const statusColorMap = ["card-text-orange", "card-text-green", "card-text-purple", "card-text-white"]; const statusColorMap = ["card-text-orange", "card-text-green", "card-text-purple", "card-text-white"];
//year select //year select
@ -1474,7 +1483,7 @@ const MonitorHome: React.FC<{}> = () => {
const getActiveSupplier = (ym: string) => { const getActiveSupplier = (ym: string) => {
getActiveSupplierAPI(ym).then(res => { getActiveSupplierAPI(ym).then(res => {
if (res?.code == 200) { if (res?.code == 200) {
const data = res?.data; const data = res?.data?.slice(0, 20);
if (data.length > 0) { if (data.length > 0) {
const max = data[0].tenderCount; const max = data[0].tenderCount;
for (let i = 0, length = data.length; i < length; i++) { for (let i = 0, length = data.length; i < length; i++) {
@ -1548,7 +1557,6 @@ const MonitorHome: React.FC<{}> = () => {
useEffect(() => { useEffect(() => {
if (auth.current) { if (auth.current) {
getTodayOpening();
getReviewDistribution(); getReviewDistribution();
getOpeningList(); getOpeningList();
getMonitorList(); getMonitorList();
@ -1566,6 +1574,19 @@ const MonitorHome: React.FC<{}> = () => {
} }
}, [yearSelect]) }, [yearSelect])
useEffect(() => {
let interval: any;
if (auth.current) {
getTodayOpening();
interval = setInterval(() => {
getTodayOpening();
}, _time);
}
return () => {
clearInterval(interval);
}
}, [])
return ( return (
<ScreenTitle title="智能招标采购室"> <ScreenTitle title="智能招标采购室">
<div className="top-main"> <div className="top-main">
@ -1588,13 +1609,13 @@ const MonitorHome: React.FC<{}> = () => {
<ScreenLabel title="今日开标" extra={<span>&nbsp;&nbsp;{isNotEmpty(todayOpeningData?.sectionNumber) ? todayOpeningData?.sectionNumber : 0}&nbsp;&nbsp;&nbsp;&nbsp;{isNotEmpty(todayOpeningData?.sectionNumber) && todayOpeningData?.sectionNumber != "0" ? Number(((Number(todayOpeningData?.banner) / todayOpeningData?.sectionNumber) * 100).toFixed(0)) : 0}%&nbsp;&nbsp;&nbsp;&nbsp;{(isNotEmpty(todayInfoData?.sectionNumber) && todayInfoData?.sectionNumber != "0") ? Number(((Number(todayInfoData?.resultNumber) / todayInfoData?.sectionNumber) * 100).toFixed(0)) : 0}%</span>} /> <ScreenLabel title="今日开标" extra={<span>&nbsp;&nbsp;{isNotEmpty(todayOpeningData?.sectionNumber) ? todayOpeningData?.sectionNumber : 0}&nbsp;&nbsp;&nbsp;&nbsp;{isNotEmpty(todayOpeningData?.sectionNumber) && todayOpeningData?.sectionNumber != "0" ? Number(((Number(todayOpeningData?.banner) / todayOpeningData?.sectionNumber) * 100).toFixed(0)) : 0}%&nbsp;&nbsp;&nbsp;&nbsp;{(isNotEmpty(todayInfoData?.sectionNumber) && todayInfoData?.sectionNumber != "0") ? Number(((Number(todayInfoData?.resultNumber) / todayInfoData?.sectionNumber) * 100).toFixed(0)) : 0}%</span>} />
</div> </div>
<div className="scroll-table"> <div className="scroll-table">
<ScrollTable dataSource={todayOpeningData?.todayList} columns={columns} ynum={266} /> <ScrollTable dataSource={todayOpeningData?.todayList} columns={columns} rowKey="sectionId" ynum={266} />
</div> </div>
<div className="monitor-label-pointer" onClick={() => { window.open("/ElecMonitor/Supplier") }}> <div className="monitor-label-pointer" onClick={() => { window.open("/ElecMonitor/Supplier") }}>
<ScreenLabel title="活跃供应商" /> <ScreenLabel title="活跃供应商排名Top20" />
</div> </div>
<div className="active-supplier"> <div className="active-supplier">
<StatisticTable columns={todayColumns} dataSource={activeSupplierData} ynum={340} /> <StatisticTable columns={todayColumns} dataSource={activeSupplierData} rowKey="companyName" ynum={340} />
</div> </div>
</div> </div>
</Col> </Col>
@ -1636,7 +1657,7 @@ const MonitorHome: React.FC<{}> = () => {
<div>MORNING</div> <div>MORNING</div>
</div> </div>
{openingList.slice(0, 2).map((item, index) => ( {openingList.slice(0, 2).map((item, index) => (
<div className={index == 0 ? "bid-opening-card bid-opening-card-first" : index == 1 ? "bid-opening-card bid-opening-card-second" : "bid-opening-card bid-opening-card-third"}> <div key={index} className={index == 0 ? "bid-opening-card bid-opening-card-first" : index == 1 ? "bid-opening-card bid-opening-card-second" : "bid-opening-card bid-opening-card-third"}>
<div> <div>
<div>{item.startTime}-{item.endTime}</div> <div>{item.startTime}-{item.endTime}</div>
<div>{item.num}/{item.max}</div> <div>{item.num}/{item.max}</div>
@ -1650,7 +1671,7 @@ const MonitorHome: React.FC<{}> = () => {
<div>AFTERNOON</div> <div>AFTERNOON</div>
</div> </div>
{openingList.slice(2, 5).map((item, index) => ( {openingList.slice(2, 5).map((item, index) => (
<div className={index == 0 ? "bid-opening-card bid-opening-card-first" : index == 1 ? "bid-opening-card bid-opening-card-second" : "bid-opening-card bid-opening-card-third"}> <div key={index} className={index == 0 ? "bid-opening-card bid-opening-card-first" : index == 1 ? "bid-opening-card bid-opening-card-second" : "bid-opening-card bid-opening-card-third"}>
<div> <div>
<div>{item.startTime}-{item.endTime}</div> <div>{item.startTime}-{item.endTime}</div>
<div>{item.num}/{item.max}</div> <div>{item.num}/{item.max}</div>
@ -1663,7 +1684,7 @@ const MonitorHome: React.FC<{}> = () => {
<ScreenLabel title="招标代理实施项目统计" /> <ScreenLabel title="招标代理实施项目统计" />
</div> </div>
<div className="tender-agent"> <div className="tender-agent">
<StatisticTable columns={tjColumns} dataSource={annualAndTenderAgentData?.agencyProjectYear} ynum={340} /> <StatisticTable columns={tjColumns} dataSource={annualAndTenderAgentData?.agencyProjectYear} rowKey="tender_agency_name" ynum={340} />
</div> </div>
</div> </div>
</Col> </Col>

View File

@ -158,7 +158,20 @@ const OpenToday: React.FC<{}> = () => {
const getDecryptSuccessRateToday = () => { const getDecryptSuccessRateToday = () => {
getDecryptSuccessRateTodayAPI().then(res => { getDecryptSuccessRateTodayAPI().then(res => {
if (res?.code == 200) { if (res?.code == 200) {
setDecryptSuccessRateTodayData(res?.data); const data = res?.data;
if (data?.decryptFailProjectList?.length > 0) {
for (let i = 0, length = data.decryptFailProjectList.length; i < length; i++) {
data.decryptFailProjectList[i]["regionDictName"] = data.decryptFailProjectList[i].projectRecord?.regionDictName;
data.decryptFailProjectList[i]["projectName"] = data.decryptFailProjectList[i].projectRecord?.projectName;
data.decryptFailProjectList[i]["ownerContactName"] = data.decryptFailProjectList[i].projectRecord?.ownerContactName;
data.decryptFailProjectList[i]["ownerContactTel"] = data.decryptFailProjectList[i].projectRecord?.ownerContactTel;
data.decryptFailProjectList[i]["appManagerName"] = data.decryptFailProjectList[i].projectRecord?.appManagerName;
data.decryptFailProjectList[i]["appManagerTel"] = data.decryptFailProjectList[i].projectRecord?.appManagerTel;
data.decryptFailProjectList[i]["recruitStartTime"] = data.decryptFailProjectList[i].projectRecord?.recruitStartTime;
data.decryptFailProjectList[i]["bidMethodDict"] = data.decryptFailProjectList[i].projectRecord?.bidMethodDict;
}
}
setDecryptSuccessRateTodayData(data);
} }
}) })
} }
@ -300,13 +313,13 @@ const OpenToday: React.FC<{}> = () => {
<Col span={12}> <Col span={12}>
<ScreenLabel title="今日开标明细" /> <ScreenLabel title="今日开标明细" />
<div className='monitor-tender-card'> <div className='monitor-tender-card'>
<ScrollTable dataSource={todayOpeningData?.todayList} columns={columns} ynum={540} selectKey={selectKey} /> <ScrollTable dataSource={todayOpeningData?.todayList} columns={columns} ynum={540} rowKey="sectionId" selectKey={selectKey} />
</div> </div>
</Col> </Col>
<Col span={12}> <Col span={12}>
<ScreenLabel title="重保项目" /> <ScreenLabel title="重保项目" />
<div className='monitor-tender-card'> <div className='monitor-tender-card'>
<ScrollTable dataSource={isNotEmpty(todayOpeningData?.importantList) ? todayOpeningData?.importantList : []} columns={reiColumns} ynum={540} selectKey={selectKey} /> <ScrollTable dataSource={isNotEmpty(todayOpeningData?.importantList) ? todayOpeningData?.importantList : []} columns={reiColumns} ynum={540} rowKey="id" selectKey={selectKey} />
</div> </div>
</Col> </Col>
</Row> </Row>

View File

@ -124,7 +124,7 @@ const Supplier: React.FC<{}> = () => {
//onSelectChange select变更事件 //onSelectChange select变更事件
const onSelectChange = (value: string | number) => { const onSelectChange = (value: string | number) => {
if (rankDataRef.current) { if (rankDataRef.current) {
const data = rankDataRef.current[value] ? rankDataRef.current[value] : []; const data = rankDataRef.current[value] ? rankDataRef.current[value]?.slice(0, 20) : [];
if (data.length > 0) { if (data.length > 0) {
const max = data[0].tenderCount; const max = data[0].tenderCount;
for (let i = 0, length = data.length; i < length; i++) { for (let i = 0, length = data.length; i < length; i++) {
@ -194,12 +194,12 @@ const Supplier: React.FC<{}> = () => {
<Row> <Row>
<Col span={8}> <Col span={8}>
<div className="monitor-left-main"> <div className="monitor-left-main">
<ScreenLabel title="全国活跃供应商排名" /> <ScreenLabel title="全国活跃供应商排名Top20" />
<div className="monitor-supplier-card"> <div className="monitor-supplier-card">
<span className='monitor-supplier-select-label'></span>&nbsp;&nbsp;&nbsp;<SelectItem options={[{ label: "全部", value: "全部" }, { label: "公开招标", value: "公开招标" }, { label: "公开比选", value: "公开比选" }, { label: "公开招募", value: "公开招募" }, { label: "竞争性谈判", value: "竞争性谈判" }, { label: "单一来源", value: "单一来源" }, { label: "公开询价", value: "公开询价" }, { label: "邀请招标", value: "邀请招标" }]} onSelectChange={onSelectChange} /> <span className='monitor-supplier-select-label'></span>&nbsp;&nbsp;&nbsp;<SelectItem options={[{ label: "全部", value: "全部" }, { label: "公开招标", value: "公开招标" }, { label: "公开比选", value: "公开比选" }, { label: "公开招募", value: "公开招募" }, { label: "竞争性谈判", value: "竞争性谈判" }, { label: "单一来源", value: "单一来源" }, { label: "公开询价", value: "公开询价" }, { label: "邀请招标", value: "邀请招标" }]} onSelectChange={onSelectChange} />
</div> </div>
<div className="monitor-tender-card"> <div className="monitor-tender-card">
<StatisticTable dataSource={activeSupplierRankData} columns={columns} ynum={670} /> <StatisticTable dataSource={activeSupplierRankData} columns={columns} rowKey="companyName" ynum={670} />
</div> </div>
</div> </div>
</Col> </Col>

View File

@ -71,7 +71,7 @@ const TenderAgent: React.FC<{}> = () => {
//省分代理分布 //省分代理分布
const [provinceData, setProvinceData] = useState<any[]>([]); const [provinceData, setProvinceData] = useState<any[]>([]);
//btn select //btn select
const [btnSelect, setBtnSelect] = useState<string>("0"); const [btnSelect, setBtnSelect] = useState<string>("1");
//year select //year select
const localYear: string = moment().month() < 2 ? String(moment().year() - 1) : String(moment().year()); const localYear: string = moment().month() < 2 ? String(moment().year() - 1) : String(moment().year());
const [yearSelect, setYearSelect] = useState<string>(localYear); const [yearSelect, setYearSelect] = useState<string>(localYear);
@ -207,15 +207,15 @@ const TenderAgent: React.FC<{}> = () => {
{categoryChart} {categoryChart}
</div> </div>
<div> <div>
<StatisticTable dataSource={tenderAgentData?.agencyProjectListYear?.slice(0, 15)} columns={columns} ynum={266} /> <StatisticTable dataSource={tenderAgentData?.agencyProjectListYear?.slice(0, 15)} columns={columns} rowKey="agencyName" ynum={266} />
</div> </div>
</Col> </Col>
<Col span={16}> <Col span={16}>
<ScreenLabel title="代理机构分布" /> <ScreenLabel title="代理机构分布" />
<div className="monitor-tender-select"> <div className="monitor-tender-select">
<Radio.Group buttonStyle="solid" onChange={onChange} value={btnSelect} className="monitor-tender-select-radio"> <Radio.Group buttonStyle="solid" onChange={onChange} value={btnSelect} className="monitor-tender-select-radio">
<Radio.Button value="0"></Radio.Button>
<Radio.Button value="1"></Radio.Button> <Radio.Button value="1"></Radio.Button>
<Radio.Button value="0"></Radio.Button>
</Radio.Group> </Radio.Group>
<SelectRadio options={selectData} onSelectChange={onSelectChange} defaultText="请选择" hidden={btnSelect == "1"} /> <SelectRadio options={selectData} onSelectChange={onSelectChange} defaultText="请选择" hidden={btnSelect == "1"} />
</div> </div>

View File

@ -11,6 +11,7 @@
height: 100%; height: 100%;
background: url("~@/assets/monitor/background-3.jpg") left top no-repeat; background: url("~@/assets/monitor/background-3.jpg") left top no-repeat;
background-size: cover; background-size: cover;
font-family: 'Microsoft Yahei', '宋体';
// background-color: #0a0c11; // background-color: #0a0c11;
.screen-wrapper { .screen-wrapper {
@ -835,14 +836,13 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 18px 16px 16px 20px; padding: 18px 16px 16px 20px;
gap: 40px;
background: rgba(27, 126, 242, 0.12); background: rgba(27, 126, 242, 0.12);
.stage-left-img { .stage-left-img {
width: 179.18px; width: 166.18px;
height: 179.18px; height: 166.18px;
box-sizing: border-box; box-sizing: border-box;
padding: 10px; padding: 8px;
.box-wrap { .box-wrap {
--front-color: #1b7ef2; --front-color: #1b7ef2;
@ -945,7 +945,7 @@
text-align: center; text-align: center;
&>span { &>span {
font-size: 20px; font-size: 18px;
font-weight: normal; font-weight: normal;
line-height: 22px; line-height: 22px;
letter-spacing: 0.8px; letter-spacing: 0.8px;
@ -1104,8 +1104,13 @@
} }
.monitor-modal-list { .monitor-modal-list {
font-family: 'Microsoft Yahei', '宋体';
.ant-modal-body { .ant-modal-body {
background: #0A1A34cc; background: #0d142bcc;
border: 2px solid #1b7ef2;
box-shadow: inset 0px 0px 16px 0px #00a3ff;
border-radius: 6px;
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
@ -1113,39 +1118,52 @@
} }
.ant-modal-content { .ant-modal-content {
background: #0A1A34cc; background: #0d142bcc;
border-radius: 6px;
} }
.ant-modal-close-x { .ant-modal-close-x {
color: #1B7EF2; color: #01C2FF;
} }
.monitor-modal-btn { .ant-descriptions-item-container .ant-descriptions-item-label {
display: flex; justify-content: flex-end;
justify-content: center;
margin-top: 16px;
} }
.modal-list-btn { .modal-list-block {
padding: 4px 15px; padding: 20px 0 16px;
background-color: #0A1A34; box-sizing: border-box;
border-radius: 20px; border-width: 0px 0px 1px 0px;
cursor: pointer; border-style: solid;
border: 1px solid #1b7ef2; border-color: #093B64;
width: 64px; }
&:hover { .modal-list-block-border0 {
background-color: #1b7ef2; border-width: 0;
}
.modal-list-pname {
&>span { &>span {
color: #fff; font-size: 16px;
font-weight: normal;
line-height: 38px;
letter-spacing: 0px;
color: #FFFFFF;
}
&>img {
position: relative;
top: -2px;
}
&>div {
padding-left: 28px;
color: #FFFFFF;
} }
} }
&>span { .modal-list-desc {
color: #1b7ef2; padding-top: 24px;
line-height: 16px;
}
} }
} }