From a7dcaeef283478c116fb47e35e1984aef406ab88 Mon Sep 17 00:00:00 2001 From: wenlele Date: Thu, 31 Aug 2023 13:39:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=90=E7=BB=B4=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/controllers/project/group.js | 51 +++++ api/app/lib/routes/project/index.js | 3 + .../assets/images/projectGroup/chart.png | Bin 0 -> 44962 bytes .../sections/projectGroup/actions/group.js | 18 +- .../projectGroup/containers/bigscreen.jsx | 185 ++++++++++++++---- web/client/src/utils/webapi.js | 3 +- 6 files changed, 224 insertions(+), 36 deletions(-) create mode 100644 web/client/assets/images/projectGroup/chart.png diff --git a/api/app/lib/controllers/project/group.js b/api/app/lib/controllers/project/group.js index c9f0fbb..63a12ee 100644 --- a/api/app/lib/controllers/project/group.js +++ b/api/app/lib/controllers/project/group.js @@ -409,6 +409,56 @@ async function groupStatisticAlarm (ctx) { } } +async function groupProject (ctx) { + try { + const { models } = ctx.fs.dc; + + const { groupId } = ctx.query + const { clickHouse } = ctx.app.fs + const findOne = await models.ProjectGroup.findOne({ where: { id: groupId } }) + const proRes = await models.ProjectCorrelation.findAll({ where: { id: { $in: findOne.pomsProjectIds } } }) + let pepProjectIds = new Set() + + for (let p of proRes) { + if (p.pepProjectId) { + pepProjectIds.add(p.pepProjectId) + } + } + + const pepProjectRes = pepProjectIds.size ? + await clickHouse.projectManage.query( + ` + SELECT + t_pim_project.id AS id, + t_pim_project.project_name AS project_name, + t_pim_project.isdelete AS isdelete, + t_pim_project_construction.construction_status_id AS construction_status_id, + t_pim_project_state.construction_status AS construction_status + FROM t_pim_project + LEFT JOIN t_pim_project_construction + ON t_pim_project.id = t_pim_project_construction.project_id + LEFT JOIN t_pim_project_state + ON t_pim_project_construction.construction_status_id = t_pim_project_state.id + WHERE id IN (${[...pepProjectIds].join(',')}, -1) + ` + ).toPromise() : + [] + + for (let p of proRes) { + const corPro = pepProjectRes.find(pp => pp.id == p.pepProjectId) || {} + p.dataValues.pepProjectName = corPro.project_name + } + ctx.status = 200; + ctx.body = proRes; + } catch (error) { + ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); + ctx.status = 400; + ctx.body = { + message: typeof error == 'string' ? error : undefined + } + } +} + module.exports = { groupList, editGroup, @@ -416,4 +466,5 @@ module.exports = { groupStatistic, groupStatisticOnline, groupStatisticAlarm, + groupProject, }; \ No newline at end of file diff --git a/api/app/lib/routes/project/index.js b/api/app/lib/routes/project/index.js index 545d829..bb0ffa6 100644 --- a/api/app/lib/routes/project/index.js +++ b/api/app/lib/routes/project/index.js @@ -48,4 +48,7 @@ module.exports = function (app, router, opts) { app.fs.api.logAttr['GET/project/group/statistic/alarm'] = { content: '获取项目分组告警统计信息', visible: true }; router.get('/project/group/statistic/alarm', projectGroup.groupStatisticAlarm); + + app.fs.api.logAttr['GET/project/group/list'] = { content: '获取分组项目信息', visible: true }; + router.get('/project/group/list', projectGroup.groupProject); }; \ No newline at end of file diff --git a/web/client/assets/images/projectGroup/chart.png b/web/client/assets/images/projectGroup/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..b575c3ca53f129bfce94d1c9cbe073e5f02c19e0 GIT binary patch literal 44962 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 basicAction({ + type: "get", + dispatch: dispatch, + query, + actionType: "GET_GROUP_PROJECT", + url: `${ApiTable.groupProject}`, + msg: { error: "获取分组项目信息失败" }, + reducer: { name: "groupProject", + params: { noClear: true } }, + }); +} + diff --git a/web/client/src/sections/projectGroup/containers/bigscreen.jsx b/web/client/src/sections/projectGroup/containers/bigscreen.jsx index 8cb4e29..14d5e4b 100644 --- a/web/client/src/sections/projectGroup/containers/bigscreen.jsx +++ b/web/client/src/sections/projectGroup/containers/bigscreen.jsx @@ -11,6 +11,7 @@ import PerfectScrollbar from "perfect-scrollbar"; let interrupt +let repair let overviewScrollbar; const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, groupStatisticOnline }) => { @@ -18,13 +19,17 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou const [online, setOnline] = useState([]) const [value, setValue] = useState([]) const [time, setTime] = useState([]) + const [groupProject, setGroupProject] = useState([]) + const [proportion, setProportion] = useState([]) + const [formatter, setFormatter] = useState({}) + const [alarmData, setAlarmData] = useState()//第三项之后的数据 const [biggest, setBiggest] = useState()//最大的刻度值 const [mockData, setMockData] = useState()//所有的告警数据 const [xData, setXData] = useState([])//横坐标 - + const self = useRef({ myChart: null }); useEffect(() => { @@ -32,7 +37,15 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou statisticOnline(groupId) dispatch(actions.projectGroup.groupStatisticAlarm({ groupId })).then(res => { if (res.success) { - setMockData(res.data) + setMockData(res.payload.data) + } + }) + + + dispatch(actions.projectGroup.groupProject({ groupId })).then(res => { + if (res.success) { + setGroupProject(res.payload.data?.map(v => ({ ...v, value: (Math.random() * 20).toFixed(0) })) || []) + setProportion([...res.payload.data?.slice(0, 3)?.map(v => ({ name: v.name || v.pepProjectName, value: (Math.random() * 20).toFixed(0) })), { value: 20, name: '其它' }]) } }) @@ -43,6 +56,12 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou suppressScrollX: true, }); } + const repairDom = document.getElementById("repair"); + if (repairDom) { + repair = new PerfectScrollbar("#repair", { + suppressScrollX: true, + }); + } }, []) @@ -63,6 +82,10 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou interrupt.update(); } + const repairDom = document.getElementById("repair"); + if (repair && repairDom) { + interrupt.update(); + } }) useEffect(() => { const maxCombinedValue = mockData?.reduce((max, item) => { @@ -119,7 +142,6 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou let statisticOnline = (groupId) => { dispatch(actions.projectGroup.groupStatisticOnline({ groupId })).then(res => { - console.log(res); if (res.success) { let Interrupt = [] res.payload.data?.forEach(v => { @@ -182,6 +204,43 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou } + useEffect(() => { + let count = 0; + let currentIndex = -1; + if (!self.current.cityChart) return; + const timer = setInterval(() => { + count++; + if (count == 8) { + count = 1; + } + // 取消之前高亮的图形 + self.current.cityChart.dispatchAction({ + type: "downplay", + seriesIndex: 0, + dataIndex: currentIndex, + }); + currentIndex = + (currentIndex + 1) % proportion?.length + // 高亮当前图形 + self.current.cityChart.dispatchAction({ + type: "highlight", + seriesIndex: 0, + dataIndex: currentIndex, + }); + // 显示 label + self.current.cityChart.dispatchAction({ + type: "showTip", + seriesIndex: 0, + dataIndex: currentIndex, + }); + }, 3000); + + return () => { + clearInterval(timer); + }; + }, [proportion]); + + return (
@@ -191,41 +250,101 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou
-
+
+
+ { + setFormatter(values?.data) + } + // `${values.seriesName}
${values.marker} ${values.name} ${values.value}个(${values.percent}%)`, + }, + series: [ + { + // name: 'Access From', + type: 'pie', + radius: ['60%', '70%'], + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 10, + borderColor: '#fff', + borderWidth: 2 + }, + label: { + show: false, + position: 'center' + }, + // emphasis: { + // label: { + // show: true, + // fontSize: 44, + // fontWeight: 'bold' + // } + // }, + labelLine: { + show: false + }, + data: proportion || [], + } + ] + }} + notMerge + onChartReady={(instance) => { + self.current.cityChart = instance; + }} + lazyUpdate + style={{ width: clientHeight * 0.55 - 300, height: clientHeight * 0.55 - 300 }} + /> + +
+
{formatter?.value}
+
{formatter?.name}
+
+
+
+ {proportion?.map((v, index) => { + let color = ['rgb(53 100 209)', 'rgb(138 201 15)', 'rgb(239 204 77)', 'rgb(233 107 107)'] + return
+
+
+ {v.name}
+
{v.value}次
+
+
+ })} +
-
序号
-
工单名称
-
修复时长
+
序号
+
工单名称
+
修复时长
-
- {[{ index: 1, name: 'wweq', time: 20 }, - { index: 2, name: 'wweq', time: 20 }, - { index: 3, name: 'wweq', time: 20 }, - { index: 4, name: 'wweq', time: 20 }, - { index: 5, name: 'wweq', time: 20 }, - { index: 6, name: 'wweq', time: 20 }, - { index: 7, name: 'wweq', time: 20 }, - { index: 1, name: 'wweq', time: 20 }, - { index: 1, name: 'wweq', time: 20 }, - { index: 1, name: 'wweq', time: 20 }].map((c, index) => { - let title - if (c.offline) { - if (c.offline >= 1440) title = Math.floor(c.offline / 1440) + "天" - if ((c.offline % 1440) >= 60) title = title + Math.floor(c.offline % 1440 / 60) + "时" - if (c.offline % 1440 % 60) title = title + c.offline % 1440 % 60 + "分" - } - - return
-
{c.name}
-
{title}
-
{c.offnum + '/' + c.totnum}
-
+
+ {groupProject?.map((c, index) => { + return index < 10 ?
+
+ NO.{index + 1}
+
+ {c.name || c.pepProjectName}(售后工单)
+
+ {c.value}h
+
: <> })}
@@ -418,10 +537,10 @@ const Bigscreen = ({ dispatch, actions, user, match, history, clientHeight, grou
-
+
- -
+ +
) } diff --git a/web/client/src/utils/webapi.js b/web/client/src/utils/webapi.js index 3bfba9a..251429a 100644 --- a/web/client/src/utils/webapi.js +++ b/web/client/src/utils/webapi.js @@ -40,7 +40,8 @@ export const ApiTable = { projectGroup: 'project/group', groupStatistic: 'project/group/statistic', groupStatisticOnline: 'project/group/statistic/online', - groupStatisticAlarm:'project/group/statistic/alarm', + groupStatisticAlarm: 'project/group/statistic/alarm', + groupProject: "project/group/list", //告警 getProjectPoms: 'project/poms', //获取已绑定项目