Browse Source

问题优化修改

dev
wenlele 2 years ago
parent
commit
388ba4d322
  1. 16
      web/client/src/sections/control/components/alarm-chart.jsx
  2. 761
      web/client/src/sections/service/containers/automaticReport.jsx
  3. 9
      web/client/src/sections/service/containers/index.js
  4. 271
      web/client/src/sections/service/containers/reportFile.jsx
  5. 12
      web/client/src/sections/service/nav-item.jsx
  6. 18
      web/client/src/sections/service/routes.js

16
web/client/src/sections/control/components/alarm-chart.jsx

@ -155,7 +155,7 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
})
}
setRankData(dataList.sort((a, b) => b.sum - a.sum)?.slice(0, 5) || [])
setRankData(dataList.sort((a, b) => b.sum - a.sum)?.slice(0, 5)?.sort((a, b) => a.sum - b.sum) || [])
}
const getData = async (radio, pepProjectId, diff1, diff2) => {
@ -382,9 +382,9 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
<Spin spinning={statisticsSpin} tip="数据加载中...">
{behind ?
<>
<div style={{ display: "flex", justifyContent: "space-between" }}>
<div style={{ display: "flex", marginLeft: 10 }}>
<div style={{ fontSize: 18, fontWeight: 'bold', color: "#0b0b0bbd" }}>故障数统计</div>
<div>
<div style={{ marginLeft: 10 }}>
<Select showClear filter placeholder='项目' value={faultId} style={{ width: 160, marginRight: 10 }}
onChange={(v) => {
setFaultId(v)
@ -404,8 +404,8 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
</RadioGroup>
</div>
</div>
<div style={{ display: 'flex', padding: 16, height: "100%" }}>
<div style={{ display: "flex", flexDirection: "column", justifyContent: "space-evenly", width: 180 }}>
<div style={{ display: 'flex', padding: 16, }}>
<div style={{ display: "flex", flexDirection: "column", justifyContent: "space-evenly", width: 180, height: 226 }}>
<div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('数据中段')}>
<div>数据中断</div>
<div style={{ fontWeight: 500 }}>
@ -452,7 +452,8 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
</div>
</div>
<div style={{ width: 'calc(100% - 180px)', display: 'flex', justifyContent: 'center', alignItems: 'center', fontSize: 46, fontWeight: 600 }}>
<div style={{ width: 'calc(100% - 180px)', display: 'flex', flexDirection: "column", justifyContent: 'center', alignItems: 'center', fontSize: 46, fontWeight: 600 }}>
<div style={{ fontWeight: 500 }}>
{(dataAlarm?.group1?.untreated || 0)
@ -474,6 +475,7 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
}
</div>
<div style={{ fontSize: 12, color: "#817a7a" }}>未处理告警 / 全部告警</div>
</div>
</div>
</>
@ -551,7 +553,7 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
{/* 故障数排名*/}
<div style={{ padding: 10, width: '50%', height: 300, position: "relative" }}>
<Spin spinning={rankSpin} tip="数据加载中...">
<RadioGroup type='button' buttonSize='middle' value={radioRank} style={{ marginRight: 10, zIndex: 10, position: "absolute", top: 8, left: 112 }}
<RadioGroup type='button' buttonSize='middle' value={radioRank} style={{ marginRight: 10, zIndex: 10, position: "absolute", top: 0, left: 105 }}
onChange={async e => {
setRadioRank(e.target.value)
let data = await getData(e.target.value, pepProjectId, true, false)

761
web/client/src/sections/service/containers/automaticReport.jsx

@ -0,0 +1,761 @@
import React, { useEffect, useRef, useState } from 'react';
import { connect } from 'react-redux';
import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Tooltip } from '@douyinfe/semi-ui';
import { IconSearch } from '@douyinfe/semi-icons';
import { SkeletonScreen, } from "$components";
import moment from "moment";
import PushModal from '../components/pushModal'
import '../style.less'
import { Setup } from "$components";
const AutomaticReport = (props) => {
const form = useRef();//
const { dispatch, actions, user, loading, socket } = props
const { service, problem } = actions;
const [setup, setSetup] = useState(false); //
const [setupp, setSetupp] = useState([]);//
const [query, setQuery] = useState({ limit: 10, page: 0 }); //
const [limits, setLimits] = useState()//
const mylimits = useRef(); //
const [pushModal, setPushModal] = useState(false) //
const [pushEdit, setPushEdit] = useState(false) //
const [change, setChange] = useState(false) //
const [allTableData, setAllTableData] = useState([]) //
const [editObj, setEditObj] = useState({});//
const [projectStatus, setProjectStatus] = useState([]); //
const [subTypeData, setSubTypedata] = useState({
data_outages: [],
data_exception: [],
strategy_hit: [],
video_exception: [],
app_exception: [],
device_exception: [],
}); //
const page = useRef(query.page);//
const EMPUSH = "empush";
const tableList = [//
{
title: '推送信息',
list: [
{ name: "关联项目", value: "projectName" },
{ name: "策略名称", value: "name" },
{ name: "创建时间", value: "createTime" },
{ name: "接收人", value: "receiverPepUser" },
{ name: "推送方式", value: "pushType" },
{ name: "监听问题模块", value: "alarmType" },
{ name: "生效项目节点", value: "timeType" },
{ name: "推送机制", value: "tactics" },
{ name: "启用状态", value: "disable" },
{ name: "推送次数", value: "pushCount" },
]
},
];
const alarmTypeObj = {
data_outages: '数据中断',
data_exception: '数据异常',
strategy_hit: '策略命中',
video_exception: '视频异常',
app_exception: '应用异常',
device_exception: '设备异常',
}
const tacticsObj = {
immediately: '即时推送机制',
continue: '持续时长推送机制',
abnormal_rate: '异常率推送机制',
}
function handleRow (record, index) {//
//
if (index % 2 === 0) {
return {
style: {
background: '#FAFCFF',
}
};
} else {
return {};
}
}
const [tableData, setTableData] = useState([]) //
useEffect(() => {
localStorage.getItem(EMPUSH) == null
? localStorage.setItem(
EMPUSH,
JSON.stringify(['projectName', 'name', 'createTime', 'receiverPepUser', 'alarmType', 'timeType', 'tactics', 'disable'])
)
: "";
getProjectStatusList()
getPushList(query);
//
dispatch(problem.getAlarmDataGroup({ showAll: 'true' })).then((res) => {
if (res.success) {
let data = { ...subTypeData }
res.payload.data?.map(v => {
if (v.id === 1) {
data['data_outages'].push(v.unit)
} else if (v.id === 2) {
data['data_exception'].push(v.unit)
} else if (v.id == 3) {
data['strategy_hit'].push(v.unit)
} else {
data['device_exception'].push(v.unit)
}
})
//
dispatch(problem.getAlarmVideoDeviceKind({ showAll: true })).then((res) => {
if (res.success) {
data['video_exception'].push(res.payload.data)
}
})
data['app_exception'].push([{ id: 'apiError', name: "接口报错", }, { id: 'element', name: "元素异常", }, { id: 'timeout', name: "加载超时", },])
setSubTypedata(data)
}
})
}, [])
useEffect(() => {
let showTableData = JSON.parse(JSON.stringify(allTableData)).slice(query.page * query.limit, (query.page + 1) * query.limit)
setTableData(showTableData)
mylimits.current = showTableData.length
}, [change]);
function getPushList (query) {
let val = form.current.getValues()
dispatch(service.getPush({ ...val })).then((res) => {//
if (res.success) {
let mytableData = JSON.parse(JSON.stringify(res.payload.data));
for (let index = 0; index < mytableData.length; index++) {
mytableData[index].key = String(mytableData[index].id)
}
setAllTableData(mytableData)
let showTableData = mytableData.slice(query.page * query.limit, (query.page + 1) * query.limit)
setTableData(showTableData)
setQuery(query)
setLimits(res.payload.data.length)
mylimits.current = showTableData.length
}
})
}
function getProjectStatusList () {//
dispatch(service.getProjectStatus()).then((res) => {
if (res.success) {
setProjectStatus(res.payload?.data)
attribute(res.payload?.data);
}
})
}
const columns = [//
{
title: "操作",
width: "12%",
dataIndex: "text",
key: 'text',
render: (_, row) => {
return (
<div style={{ display: "flex" }}>
<Button
theme="borderless"
onClick={() => {
setEditObj(row)
setPushModal(true);
setPushEdit(true)
}}
>
修改
</Button>
{row?.disable ? (
<Button
theme="borderless"
style={{ color: '#F31C1C' }}
onClick={() => {
dispatch(service.putPushPushId({ pushId: row?.id, del: false, disable: false, msg: '更改推送配置状态' })).then(() => {
getPushList({ limit: query.limit, page: page.current });
})
}}
>
已禁用
</Button>
) : (
<Popconfirm
title="禁用后,通知策略将会失效。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
dispatch(service.putPushPushId({ pushId: row?.id, del: false, disable: true, msg: '更改推送配置状态' })).then(() => {
getPushList({ limit: query.limit, page: page.current });
})
}}
>
<Button theme="borderless">已启用</Button>
</Popconfirm>
)}
<Popconfirm
title="删除后通知策略将会失效。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
dispatch(service.putPushPushId({ pushId: row?.id, del: true, disable: false, msg: '删除推送配置' })).then(() => {
if (page.current > 0 && mylimits.current < 2) {
getPushList({ limit: query.limit, page: page.current - 1 });
} else {
getPushList({ limit: query.limit, page: page.current });
}
})
}}
>
<Button theme="borderless">删除</Button>
</Popconfirm>
</div>
);
},
},
]
function expandRowRender (record, index) {
return (
<div style={{}}>
结构物
{
record.structure?.map((item, index) => {
return (
<span key={index} style={{
marginRight: 5, padding: '1px 17px', color: '#0F7EFB',
display: 'inline-block', marginBottom: 5
}}>
{item.name}
</span>
)
})
}
</div>
)
}
//
function attribute (val) {
const arr = localStorage.getItem(EMPUSH)
? JSON.parse(localStorage.getItem(EMPUSH))
: [];
const column = [
{
title: '关联项目',
dataIndex: "projectName",
key: "projectName",
render: (_, row) => {
let projectData = []
row.pomsProject?.map(v => {
projectData.push({
projectName: v.pepProject?.projectName,
name: v.name,
anxinerror: v.del,
constructionStatus: v.pepProject?.constructionStatus,
})
})
let anxinerror = false
let anxinerrorArr = ''
if (row.pomsProject.del == true) {
anxinerror = true
anxinerrorArr = row.pomsProject.pepProject?.projectName || row.pomsProject.name
}
return (
projectData.map((u, index) => <div key={'projecname' + index} style={{ display: 'flex', alignItems: 'center' }}>
{
u.anxinerror ? (
<Tooltip content={(u.projectName || u.name) + ',项目已在【项企PEP】或【映射关系】中被删除,请重选项目!'}>
<div style={{ marginRight: 5 }}>
<img src="/assets/images/install/risk.png" alt="" style={{ height: 24, width: 24, }} />
</div>
</Tooltip>) : ('')
}
{
<div className='myseparator' style={{ display: 'flex', alignItems: 'center' }}>
<Tooltip content={(u.projectName || u.name)}>
<div style={{ width: u.projectName?.length > 7 || u.name?.length > 7 ? '112px' : '', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis', color: row.pomsProject.del ? '#F93920' : '' }}>
{u.projectName || u.name}
</div>
</Tooltip>
</div>
}
{
u.projectName ? (
<div style={{
height: 18, marginLeft: 4, width: 76,
background: 'linear-gradient(180deg, #EBF5FF 0%, #EBF5FF 0%, #D3E8FF 100%)',
borderRadius: 2, display: 'flex', alignItems: 'center'
}}>
<div>
<img src="/assets/images/install/icon_zhengque.png" alt="" style={{ height: 10, width: 10, marginLeft: 4, marginRight: 9 }} />
</div>
<div style={{ color: '#0F7EFB', fontSize: 11, marginRight: 12 }}>
{u.constructionStatus}
</div>
</div>
) : (
<div style={{
height: 18, marginLeft: 4,
background: 'linear-gradient(180deg, #99C7DD 0%, #3048FC 100%)',
borderRadius: 2, display: 'flex', alignItems: 'center'
}}>
<div>
<img src="/assets/images/install/icon_POMS.png" alt="" style={{ height: 10, width: 10, marginLeft: 4, marginRight: 9 }} />
</div>
<div style={{ color: '#FFFFFF', fontSize: 11, marginRight: 12 }}>
POMS
</div>
</div>
)
}
</div>)
)
}
},
{
title: '策略名称',
dataIndex: "name",
key: 'name',
render: (_, row) => {
return row.name
}
},
{
title: "创建时间",
dataIndex: "createTime",
key: "createTime",
render: (_, r, index) => {
return moment(r.createTime).format('YYYY-MM-DD HH:mm:ss');
},
},
{
title: '接收人',
dataIndex: "receiverPepUser",
key: 'receiverPepUser',
render: (_, row) => {
return (
<div style={{ display: 'flex', alignItems: 'center' }}>
{
row.receiverPepUser.map((item, index) => {
return (
<div className='myseparator' key={index} style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ display: index > 1 ? 'none' : '', color: '#005ABD' }}>
{item.name}
</div>
<div className='separator' style={{ width: 1, height: 12, border: '1px solid #DCDEE0', margin: '0px 10px', display: index > 0 ? 'none' : '' }}></div>
</div>
)
})
}
{
row.receiverPepUser.length > 2 ? (
<Tooltip content={
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
{
row.receiverPepUser.map((item, index) => {
return (
<div key={index}>
{item.name},
</div>
)
})
}
</div>
} trigger="click" style={{ lineHeight: 2 }}>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 8, cursor: "pointer", }}>
+{row.receiverPepUser.length - 2}
</div>
</Tooltip>
) : ('')
}
</div>
)
}
},
{
title: "推送方式",
dataIndex: "pushType",
key: "pushType",
render: (_, r, index) => {
return '邮件通知';
},
},
{
title: "监听问题模块",
dataIndex: "alarmType",
key: "alarmType",
render: (_, row) => {
return (
<div style={{ display: 'flex', alignItems: 'center' }}>
{
row.alarmType.map((item, index) => {
return (
<div className='myseparator' key={index} style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ display: index > 1 ? 'none' : '' }}>
{alarmTypeObj[item]}
</div>
<div className='separator' style={{ width: 1, height: 12, border: '1px solid #DCDEE0', margin: '0px 10px', display: index > 0 ? 'none' : '' }}></div>
</div>
)
})
}
{
row.alarmType.length > 2 ? (
<Tooltip content={
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
{
row.alarmType.map((item, index) => {
return (
<div key={index} >
{alarmTypeObj[item]},
</div>
)
})
}
</div>
} trigger="click" style={{ lineHeight: 2 }}>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 8, cursor: "pointer", }}>
+{row.alarmType.length - 2}
</div>
</Tooltip>
) : ('')
}
</div>
)
}
},
{
title: "生效项目节点",
dataIndex: "timeType",
key: "timeType",
render: (_, row, index) => {
return (
<div style={{ display: 'flex', alignItems: 'center' }}>
{
row.timeType.length > 0 ? (
row.timeType.map((item, index) => {
return (
<div key={index} style={{
height: 18, marginLeft: 4,
background: 'linear-gradient(180deg, #EBF5FF 0%, #EBF5FF 0%, #D3E8FF 100%)',
borderRadius: 2, display: index > 1 ? 'none' : 'flex', alignItems: 'center'
}}>
<div>
<img src="/assets/images/install/icon_zhengque.png" alt="" style={{ height: 10, width: 10, marginLeft: 4, marginRight: 9 }} />
</div>
<div style={{ color: '#0F7EFB', fontSize: 11, marginRight: 12 }}>
{
val.map((ite, idx) => {
return (
<div key={idx}>
{ite.id == item ? ite.construction_status : ''}
</div>
)
})
}
</div>
</div>
)
})
) : (
<div style={{
height: 18, marginLeft: 4,
background: 'linear-gradient(180deg, #99C7DD 0%, #3048FC 100%)',
borderRadius: 2, display: 'flex', alignItems: 'center'
}}>
<div>
<img src="/assets/images/install/icon_POMS.png" alt="" style={{ height: 10, width: 10, marginLeft: 4, marginRight: 9 }} />
</div>
<div style={{ color: '#FFFFFF', fontSize: 11, marginRight: 12 }}>
POMS
</div>
</div>
)
}
{
row.timeType.length > 2 ? (
<Tooltip content={
<div style={{ display: 'flex', flexWrap: 'wrap' }}>
{
row.timeType.map((item, index) => {
return (
<div key={index}>
{
val.map((ite, idx) => {
return (
<span key={idx}>
{ite.id == item ? ite.construction_status : ''}
</span>
)
})
},
</div>
)
})
}
</div>
} trigger="click" style={{ lineHeight: 2 }}>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 8, cursor: "pointer", }}>
+{row.timeType.length - 2}
</div>
</Tooltip>
) : ('')
}
</div>
)
},
},
{
title: "推送机制",
dataIndex: "tactics",
key: "tactics",
render: (_, r, index) => {
return tacticsObj[r.tactics]
},
},
{
title: "启用状态",
dataIndex: "disable",
key: "disable",
render: (_, row, index) => {
let enableType = ''
if (row.disable) {
enableType = '禁用'
} else {
let construcId = row.pomsProject?.map(v => (v.pepProject?.constructionStatusId || 'POMS')) || []
if (construcId?.includes('POMS')) {
enableType = '已生效'
} else {
let timeType = row.timeType?.map(Number) || []
for (let i = 0; i < timeType.length; i++) {
if (construcId?.includes(timeType[i])) {
enableType = '已生效'
break
} else {
enableType = '未生效'
}
}
}
}
return (
<div style={{ textAlign: 'center', padding: '1px 17px', color: enableType == '禁用' ? '#FB0F0F' : enableType == '已生效' ? '#0F7EFB' : '#646566', background: enableType == '禁用' ? 'rgba(255,221,221,0.38)' : enableType == '已生效' ? 'rgba(221,237,255,0.38)' : 'rgba(192,192,192,0.38)', }}>
{enableType}
</div>
)
},
},
{
title: "推送次数",
dataIndex: "pushCount",
key: "pushCount",
render: (_, r, index) => {
return (r.pushCount || 0) + '次'
},
},
];
for (let i = 0; i < arr.length; i++) {
let colum = column.filter((item) => {
return item.key === arr[i];
});
columns.splice(columns.length - 1, 0, colum[0]);
}
setSetupp(columns);
}
return (
<>
<div style={{ background: '#FFFFFF', margin: '8px 12px', padding: '20px 20px 0px 20px' }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #005ABD', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#101531', marginLeft: 8 }}>EM推送</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>Em push</div>
</div>
<div style={{ marginRight: 20, display: 'flex', alignItems: 'center' }} className='myempush'>
<Form
onSubmit={(values) => console.log(values)}
getFormApi={(formApi) => (form.current = formApi)}
layout="horizontal"
style={{ position: "relative", width: "100%", flex: 1 }}
>
<Form.Select
pure
field="keywordTarget"
placeholder="请选择搜索类型"
style={{ width: 200 }}
initValue={"pepProject"}
>
<Form.Select.Option value='pepProject'>项目</Form.Select.Option>
<Form.Select.Option value='struc'>结构物</Form.Select.Option>
<Form.Select.Option value='tactics'>策略名</Form.Select.Option>
</Form.Select>
<Form.Input
suffix={<IconSearch />}
field="keyword"
pure
showClear
style={{ width: 260, marginLeft: 12, marginRight: 12 }}
placeholder="请输入或选择关键词"
/>
<Form.Select
label='推送机制:'
labelPosition="left"
field='tactics'
style={{ width: 116, marginRight: 10, color: "#F9F9F9", }}
placeholder="全部"
filter
showClear
>
<Form.Select.Option value="immediately">即时推送机制</Form.Select.Option>
<Form.Select.Option value="continue">持续时长推送机制</Form.Select.Option>
<Form.Select.Option value="abnormal_rate">异常率推送机制</Form.Select.Option>
</Form.Select>
<Form.Select
label='启用状态:'
labelPosition="left"
field='state'
style={{ width: 116, marginRight: 10, color: "#F9F9F9", }}
placeholder="全部"
filter
showClear
>
<Form.Select.Option value='takeEffect'>已生效</Form.Select.Option>
<Form.Select.Option value='notYet'>未生效</Form.Select.Option>
<Form.Select.Option value='disable'>禁用</Form.Select.Option>
</Form.Select>
</Form>
<Button
theme="solid"
type="primary"
style={{
width: 80,
height: 32,
borderRadius: 2,
marginRight: 32,
background: '#FFFFFF',
color: '#005ABD',
border: '1px solid #005ABD'
}}
onClick={() => {
getPushList({ limit: query.limit, page: 0 })
}}
>
查询
</Button>
<div style={{ display: 'flex', alignItems: 'center' }}>
<img title='设置' src="/assets/images/problem/setup.png" style={{ width: 18, height: 18, cursor: "pointer" }} onClick={() => setSetup(true)} />
</div>
<Button
theme="solid"
type="primary"
style={{
width: 136,
height: 32,
borderRadius: 2,
marginLeft: 32
}}
onClick={() => {
setPushModal(true);
setPushEdit(false);
setEditObj({})
}}
>
添加推送策略
</Button>
</div>
</div>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 20, marginTop: 5 }}>
<div style={{ fontSize: 12, color: '#8B8B8B' }}>EM推送提供对映射关系组的项目结构物问题的监听和通知服务支持对设备异常率问题持续时间即时响应等策略定义的动态推送</div>
</div>
<div style={{ marginTop: 20 }}>
<Skeleton
loading={loading}
// loading={false}
active={true}
placeholder={SkeletonScreen()}
>
<Table
rowKey="name"
columns={setupp.filter((s) => s)}
dataSource={tableData}
bordered={false}
hideExpandedColumn={false}
empty="暂无数据"
expandedRowRender={expandRowRender}
pagination={false}
onRow={handleRow}
/>
</Skeleton>
<div
style={{
display: "flex",
justifyContent: "space-between",
padding: "20px 20px",
}}
>
<div>
</div>
<div style={{ display: 'flex', }}>
<span style={{ lineHeight: "30px", fontSize: 13, color: 'rgba(0,90,189,0.8)' }}>
{limits}条信息
</span>
<Pagination
className="22"
total={limits}
showSizeChanger
currentPage={query.page + 1}
pageSizeOpts={[10, 20, 30, 40]}
onChange={(currentPage, pageSize) => {
setQuery({ limit: pageSize, page: currentPage - 1 });
page.current = currentPage - 1
setChange(!change)
}}
/>
</div>
</div>
</div>
</div>
{//
pushModal ?
<PushModal
visible={true}
pushEdit={pushEdit}
editObj={editObj}
subTypeData={subTypeData}
cancel={() => {
setPushModal(false);
}}
close={() => {
setPushModal(false);
getPushList(query)
}} >
</PushModal> : ''
}
{setup ? (
<Setup
tableType={EMPUSH}
tableList={tableList}
close={() => {
setSetup(false);
attribute(projectStatus);
}}
/>
) : (
""
)}
</>
)
}
function mapStateToProps (state) {
const { auth, global, getPush } = state;
return {
loading: getPush.isRequesting,
user: auth.user,
actions: global.actions,
// members: members.data,
};
}
export default connect(mapStateToProps)(AutomaticReport);

9
web/client/src/sections/service/containers/index.js

@ -10,4 +10,11 @@ import ServiceRecord from './serviceRecord';
import MaintenanceRecords from './maintenanceRecords';
import FirmwareLibrary from './firmwareLibrary'
import DeviceManagement from './deviceManagement';
export { ReportManagement, CyclePlan, TemporaryResponse, EmPush, AppPush, MaintenanceModel, ServiceRecord, MaintenanceRecords,DeviceManagement,FirmwareLibrary };
import AutomaticReport from './automaticReport';
import ReportFile from './reportFile.jsx';
export {
ReportManagement, CyclePlan, TemporaryResponse, EmPush, AppPush, MaintenanceModel,
ServiceRecord, MaintenanceRecords, DeviceManagement, FirmwareLibrary, AutomaticReport,
ReportFile
};

271
web/client/src/sections/service/containers/reportFile.jsx

@ -0,0 +1,271 @@
import React, { useEffect, useRef, useState } from 'react';
import { connect } from 'react-redux';
import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Tooltip } from '@douyinfe/semi-ui';
import { IconSearch } from '@douyinfe/semi-icons';
import { SkeletonScreen, } from "$components";
import moment from "moment";
import PushModal from '../components/pushModal'
import SimpleBar from 'simplebar-react';
import '../style.less'
import { Setup } from "$components";
const AutomaticReport = ({ dispatch, actions, user, clientHeight, loading, socket, projectPoms }) => {
const form = useRef();//
const { service, problem } = actions;
const [setup, setSetup] = useState(false); //
const [query, setQuery] = useState({ limit: 10, page: 0 }); //
const [limits, setLimits] = useState()//
const mylimits = useRef(); //
const [pushModal, setPushModal] = useState(false) //
const [pushEdit, setPushEdit] = useState(false) //
const [change, setChange] = useState(false) //
const [editObj, setEditObj] = useState({});//
const [projectStatus, setProjectStatus] = useState([]); //
const [tableData, setTableData] = useState([]) //
const [projectList, setProjectList] = useState([]) //
const [projectId, setProjectId] = useState() //id
const [projectSearch, setProjectSearch] = useState() //
const [subTypeData, setSubTypedata] = useState({
data_outages: [],
data_exception: [],
strategy_hit: [],
video_exception: [],
app_exception: [],
device_exception: [],
}); //
const page = useRef(query.page);//
const EMPUSH = "empush";
const tableList = [//
{
title: '推送信息',
list: [
{ name: "关联项目", value: "projectName" },
{ name: "策略名称", value: "name" },
{ name: "创建时间", value: "createTime" },
{ name: "接收人", value: "receiverPepUser" },
{ name: "推送方式", value: "pushType" },
{ name: "监听问题模块", value: "alarmType" },
{ name: "生效项目节点", value: "timeType" },
{ name: "推送机制", value: "tactics" },
{ name: "启用状态", value: "disable" },
{ name: "推送次数", value: "pushCount" },
]
},
];
useEffect(() => {
if (projectPoms?.length) {
let dataList = projectPoms?.filter(v => v.pepProjectIsDelete != 1)
setProjectId(dataList[0]?.id)
setProjectList(dataList)
}
}, [projectPoms])
const columns = [{
title: "文件名称",
dataIndex: "name",
key: 'name',
}, {
title: "报表类型",
dataIndex: "type",
key: 'type',
}, {
title: "最近生产时间",
dataIndex: "time",
key: 'time',
}, {
title: "操作",
dataIndex: "text",
key: 'text',
render: (_, row) => {
return (
<div style={{ display: "flex" }}>
<Button
theme="borderless"
onClick={() => {
setEditObj(row)
setPushModal(true);
setPushEdit(true)
}}
>
下载
</Button>
<Popconfirm
title="删除后通知策略将会失效。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
dispatch(service.putPushPushId({ pushId: row?.id, del: true, disable: false, msg: '删除推送配置' })).then(() => {
if (page.current > 0 && mylimits.current < 2) {
getPushList({ limit: query.limit, page: page.current - 1 });
} else {
getPushList({ limit: query.limit, page: page.current });
}
})
}}
>
<Button theme="borderless">删除</Button>
</Popconfirm>
</div>
);
},
},
]
function handleRow (record, index) {//
//
if (index % 2 === 0) {
return {
style: {
background: '#FAFCFF',
}
};
} else {
return {};
}
}
return (
<>
<div style={{ background: '#FFFFFF', margin: '8px 12px', padding: '20px 20px 0px 20px', }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #005ABD', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#101531', marginLeft: 8 }}>报表文件</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>REPORT FILE</div>
</div>
<Button style={{ width: 78 }} theme='solid' type='secondary' onClick={() => {
}}>上传 </Button>
</div>
<div style={{ display: 'flex' }}>
<div style={{ width: 200, height: '100%', padding: '16px 10px', boxShadow: '0 0 4px 2px #0000000d' }}>
<Input placeholder='请输入项目名称' value={projectSearch} onChange={v => setProjectSearch(v)} />
{/* <SimpleBar style={{ height: 'calc(100% - 24px', }} forceVisible="y" > */}
<SimpleBar style={{ width: 200, height: clientHeight - 100 }} forceVisible="y">
{projectList?.map(v => {
return <div key={'pepProjectId' + v.pepProjectId} title={v.name || v.pepProjectName}
style={{
cursor: 'pointer', background: v.pepProjectId == pepProjectId ? 'rgb(15 126 251 / 16%)' : '',
width: 180, height: 30, display: 'flex', alignItems: 'center'
}}
onClick={() => {
setPepProjectId(v.pepProjectId)
fileList(v.pepProjectId)
setDataSource([])
setFileId('')
}}>
<img src="/assets/images/icon/project-icon.png" style={{ width: 14, marginRight: 8 }} />
<div style={{ fontSize: 14, width: 152, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}> {v.pepProjectName}</div>
</div>
})}
{/* </SimpleBar> */}
</SimpleBar>
</div>
<div style={{ marginTop: 20, width: 'calc(100% - 200px)' }}>
<Skeleton
loading={loading}
// loading={false}
active={true}
placeholder={SkeletonScreen()}
>
<Table
rowKey="name"
columns={columns}
dataSource={tableData}
bordered={false}
hideExpandedColumn={false}
empty="暂无数据"
pagination={false}
onRow={handleRow}
/>
</Skeleton>
{limits > 0 && <div
style={{
display: "flex",
justifyContent: "space-between",
padding: "20px 20px",
}}
>
<div>
</div>
<div style={{ display: 'flex', }}>
<span style={{ lineHeight: "30px", fontSize: 13, color: 'rgba(0,90,189,0.8)' }}>
{limits}条信息
</span>
<Pagination
className="22"
total={limits}
showSizeChanger
currentPage={query.page + 1}
pageSizeOpts={[10, 20, 30, 40]}
onChange={(currentPage, pageSize) => {
setQuery({ limit: pageSize, page: currentPage - 1 });
page.current = currentPage - 1
setChange(!change)
}}
/>
</div>
</div>}
</div>
</div>
</div>
{//
pushModal ?
<PushModal
visible={true}
pushEdit={pushEdit}
editObj={editObj}
subTypeData={subTypeData}
cancel={() => {
setPushModal(false);
}}
close={() => {
setPushModal(false);
getPushList(query)
}} >
</PushModal> : ''
}
{setup ? (
<Setup
tableType={EMPUSH}
tableList={tableList}
close={() => {
setSetup(false);
attribute(projectStatus);
}}
/>
) : (
""
)}
</>
)
}
function mapStateToProps (state) {
const { auth, global, getPush, ProjectPoms } = state;
console.log(global);
return {
loading: getPush.isRequesting,
user: auth.user,
actions: global.actions,
clientHeight: global?.clientHeight,
projectPoms: ProjectPoms?.data?.rows
};
}
export default connect(mapStateToProps)(AutomaticReport);

12
web/client/src/sections/service/nav-item.jsx

@ -16,7 +16,13 @@ export function getNavItem (user, dispatch) {
to: '/service/reportingServices/reportManagement',
items: [{
itemKey: 'reportManagement', to: '/service/reportingServices/reportManagement', text: '报表管理'
}]
}
// , {
// itemKey: 'automaticReport', to: '/service/reportingServices/automaticReport', text: ''
// }, {
// itemKey: 'reportFile', to: '/service/reportingServices/reportFile', text: ''
// }
]
}, {
itemKey: 'maintenancePlan',
text: '维护计划',
@ -26,7 +32,7 @@ export function getNavItem (user, dispatch) {
itemKey: 'cyclePlan', to: '/service/maintenancePlan/cyclePlan', text: '周期计划'
}, {
itemKey: 'temporaryResponse', to: '/service/maintenancePlan/temporaryResponse', text: '临时响应'
},{
}, {
itemKey: 'serviceRecord1', to: '/service/serviceRecord/serviceRecord1', text: '响应记录',
},]
}, {
@ -56,7 +62,7 @@ export function getNavItem (user, dispatch) {
text: '硬件维修',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconjianshezhong"></iconpark-icon>,
to: '/service/serviceRecord/MaintenanceRecords',
items: [{ itemKey:'MaintenanceRecords',to:'/service/serviceRecord/MaintenanceRecords',text:'维修记录'}]
items: [{ itemKey: 'MaintenanceRecords', to: '/service/serviceRecord/MaintenanceRecords', text: '维修记录' }]
},
// {
// itemKey: 'firmwareUpgrade',

18
web/client/src/sections/service/routes.js

@ -1,4 +1,8 @@
import { ReportManagement, CyclePlan, TemporaryResponse, EmPush, AppPush, MaintenanceModel, ServiceRecord, MaintenanceRecords,FirmwareLibrary,DeviceManagement } from './containers';
import {
ReportManagement, CyclePlan, TemporaryResponse, EmPush, AppPush,
MaintenanceModel, ServiceRecord, MaintenanceRecords, FirmwareLibrary,
DeviceManagement, AutomaticReport, ReportFile
} from './containers';
export default [{
type: 'inner',
@ -16,6 +20,16 @@ export default [{
key: 'reportManagement',
component: ReportManagement,
breadcrumb: '报表管理',
}, {
path: '/automaticReport',
key: 'automaticReport',
component: AutomaticReport,
breadcrumb: '自动化报表',
}, {
path: '/reportFile',
key: 'reportFile',
component: ReportFile,
breadcrumb: '报表文件',
}]
}, {
path: '/maintenancePlan',
@ -83,7 +97,7 @@ export default [{
key: 'firmwareLibrary',
component: FirmwareLibrary,
breadcrumb: '固件库',
},{
}, {
path: '/DeviceManagement',
key: 'deviceManagement',
component: DeviceManagement,

Loading…
Cancel
Save