areaCheckPlanManagementDept.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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-table-container">
  8. <header>
  9. <div style="position: relative"></div>
  10. <div class="act-search">
  11. <section class="select-box">
  12. <div class="select-box--item">
  13. <span>检查场所/计划名称:</span>
  14. <el-input
  15. v-model="tableQuery.queryParam.keyword"
  16. placeholder="搜索检查场所或计划名称"
  17. class="act-search-input"
  18. clearable
  19. />
  20. </div>
  21. <div class="select-box--item">
  22. <span>状态:</span>
  23. <el-select
  24. v-model="tableQuery.queryParam.status"
  25. placeholder="请选择状态"
  26. clearable
  27. >
  28. <el-option
  29. v-for="item in AREA_CHECK_PLAN_STATUS_OPTIONS"
  30. :key="String(item.value)"
  31. :label="item.label"
  32. :value="item.value"
  33. />
  34. </el-select>
  35. </div>
  36. <div class="select-box--item">
  37. <span>场所所属类别:</span>
  38. <el-select
  39. v-model="tableQuery.queryParam.venueCategory"
  40. placeholder="请选择场所所属类别"
  41. clearable
  42. filterable
  43. >
  44. <el-option
  45. v-for="item in venueCategoryOptions"
  46. :key="item.value"
  47. :label="item.label"
  48. :value="item.value"
  49. />
  50. </el-select>
  51. </div>
  52. <div class="select-box--item">
  53. <span>日期范围:</span>
  54. <el-date-picker
  55. v-model="dateRange"
  56. type="daterange"
  57. range-separator="-"
  58. start-placeholder="开始日期"
  59. end-placeholder="结束日期"
  60. value-format="YYYY-MM-DD"
  61. format="YYYY-MM-DD"
  62. />
  63. </div>
  64. </section>
  65. <section class="search-btn">
  66. <el-button type="primary" @click="handleSearch">查询</el-button>
  67. <el-button @click="handleReset">重置</el-button>
  68. </section>
  69. </div>
  70. </header>
  71. <div class="batch-table">
  72. <BasicTable
  73. ref="basicTableRef"
  74. :tableData="tableData"
  75. :tableConfig="tableConfig"
  76. @update:pageSize="handleSizeChange"
  77. @update:pageNumber="handleCurrentChange"
  78. >
  79. <template #status="scope">
  80. <span>{{ AREA_CHECK_PLAN_STATUS_LABEL[String(scope.row.status)] ?? '-' }}</span>
  81. </template>
  82. <template #needOverallDesc="scope">
  83. <span>{{ scope.row.needOverallDesc === true ? '是' : scope.row.needOverallDesc === false ? '否' : '-' }}</span>
  84. </template>
  85. <template #needInspectedSign="scope">
  86. <span>{{ scope.row.needInspectedSign === true ? '是' : scope.row.needInspectedSign === false ? '否' : '-' }}</span>
  87. </template>
  88. <template #action="scope">
  89. <div class="action-container--div" style="justify-content: left">
  90. <ActionButton text="查看" @click="handleView(scope.row.id)" />
  91. </div>
  92. </template>
  93. </BasicTable>
  94. </div>
  95. </div>
  96. </main>
  97. </div>
  98. </template>
  99. <script setup lang="ts">
  100. import { onMounted, reactive, ref } from 'vue';
  101. import BasicTable from '@/components/BasicTable.vue';
  102. import useTableConfig from '@/hooks/useTableConfigHook';
  103. import ActionButton from '@/components/ActionButton.vue';
  104. import {
  105. TABLE_OPTIONS,
  106. AREA_CHECK_PLAN_TABLE_COLUMNS,
  107. AREA_CHECK_PLAN_STATUS_OPTIONS,
  108. AREA_CHECK_PLAN_STATUS_LABEL,
  109. } from '../areaCheckPlanManagement/configs/tables';
  110. import { useRouter } from 'vue-router';
  111. import type { QueryPageRequest } from '@/types/basic-query';
  112. import type { AreaCheckPlanQuery, AreaCheckPlanRecord } from '../areaCheckPlanManagement/configs/types';
  113. const router = useRouter();
  114. const basicTableRef = ref<InstanceType<typeof BasicTable>>();
  115. const { tableConfig, pagination } = useTableConfig(AREA_CHECK_PLAN_TABLE_COLUMNS, TABLE_OPTIONS);
  116. const allData = ref<AreaCheckPlanRecord[]>([]);
  117. const tableData = ref<AreaCheckPlanRecord[]>([]);
  118. const dateRange = ref<[string, string] | null>(null);
  119. // 场所所属类别选项(可从接口或字典获取,此处预留)
  120. const venueCategoryOptions = ref<Array<{ label: string; value: string }>>([]);
  121. const tableQuery = reactive<QueryPageRequest<AreaCheckPlanQuery>>({
  122. pageNumber: pagination.pageNumber,
  123. pageSize: pagination.pageSize,
  124. queryParam: {
  125. keyword: '',
  126. status: '' as AreaCheckPlanQuery['status'],
  127. venueCategory: '',
  128. planStartTime: '',
  129. planEndTime: '',
  130. },
  131. });
  132. const handleSizeChange = (value: number) => {
  133. pagination.pageSize = value;
  134. tableQuery.pageSize = value;
  135. getTableData();
  136. };
  137. const handleCurrentChange = (value: number) => {
  138. pagination.pageNumber = value;
  139. tableQuery.pageNumber = value;
  140. getTableData();
  141. };
  142. /** 主列表假数据(本页面不调用接口,全部使用示例数据) */
  143. const MOCK_LIST: AreaCheckPlanRecord[] = [
  144. {
  145. id: 1,
  146. checkVenue: '18号楼、油库、液氮罐',
  147. status: 1,
  148. venueCategoryName: '各级风险点',
  149. planName: '2025年度生产安全检查计划',
  150. mainDeptName: '试验验证中心、质量管理部',
  151. selfCheckFrequency: '每日',
  152. mainDeptExecutorGroupName: '自查小分队分组',
  153. mainDeptResponsiblePerson: '孙菲、周萍',
  154. safetyEmergencyDeptName: '安全应急部',
  155. safetyEmergencyCheckFrequency: '每周',
  156. safetyEmergencyExecutorGroupName: '安全应急部小分队分组',
  157. safetyEmergencyResponsiblePerson: '李雪峰',
  158. hospitalLeaderDeptName: '院领导',
  159. hospitalLeaderCheckFrequency: '每季度',
  160. hospitalLeaderExecutorGroupName: '领导小分队执行组',
  161. hospitalLeaderResponsiblePerson: '孙菲亚',
  162. checklistCategoryName: '安全管理检查单',
  163. checklistTemplateName: '上飞院安全检查表',
  164. needOverallDesc: true,
  165. needInspectedSign: true,
  166. planStartTime: '2019-03-28',
  167. planEndTime: '2019-03-28',
  168. },
  169. ];
  170. function getTableData() {
  171. tableConfig.loading = true;
  172. try {
  173. let list = allData.value.slice();
  174. const { keyword, status, venueCategory, planStartTime, planEndTime } = tableQuery.queryParam;
  175. if (keyword && keyword.trim()) {
  176. const kw = keyword.trim().toLowerCase();
  177. list = list.filter(
  178. (row) =>
  179. (row.checkVenue || '').toLowerCase().includes(kw) ||
  180. (row.planName || '').toLowerCase().includes(kw),
  181. );
  182. }
  183. if (status !== '' && status !== undefined && status !== null) {
  184. list = list.filter((row) => String(row.status) === String(status));
  185. }
  186. if (venueCategory && venueCategory.trim()) {
  187. const vc = venueCategory.trim().toLowerCase();
  188. list = list.filter((row) => (row.venueCategoryName || '').toLowerCase().includes(vc));
  189. }
  190. if (planStartTime) {
  191. list = list.filter((row) => !row.planStartTime || row.planStartTime >= planStartTime);
  192. }
  193. if (planEndTime) {
  194. list = list.filter((row) => !row.planEndTime || row.planEndTime <= planEndTime);
  195. }
  196. pagination.total = list.length;
  197. const start = (tableQuery.pageNumber - 1) * tableQuery.pageSize;
  198. tableData.value = list.slice(start, start + tableQuery.pageSize);
  199. } finally {
  200. tableConfig.loading = false;
  201. }
  202. }
  203. const handleSearch = () => {
  204. if (dateRange.value && dateRange.value.length === 2) {
  205. tableQuery.queryParam.planStartTime = dateRange.value[0];
  206. tableQuery.queryParam.planEndTime = dateRange.value[1];
  207. } else {
  208. tableQuery.queryParam.planStartTime = '';
  209. tableQuery.queryParam.planEndTime = '';
  210. }
  211. pagination.pageNumber = 1;
  212. tableQuery.pageNumber = 1;
  213. getTableData();
  214. };
  215. const handleReset = () => {
  216. tableQuery.queryParam.keyword = '';
  217. tableQuery.queryParam.status = '';
  218. tableQuery.queryParam.venueCategory = '';
  219. tableQuery.queryParam.planStartTime = '';
  220. tableQuery.queryParam.planEndTime = '';
  221. dateRange.value = null;
  222. handleSearch();
  223. };
  224. const handleView = (id: number) => {
  225. router.push({
  226. name: 'areaCheckPlanManagementDeptItem',
  227. query: {
  228. id,
  229. operate: 'area-check-plan-dept-view',
  230. },
  231. });
  232. };
  233. onMounted(() => {
  234. allData.value = [...MOCK_LIST];
  235. venueCategoryOptions.value = [
  236. { label: '各级风险点', value: '各级风险点' },
  237. { label: '关键业务活动', value: '关键业务活动' },
  238. { label: '日常安全', value: '日常安全' },
  239. ];
  240. getTableData();
  241. });
  242. </script>
  243. <style scoped lang="scss">
  244. @use '@/styles/page-details-layout.scss' as *;
  245. @use '@/styles/page-main-layout.scss' as *;
  246. @use '@/styles/basic-table-action.scss' as *;
  247. @use '@/views/traffic/violation/style/act-search-table.scss' as *;
  248. </style>