AccessControl.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. <!-- 按钮 -->
  10. <el-button
  11. v-if="managementPermission"
  12. type="primary"
  13. class="search-table-container--button"
  14. :icon="Plus"
  15. @click="handleCreateRecord"
  16. >
  17. 新建门禁事件
  18. </el-button>
  19. <div class="table-search">
  20. <section class="select-box">
  21. <SelectableInput ref="selectableInputRef" :options="ACCESS_TABLE_SEARCH_OPTIONS" />
  22. <div class="select-box--item">
  23. <span>时间:</span>
  24. <el-date-picker
  25. v-model="searchTime"
  26. type="datetimerange"
  27. range-separator="至"
  28. start-placeholder="开始时间"
  29. end-placeholder="结束时间"
  30. value-format="YYYY-MM-DD HH:mm:ss"
  31. />
  32. </div>
  33. </section>
  34. <section class="search-btn">
  35. <el-button type="primary" @click="handleSearch">查询</el-button>
  36. <el-button @click="handleReset">重置</el-button>
  37. <el-button @click="handleDownload">导出</el-button>
  38. </section>
  39. </div>
  40. </header>
  41. <!-- 表格 -->
  42. <BasicTable
  43. ref="basicTableRef"
  44. :tableData="tableData"
  45. :tableConfig="tableConfig"
  46. @update:pageSize="handleSizeChange"
  47. @update:pageNumber="handleCurrentChange"
  48. >
  49. <template #images="scope">
  50. <ImageViewer :file-list="scope.row.images" />
  51. </template>
  52. <template #actions="scope">
  53. <ActionButton text="编辑" @click="handleEditRecord(scope.row.id)" />
  54. <ActionButton
  55. text="删除"
  56. :popconfirm="{
  57. title: '确定要删除?',
  58. }"
  59. @confirm="handleDeleteRecord(scope.row.id)"
  60. />
  61. </template>
  62. </BasicTable>
  63. </div>
  64. </main>
  65. </div>
  66. </template>
  67. <script setup lang="ts">
  68. import BasicTable from '@/components/BasicTable.vue';
  69. import useTableConfig from '@/hooks/useTableConfigHook';
  70. import ActionButton from '@/components/ActionButton.vue';
  71. import SelectableInput from '@/components/formItems/selectableInput/SelectableInput.vue';
  72. import ImageViewer from '@/views/traffic/violation/act/components/ImageViewer.vue';
  73. import { useRouter } from 'vue-router';
  74. import { ref, reactive, onMounted } from 'vue';
  75. import { Plus } from '@element-plus/icons-vue';
  76. import { ElMessage } from 'element-plus';
  77. import { downloadFile } from '@/views/disaster/utils';
  78. import { useUserInfoHook } from '@/hooks/useUserInfoHook';
  79. import {
  80. getAccessRecordList,
  81. exportAccessRecordList,
  82. deleteAccessRecord,
  83. } from '@/api/security-confidentiality-access';
  84. import { ACCESS_MANAGEMENT_PERMISSION, ACCESS_TABLE_SEARCH_OPTIONS } from './constants';
  85. import { TABLE_OPTIONS, ACCESS_TABEL_COLUMNS, ACCESS_TABEL_COLUMNS_CHECKONLY } from './configs/tables';
  86. import type { AccessDetailResponse, AccessTableQuery } from './types';
  87. import type { QueryPageRequest } from '@/types/basic-query';
  88. import dayjs from 'dayjs';
  89. const { permissions } = useUserInfoHook();
  90. const managementPermission = ref<Boolean>(
  91. !Boolean(permissions.find((item: { code: string }) => item.code === ACCESS_MANAGEMENT_PERMISSION)),
  92. );
  93. const router = useRouter();
  94. const handleCreateRecord = () => {
  95. router.push({
  96. name: 'security-confidentiality-access-control-item',
  97. query: {
  98. operate: 'access-create',
  99. },
  100. });
  101. };
  102. const searchTime = ref<string[]>();
  103. const selectableInputRef = ref<InstanceType<typeof SelectableInput>>();
  104. function getQuery() {
  105. const selectableSearch = selectableInputRef.value?.getValue();
  106. tableQuery.queryParam = {
  107. fieldType: selectableSearch?.key as number | null,
  108. fieldContent: selectableSearch?.value,
  109. };
  110. if (searchTime.value) {
  111. tableQuery.queryParam.startTime = searchTime.value[0];
  112. tableQuery.queryParam.endTime = searchTime.value[1];
  113. }
  114. }
  115. async function getTableData() {
  116. tableConfig.loading = true;
  117. const res = await getAccessRecordList(tableQuery);
  118. tableData.value = res.records;
  119. pagination.total = res.totalRow;
  120. tableConfig.loading = false;
  121. }
  122. function handleSearch() {
  123. getQuery();
  124. getTableData();
  125. }
  126. function handleReset() {
  127. selectableInputRef.value?.clearValue();
  128. for (const key in tableQuery.queryParam) {
  129. if (tableQuery.queryParam.hasOwnProperty(key)) {
  130. tableQuery.queryParam[key] = undefined;
  131. }
  132. }
  133. searchTime.value = [];
  134. handleSearch();
  135. }
  136. async function handleDownload() {
  137. getQuery();
  138. try {
  139. const res = await exportAccessRecordList(tableQuery.queryParam);
  140. if (res.size === 0) return;
  141. const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  142. const url = window.URL.createObjectURL(blob);
  143. downloadFile(url, '内部人员门禁出入记录.xlsx');
  144. } catch (e) {
  145. ElMessage.error('下载失败');
  146. console.log(e);
  147. }
  148. }
  149. // 表格
  150. const { tableConfig, pagination } = useTableConfig(
  151. managementPermission.value ? ACCESS_TABEL_COLUMNS : ACCESS_TABEL_COLUMNS_CHECKONLY,
  152. TABLE_OPTIONS,
  153. );
  154. const tableData = ref<AccessDetailResponse[]>([]);
  155. const tableQuery = reactive<QueryPageRequest<AccessTableQuery>>({
  156. pageNumber: pagination.pageNumber,
  157. pageSize: pagination.pageSize,
  158. queryParam: {},
  159. });
  160. const handleSizeChange = (value: number) => {
  161. pagination.pageSize = value;
  162. tableQuery.pageSize = value;
  163. getTableData();
  164. };
  165. const handleCurrentChange = (value: number) => {
  166. pagination.pageNumber = value;
  167. tableQuery.pageNumber = value;
  168. getTableData();
  169. };
  170. const handleEditRecord = (id: number) => {
  171. router.push({
  172. name: 'security-confidentiality-access-control-item',
  173. query: {
  174. operate: 'access-edit',
  175. id,
  176. },
  177. });
  178. };
  179. const handleDeleteRecord = async (id: number) => {
  180. try {
  181. await deleteAccessRecord(id);
  182. ElMessage.success('删除成功');
  183. } catch (e) {
  184. ElMessage.error('删除失败');
  185. }
  186. getTableData();
  187. };
  188. onMounted(() => {
  189. handleSearch();
  190. });
  191. </script>
  192. <style scoped lang="scss">
  193. @use '@/styles/page-details-layout.scss' as *;
  194. @use '@/styles/page-main-layout.scss' as *;
  195. @use '@/styles/basic-table-action.scss' as *;
  196. .table-search {
  197. display: flex;
  198. align-items: flex-end;
  199. justify-content: space-between;
  200. width: 100%;
  201. }
  202. .select-box {
  203. display: flex;
  204. align-items: center;
  205. flex-wrap: wrap;
  206. gap: 20px;
  207. &--item {
  208. @include flex-center;
  209. white-space: nowrap;
  210. }
  211. span {
  212. color: rgba(0, 0, 0, 0.85);
  213. font-size: 14px;
  214. }
  215. .el-select {
  216. width: 200px;
  217. }
  218. }
  219. .search-btn {
  220. display: flex;
  221. }
  222. </style>