Visitor.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <div class="search-table-container">
  3. <header>
  4. <div class="table-search">
  5. <section class="select-box">
  6. <SelectableInput ref="selectableInputRef" :options="VISITOR_TABLE_SEARCH_OPTIONS" />
  7. <div class="select-box--item">
  8. <span>是否外籍:</span>
  9. <el-select
  10. style="width: 100px"
  11. v-model="searchData.isForeigner"
  12. placeholder="请选择"
  13. class="select-box--select"
  14. clearable
  15. >
  16. <el-option
  17. v-for="item in IS_FOREIGNER_TYPE_OPTIONS"
  18. :key="item.value"
  19. :value="item.label"
  20. :label="item.label"
  21. :disabled="item.disabled"
  22. />
  23. </el-select>
  24. </div>
  25. <div class="select-box--item">
  26. <span>访问状态:</span>
  27. <el-select
  28. style="width: 100px"
  29. v-model="searchData.visitState"
  30. placeholder="请选择"
  31. class="select-box--select"
  32. clearable
  33. >
  34. <el-option
  35. v-for="item in VISIT_STATE_TYPE_OPTIONS"
  36. :key="item.value"
  37. :value="item.value"
  38. :label="item.label"
  39. :disabled="item.disabled"
  40. />
  41. </el-select>
  42. </div>
  43. <div class="select-box--item">
  44. <span>到达时间:</span>
  45. <el-date-picker v-model="searchData.startTime" type="datetime" />
  46. </div>
  47. <div class="select-box--item">
  48. <span>离开时间:</span>
  49. <el-date-picker v-model="searchData.endTime" type="datetime" />
  50. </div>
  51. </section>
  52. <section class="search-btn">
  53. <el-button type="primary" @click="handleSearch">查询</el-button>
  54. <el-button @click="handleReset">重置</el-button>
  55. <el-button @click="handleDownload">导出</el-button>
  56. </section>
  57. </div>
  58. </header>
  59. <!-- 表格 -->
  60. <BasicTable
  61. ref="basicTableRef"
  62. :tableData="tableData"
  63. :tableConfig="tableConfig"
  64. @update:pageSize="handleSizeChange"
  65. @update:pageNumber="handleCurrentChange"
  66. >
  67. </BasicTable>
  68. </div>
  69. </template>
  70. <script setup lang="ts">
  71. import BasicTable from '@/components/BasicTable.vue';
  72. import useTableConfig from '@/hooks/useTableConfigHook';
  73. import SelectableInput from '@/components/formItems/selectableInput/SelectableInput.vue';
  74. import { onMounted, reactive, ref } from 'vue';
  75. import { QueryPageRequest, QueryPageResponse } from '@/types/basic-query';
  76. import { VisitorTableData, VisitorTableQuery } from '../types';
  77. import { OUTER_PERSON_VISITOR_TABEL_COLUMNS, TABLE_OPTIONS } from '../configs/table';
  78. import { VISITOR_TABLE_SEARCH_OPTIONS, IS_FOREIGNER_TYPE_OPTIONS, VISIT_STATE_TYPE_OPTIONS } from '../constants';
  79. import { exportVisitorList, getVisitorList } from '@/api/security-confidentiality-person/outer-person';
  80. import { ElMessage } from 'element-plus';
  81. import { downloadFile } from '@/views/disaster/utils';
  82. const searchData = reactive<VisitorTableQuery>({});
  83. const { tableConfig, pagination } = useTableConfig(OUTER_PERSON_VISITOR_TABEL_COLUMNS, TABLE_OPTIONS);
  84. const tableData = ref<VisitorTableData[]>([]);
  85. const tableQuery = reactive<QueryPageRequest<VisitorTableQuery>>({
  86. pageNumber: pagination.pageNumber,
  87. pageSize: pagination.pageSize,
  88. queryParam: {},
  89. });
  90. function getQuery() {
  91. tableQuery.queryParam = {
  92. ...searchData,
  93. };
  94. }
  95. async function getTableData() {
  96. tableConfig.loading = true;
  97. const res = await getVisitorList(tableQuery);
  98. tableData.value = res.records;
  99. pagination.total = res.totalRow;
  100. tableConfig.loading = false;
  101. }
  102. const handleSizeChange = (value: number) => {
  103. pagination.pageSize = value;
  104. tableQuery.pageSize = value;
  105. getTableData();
  106. };
  107. const handleCurrentChange = (value: number) => {
  108. pagination.pageNumber = value;
  109. tableQuery.pageNumber = value;
  110. getTableData();
  111. };
  112. function handleSearch() {
  113. getQuery();
  114. getTableData();
  115. }
  116. function handleReset() {
  117. for (const key in searchData) {
  118. if (searchData.hasOwnProperty(key)) {
  119. searchData[key] = undefined;
  120. }
  121. }
  122. handleSearch();
  123. }
  124. async function handleDownload() {
  125. getQuery();
  126. try {
  127. const res = await exportVisitorList(tableQuery.queryParam);
  128. if (res.size === 0) return;
  129. const blob = new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
  130. const url = window.URL.createObjectURL(blob);
  131. downloadFile(url, '访客记录.xlsx');
  132. } catch (e) {
  133. ElMessage.error('下载失败');
  134. console.log(e);
  135. }
  136. }
  137. onMounted(() => {
  138. getTableData();
  139. });
  140. </script>
  141. <style scoped lang="scss">
  142. .table-search {
  143. display: flex;
  144. align-items: flex-end;
  145. justify-content: space-between;
  146. width: 100%;
  147. }
  148. .select-box {
  149. display: flex;
  150. align-items: center;
  151. flex-wrap: wrap;
  152. gap: 20px;
  153. &--item {
  154. @include flex-center;
  155. white-space: nowrap;
  156. }
  157. span {
  158. color: rgba(0, 0, 0, 0.85);
  159. font-size: 14px;
  160. }
  161. .el-select {
  162. width: 200px;
  163. }
  164. }
  165. .search-btn {
  166. display: flex;
  167. }
  168. </style>