Merge branch 'uat-评标室-风险防控-告警处理' into 'release_electronic_bid_evaluation_room'

8.26 电子评标室 风险防控 告警处理

See merge request eshop/fe_service_ebtp_frontend!245
This commit is contained in:
周建龙
2022-08-26 13:39:35 +08:00
7 changed files with 666 additions and 2 deletions

View File

@ -385,6 +385,11 @@ export default [
},
],
},
{//异常告警
name: 'AbnormalAlarm',
path: '/AbnormalAlarm',
component: './AbnormalAlarm'
},
{
component: './404',
},

View File

@ -0,0 +1,203 @@
import React, { useState, useRef } from 'react';
import { message, PageHeader, Button, Spin } from 'antd';
import ProTable, { ProColumns, ActionType } from '@ant-design/pro-table';
import { getPage, handleAlarm } from './service';
import ViewEvalAlarmUpdateModal from '../Evaluation/BidControl/BidControlManager/components/ViewEvalAlarmUpdateModal';
interface alarmData {
tilte:string;//标题
id:string;//告警id
reserveId:string;//预约id
tpName:string;//项目名称
tpNumber:string;//项目编号
bsName:string;//标段名称
placeName:string; //评标室名称
startDate:string; //开始时间
endDate:string; //结束时间
status:string;//处理状态0未处理1已处理',
roomStatus:string;//评标室状态 0-未开启 1-进行中 2-已结束
pNumber:string;//人数信息
remark:string;//处理说明
attachment:string;//附件id
}
const AbnormalAalarm: React.FC<{}> = () => {
const actionRef = useRef<ActionType>();
const [spin, setSpin] = useState<boolean>(false);
//显隐 查看详情窗口
const [viewDetailModalVisible, setViewDetailModalVisible] = useState<boolean>(false);
//查询分页数据
const [pageData, pageDataSet] = useState<any>({
pageNo: 1,
pageSize: 10
});
const alarm:alarmData ={
tilte: "测试",
id: '',
reserveId: '',
tpName: '',
tpNumber: '',
bsName: '',
placeName: '',
startDate: '',
endDate: '',
status: '',
roomStatus: '',
pNumber: '',
remark: '',
attachment: ''
}
const [alarmData, setAlarmData] = useState<alarmData>(alarm);
//委托列表
const columns: ProColumns<any>[] = [
{
title: '序号', valueType: 'index', width: 50, hideInSearch:true, align: 'center'
},
{ title: '项目名称', dataIndex: 'projectName', width: '15%', hideInSearch: false, align: 'center' },
{ title: '标段名称', dataIndex: 'sectionName', hideInSearch: false, align: 'center' },
{ title: '评审室名称', dataIndex: 'areaName', width: '10%',hideInSearch:true, align: 'center' },
{ title: '告警设备类型', dataIndex: 'deviceType', hideInSearch:true, align: 'center' },
{ title: '告警设备编号', dataIndex: 'deviceCode', width: '15%', hideInSearch:true, align: 'center'},
{ title: '告警消息', dataIndex: 'type', hideInSearch: false, align: 'center',
valueEnum: {
1: { text: '设备离线'},
2: { text: '人员数量异常'},
3: { text: '陌生人告警'},
}
},
{
title: '处理状态', dataIndex: 'status', align: 'center',hideInSearch: true,
valueEnum: {
0: { text: '未处理'},
1: { text: '已处理'},
}
},
{
title: '操作', width: '9%', align: 'center',
valueType: 'option',
render: (_, record) => {
if (record.type === "1") {
if(record.status === "0"){
return <Button type="text" onClick={() => { handle(record); }}></Button>
}
} else {
return (<Button type='text' onClick={() => { EnvData(record); setViewDetailModalVisible(true); }}></Button>
)
}
}
},
];
/**
* 处理
* @param fields
*/
const handle = async (fields: any) => {
setSpin(true);
const hide = message.loading('正在处理');
try {
await handleAlarm({
id: fields.id,
type: fields.type
});
hide();
message.success('处理成功');
actionRef?.current?.reload();
return true;
} catch (error) {
hide();
message.error('处理失败请重试!');
return false;
}finally{
setSpin(false);
}
};
/**
* modal封装数据
* @param record 列表数据
*/
const EnvData = (record: any) => {
alarm.tilte=getTypeValue(record.type);
alarm.tpName=record.projectName;
alarm.tpNumber=record.projectNum;
alarm.bsName=record.sectionName;
alarm.id=record.id;
alarm.reserveId=record.reserveId;
alarm.placeName=record.areaName;
alarm.startDate=record.startDate;
alarm.endDate=record.endDate;
alarm.pNumber=record.pnumber;
alarm.status=record.status;
alarm.roomStatus=record.roomStatus;
alarm.remark=record.remark;
alarm.attachment=record.attachment;
setAlarmData(alarm);
}
function getTypeValue(key:any){
let val = "";
if (key === "2") {
val = "人员数量异常";
}else if(key === "3"){
val = "陌生人告警";
}else{
val = key;
}
return val;
}
return (
<Spin spinning={spin}>
<PageHeader title="异常告警" />
<div style={{ maxHeight: innerHeight - 130, height: innerHeight - 130 }} className='xsy-entrust bgCWhite'>
<ProTable<any>
actionRef={actionRef}//action触发后更新表格
columns={columns}//表格
options={false}
bordered={false}
className='tableSearch'
size='small'
search={{ labelWidth: 'auto', span: 6 }}
request={(params) =>
getPage({
...params,
pageNo: pageData.pageNo,
pageSize: pageData.pageSize,
}).then((res) => {
const result = {
data: res.data.records,
total: res.data.total,
success: res.success,
pageSize: res.data.size,
current: res.data.current
}
return result;
})
}
pagination={{
defaultPageSize: 10,
showSizeChanger: false,
onChange: (page, pageSize) => pageDataSet({ pageNo: page, pageSize: pageSize }),
onShowSizeChange: (current, size) => pageDataSet({ pageNo: current, pageSize: size }),
}}
onReset={() => { pageDataSet({ pageNo: 1, pageSize: 10 }) }}
/>
</div>
{viewDetailModalVisible ? (
<ViewEvalAlarmUpdateModal
alarmData={alarmData}
detail={viewDetailModalVisible}
isLookType={true}
onCancel={() => setViewDetailModalVisible(false)}
onOk={()=>{}}
>
</ViewEvalAlarmUpdateModal>
) : null
}
</Spin >
)
};
export default AbnormalAalarm;

View File

@ -0,0 +1,28 @@
import request from '@/utils/request';
/**
* 分页查询接口
* @return 分页数据
*/
export async function getPage(params: any) {
return request('/api/biz-service-ebtp-evaluation/v1/eval/room/alarm/getRiskPointPage', {
method: 'POST',
data: {
...params
},
});
}
/**
* 处理告警接口
* @param params 数据id
* @returns 处理结果
*/
export async function handleAlarm(params: any) {
return request('/api/biz-service-ebtp-evaluation/v1/eval/room/alarm/update/status', {
method: 'POST',
data: {
...params
},
});
}

View File

@ -0,0 +1,158 @@
import React, { useEffect,useState } from 'react';
import { Tabs,Collapse,Form, Input, Modal,Col,Row,Divider, Table, Button, Empty ,message,Spin,Card,} from 'antd';
import {saveUpdateEvalRoom} from '../service';
import {} from '@/utils/CommonUtils'
import ProTable, { ProColumns } from "@ant-design/pro-table";
import { getProMethod, getRoomId, getSessionRoleData } from '@/utils/session';
import ExtendUpload from "@/utils/ExtendUpload";
interface alarmDataObj {
tilte:string;//标题
id:string;//告警id
reserveId:string;//预约id
tpName:string;//项目名称
tpNumber:string;//项目编号
bsName:string;//标段名称
placeName:string; //评标室名称
startDate:string; //开始时间
endDate:string; //结束时间
status:string;//处理状态0未处理1已处理',
roomStatus:string;//评标室状态 0-未开启 1-进行中 2-已结束
pNumber:string;//人数信息
remark:string;//处理说明
attachment:string;//附件id
}
interface ViewEvalAlarmUpdateModalProps {
alarmData: alarmDataObj;
detail:boolean;
isLookType:boolean;
onCancel:any;
onOk:any;
}
const ViewEvalAlarmUpdateModal: React.FC<ViewEvalAlarmUpdateModalProps> = (props) => {
const {alarmData,detail,isLookType,onCancel,onOk}= props;
const { TextArea } = Input;//文本域
const [orderSpin, orderSpinSet] = useState<boolean>(false);//订单页加载中
const [uploadProps, setUploadProps] = useState<any>(false);
const [form] = Form.useForm();
var roleId = getSessionRoleData().roleCode;
useEffect(() => {
setUploadProps(alarmData.status=="1"||isLookType);
},[])
const saveUpdate = async () =>{
orderSpinSet(true);
form.validateFields().then(res => {
console.log( form.getFieldValue("remark"));
const fromData = {
id: alarmData.id,
remark: form.getFieldValue("remark"),
attachment: form.getFieldValue("attachment"),
};
console.log(fromData);
saveUpdateEvalRoom(fromData).then((res) => {
if (res.success == true) {
onOk();
} else {
message.error('系统异常:获取告警数据失败')
}
})
})
orderSpinSet(false);
}
//0-未开启 1-进行中 2-已结束
function getStautsValue(key:any){
let val = "";
//setUploadProps(false);
if(key=="0"){
val = "未开启"
}else if(key=="1"){
val = "正在评标"
//setUploadProps(true);
}else if(key=="2"){
val = "已结束"
}
return val;
}
return (
<>(
<Modal
visible={detail}
width={"1000px"}
centered
title={"异常信息:"+alarmData.tilte}//+alarmData.tilte
onCancel={() => { onCancel(); }}
onOk={() => {onOk();}}
bodyStyle={{ maxHeight: "500px", overflow: "auto", zIndex: 1 }}
footer={[
<Button key="back" onClick={() => {
onCancel();
}}></Button>,
<Button
key="submit"
type="primary"
onClick={() => saveUpdate()}
loading={orderSpin}
hidden={isLookType}
></Button>
]}
>
<Spin spinning={orderSpin}>
<Card>
<Form labelCol={{ span: 8 }} wrapperCol={{ span: 16 }} form={form}>
<Row>
<Col span={12}><Form.Item label="项目名称">{alarmData.tpName}</Form.Item></Col>
<Col span={12}><Form.Item label="项目编号">{alarmData.tpNumber}</Form.Item></Col>
</Row>
<Row>
<Col span={12}><Form.Item label="标段名称">{alarmData.bsName}</Form.Item></Col>
<Col span={12}><Form.Item label="评标室名称">{alarmData.placeName}</Form.Item></Col>
</Row>
<Row>
<Col span={12}><Form.Item label="评标开始时间">{alarmData.startDate}</Form.Item></Col>
<Col span={12}><Form.Item label="评标结束时间">{alarmData.endDate}</Form.Item></Col>
</Row>
<Row>
<Col span={12}><Form.Item label="评标状态">{getStautsValue(alarmData.roomStatus)}</Form.Item></Col>
<Col span={12}></Col>
</Row>
<Row hidden={alarmData.pNumber==null||alarmData.pNumber==""}>
<Col span={2}></Col>
<Col span={16}>{(alarmData.pNumber)}</Col>
</Row>
<Row>
<Col span={12}><Form.Item label="告警详情"><a></a></Form.Item></Col>
<Col span={12}></Col>
</Row>
<Row>
<Col span={12}><Form.Item label="处理说明" name="remark">{isLookType?alarmData.remark:
<TextArea rows={4} style={{ resize: 'vertical' }} placeholder="请填写备注" value={alarmData.remark} />}</Form.Item></Col>
</Row>
<Row>
<Col span={12}><Form.Item label="附件" name="attachment">
<ExtendUpload bid={alarmData.attachment} uploadProps={{ disabled: uploadProps }}>
</ExtendUpload>
</Form.Item></Col>
<Col span={12}></Col>
</Row>
</Form>
</Card>
</Spin>
</Modal>
)
</>
);
};
export default ViewEvalAlarmUpdateModal;

View File

@ -0,0 +1,233 @@
import React, { useEffect,useState } from 'react';
import { Tabs,Collapse,Form, Input, Modal,Col,Row,Divider, Table, Button, Empty ,message} from 'antd';
import { getEvalRoomByAssessId, getEvalRoomPage, saveUpdateEvalRoom} from '../service';
import {} from '@/utils/CommonUtils'
import ProTable, { ProColumns } from "@ant-design/pro-table";
import { getProMethod, getRoomId, getSessionRoleData } from '@/utils/session';
import ViewEvalAlarmUpdateModal from './ViewEvalAlarmUpdateModal';
interface ViewEvalFormModalProps {
modalVisible: boolean;
values: any;
onCancel:any;
}
interface alarmData {
tilte:string;//标题
id:string;//告警id
reserveId:string;//预约id
tpName:string;//项目名称
tpNumber:string;//项目编号
bsName:string;//标段名称
placeName:string; //评标室名称
startDate:string; //开始时间
endDate:string; //结束时间
status:string;//处理状态0未处理1已处理',
roomStatus:string;//评标室状态 0-未开启 1-进行中 2-已结束
pNumber:string;//人数信息
remark:string;//处理说明
attachment:string;//附件id
}
const ViewEvalFormModal: React.FC<ViewEvalFormModalProps> = (props) => {
const alarm:alarmData ={
tilte: "测试",
id: '',
reserveId: '',
tpName: '',
tpNumber: '',
bsName: '',
placeName: '',
startDate: '',
endDate: '',
status: '',
roomStatus: '',
pNumber: '',
remark: '',
attachment: ''
}
const [alarmData, setAlarmData] = useState<alarmData>(alarm);
const [alarmList, setAlarmList] = useState([]);
const [juryTableShow, setJuryTableShow] = useState<boolean>(true);//
const [alarmNumber, setAlarmNumber] = useState<any>({});
const [evalAlarmUpdateDetail, setEvalAlarmUpdateDetail] = useState<boolean>(false);
const [isLookType, setIsLookType] = useState<boolean>(false);
var roleId = getSessionRoleData().roleCode;
let roomId=getRoomId();//getRoomId();//sessionStorage.getItem('roomId');//sessionStorage.getItem('roomId')
useEffect(() => {
// if(roleId==="ebtp-expert"){
// setJuryTableShow(false);
// }
setAlarmNumber("0");
getReserveIdFunction();
},[])
const columns: any[] =[
{ title: '序号', dataIndex: 'num', width: 60, render: (text: any, record: any, index: any) => `${index + 1}` },
{
title: '告警设备类型',
dataIndex: 'deviceType',
render: (_: any, record: any) => {
let a;
if (record.deviceType === "door") {
a = "门禁点";
}else if(record.deviceType === "camera"){
a = "监控点";
}else if(record.deviceType === "nvr"){
a = "nvr";
}else if(record.deviceType === "encodeDevice"){
a = "编码设备";
}else if(record.deviceType === "oneMachine"){
a = "一体机";
}
return a;
}
}, {
title: '告警设备编号',
dataIndex: 'deviceCode',
}, {
title: '告警信息',
dataIndex: 'type',
render: (_: any, record: any) => {
return getTypeValue(record.type);
}
}, {
title: '处理状态',
dataIndex: 'status',
render: (_: any, record: any) => {
let a;
if (record.status === "0") {
a = <p style={{color:'red'}}>{"未处理"}</p>;
}else if(record.status === "1"){
a = "已处理";
}
return a;
}
},
{
title: '操作',
dataIndex: 'operation',
render: (_: any, record: any) => {
return <>
{record.status === "0"?<a key="1" onClick={() => toUpdate(record)} >
</a>:<a key="1" onClick={() => toLook(record)} >
</a>}
</>
},
},
]
function getTypeValue(key:any){
let val = "";
if (key === "2") {
val = "人员数量异常";
}else if(key === "3"){
val = "陌生人告警";
}else{
val = key;
}
return val;
}
const getDate = (record: any) => {
alarm.tilte=getTypeValue(record.type);
alarm.tpName=record.projectName;
alarm.tpNumber=record.projectNum;
alarm.bsName=record.sectionName;
alarm.id=record.id;
alarm.reserveId=record.reserveId;
alarm.placeName=record.areaName;
alarm.startDate=record.startDate;
alarm.endDate=record.endDate;
alarm.pNumber=record.pnumber;
alarm.status=record.status;
alarm.roomStatus=record.roomStatus;
alarm.remark=record.remark;
alarm.attachment=record.attachment;
setAlarmData(alarm);
}
const toUpdate = (record: any) => { // 去处理
setIsLookType(false);
getDate(record);
setEvalAlarmUpdateDetail(true)
}
const toLook = (record: any) => { // 去处理
setIsLookType(true);
getDate(record);
setEvalAlarmUpdateDetail(true)
}
const getReserveIdFunction = async () => {
await getEvalRoomByAssessId(roomId).then((res) => {
if (res.success == true) {
getEvalRoomPageFunction(res.data);
} else {
message.error('获取评标室预约id失败:显示测试数据-uat专用')
getEvalRoomPageFunction("1523557937760681984");
}
})
}
const getEvalRoomPageFunction = async (reserveId:any) => {
var params={};
params["reserveId"]= reserveId;
params["types"]= [2,3];
params["pageNo"]=1;
params["pageSize"]=999;
await getEvalRoomPage(params).then((res) => {
if (res.success == true) {
setAlarmList(res.data.records);
} else {
message.error('系统异常:获取告警数据失败')
}
})
}
function callback(key: any) {
}
return (
<>
{juryTableShow?
<Collapse onChange={callback}>
<Collapse.Panel header={"评标现场异常情况"} key="2">
<Table
columns={columns}
dataSource={alarmList}
//pagination={false}//分页
>
</Table>
</Collapse.Panel>
</Collapse>:null}
{evalAlarmUpdateDetail ? (
<ViewEvalAlarmUpdateModal
alarmData={alarmData}
detail={evalAlarmUpdateDetail}
isLookType={isLookType}
onCancel={() => setEvalAlarmUpdateDetail(false)}
onOk={() => {
getReserveIdFunction();
setEvalAlarmUpdateDetail(false);
}}
>
</ViewEvalAlarmUpdateModal>
) : null
}
</>
);
};
export default ViewEvalFormModal;

View File

@ -7,7 +7,7 @@ import ViewJuryScoringRemindFormModal from './components/ViewJuryScoringRemindFo
import ViewJuryScoringAnalysisFormModal from './components/ViewJuryScoringAnalysisFormModal';
import ViewRiskSupplierModal from './components/ViewRiskSupplierModal';
import BidDocSmartCheckFormModal from './components/BidDocSmartCheckFormModal';
import ViewEvalFormModal from './components/ViewEvalFormModal';
const Sing: React.FC<{}> = () => {
//ip mac
@ -48,6 +48,11 @@ const Sing: React.FC<{}> = () => {
const [BidDocSmartCheckFormVisible, setBidDocSmartCheckFormVisible] = useState<any>(false);
//查看详情窗口record
const [BidDocSmartCheckValues, setBidDocSmartCheckValues] = useState<any>({});
//投标文件智能审查
const [ViewEvalFormVisible, setViewEvalFormVisible] = useState<any>(false);
//查看详情窗口record
const [ViewEvalCheckValues, setViewEvalCheckValues] = useState<any>({});
return (
<>
{
@ -154,7 +159,20 @@ const Sing: React.FC<{}> = () => {
>
</ViewRiskSupplierModal>
) : null
}
}
{
ViewEvalFormModal ? (
<ViewEvalFormModal
modalVisible={ViewEvalFormVisible}
values={ViewEvalCheckValues}
onCancel={() => {
setViewEvalFormVisible(!ViewEvalFormVisible);
setViewEvalCheckValues({});
}}
>
</ViewEvalFormModal>
) : null
}
</>
)
}

View File

@ -131,5 +131,24 @@ export async function getRiskSupplierList(projectId: any, assessRoomId: any) {
});
}
export async function getEvalRoomByAssessId(id: any) { // 评标室告警信息-查询评标室id
return request('/api/biz-service-ebtp-evaluation/v1/screen/getEvalRoomByAssessId/?assessId='+`${id}`, {
method: 'get'
});
}
export async function getEvalRoomPage(params: any) { // 评标室告警信息-查询告警
return request('/api/biz-service-ebtp-evaluation/v1/eval/room/alarm/getRiskPointPage', {
method: 'post',
data: {...params}
});
}
export async function saveUpdateEvalRoom(params: any) { // 评标室告警信息-处理告警
return request('/api/biz-service-ebtp-evaluation/v1/eval/room/alarm/update/status', {
method: 'post',
data: {...params}
});
}