warn.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <template>
  2. <div class="app-container power-index-content">
  3. <el-row :gutter="10">
  4. <el-col :span="4" :xs="24">
  5. <div class="head-container">
  6. <el-input v-model="areaName" placeholder="请输入服务区名称" clearable size="small" prefix-icon="el-icon-search"
  7. style="margin-bottom: 20px" />
  8. </div>
  9. <div class="head-container">
  10. <el-tree ref="tree" :data="areaOptions" :default-expand-all="true" :expand-on-click-node="false" :filter-node-method="filterNode" node-key="id" highlight-current @node-click="handleNodeClick" />
  11. </div>
  12. </el-col>
  13. <el-col :span="20" :xs="24">
  14. <el-row :gutter="20">
  15. <el-col :span="12">
  16. <DeviceWaring />
  17. </el-col>
  18. <el-col :span="12">
  19. <LineChartBlock title="历史告警变化" :opt-cfg="devcWarningHis">
  20. <template v-slot:filters>
  21. <SwitchTag :ds="[{ val: 'year', text: '按年' }, { val: 'month', text: '按月' }, { val: 'day', text: '按日' }]"
  22. :defTag="dateType" :tagClick="onDateTypeSwitch" />
  23. </template>
  24. </LineChartBlock>
  25. </el-col>
  26. </el-row>
  27. <el-row type="flex" :gutter="20" style="margin-top: 20px">
  28. <el-col :span="12">
  29. <BlockTable title="实时告警" :table-data="realTimeTableData">
  30. <template v-slot:columns>
  31. <el-table-column type="index" label="序号" align="center" />
  32. <el-table-column prop="subSystemName" label="子系统" align="center" />
  33. <el-table-column prop="objName" label="对象名称" align="center" />
  34. <el-table-column prop="alarmMsg" label="描述" align="center" />
  35. <el-table-column prop="alarmTime" label="时间" align="center" />
  36. <el-table-column label="操作" align="center" width="100">
  37. <template slot-scope="scope">
  38. <el-dropdown @command="(cmd) => handleCommand(cmd, scope.row)"
  39. v-if="![ALARM_STATE.dissolved.value, ALARM_STATE.dissolved.value].includes(scope.row.alarmState)">
  40. <span class="el-dropdown-link">
  41. <dict-tag :options="dict.type.alarm_state" :value="scope.row.alarmState"></dict-tag>
  42. <i class="el-icon-arrow-down el-icon--right"></i>
  43. </span>
  44. <el-dropdown-menu slot="dropdown">
  45. <el-dropdown-item :command="ALARM_STATE.disposing.code"
  46. v-if="scope.row.alarmState === ALARM_STATE.new.value">开始处理
  47. </el-dropdown-item>
  48. <el-dropdown-item :command="ALARM_STATE.disposed.code">已处理</el-dropdown-item>
  49. <el-dropdown-item :command="ALARM_STATE.dissolved.code">已消散</el-dropdown-item>
  50. </el-dropdown-menu>
  51. </el-dropdown>
  52. </template>
  53. </el-table-column>
  54. </template>
  55. </BlockTable>
  56. </el-col>
  57. <el-col :span="12">
  58. <BarChartBlock title="告警统计报表" :opt-cfg="subSysIndex">
  59. <template v-slot:filters>
  60. <SwitchTag :ds="[{ val: 'year', text: '按年' }, { val: 'month', text: '按月' }, { val: 'day', text: '按日' }]"
  61. :defTag="dateType" :tagClick="onSubSysDateTypeSwitch" />
  62. </template>
  63. </BarChartBlock>
  64. </el-col>
  65. </el-row>
  66. </el-col>
  67. </el-row>
  68. </div>
  69. </template>
  70. <script>
  71. import {
  72. fetchAlarmIndexDay, fetchAlarmIndexMonth, fetchAlarmIndexYear, fetchSubSysIndexDay, fetchSubSysIndexMonth,
  73. fetchSubSysIndexYear, listAlarmInfo, updateAlarmInfo,
  74. } from '@/api/alarm/alarm-info';
  75. import {ApiCode} from '@/api/apiEmums';
  76. import Block from '@/components/Block/block.vue';
  77. import BlockTable from '@/components/Block/BlockTable/index.vue';
  78. import BarChartBlock from '@/components/Block/charts/BarChartBlock.vue';
  79. import PieChartBlock from '@/components/Block/charts/PieChartBlock.vue';
  80. import {ALARM_STATE} from '@/enums/alarm';
  81. import {DateTool} from '@/utils/DateTool';
  82. import DeviceWaring from '@/views/analysis/device/DevcWarning/index.vue';
  83. import Tag from '@/views/basecfg/tag/index.vue';
  84. import dayjs from 'dayjs';
  85. import {areaTreeSelect} from '@/api/basecfg/area'
  86. import LineChartBlock from '../../../components/Block/charts/LineChartBlock.vue';
  87. import SwitchTag from '../../../components/SwitchTag/index.vue';
  88. export default {
  89. dicts: ['alarm_type', 'alarm_state'],
  90. components: {
  91. Tag,
  92. BlockTable,
  93. DeviceWaring,
  94. Block,
  95. BarChartBlock,
  96. PieChartBlock,
  97. LineChartBlock,
  98. SwitchTag,
  99. },
  100. data () {
  101. return {
  102. startRecTime: '',
  103. endRecTime: '',
  104. areaName: undefined,
  105. areaOptions: [],
  106. ALARM_STATE,
  107. dateType: {val: 'year'},
  108. areaCode: '',
  109. devcWarningHis: {
  110. unit: ' ',
  111. xAxis: {
  112. type: 'category',
  113. data: [],
  114. },
  115. series: [],
  116. },
  117. subSysIndex: {
  118. unit: ' ',
  119. xAxis: {
  120. type: 'category',
  121. data: [],
  122. },
  123. series: [],
  124. },
  125. realTimeTableData: [],
  126. };
  127. },
  128. watch: {
  129. // 根据名称筛选区域树
  130. areaName (val) {
  131. this.$refs.tree.filter(val)
  132. }
  133. },
  134. async mounted () {
  135. await this.getAreaTreeByTag('0', 1)
  136. this.queryCharts()
  137. this.getRecentSevenDays();
  138. },
  139. methods: {
  140. /**计算近7天的时间范围*/
  141. getRecentSevenDays() {
  142. const endRecTime = dayjs(); // 当前时间
  143. const startRecTime = endRecTime.subtract(7, 'days'); // 7天前的时间
  144. this.startRecTime = startRecTime.format('YYYY-MM-DD HH:mm:ss');
  145. this.endRecTime = endRecTime.format('YYYY-MM-DD HH:mm:ss');
  146. },
  147. /** 查询区域树结构 */
  148. async getAreaTreeByTag(areaCode, layer) {
  149. await areaTreeSelect(areaCode, layer).then(response => {
  150. this.areaOptions = [{
  151. id: '-1',
  152. label: '全部',
  153. children: []
  154. }].concat(response.data)
  155. this.areaCode = '-1'
  156. })
  157. },
  158. // 筛选节点
  159. filterNode (value, data) {
  160. if (!value) return true
  161. return data.label.indexOf(value) !== -1
  162. },
  163. handleNodeClick (data, node) {
  164. this.areaCode = data.id
  165. this.queryCharts()
  166. },
  167. async onDateTypeSwitch (item) {
  168. if (item.val === 'day') {
  169. const xaxis = DateTool.getTime(60);
  170. const {data} = await fetchAlarmIndexDay({
  171. areaCode: this.areaCode,
  172. });
  173. const series = this.toSeries(data, xaxis);
  174. this.devcWarningHis.xAxis.data = xaxis;
  175. this.devcWarningHis.series = series;
  176. return;
  177. }
  178. if (item.val === 'month') {
  179. const xaxis = DateTool.getDayOfRange(
  180. dayjs().subtract(1, 'month'), dayjs(), DateTool.DateFormat.YYYY_MM_DD);
  181. const {data} = await fetchAlarmIndexMonth({areaCode: this.areaCode});
  182. const series = this.toSeries(data, xaxis);
  183. this.devcWarningHis.xAxis.data = xaxis;
  184. this.devcWarningHis.series = series;
  185. return;
  186. }
  187. const xaxis = DateTool.getMonthsOfYearAgo();
  188. const {data} = await fetchAlarmIndexYear({areaCode: this.areaCode});
  189. const series = this.toSeries(data, xaxis);
  190. this.devcWarningHis.xAxis.data = xaxis;
  191. this.devcWarningHis.series = series;
  192. },
  193. async onSubSysDateTypeSwitch (item) {
  194. if (item.val === 'day') {
  195. const xaxis = DateTool.getTime(60);
  196. const {data} = await fetchSubSysIndexDay({
  197. areaCode: this.areaCode,
  198. });
  199. const series = this.subSysIndexToSeries(data, xaxis);
  200. this.subSysIndex.xAxis.data = xaxis;
  201. this.subSysIndex.series = series;
  202. return;
  203. }
  204. if (item.val === 'month') {
  205. const xaxis = DateTool.getDayOfRange(
  206. dayjs().subtract(1, 'month'), dayjs(), DateTool.DateFormat.YYYY_MM_DD);
  207. const {data} = await fetchSubSysIndexMonth({areaCode: this.areaCode});
  208. const series = this.subSysIndexToSeries(data, xaxis);
  209. this.subSysIndex.xAxis.data = xaxis;
  210. this.subSysIndex.series = series;
  211. return;
  212. }
  213. const xaxis = DateTool.getMonthsOfYearAgo();
  214. const {data} = await fetchSubSysIndexYear({areaCode: this.areaCode});
  215. const series = this.subSysIndexToSeries(data, xaxis);
  216. this.subSysIndex.xAxis.data = xaxis;
  217. this.subSysIndex.series = series;
  218. },
  219. toSeries (data, xaxis) {
  220. const dayGroup = _.groupBy(data, 'alarmType');
  221. const series = [];
  222. Object.keys(dayGroup).forEach((alarmType) => {
  223. let ds = {};
  224. let typeName = this.selectDictLabel(this.dict.type.alarm_type, alarmType);
  225. dayGroup[alarmType].forEach(item => {
  226. ds[item.dateIndex] = item.cnt;
  227. });
  228. let seriesData = [];
  229. xaxis.forEach((item) => seriesData.push(ds[item] || 0));
  230. series.push({
  231. name: typeName,
  232. type: 'line',
  233. smooth: true,
  234. data: seriesData,
  235. });
  236. });
  237. return series;
  238. },
  239. subSysIndexToSeries (data, xaxis) {
  240. const dayGroup = _.groupBy(data, 'systemCode');
  241. const series = [];
  242. Object.keys(dayGroup).forEach((subSysCode) => {
  243. let ds = {};
  244. let systemName = dayGroup[subSysCode][0].systemName;
  245. dayGroup[subSysCode].forEach(item => {
  246. ds[item.dateIndex] = item.cnt;
  247. });
  248. let seriesData = [];
  249. xaxis.forEach((item) => seriesData.push(ds[item] || 0));
  250. series.push({
  251. name: systemName,
  252. type: 'bar',
  253. data: seriesData,
  254. });
  255. });
  256. return series;
  257. },
  258. queryCharts () {
  259. this.onDateTypeSwitch(this.dateType);
  260. this.onSubSysDateTypeSwitch(this.dateType);
  261. this.getRealTimeAlarm();
  262. },
  263. async getRealTimeAlarm () {
  264. let result = [];
  265. const {
  266. code,
  267. rows,
  268. } = await listAlarmInfo({
  269. pageNum: 1,
  270. pageSize: 10,
  271. areaCode: this.areaCode,
  272. alarmStateList: [
  273. ALARM_STATE.new.value, ALARM_STATE.disposing.value,
  274. ],
  275. startRecTime: this.startRecTime,
  276. endRecTime: this.endRecTime,
  277. });
  278. if (ApiCode.SUCCESS === code && rows && rows.length > 0) {
  279. result = rows;
  280. }
  281. this.realTimeTableData = result;
  282. },
  283. async handleCommand (command, data) {
  284. await updateAlarmInfo({
  285. id: data.id,
  286. alarmState: ALARM_STATE[command].value,
  287. });
  288. await this.getRealTimeAlarm();
  289. },
  290. },
  291. };
  292. </script>
  293. <style src="./index.scss" scoped lang="scss" />