PageProcedure.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <template>
  2. <div class="safety-platform-container">
  3. <div class="safety-platform-container__header">
  4. <div class="breadcrumb-title">应急处置</div>
  5. </div>
  6. <div class="safety-platform-container__main">
  7. <div class="search-table-container">
  8. <header class="disaster-precaution__header">
  9. <el-button
  10. type="danger"
  11. size="large"
  12. class="search-table-container--button start-event-btn"
  13. v-if="emergencyProcedureManagePermission"
  14. @click="handleAddEmergencyEvent"
  15. >
  16. <template #icon>
  17. <SvgIcon iconName="start-emergency-event" color="#fff" />
  18. </template>
  19. <span class="start-event-btn-text">启动应急事件</span>
  20. </el-button>
  21. <BasicSearch
  22. :searchConfig="PROCEDURE_LIST_SEARCH_CONFIG"
  23. :searchData="searchData"
  24. @update:search-data="handleSearch"
  25. >
  26. <template #emergencyType>
  27. <el-select v-model="searchData.emergencyType" placeholder="全部" clearable>
  28. <el-option
  29. v-for="item in emergencyEventDice"
  30. :key="item.itemCode"
  31. :label="item.itemValue"
  32. :value="item.itemValue"
  33. />
  34. </el-select>
  35. </template>
  36. </BasicSearch>
  37. </header>
  38. <BasicTable
  39. :tableData="tableData"
  40. :tableConfig="tableConfig"
  41. @update:page-number="handleCurrentPageChange"
  42. @update:page-size="handlePageSizeChange"
  43. >
  44. <template #status="scope">
  45. <span :style="{ color: scope.row.status === EMERGENCY_PROCEDURE_STATUS.INPROGRESS ? 'red' : '' }">
  46. {{ getEmergencyStatus(scope.row.status) }}
  47. </span>
  48. </template>
  49. <template #action="scope">
  50. <div class="action-container--div" v-if="scope.row.status === EMERGENCY_PROCEDURE_STATUS.INPROGRESS">
  51. <ActionButton
  52. text="指挥中心"
  53. @click="handleOpenCommandCenter(scope.row)"
  54. v-if="emergencyCommandCenterManagePermission"
  55. />
  56. <ActionButton
  57. text="修改"
  58. @click="handleEditEmergencyEvent(scope.row)"
  59. v-if="emergencyProcedureManagePermission"
  60. />
  61. <ActionButton
  62. text="处置完成"
  63. @click="handleFinishEmergencyEvent(scope.row)"
  64. v-if="emergencyProcedureCompletePermission"
  65. />
  66. <ActionButton
  67. text="关闭"
  68. :popconfirm="{
  69. title: '是否关闭应急事件?',
  70. }"
  71. @confirm="handleCloseEmergencyEvent(scope.row)"
  72. v-if="emergencyProcedureManagePermission"
  73. />
  74. </div>
  75. <div class="action-container--div" v-if="scope.row.status === EMERGENCY_PROCEDURE_STATUS.HASFINISHED">
  76. <ActionButton text="应急报表" @click="handleOpenEmergencyReport(scope.row)" />
  77. </div>
  78. </template>
  79. </BasicTable>
  80. </div>
  81. </div>
  82. </div>
  83. <EmergencyEventManage
  84. v-if="emergencyEventManageDialog"
  85. :dialog-type="emergencyEventManageType"
  86. :event-type-options="emergencyEventDice"
  87. :original-event-form="originalEventForm"
  88. @close="handleCloseEmergencyEventManageDialog"
  89. @confirm="handleConfirmEmergencyEventManageDialog"
  90. />
  91. </template>
  92. <script setup lang="ts">
  93. import { onMounted, reactive, ref } from 'vue';
  94. import { useRouter } from 'vue-router';
  95. import { ElMessage } from 'element-plus';
  96. import SvgIcon from '@/components/SvgIcon/SvgIcon.vue';
  97. import BasicSearch from '@/components/BasicSearch.vue';
  98. import BasicTable from '@/components/BasicTable.vue';
  99. import ActionButton from '@/components/ActionButton.vue';
  100. import type { QueryPageRequest } from '@/types/basic-query';
  101. import useTableConfig from '@/hooks/useTableConfigHook';
  102. import { useUserInfoHook } from '@/hooks/useUserInfoHook';
  103. import { EMERGENCY_PERMISSIONS } from '@/views/emergency/src/constant';
  104. import {
  105. PROCEDURE_LIST_SEARCH_CONFIG,
  106. PROCEDURE_LIST_TABLE_MAX_HEIGHT_DEFAULT,
  107. PROCEDURE_LIST_TABLE_MAX_HEIGHT_PERMISSION,
  108. PROCEDURE_LIST_TABLE_OPTIONS,
  109. PROCEDURE_LIST_TABLE_COLUMNS,
  110. } from './config';
  111. import { useEmergencyProcedureHook } from './hooks';
  112. import { EMERGENCY_PROCEDURE_STATUS } from './constant';
  113. import {
  114. ProcedureListQuery,
  115. EmergencyProcedureManageStruct,
  116. getEmergencyProcedureList,
  117. createEmergencyProcedure,
  118. updateEmergencyProcedure,
  119. } from '@/api/emergency-procedure';
  120. import EmergencyEventManage from './components/EmergencyEventManage.vue';
  121. const { tableConfig, pagination } = useTableConfig(PROCEDURE_LIST_TABLE_COLUMNS, PROCEDURE_LIST_TABLE_OPTIONS);
  122. const { emergencyEventDice, getEmergencyEventDict, getEmergencyStatus } = useEmergencyProcedureHook();
  123. const router = useRouter();
  124. const { permissions } = useUserInfoHook();
  125. const emergencyProcedureManagePermission = ref<Boolean>(false);
  126. const emergencyProcedureCompletePermission = ref<Boolean>(false);
  127. const emergencyCommandCenterManagePermission = ref<Boolean>(false);
  128. const searchData = reactive({
  129. emergencyType: '',
  130. procedureName: '',
  131. procedureStartTime: ['', ''],
  132. status: undefined,
  133. });
  134. const emergencyProcedureQuery: QueryPageRequest<ProcedureListQuery> = {
  135. pageNumber: pagination.pageNumber,
  136. pageSize: pagination.pageSize,
  137. queryParam: {},
  138. };
  139. const tableData = ref<EmergencyProcedureManageStruct[]>([]);
  140. const emergencyEventManageDialog = ref(false);
  141. const emergencyEventManageType = ref('add');
  142. const originalEventForm = ref<EmergencyProcedureManageStruct>();
  143. const handleSearch = () => {
  144. emergencyProcedureQuery.queryParam = {};
  145. if (searchData.emergencyType) {
  146. emergencyProcedureQuery.queryParam.eventType = searchData.emergencyType;
  147. }
  148. if (searchData.procedureName) {
  149. emergencyProcedureQuery.queryParam.eventName = searchData.procedureName;
  150. }
  151. if (searchData.procedureStartTime) {
  152. emergencyProcedureQuery.queryParam.startTimeStart = searchData.procedureStartTime[0];
  153. emergencyProcedureQuery.queryParam.startTimeEnd = searchData.procedureStartTime[1];
  154. }
  155. if (searchData.status) {
  156. emergencyProcedureQuery.queryParam.status = searchData.status;
  157. }
  158. getTableData();
  159. };
  160. // 启动应急事件
  161. const handleAddEmergencyEvent = () => {
  162. emergencyEventManageType.value = 'add';
  163. emergencyEventManageDialog.value = true;
  164. };
  165. // 关闭应急事件管理弹窗
  166. const handleCloseEmergencyEventManageDialog = () => {
  167. emergencyEventManageDialog.value = false;
  168. originalEventForm.value = undefined;
  169. };
  170. // 确认应急事件管理弹窗
  171. const handleConfirmEmergencyEventManageDialog = (form) => {
  172. emergencyEventManageDialog.value = false;
  173. if (emergencyEventManageType.value === 'add') {
  174. createEmergencyProcedure(form).then(() => {
  175. ElMessage({
  176. message: '应急事件启动成功',
  177. type: 'success',
  178. });
  179. getTableData();
  180. originalEventForm.value = undefined;
  181. });
  182. } else {
  183. updateEmergencyProcedure({
  184. id: originalEventForm.value?.id,
  185. ...form,
  186. }).then(() => {
  187. ElMessage({
  188. message: '应急事件修改成功',
  189. type: 'success',
  190. });
  191. getTableData();
  192. originalEventForm.value = undefined;
  193. });
  194. }
  195. };
  196. // 打开指挥中心
  197. const handleOpenCommandCenter = (row) => {
  198. window.open(`/#/large-screen/command-center/${row.id}`, '_blank');
  199. };
  200. // 修改
  201. const handleEditEmergencyEvent = (row) => {
  202. emergencyEventManageType.value = 'edit';
  203. emergencyEventManageDialog.value = true;
  204. originalEventForm.value = row;
  205. };
  206. // 处置完成
  207. const handleFinishEmergencyEvent = (row) => {
  208. router.push({
  209. name: 'emergency-procedure-complete',
  210. params: {
  211. id: row.id,
  212. },
  213. });
  214. };
  215. // 关闭
  216. const handleCloseEmergencyEvent = (row) => {
  217. updateEmergencyProcedure({
  218. id: row.id,
  219. status: EMERGENCY_PROCEDURE_STATUS.HASCLOSED,
  220. }).then(() => {
  221. ElMessage({
  222. message: '应急事件已关闭',
  223. type: 'success',
  224. });
  225. getTableData();
  226. });
  227. };
  228. // 应急报表
  229. const handleOpenEmergencyReport = (row) => {
  230. router.push({
  231. name: 'emergency-procedure-report',
  232. params: {
  233. id: row.id,
  234. },
  235. });
  236. };
  237. const handleCurrentPageChange = (pageNumber: number) => {
  238. pagination.pageNumber = pageNumber;
  239. emergencyProcedureQuery.pageNumber = pageNumber;
  240. getTableData();
  241. };
  242. const handlePageSizeChange = (pageSize: number) => {
  243. pagination.pageSize = pageSize;
  244. emergencyProcedureQuery.pageSize = pageSize;
  245. getTableData();
  246. };
  247. const getTableData = async () => {
  248. tableConfig.loading = true;
  249. const res = await getEmergencyProcedureList(emergencyProcedureQuery);
  250. tableData.value = res?.records || [];
  251. pagination.total = res?.totalRow || 0;
  252. tableConfig.loading = false;
  253. };
  254. onMounted(() => {
  255. getEmergencyEventDict();
  256. getTableData();
  257. // 应急处置-应急事件启动管理权限:增改关
  258. emergencyProcedureManagePermission.value = Boolean(
  259. permissions.find((item: { code: string }) => item.code === EMERGENCY_PERMISSIONS.EMERGENCY_PROCEDURE_MANAGE),
  260. );
  261. // 应急处置-应急处置管理权限:完成
  262. emergencyProcedureCompletePermission.value = Boolean(
  263. permissions.find((item: { code: string }) => item.code === EMERGENCY_PERMISSIONS.EMERGENCY_PROCEDURE_COMPLETE),
  264. );
  265. // 应急处置-应急指挥中心管理权限:打开、编辑
  266. emergencyCommandCenterManagePermission.value = Boolean(
  267. permissions.find((item: { code: string }) => item.code === EMERGENCY_PERMISSIONS.EMERGENCY_COMMAND_CENTER_MANAGE),
  268. );
  269. tableConfig.maxHeight = emergencyProcedureManagePermission.value
  270. ? PROCEDURE_LIST_TABLE_MAX_HEIGHT_PERMISSION
  271. : PROCEDURE_LIST_TABLE_MAX_HEIGHT_DEFAULT;
  272. });
  273. </script>
  274. <style scoped lang="scss">
  275. @use '@/styles/page-main-layout.scss' as *;
  276. @use '@/styles/page-details-layout.scss' as *;
  277. @use '@/styles/basic-table-action.scss' as *;
  278. .el-select {
  279. --el-select-width: 200px !important;
  280. }
  281. .start-event-btn {
  282. padding: 30px 60px;
  283. font-size: 40px;
  284. background-color: #ec2828;
  285. .start-event-btn-text {
  286. font-size: 20px;
  287. }
  288. }
  289. </style>