This commit is contained in:
jl-zhoujl2
2023-02-06 08:58:35 +08:00
parent 3b2f680472
commit e58d05bbca
5 changed files with 423 additions and 148 deletions

View File

@ -3,14 +3,14 @@ import React, { useEffect, useRef, useState } from 'react';
import '../style.less'
import { authCheck, ModalList, onCell, onHeaderCell, OverviewItem, ScreenLabel, ScreenTitle, ScrollTable } from '../Home';
import Circle3199 from '@/assets/monitor/circle-3199.png';
import { getDecryptDataAPI, getNoOpenAssessListAPI, getNoOpenAssessNumberAPI, getNoOpenListAPI, getNoOpenNumberAPI, getThreeDayNoEndAPI, getThreeDayNoEndCountAPI, getThreeDaysUnSendAnnoCountAPI, getThreeDaysUnSendAnnoListAPI } from '../service';
import { getMacSameListAPI, getDecryptExceptionListAPI, getNoOpenAssessListAPI, getNoOpenAssessNumberAPI, getNoOpenListAPI, getNoOpenNumberAPI, getThreeDayNoEndAPI, getThreeDayNoEndCountAPI, getThreeDaysUnSendAnnoCountAPI, getThreeDaysUnSendAnnoListAPI } from '../service';
import { isNotEmpty } from '@/utils/CommonUtils';
const MonitorException: React.FC<{}> = () => {
//超过1小时未开标数量
const [noOpenNumberData, setNoOpenNumberData] = useState<string>("");
//开启评审后3日未结束评标-列表
const [threeDayNoEndData, setThreeDayNoEndData] = useState<any[]>([]);
const [threeDayNoEndData, setThreeDayNoEndData] = useState<any>();
//开启评审后3日未结束评标-数量
const [threeDayNoEndCount, setThreeDayNoEndCount] = useState<any>(0);
//超过1小时未开标数量-列表
@ -19,20 +19,24 @@ const MonitorException: React.FC<{}> = () => {
const [noOpenAssessListData, setNoOpenAssessListData] = useState<any[]>([]);
//开标后超过6小时未开启评审室-数量
const [noOpenAssessNumber, setNoOpenAssessNumber] = useState<string | number>(0);
//异常监控-解密异常、mac地址相同及相关项目列表
const [decryptData, setDecryptData] = useState<any>();
//异常监控-解密异常
const [decryptExceptionList, setDecryptExceptionList] = useState<any>();
//异常监控-mac地址相同
const [macSameList, setMacSameList] = useState<any>();
//评审室关闭3日内未发布公示数
const [threeDaysUnSendAnnoCount, setThreeDaysUnSendAnnoCount] = useState<string>("");
//评审室关闭3日内未发布公示列表
const [threeDaysUnSendAnnoList, setThreeDaysUnSendAnnoList] = useState<any[]>([]);
const [threeDaysUnSendAnnoList, setThreeDaysUnSendAnnoList] = useState<any>();
//ModalList visible
const [modalListVisible, setModalListVisible] = useState<boolean>(false);
//ModalList Data
const [modalListData, setModalListData] = useState<any[]>([]);
const [modalListData, setModalListData] = useState<any>();
//ModalList Type
const [exceptionType, setExceptionType] = useState<any>();
//selectKey
const [selectKey, setSelectKey] = useState<number>(-1);
// const [selectKey, setSelectKey] = useState<number>(-1);
//modal弹窗数据类型
const dataType = useRef<string>("");
//权限校验
const auth = useRef<boolean>(authCheck(["ebtp-watcher"]));
//超过1小时未开标数量
@ -44,10 +48,14 @@ const MonitorException: React.FC<{}> = () => {
})
}
//开启评审后3日未结束评标
const getThreeDayNoEnd = () => {
getThreeDayNoEndAPI().then(res => {
const getThreeDayNoEnd = (params: any, type: number) => {
getThreeDayNoEndAPI({ ...params }).then(res => {
if (res?.code == 200) {
setThreeDayNoEndData(res?.data);
if (type == 0) {
setThreeDayNoEndData(res?.data);
} else {
setModalListData(res?.data);
}
}
})
}
@ -76,37 +84,54 @@ const MonitorException: React.FC<{}> = () => {
}
})
}
//异常监控-解密异常、mac地址相同及相关项目列表jectRecord?
const getDecryptData = () => {
getDecryptDataAPI().then(res => {
//异常监控-解密异常
const getDecryptExceptionList = (params: any, type: number) => {
getDecryptExceptionListAPI({ ...params }).then(res => {
if (res?.code == 200) {
const data = res?.data;
if (data?.decryptExceptionList?.length > 0) {
for (let i = 0, length = data.decryptExceptionList.length; i < length; i++) {
data.decryptExceptionList[i]["regionDictName"] = data.decryptExceptionList[i].projectRecord?.regionDictName;
data.decryptExceptionList[i]["projectName"] = data.decryptExceptionList[i].projectRecord?.projectName;
data.decryptExceptionList[i]["ownerContactName"] = data.decryptExceptionList[i].projectRecord?.ownerContactName;
data.decryptExceptionList[i]["ownerContactTel"] = data.decryptExceptionList[i].projectRecord?.ownerContactTel;
data.decryptExceptionList[i]["appManagerName"] = data.decryptExceptionList[i].projectRecord?.appManagerName;
data.decryptExceptionList[i]["appManagerTel"] = data.decryptExceptionList[i].projectRecord?.appManagerTel;
data.decryptExceptionList[i]["recruitStartTime"] = data.decryptExceptionList[i].projectRecord?.recruitStartTime;
data.decryptExceptionList[i]["bidMethodDict"] = data.decryptExceptionList[i].projectRecord?.bidMethodDict;
if (data?.decryptExceptionList?.records?.length > 0) {
for (let i = 0, length = data.decryptExceptionList.records.length; i < length; i++) {
data.decryptExceptionList.records[i]["regionDictName"] = data.decryptExceptionList.records[i].projectRecord?.regionDictName;
data.decryptExceptionList.records[i]["projectName"] = data.decryptExceptionList.records[i].projectRecord?.projectName;
data.decryptExceptionList.records[i]["ownerContactName"] = data.decryptExceptionList.records[i].projectRecord?.ownerContactName;
data.decryptExceptionList.records[i]["ownerContactTel"] = data.decryptExceptionList.records[i].projectRecord?.ownerContactTel;
data.decryptExceptionList.records[i]["appManagerName"] = data.decryptExceptionList.records[i].projectRecord?.appManagerName;
data.decryptExceptionList.records[i]["appManagerTel"] = data.decryptExceptionList.records[i].projectRecord?.appManagerTel;
data.decryptExceptionList.records[i]["recruitStartTime"] = data.decryptExceptionList.records[i].projectRecord?.recruitStartTime;
data.decryptExceptionList.records[i]["bidMethodDict"] = data.decryptExceptionList.records[i].projectRecord?.bidMethodDict;
}
}
if (data?.macSameList?.length > 0) {
for (let i = 0, length = data.macSameList.length; i < length; i++) {
data.macSameList[i]["regionDictName"] = data.macSameList[i].projectRecord?.regionDictName;
data.macSameList[i]["projectName"] = data.macSameList[i].projectRecord?.projectName;
data.macSameList[i]["ownerContactName"] = data.macSameList[i].projectRecord?.ownerContactName;
data.macSameList[i]["ownerContactTel"] = data.macSameList[i].projectRecord?.ownerContactTel;
data.macSameList[i]["appManagerName"] = data.macSameList[i].projectRecord?.appManagerName;
data.macSameList[i]["appManagerTel"] = data.macSameList[i].projectRecord?.appManagerTel;
data.macSameList[i]["recruitStartTime"] = data.macSameList[i].projectRecord?.recruitStartTime;
data.macSameList[i]["bidMethodDict"] = data.macSameList[i].projectRecord?.bidMethodDict;
if (type == 0) {
setDecryptExceptionList(data);
} else {
setModalListData(data?.decryptExceptionList);
}
}
})
}
//异常监控-mac地址相同
const getMacSameList = (params: any, type: number) => {
getMacSameListAPI({ ...params }).then(res => {
if (res?.code == 200) {
const data = res?.data;
if (data?.macSameList?.records?.length > 0) {
for (let i = 0, length = data.macSameList.records.length; i < length; i++) {
data.macSameList.records[i]["regionDictName"] = data.macSameList.records[i].projectRecord?.regionDictName;
data.macSameList.records[i]["projectName"] = data.macSameList.records[i].projectRecord?.projectName;
data.macSameList.records[i]["ownerContactName"] = data.macSameList.records[i].projectRecord?.ownerContactName;
data.macSameList.records[i]["ownerContactTel"] = data.macSameList.records[i].projectRecord?.ownerContactTel;
data.macSameList.records[i]["appManagerName"] = data.macSameList.records[i].projectRecord?.appManagerName;
data.macSameList.records[i]["appManagerTel"] = data.macSameList.records[i].projectRecord?.appManagerTel;
data.macSameList.records[i]["recruitStartTime"] = data.macSameList.records[i].projectRecord?.recruitStartTime;
data.macSameList.records[i]["bidMethodDict"] = data.macSameList.records[i].projectRecord?.bidMethodDict;
}
}
setDecryptData(data);
if (type == 0) {
setMacSameList(data);
} else {
setModalListData(data?.macSameList);
}
}
})
}
@ -121,10 +146,14 @@ const MonitorException: React.FC<{}> = () => {
}
//异常监控-评审室关闭3日内未发布公示列表
const getThreeDaysUnSendAnnoList = () => {
getThreeDaysUnSendAnnoListAPI().then(res => {
const getThreeDaysUnSendAnnoList = (params: any, type: number) => {
getThreeDaysUnSendAnnoListAPI({ ...params }).then(res => {
if (res?.code == 200) {
setThreeDaysUnSendAnnoList(res?.data);
if (type == 0) {
setThreeDaysUnSendAnnoList(res?.data);
} else {
setModalListData(res?.data);
}
}
})
}
@ -139,47 +168,49 @@ const MonitorException: React.FC<{}> = () => {
}
useEffect(() => {
if (auth.current) {
const params = { pageNo: 1, pageSize: 10 };
getNoOpenNumber();
getThreeDayNoEnd();
getThreeDayNoEnd(params, 0);
getNoOpenList();
getNoOpenAssessList();
getNoOpenAssessNumber();
getDecryptData();
getDecryptExceptionList(params, 0);
getMacSameList(params, 0);
getThreeDaysUnSendAnnoCount();
getThreeDaysUnSendAnnoList();
getThreeDaysUnSendAnnoList(params, 0);
getThreeDayNoEndCount();
}
}, [])
useEffect(() => {
let interval: any = null;
let count = 0;
let lengthMap = [noOpenListData.length, noOpenAssessListData.length, isNotEmpty(decryptData?.decryptExceptionList) ? decryptData?.decryptExceptionList.length : 0, threeDayNoEndData.length, isNotEmpty(decryptData?.macSameList) ? decryptData?.macSameList.length : 0, threeDaysUnSendAnnoList.length].sort((a, b) => b - a);
if (lengthMap[0] > 1) {//至少2条才能滚动
interval = setInterval(() => {
if (count < lengthMap[0]) {
setSelectKey(count);
const v0 = document.getElementsByClassName("scroll-select-bg")[0];
const v1 = document.getElementsByClassName("scroll-select-bg")[1];
const v2 = document.getElementsByClassName("scroll-select-bg")[2];
const v3 = document.getElementsByClassName("scroll-select-bg")[3];
const v4 = document.getElementsByClassName("scroll-select-bg")[4];
const v5 = document.getElementsByClassName("scroll-select-bg")[5];
v0?.scrollIntoView(false);
v1?.scrollIntoView(false);
v2?.scrollIntoView(false);
v3?.scrollIntoView(false);
v4?.scrollIntoView(false);
v5?.scrollIntoView(false);
count++;
} else {
count = 0;
}
}, 3000)
}
return () => {
clearInterval(interval);
}
}, [noOpenListData, noOpenAssessListData, decryptData?.decryptExceptionList, threeDayNoEndData, decryptData?.macSameList, threeDaysUnSendAnnoList])
// useEffect(() => {
// let interval: any = null;
// let count = 0;
// let lengthMap = [noOpenListData.length, noOpenAssessListData.length, isNotEmpty(decryptData?.decryptExceptionList) ? decryptData?.decryptExceptionList.length : 0, threeDayNoEndData.length, isNotEmpty(decryptData?.macSameList) ? decryptData?.macSameList.length : 0, threeDaysUnSendAnnoList.length].sort((a, b) => b - a);
// if (lengthMap[0] > 1) {//至少2条才能滚动
// interval = setInterval(() => {
// if (count < lengthMap[0]) {
// setSelectKey(count);
// const v0 = document.getElementsByClassName("scroll-select-bg")[0];
// const v1 = document.getElementsByClassName("scroll-select-bg")[1];
// const v2 = document.getElementsByClassName("scroll-select-bg")[2];
// const v3 = document.getElementsByClassName("scroll-select-bg")[3];
// const v4 = document.getElementsByClassName("scroll-select-bg")[4];
// const v5 = document.getElementsByClassName("scroll-select-bg")[5];
// v0?.scrollIntoView(false);
// v1?.scrollIntoView(false);
// v2?.scrollIntoView(false);
// v3?.scrollIntoView(false);
// v4?.scrollIntoView(false);
// v5?.scrollIntoView(false);
// count++;
// } else {
// count = 0;
// }
// }, 3000)
// }
// return () => {
// clearInterval(interval);
// }
// }, [noOpenListData, noOpenAssessListData, decryptData?.decryptExceptionList, threeDayNoEndData, decryptData?.macSameList, threeDaysUnSendAnnoList])
const columns: any[] = [
{
@ -500,8 +531,8 @@ const MonitorException: React.FC<{}> = () => {
<div className="top-main">
<div className="monitor-top-space-flex">
<OverviewItem icon={Circle3199} title="一小时内未开标" number={noOpenNumberData} unit="个" />
<OverviewItem icon={Circle3199} title="解密异常" number={decryptData?.decryptExceptionCount} unit="次" />
<OverviewItem icon={Circle3199} title="MAC地址相同" number={decryptData?.macSameCount} unit="个" />
<OverviewItem icon={Circle3199} title="解密异常" number={decryptExceptionList?.decryptExceptionCount} unit="次" />
<OverviewItem icon={Circle3199} title="MAC地址相同" number={macSameList?.macSameCount} unit="个" />
<OverviewItem icon={Circle3199} title="开标后6小时未开启评审" number={noOpenAssessNumber} unit="个" />
<OverviewItem icon={Circle3199} title="开启评审后3日未结束评标" number={threeDayNoEndCount} unit="个" />
<OverviewItem icon={Circle3199} title="评标结束3日未公示" number={threeDaysUnSendAnnoCount} unit="个" />
@ -511,11 +542,11 @@ const MonitorException: React.FC<{}> = () => {
<Row>
<Col span={8}>
<div className="monitor-left-main">
<ScreenLabel title="1小时未开标项目列表" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType(null); setModalListData(noOpenListData); setModalListVisible(true); }}>more</span>} />
<ScreenLabel title="1小时未开标项目列表" extra={<span className='monitor-extra-pointer' onClick={() => { setExceptionType(null); setModalListData(noOpenListData); dataType.current = "1"; setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card">
<ScrollTable dataSource={noOpenListData} columns={columns} ynum={260} rowKey="sectionId" rowClassName="scroll-select-bg0" tableKey={0} isScroll />
</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); dataType.current = "4"; setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card">
<ScrollTable dataSource={noOpenAssessListData} columns={columns} ynum={260} rowKey="sectionId" rowClassName="scroll-select-bg1" tableKey={1} isScroll />
</div>
@ -523,30 +554,50 @@ const MonitorException: React.FC<{}> = () => {
</Col>
<Col span={8}>
<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(decryptExceptionList?.decryptExceptionList); dataType.current = "2"; setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card">
<ScrollTable dataSource={decryptData?.decryptExceptionList} columns={columnsSecond} rowKey="id" rowClassName="scroll-select-bg2" ynum={260} tableKey={2} isScroll />
<ScrollTable dataSource={decryptExceptionList?.decryptExceptionList.records} columns={columnsSecond} rowKey="id" rowClassName="scroll-select-bg2" ynum={260} tableKey={2} isScroll />
</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); dataType.current = "5"; setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card">
<ScrollTable dataSource={threeDayNoEndData} columns={columnsForth} ynum={260} rowKey="sectionName" rowClassName="scroll-select-bg3" tableKey={3} isScroll />
<ScrollTable dataSource={threeDayNoEndData?.records} columns={columnsForth} ynum={260} rowKey="sectionName" rowClassName="scroll-select-bg3" tableKey={3} isScroll />
</div>
</div>
</Col>
<Col span={8}>
<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(macSameList?.macSameList); dataType.current = "3"; setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card">
<ScrollTable dataSource={decryptData?.macSameList} columns={columnsFifth} ynum={260} rowKey="id" rowClassName="scroll-select-bg4" tableKey={4} isScroll />
<ScrollTable dataSource={macSameList?.macSameList.records} columns={columnsFifth} ynum={260} rowKey="id" rowClassName="scroll-select-bg4" tableKey={4} isScroll />
</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); dataType.current = "6"; setModalListVisible(true); }}>more</span>} />
<div className="monitor-exception-card">
<ScrollTable dataSource={threeDaysUnSendAnnoList} columns={columnsThird} ynum={260} rowKey="bidSectName" rowClassName="scroll-select-bg5" tableKey={5} isScroll />
<ScrollTable dataSource={threeDaysUnSendAnnoList?.records} columns={columnsThird} ynum={260} rowKey="bidSectName" rowClassName="scroll-select-bg5" tableKey={5} isScroll />
</div>
</div>
</Col>
</Row>
<ModalList modalVisible={modalListVisible} onCancel={() => { setModalListVisible(false); setModalListData([]); }} exceptionData={modalListData} exceptionType={exceptionType} />
<ModalList modalVisible={modalListVisible} onCancel={() => { setModalListVisible(false); setModalListData([]); }} exceptionData={modalListData} exceptionType={exceptionType} onCallBack={(current, projectName, ownerContactName) => {
const params = {
pageNo: current,
pageSize: 10,
}
projectName != "" ? params["projectName"] = projectName : null;
ownerContactName != "" ? params["ownerContactName"] = ownerContactName : null;
if (dataType.current == "1") {
} else if (dataType.current == "2") {
getDecryptExceptionList(params, 1);
} else if (dataType.current == "3") {
getMacSameList(params, 1);
} else if (dataType.current == "4") {
} else if (dataType.current == "5") {
getThreeDayNoEnd(params, 1);
} else if (dataType.current == "6") {
getThreeDaysUnSendAnnoList(params, 1);
}
}} />
</ScreenTitle>
);
};

View File

@ -1,4 +1,4 @@
import { Button, Col, Descriptions, Divider, Dropdown, Empty, Input, Menu, MenuProps, message, Modal, Progress, Row, Space, Table, Typography } from 'antd';
import { Button, Col, Descriptions, Divider, Dropdown, Empty, Input, Menu, MenuProps, message, Modal, Pagination, PaginationProps, Progress, Row, Space, Table, Typography } from 'antd';
import { debounce } from 'lodash';
import React, { useEffect, useMemo, useRef, useState } from 'react';
import '../style.less'
@ -12,6 +12,8 @@ import Frame10121 from '@/assets/monitor/Frame-10121.png';
import titleIcon from '@/assets/monitor/title-icon.png';
import left from '@/assets/monitor/left.png';
import right from '@/assets/monitor/right.png';
import arrowLeftCircleFill from '@/assets/monitor/arrow-left-circle-fill.png'
import arrowRightCircleFill from '@/assets/monitor/arrow-right-circle-fill.png'
import { CaretRightOutlined, DownOutlined } from '@ant-design/icons';
import './china';
import * as echarts from 'echarts';
@ -675,9 +677,9 @@ export const ScreenTitle = (props: { title: string, children: any }) => {
}
//modal大弹窗
export const ModalList = (props: { modalVisible: boolean, onCancel: () => void, exceptionType?: string, exceptionData: any[], title?: string | null }) => {
const { modalVisible, onCancel, exceptionType, exceptionData, title } = props;
const modalHeight = window.innerHeight * 96 / 100;
export const ModalList = (props: { modalVisible: boolean, onCancel: () => void, exceptionType?: string, exceptionData: any, title?: string | null, onCallBack?: (current: number, projectName: string, ownerContactName: string) => void }) => {
const { modalVisible, onCancel, exceptionType, exceptionData, title, onCallBack = () => { } } = props;
// const modalHeight = window.innerHeight * 96 / 100;
const labelStyle = { color: "#29F0F9", fontWeight: "bold", width: "100px" };
const contentStyle = { color: "#fff", paddingLeft: "14px" };
const titleStyle = { color: "#01C2FF", fontWeight: 700, marginBottom: 0 };
@ -685,49 +687,102 @@ export const ModalList = (props: { modalVisible: boolean, onCancel: () => void,
//初始化字典
let dic: any = getDicData();
let dicData: any = JSON.parse(dic);
const [current, setCurrent] = useState(1);
const [total, setTotal] = useState(0);
const project = useRef<string>("");
const owner = useRef<string>("");
const onChange: PaginationProps['onChange'] = page => {
setCurrent(page);
onCallBack(page, project.current, owner.current);
};
const itemRender: PaginationProps['itemRender'] = (_, type, originalElement) => {
if (type === 'prev') {
return <a><img src={arrowLeftCircleFill} alt="" /></a>;
}
if (type === 'next') {
return <a><img src={arrowRightCircleFill} alt="" /></a>;
}
return originalElement;
};
const onProjectChange = (e: any) => {
project.current = e.target.value;
}
const onOwnerChange = (e: any) => {
owner.current = e.target.value;
}
const onSearchClick = () => {
setCurrent(1);
onCallBack(1, project.current, owner.current);
}
useEffect(() => {
setTotal(exceptionData?.total || 0);
setCurrent(exceptionData?.currnet || 1);
}, [exceptionData])
return (
<Modal
destroyOnClose
visible={modalVisible}
wrapClassName="monitor-modal-list"
onCancel={() => onCancel()}
onCancel={() => {
project.current = "";
owner.current = "";
onCancel()
}}
width={"60%"}
style={{ maxHeight: modalHeight }}
bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', padding: "20px 24px 24px" }}
// style={{ maxHeight: modalHeight }}
// bodyStyle={{ maxHeight: modalHeight - 107, overflowY: 'auto', padding: "20px 24px 24px" }}
bodyStyle={{ padding: "20px 24px 24px" }}
centered
footer={null}
>
<h3 style={titleStyle}>{isNotEmpty(title) ? title : "重点监测异常明细单"}</h3>
{exceptionData.length > 0 ? exceptionData.map((item, index) => {
return (
<div key={index} className={exceptionData.length > 1 ? 'modal-list-block' : 'modal-list-block modal-list-block-border0'}>
<div className='modal-list-pname'>
<div className='modal-list-left'>
<img src={titleIcon} /><Text className="modal-list-name" ellipsis={{ tooltip: item?.projectName }}>{item?.projectName}</Text>
<div>{item?.bidSectName || item?.sectionName}</div>
</div>
{isEmpty(title) && <div className='modal-list-right'>
<div className='modal-list-proc'>
<span>{changeDict(dicData['procurement_mode=entrust'], item?.bidMethodDict)}</span>
<div className='modal-list-search'>
<div>
<Input style={{ width: 200 }} onChange={onProjectChange} />
</div>
<div>
<Input style={{ width: 200 }} onChange={onOwnerChange} />
</div>
<div>
<Button type="primary" onClick={() => { onSearchClick() }}></Button>
</div>
</div>
<div className='modal-list-content-g'>
{exceptionData?.records?.length > 0 ? exceptionData?.records?.map((item: any, index: any) => {
return (
<div key={index} className={exceptionData?.records?.length > 1 ? 'modal-list-block' : 'modal-list-block modal-list-block-border0'}>
<div className='modal-list-pname'>
<div className='modal-list-left'>
<img src={titleIcon} /><Text className="modal-list-name" ellipsis={{ tooltip: item?.projectName }}>{item?.projectName}</Text>
<div>{item?.bidSectName || item?.sectionName}</div>
</div>
</div>}
{isEmpty(title) && <div className='modal-list-right'>
<div className='modal-list-proc'>
<span>{changeDict(dicData['procurement_mode=entrust'], item?.bidMethodDict)}</span>
</div>
</div>}
</div>
<div className='modal-list-desc'>
<Descriptions>
<Descriptions.Item label={isNotEmpty(title) ? "采购方式" : "异常类型"} labelStyle={labelStyle} contentStyle={contentStyle}>{isNotEmpty(title) ? changeDict(dicData['procurement_mode=entrust'], item?.bidMethodDict) : isNotEmpty(exceptionType) ? exceptionType : item?.exType}</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) ? typeof item?.bidSectContractPrice == "number" ? Number(item?.bidSectContractPrice).toFixed(2) : item?.bidSectContractPrice : "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?.ownerContactName}</Descriptions.Item>
<Descriptions.Item label="采购经理电话" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.ownerContactTel}</Descriptions.Item>
<Descriptions.Item label="标段状态" labelStyle={labelStyle} contentStyle={contentStyle}>{(item?.sectionState || item?.sectionStatus || item?.state) == 9 ? "异常处理" : changeDict(item?.bidMethodDict ? dicData[`business_module=${item?.bidMethodDict}`] : [], item?.businessModule)}</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>
</div>
</div>
<div className='modal-list-desc'>
<Descriptions>
<Descriptions.Item label={isNotEmpty(title) ? "采购方式" : "异常类型"} labelStyle={labelStyle} contentStyle={contentStyle}>{isNotEmpty(title) ? changeDict(dicData['procurement_mode=entrust'], item?.bidMethodDict) : isNotEmpty(exceptionType) ? exceptionType : item?.exType}</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) ? typeof item?.bidSectContractPrice == "number" ? Number(item?.bidSectContractPrice).toFixed(2) : item?.bidSectContractPrice : "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?.ownerContactName}</Descriptions.Item>
<Descriptions.Item label="采购经理电话" labelStyle={labelStyle} contentStyle={contentStyle}>{item?.ownerContactTel}</Descriptions.Item>
<Descriptions.Item label="标段状态" labelStyle={labelStyle} contentStyle={contentStyle}>{(item?.sectionState || item?.sectionStatus || item?.state) == 9 ? "异常处理" : changeDict(item?.bidMethodDict ? dicData[`business_module=${item?.bidMethodDict}`] : [], item?.businessModule)}</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>
</div>
</div>
)
}) : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} className="monitor-modal-empty" />}
)
}) : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} className="monitor-modal-empty" />}
</div>
<div className='modal-list-pagination'>
<Pagination current={current} pageSize={10} showSizeChanger={false} onChange={onChange} total={total} itemRender={itemRender} />
</div>
{/* <div className='monitor-modal-btn'>
<div className='modal-list-btn' onClick={() => onCancel()}>
<span>确 定</span>

View File

@ -250,28 +250,28 @@ const OpenToday: React.FC<{}> = () => {
clearInterval(interval);
}
}, [])
useEffect(() => {
let interval: any = null;
let count = 0;
let lengthMap = [isNotEmpty(todayOpeningData?.todayList) ? todayOpeningData?.todayList.length : 0, isNotEmpty(todayOpeningData?.importantList) ? todayOpeningData?.importantList.length : 0].sort((a, b) => b - a);
if (lengthMap[0] > 1) {//至少2条才能滚动
interval = setInterval(() => {
if (count < lengthMap[0]) {
setSelectKey(count);
const v0 = document.getElementsByClassName("scroll-select-bg")[0];
const v1 = document.getElementsByClassName("scroll-select-bg")[1];
v0?.scrollIntoView(false);
v1?.scrollIntoView(false);
count++;
} else {
count = 0;
}
}, 3000)
}
return () => {
clearInterval(interval);
}
}, [todayOpeningData?.todayList, todayOpeningData?.importantList])
// useEffect(() => {
// let interval: any = null;
// let count = 0;
// let lengthMap = [isNotEmpty(todayOpeningData?.todayList) ? todayOpeningData?.todayList.length : 0, isNotEmpty(todayOpeningData?.importantList) ? todayOpeningData?.importantList.length : 0].sort((a, b) => b - a);
// if (lengthMap[0] > 1) {//至少2条才能滚动
// interval = setInterval(() => {
// if (count < lengthMap[0]) {
// setSelectKey(count);
// const v0 = document.getElementsByClassName("scroll-select-bg")[0];
// const v1 = document.getElementsByClassName("scroll-select-bg")[1];
// v0?.scrollIntoView(false);
// v1?.scrollIntoView(false);
// count++;
// } else {
// count = 0;
// }
// }, 3000)
// }
// return () => {
// clearInterval(interval);
// }
// }, [todayOpeningData?.todayList, todayOpeningData?.importantList])
return (
<ScreenTitle title="今日开标">
<div className="top-main top-main-bottom">

View File

@ -93,9 +93,10 @@ export async function getNoOpenNumberAPI(data: any) {
/**
* 异常监控-开启评审后3日未结束评标
*/
export async function getThreeDayNoEndAPI() {
export async function getThreeDayNoEndAPI(data: any) {
return request('/api/biz-service-ebtp-statistics/api/evaluation/exception/threedaynoend', {
method: 'GET',
method: 'POST',
data: { ...data },
});
}
@ -142,11 +143,22 @@ export async function getNoOpenAssessNumberAPI(data: any) {
}
/**
* 异常监控-解密异常、mac地址相同及相关项目列表
* 异常监控-解密异常列表、解密异常数量
*/
export async function getDecryptDataAPI() {
return request('/api/biz-service-ebtp-statistics/exceptionMonitor/getDecryptDataNow', {
method: 'GET',
export async function getDecryptExceptionListAPI(data: any) {
return request('/api/biz-service-ebtp-statistics/exceptionMonitor/getDecryptExceptionList', {
method: 'POST',
data: { ...data }
});
}
/**
* 异常监控-mac地址相同列表mac地址相同数量
*/
export async function getMacSameListAPI(data: any) {
return request('/api/biz-service-ebtp-statistics/exceptionMonitor/getMacSameList', {
method: 'POST',
data: { ...data }
});
}
@ -162,9 +174,10 @@ export async function getThreeDaysUnSendAnnoCountAPI() {
/**
* 异常监控-评审室关闭3日内未发布公示列表
*/
export async function getThreeDaysUnSendAnnoListAPI() {
export async function getThreeDaysUnSendAnnoListAPI(data: any) {
return request('/api/biz-service-ebtp-statistics/exceptionMonitor/threeDaysUnSendAnnoList', {
method: 'GET',
method: 'POST',
data: { ...data }
});
}

View File

@ -1987,6 +1987,162 @@
justify-content: flex-end;
}
.modal-list-content-g {
max-height: calc(84vh - 130px);
overflow-y: auto;
&::-webkit-scrollbar {
display: none;
}
}
.modal-list-search {
display: flex;
justify-content: flex-start;
margin-top: 16px;
&>div {
color: #FFFFFF;
}
&>div:not(:last-child) {
padding-right: 16px;
}
.ant-input {
width: 200px;
color: #FFFFFF;
background-color: transparent;
border: 1px solid #1B7DF2;
&:hover {
border-color: #1B7DF2;
}
&:focus {
border-color: #1B7DF2;
box-shadow: 0 0 0 2px #1B7DF2;
}
&::-webkit-input-placeholder {
color: #29F1FA;
}
&:-ms-input-placeholder {
color: #29F1FA;
}
}
.ant-btn-primary {
background: #1B7EF2;
border-color: #1B7EF2;
&:hover &:focus &:active {
background: #1B7EF2;
border-color: #1B7EF2;
}
}
}
.modal-list-pagination {
text-align: center;
.ant-pagination-item {
// border: none;
background: none;
border: 0;
// margin-right: 0.5rem;
margin: 0 0.5rem 0 0;
&>a {
color: #45a2ff;
}
&:hover>a {
color: #ffd502;
}
}
.ant-pagination-item:hover {
border-color: #ffd502;
}
.ant-pagination-item:focus-visible {
border-color: #ffd502;
}
.ant-pagination-item-active {
border-color: #ffd502;
a {
color: #ffd502;
}
&:hover &:focus-visible {
border-color: #ffd502;
}
}
.ant-pagination-prev:focus-visible .ant-pagination-item-link,
.ant-pagination-next:focus-visible .ant-pagination-item-link,
.ant-pagination-prev:hover .ant-pagination-item-link,
.ant-pagination-next:hover .ant-pagination-item-link {
border-color: #45a2ff;
color: #45a2ff;
}
.ant-pagination-prev .ant-pagination-item-link,
.ant-pagination-next .ant-pagination-item-link {
background: none;
border-color: #45a2ff;
color: #45a2ff;
}
.pagination-icon {
font-size: 20px;
vertical-align: middle;
color: #45a2ff;
height: 24px;
}
.ant-pagination-total-text {
color: #45a2ff;
}
.ant-pagination-prev {
margin-right: 0.5rem;
&>a>img {
position: relative;
top: -2px;
}
}
.ant-pagination-next {
&>a>img {
position: relative;
top: -2px;
}
}
.ant-pagination-item-ellipsis {
color: #45a2ff;
}
.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,
.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon {
color: #45a2ff;
}
.ant-pagination-jump-prev .ant-pagination-item-container,
.ant-pagination-jump-next .ant-pagination-item-container {
position: relative;
top: -2px;
}
}
.modal-list-block {
padding: 20px 0 16px;
box-sizing: border-box;