list.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <div class="safety-platform-container">
  3. <header class="safety-platform-container__header">
  4. <div class="breadcrumb-title"> 危险源清单管理 </div>
  5. </header>
  6. <main class="safety-platform-container__main">
  7. <div class="search-form">
  8. <el-form :inline="true">
  9. <el-form-item label="搜索">
  10. <el-input
  11. v-model="queryParams.queryParam.keyProcessUnit"
  12. placeholder="搜索关键过程/作业单元"
  13. style="width: 170px"
  14. />
  15. </el-form-item>
  16. <el-form-item label="状态">
  17. <el-select v-model="queryParams.queryParam.status" clearable placeholder="状态" style="width: 170px">
  18. <el-option value="" label="全部" />
  19. <el-option :value="1" label="正常" />
  20. <el-option :value="2" label="待确认" />
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="部门名称">
  24. <el-cascader
  25. v-model="queryParams.queryParam.responsibleDepartmentId"
  26. style="width: 170px"
  27. ref="cascaderRef"
  28. :options="firstLevelDepts"
  29. :props="cascaderProp"
  30. :show-all-levels="false"
  31. placeholder="部门名称"
  32. filterable
  33. @change="handleChangeDept"
  34. />
  35. </el-form-item>
  36. <el-form-item label="固有风险等级">
  37. <el-select
  38. v-model="queryParams.queryParam.inherentRiskLevel"
  39. clearable
  40. placeholder="固有风险等级"
  41. style="width: 170px"
  42. >
  43. <el-option :value="1" label="B" />
  44. <el-option :value="2" label="C" />
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item label="控制风险等级">
  48. <el-select
  49. v-model="queryParams.queryParam.controlRiskLevel"
  50. clearable
  51. placeholder="控制风险等级"
  52. style="width: 170px"
  53. >
  54. <el-option value="D" label="D" />
  55. </el-select>
  56. </el-form-item>
  57. </el-form>
  58. <div>
  59. <el-button type="primary" @click="$router.push({ name: 'hazardManageAdd' })">添加 </el-button>
  60. <el-button type="primary" @click="queryTableList">查询</el-button>
  61. <el-button @click="handleRestParams">重置</el-button>
  62. </div>
  63. </div>
  64. <div class="table-content">
  65. <el-table :data="tableData.data">
  66. <el-table-column type="index" label="序号" width="80" />
  67. <el-table-column label="危险源编号" prop="hazardCode" width="180" />
  68. <el-table-column label="关键过程/作业单元" prop="keyProcessUnit" width="180" />
  69. <el-table-column label="危险源名称" prop="hazardName" width="180" />
  70. <el-table-column label="是否重大危险" prop="isMajorHazard" width="180" />
  71. <el-table-column label="危险源来源" prop="hazardSource" width="180" />
  72. <el-table-column label="涉及型号" prop="involvedDepartment" width="180" />
  73. <el-table-column label="危险源管理的主责单位/部门" prop="riskManagementDept" width="240" />
  74. <el-table-column label="状态" prop="statusName" width="80" />
  75. <el-table-column label="变更原因" prop="changeReason" width="120" />
  76. <el-table-column fixed="right" min-width="240" label="操作">
  77. <template #default="scope">
  78. <el-button
  79. type="primary"
  80. link
  81. @click="$router.push({ name: 'hazardManageEdit', query: { id: scope.row.id } })"
  82. >编辑</el-button
  83. >
  84. <el-button type="primary" link @click="handleConfirmDeleteRow(scope)">删除</el-button>
  85. <el-button
  86. type="primary"
  87. link
  88. @click="$router.push({ name: 'hazardManageView', query: { id: scope.row.id } })"
  89. >查看</el-button
  90. >
  91. <el-button
  92. type="primary"
  93. link
  94. @click="$router.push({ name: 'hazardManageCreatePlan', query: { id: scope.row.id } })"
  95. >创建计划和方案</el-button
  96. >
  97. </template>
  98. </el-table-column>
  99. </el-table>
  100. </div>
  101. <div class="pagination-container" v-if="tableData.total > 0">
  102. <el-pagination
  103. background
  104. :current-page="queryParams.pageNumber"
  105. :page-size="queryParams.pageSize"
  106. :total="tableData.total"
  107. @size-change="handleSizeChange"
  108. @current-change="handleCurrentChange"
  109. />
  110. </div>
  111. </main>
  112. </div>
  113. </template>
  114. <script lang="ts" setup>
  115. import { onMounted, reactive, ref } from 'vue';
  116. import { ElMessage } from 'element-plus';
  117. import { useRouter } from 'vue-router';
  118. import {
  119. safetyHazardInventoryQueryPage,
  120. safetyHazardInventoryDelete,
  121. safetyRiskListApprove,
  122. } from '@/api/production-safety/responsibility-implementation';
  123. import { omit } from 'lodash-es';
  124. import { useUserInfoHook } from '@/hooks/useUserInfoHook';
  125. import { unformatAttachment } from '@/components/UploadFiles/utils';
  126. import { downloadFile } from '@/views/disaster/utils';
  127. import { formatDeptTree } from '@/views/disaster/utils/formatDeptTree';
  128. import { getAllDepartments } from '@/api/auth/dept';
  129. const router = useRouter();
  130. const { id } = useUserInfoHook();
  131. const firstLevelDepts = ref<any[]>([]);
  132. const cascaderProp = {
  133. expandTrigger: 'click',
  134. checkStrictly: true,
  135. // emitPath: false,
  136. value: 'id',
  137. label: 'deptName',
  138. };
  139. const queryParams = reactive<any>({
  140. pageNumber: 1,
  141. pageSize: 10,
  142. queryParam: {
  143. keyProcessUnit: '',
  144. status: '',
  145. inherentRiskLevel: '',
  146. controlRiskLevel: '',
  147. riskManagementDept: '',
  148. userId: id,
  149. responsibleDepartmentId: [],
  150. },
  151. });
  152. const cascaderRef = ref();
  153. const tableData = reactive({
  154. data: [],
  155. total: 0,
  156. });
  157. const handleSizeChange = (value) => {};
  158. const handleCurrentChange = (value) => {
  159. queryParams.pageNumber = value;
  160. queryTableList();
  161. };
  162. const getDeptData = () => {
  163. getAllDepartments().then((res) => {
  164. firstLevelDepts.value = formatDeptTree(res);
  165. });
  166. };
  167. const handleChangeDept = () => {
  168. const deptInfo = cascaderRef.value?.getCheckedNodes();
  169. if (deptInfo?.[0]) {
  170. queryParams.queryParam.responsibleDepartment = deptInfo[0].label;
  171. }
  172. };
  173. const handleApprove = (scope, approveType) => {
  174. safetyRiskListApprove({
  175. id: scope.row.id,
  176. approveType,
  177. }).then(() => {
  178. ElMessage.success('操作成功!');
  179. queryTableList();
  180. });
  181. };
  182. const handleDownloadLink = (scope) => {
  183. const attachment = unformatAttachment(scope.row.attachment);
  184. attachment?.forEach((item: any) => {
  185. downloadFile(item.fileUrl, item.fileName);
  186. });
  187. };
  188. const handleConfirmDeleteRow = (scope) => {
  189. safetyHazardInventoryDelete(scope.row.id).then(() => {
  190. ElMessage.success('删除成功!');
  191. queryTableList();
  192. });
  193. };
  194. const queryTableList = () => {
  195. safetyHazardInventoryQueryPage({
  196. ...queryParams,
  197. queryParam: {
  198. ...omit(queryParams.queryParam, 'responsibleDepartmentId'),
  199. },
  200. }).then((res) => {
  201. tableData.data = res.records;
  202. tableData.total = res.totalRow;
  203. });
  204. };
  205. const handleRestParams = () => {
  206. Object.assign(queryParams, {
  207. pageNumber: 1,
  208. pageSize: 10,
  209. queryParam: {
  210. ...queryParams.queryParam,
  211. keyProcessUnit: '',
  212. status: '',
  213. inherentRiskLevel: '',
  214. controlRiskLevel: '',
  215. riskManagementDept: '',
  216. userId: id,
  217. responsibleDepartmentId: [],
  218. },
  219. });
  220. queryTableList();
  221. };
  222. onMounted(async () => {
  223. await getDeptData();
  224. queryTableList();
  225. });
  226. </script>
  227. <style lang="scss" scoped>
  228. @use '@/styles/page-details-layout.scss' as *;
  229. @use '@/styles/page-main-layout.scss' as *;
  230. @use '@/styles/basic-table-action.scss' as *;
  231. :deep(.el-tabs__header) {
  232. margin: 0;
  233. }
  234. :deep(.el-tabs__item) {
  235. font-size: 14px !important;
  236. }
  237. :deep(.flexContent) {
  238. display: flex;
  239. }
  240. :deep(.breadcrumb .title) {
  241. margin-left: 0;
  242. }
  243. :deep(.el-form) {
  244. flex: 1;
  245. display: flex;
  246. row-gap: 15px;
  247. flex-wrap: wrap;
  248. }
  249. :deep(.el-form-item) {
  250. margin-bottom: 0;
  251. }
  252. :deep(main) {
  253. display: flex;
  254. flex-direction: column;
  255. }
  256. .search-form {
  257. min-width: 800px;
  258. display: flex;
  259. justify-content: space-between;
  260. align-items: center;
  261. margin-bottom: 20px;
  262. }
  263. .button-content {
  264. margin-bottom: 20px;
  265. }
  266. .table-content {
  267. flex: 1;
  268. overflow: hidden;
  269. overflow-y: auto;
  270. }
  271. .page-content {
  272. display: flex;
  273. justify-content: flex-end;
  274. }
  275. </style>