2.6
This commit is contained in:
@ -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>
|
||||
);
|
||||
};
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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 }
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user