index.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <!-- eslint-disable vue/multi-word-component-names -->
  2. <template>
  3. <!-- 新增Tabs组件区分实时/历史数据 -->
  4. <Tabs v-model:activeKey="activeTab" type="line" class="common-page-tabs">
  5. <TabPane tab="实时分析" key="realtime">
  6. <div class="board-info">
  7. <MiniBoard
  8. v-for="(item, index) in boardData"
  9. :key="index"
  10. type="A"
  11. :label="item.label"
  12. :value="item.value"
  13. layout="label-top"
  14. class="board-item"
  15. />
  16. </div>
  17. <!-- 实时数据表格 -->
  18. <BasicTable @register="registerRealtimeTable" :scroll="{ x: 'max-content' }" :style="{ padding: 0 }">
  19. <!-- 核心:判断record是否有有效数据,无则显示- -->
  20. <template #action="{ record }">
  21. <div class="action-buttons">
  22. <button @click="openModal(record)" class="action-btn resolved-btn" title="解决">
  23. <SvgIcon name="details" />
  24. </button>
  25. <button @click="handleGoToPageQuery(record, '/warningAnalysis/connectAnalysis')" class="action-btn" title="智能分析数据">
  26. <SvgIcon name="chart" />
  27. </button>
  28. </div>
  29. </template>
  30. <template #resetBefore>
  31. <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="onExportXlsTime"> 导出 </a-button>
  32. </template>
  33. <template #empty>
  34. <!-- 无数据时显示-,样式居中对齐 -->
  35. <span class="empty-placeholder">-</span>
  36. </template>
  37. </BasicTable>
  38. </TabPane>
  39. <TabPane tab="历史数据" key="history">
  40. <!-- 历史数据表格 -->
  41. <BasicTable @register="registerHistoryTable" :scroll="{ x: 'max-content' }" :style="{ padding: 0 }">
  42. <template #action="{ record }">
  43. <div class="action-buttons">
  44. <button @click="handleGoToPageQuery(record, '/warningAnalysis/connectAnalysis')" class="action-btn" title="智能分析数据">
  45. <SvgIcon name="chart" />
  46. </button>
  47. </div>
  48. </template>
  49. <template #resetBefore>
  50. <a-button type="default" class="ml-8px" preIcon="mdi:download" @click="onExportXls"> 导出 </a-button>
  51. </template>
  52. <template #form-goaf-select>
  53. <a-select v-model:value="goafId" :options="goafOptions" placeholder="请选择" @change="historyTable.reload" />
  54. </template>
  55. </BasicTable>
  56. </TabPane>
  57. </Tabs>
  58. <!-- 弹窗组件 -->
  59. <RealtimeDetailsModal title="密闭爆炸危险性判定详情" :width="1000" :modal-details-data="modalDetailsData" @register="registerRealtimeModal" />
  60. </template>
  61. <script setup lang="ts">
  62. import { ref } from 'vue';
  63. import { BasicTable } from '/@/components/Table';
  64. import { Tabs, TabPane } from 'ant-design-vue';
  65. import MiniBoard from '/@/components/Configurable/detail/MiniBoard.vue';
  66. import { SvgIcon } from '/@/components/Icon';
  67. // 引入模拟数据
  68. import { columns, modalDetailsData } from './sealRiskJudgeAnalysis.data';
  69. import { getProvinceAlarm, getProvinceAlarmHistory, getProvinceAlarmNum } from './sealRiskJudge.api';
  70. import RealtimeDetailsModal from '/@/views/monitor/sealedMonitor/components/RealtimeDetailsModal.vue';
  71. // import { useIntervalFn } from '@vueuse/core';
  72. import { useModal } from '/@/components/Modal';
  73. import { useInitForm } from '../../common/analysis';
  74. import { historicalFormSchema } from '/@/views/monitor/sealedMonitor/monitor.data';
  75. import { useListPage } from '/@/hooks/system/useListPage';
  76. import { advancedRoutePush } from '/@/utils';
  77. // 激活的Tab页签
  78. const activeTab = ref('realtime');
  79. const { goafOptions, goafId, hiscode, initGoafOptions } = useInitForm();
  80. const boardData = ref([
  81. {
  82. label: '存在风险情况数量',
  83. value: '-',
  84. },
  85. {
  86. label: '低风险',
  87. value: '-',
  88. },
  89. {
  90. label: '一般风险',
  91. value: '-',
  92. },
  93. {
  94. label: '较高风险',
  95. value: '-',
  96. },
  97. {
  98. label: '高风险',
  99. value: '-',
  100. },
  101. ]);
  102. const wrappedGetMineData = (params) => {
  103. // 调用原接口
  104. return Promise.all([getAlarmTotalData(params), getProvinceAlarm(params)]).then(([__, res]) => res);
  105. };
  106. // 注册实时数据表格
  107. const { tableContext: ctxRealtime, onExportXls: onExportXlsTime } = useListPage({
  108. tableProps: {
  109. columns,
  110. api: wrappedGetMineData,
  111. formConfig: {
  112. labelWidth: 120,
  113. schemas: [
  114. {
  115. label: '煤矿名称',
  116. field: 'deptId',
  117. component: 'MineCascader', // 自定义组件名
  118. colProps: { span: 6 },
  119. rules: [],
  120. },
  121. ],
  122. showAdvancedButton: false,
  123. schemaGroupNames: ['常规查询'],
  124. },
  125. pagination: true,
  126. striped: true,
  127. useSearchForm: true,
  128. bordered: true,
  129. showIndexColumn: false,
  130. actionColumn: {
  131. width: 80,
  132. title: '详情',
  133. dataIndex: 'action',
  134. slots: { customRender: 'action' },
  135. fixed: undefined,
  136. },
  137. },
  138. exportConfig: {
  139. url: '/ventanaly-province/province/alarm/exportProvinceAlarmReal',
  140. name: '密闭爆炸危险性判定',
  141. params: {
  142. alarmType: 'explosionAlarm',
  143. },
  144. },
  145. });
  146. const [registerRealtimeTable] = ctxRealtime;
  147. // 注册历史数据表格
  148. const { tableContext, onExportXls } = useListPage({
  149. tableProps: {
  150. columns,
  151. // columns: historyColumns,
  152. api: async (params) => {
  153. await initGoafOptions(params.deptId);
  154. if (!goafId.value) {
  155. return Promise.resolve([]);
  156. }
  157. params.goafId = goafId.value;
  158. return getProvinceAlarmHistory(params);
  159. },
  160. formConfig: {
  161. model: { deptId: hiscode },
  162. labelWidth: 120,
  163. schemas: [
  164. // {
  165. // label: '开始时间',
  166. // field: 'startTime',
  167. // component: 'DatePicker',
  168. // defaultValue: dayjs().add(-30, 'day').format('YYYY-MM-DD HH:mm:ss'),
  169. // componentProps: {
  170. // showTime: true,
  171. // placeholder: '请选择开始时间',
  172. // valueFormat: 'YYYY-MM-DD HH:mm:ss',
  173. // },
  174. // colProps: { span: 6 },
  175. // rules: [{ required: true, message: '请选择开始时间' }],
  176. // },
  177. // {
  178. // label: '结束时间',
  179. // field: 'endTime',
  180. // component: 'DatePicker',
  181. // defaultValue: dayjs(),
  182. // componentProps: {
  183. // showTime: true,
  184. // placeholder: '请选择结束时间',
  185. // valueFormat: 'YYYY-MM-DD HH:mm:ss',
  186. // },
  187. // colProps: { span: 6 },
  188. // rules: [{ required: true, message: '请选择结束时间' }],
  189. // },
  190. {
  191. label: '煤矿名称',
  192. field: 'deptId',
  193. component: 'MineCascader', // 自定义组件名
  194. componentProps: {
  195. initFromStore: false,
  196. syncToStore: false,
  197. changeOnSelect: false,
  198. // onChange: (e) => {
  199. // historyTable.setLoading(true);
  200. // initGoafOptions(e).finally(() => {
  201. // historyTable.setLoading(false);
  202. // });
  203. // },
  204. },
  205. colProps: { span: 6 },
  206. rules: [],
  207. },
  208. ...historicalFormSchema,
  209. ],
  210. showAdvancedButton: false,
  211. schemaGroupNames: ['常规查询'],
  212. },
  213. pagination: true,
  214. striped: true,
  215. useSearchForm: true,
  216. bordered: true,
  217. showIndexColumn: true,
  218. // showActionColumn: false,
  219. },
  220. exportConfig: {
  221. url: '/province/alarm/exportProvinceAlarmHistory',
  222. name: '历史数据',
  223. params: {
  224. alarmType: 'explosionAlarm',
  225. goafId,
  226. },
  227. },
  228. });
  229. const [registerHistoryTable, historyTable] = tableContext;
  230. // 弹窗引用
  231. const [registerRealtimeModal, { openModal: openRealtimeModal }] = useModal();
  232. // 打开弹窗方法(区分实时/历史)
  233. const openModal = (record) => {
  234. openRealtimeModal(true, record);
  235. // pause();
  236. };
  237. async function getAlarmTotalData(p) {
  238. const params = {
  239. ...p,
  240. alarmType: 'explosionAlarm',
  241. };
  242. const result = await getProvinceAlarmNum(params);
  243. boardData.value[1].value = result.alarmLevel1;
  244. boardData.value[2].value = result.alarmLevel2;
  245. boardData.value[3].value = result.alarmLevel3;
  246. boardData.value[4].value = result.alarmLevel4;
  247. boardData.value[0].value = result.alarmLevel1 + result.alarmLevel2 + result.alarmLevel3 + result.alarmLevel4;
  248. }
  249. /**
  250. * 通用页面跳转方法
  251. * @param record 当前行数据
  252. * @param path 目标路径
  253. */
  254. function handleGoToPageQuery(record: any, path: string) {
  255. advancedRoutePush({
  256. path,
  257. query: { deptId: record.deptId, goafId: record.goafId, filter: 'coVal,ch4Val,c2h2Val,c2h4Val,o2Val' },
  258. });
  259. }
  260. // const { pause, resume } = useIntervalFn(() => reload({ silence: true }), 60000);
  261. </script>
  262. <style lang="less" scoped>
  263. @import url(../../common/board.less);
  264. </style>