index.vue 7.7 KB

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