SecurityPosition.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. v-if="securityPositionManagePermission"
  11. class="search-table-container--button"
  12. type="primary"
  13. :icon="Plus"
  14. @click="handleAddSecurityPosition"
  15. >
  16. 新建治安重点部位
  17. </el-button>
  18. <BasicSearch
  19. :searchConfig="SECURITY_POSITION_LIST_SEARCH_CONFIG"
  20. :searchData="searchData"
  21. @update:search-data="handleSearch"
  22. >
  23. <template #securityPosition>
  24. <el-input
  25. v-model="searchKeyword"
  26. :placeholder="`请输入${curSearchTypeLabel}进行搜索`"
  27. clearable
  28. @input="handleSearch"
  29. @keyup.enter="handleSearch"
  30. style="width: 380px"
  31. >
  32. <template #prefix>
  33. <el-icon color="#1777ff"><Search /></el-icon>
  34. </template>
  35. <template #prepend>
  36. <el-select
  37. v-model="searchSelectedType"
  38. placeholder="选择搜索项"
  39. @change="handleSelectedTypeChange"
  40. style="width: 100px"
  41. >
  42. <el-option
  43. v-for="item in securityPositionQueryOptions"
  44. :key="item.value"
  45. :label="item.label"
  46. :value="item.value"
  47. />
  48. </el-select>
  49. </template>
  50. </el-input>
  51. </template>
  52. </BasicSearch>
  53. </header>
  54. <BasicTable ref="basicTableRef" :tableData="tableData" :tableConfig="tableConfig">
  55. <template #cameraName="scope">
  56. <div class="camera-name-container">
  57. <div v-for="item in scope.row.children" :key="item.id">
  58. {{ item.name }}
  59. </div>
  60. </div>
  61. </template>
  62. <template #action="scope">
  63. <div class="action-container--div">
  64. <ActionButton text="上移" @click="handleUpOne(scope.row.id, scope.row.orderNum)" />
  65. <ActionButton text="下移" @click="handleDownOne(scope.row.id, scope.row.orderNum)" />
  66. <ActionButton
  67. text="编辑"
  68. v-if="securityPositionManagePermission"
  69. @click="handleEditSecurityPosition(scope.row)"
  70. />
  71. <ActionButton
  72. v-if="securityPositionManagePermission"
  73. text="删除"
  74. :popconfirm="{
  75. title: '是否删除该治安重点部位?',
  76. }"
  77. @confirm="handleDeleteSecurityPosition(scope.row.id)"
  78. />
  79. </div>
  80. </template>
  81. </BasicTable>
  82. </div>
  83. </div>
  84. <UpdatePositionMonitorCamera
  85. v-if="updatePositionMonitorCameraVisible"
  86. @confirm="handleConfirmPositionMonitorCamera"
  87. @close="handleClosePositionMonitorCamera"
  88. />
  89. </div>
  90. </template>
  91. <script setup lang="ts">
  92. import { ref, onMounted, reactive, computed } from 'vue';
  93. import { ElMessage } from 'element-plus';
  94. import { Plus, Search } from '@element-plus/icons-vue';
  95. import { storeToRefs } from 'pinia';
  96. import BasicSearch from '@/components/BasicSearch.vue';
  97. import BasicTable from '@/components/BasicTable.vue';
  98. import ActionButton from '@/components/ActionButton.vue';
  99. import UpdatePositionMonitorCamera from '@/components/position-monitor-camera-edit/UpdatePositionMonitorCamera.vue';
  100. import useTableConfig from '@/hooks/useTableConfigHook';
  101. import { useUserInfoHook } from '@/hooks/useUserInfoHook';
  102. import { usePositionMonitorCameraEdit } from '@/store/modules/usePositionMonitorCameraEdit';
  103. import { SECURITY_CONFIDENTIALITY_PERMISSIONS } from '../constant';
  104. import { FIELDTYPE, FIELD_CONTENT, POSITION_TYPE, securityPositionQueryOptions } from './constant';
  105. import {
  106. SECURITY_POSITION_LIST_TABLE_MAX_HEIGHT_DEFAULT,
  107. SECURITY_POSITION_LIST_TABLE_MAX_HEIGHT_PERMISSION,
  108. SECURITY_POSITION_LIST_TABLE_OPTIONS,
  109. SECURITY_POSITION_LIST_TABLE_COLUMNS,
  110. SECURITY_POSITION_LIST_SEARCH_CONFIG,
  111. } from './config';
  112. import {
  113. GetPositionListParams,
  114. PositionMonitorCameraListRes,
  115. getSecurityPositionList,
  116. AddOrUpdatePositionInfoParams,
  117. addOrUpdatePositionInfo,
  118. updateCameraGroupOrder,
  119. } from '@/api/security-confidentiality-position';
  120. import { deleteCameraGroupApi } from '@/api/nine-square-grid';
  121. const { tableConfig } = useTableConfig(SECURITY_POSITION_LIST_TABLE_COLUMNS, SECURITY_POSITION_LIST_TABLE_OPTIONS);
  122. const { permissions } = useUserInfoHook();
  123. const securityPositionManagePermission = ref<boolean>(false);
  124. const positionMonitorCameraEdit = usePositionMonitorCameraEdit();
  125. const {
  126. titleOfUpdatePositionMonitorCamera,
  127. dataOfPosition,
  128. idOfPosition,
  129. nameOfPosition,
  130. selectedCameraIdsOfPosition,
  131. } = storeToRefs(positionMonitorCameraEdit);
  132. const { initDataOfPosition } = positionMonitorCameraEdit;
  133. const searchData = reactive<GetPositionListParams>({
  134. groupName: '',
  135. cameraName: '',
  136. });
  137. const searchSelectedType = ref(FIELDTYPE.POSITION_NAME);
  138. const searchKeyword = ref('');
  139. const curSearchTypeLabel = computed(() => {
  140. const option = securityPositionQueryOptions.find((item) => item.value === searchSelectedType.value);
  141. return option ? option.label : FIELD_CONTENT[searchSelectedType.value];
  142. });
  143. const tableData = ref<PositionMonitorCameraListRes[]>([]);
  144. const updatePositionMonitorCameraVisible = ref(false);
  145. const handleAddSecurityPosition = () => {
  146. titleOfUpdatePositionMonitorCamera.value = '编辑重点监控部位';
  147. dataOfPosition.value = undefined;
  148. updatePositionMonitorCameraVisible.value = true;
  149. };
  150. const handleSearch = () => {
  151. console.log('查询治安重点部位');
  152. if (searchSelectedType.value === FIELDTYPE.POSITION_NAME) searchData.groupName = searchKeyword.value;
  153. else searchData.cameraName = searchKeyword.value;
  154. getTableData();
  155. };
  156. const handleSelectedTypeChange = () => {
  157. searchKeyword.value = '';
  158. };
  159. const handleUpOne = (id: number, orderNum: number) => {
  160. console.log('上移治安重点部位', id);
  161. updateCameraGroupOrder({
  162. id: id,
  163. orderNum: orderNum - 1,
  164. }).then((res) => {
  165. console.log('上移治安重点部位', res);
  166. getTableData();
  167. });
  168. };
  169. const handleDownOne = (id: number, orderNum: number) => {
  170. console.log('下移治安重点部位', id);
  171. updateCameraGroupOrder({
  172. id: id,
  173. orderNum: orderNum + 1,
  174. }).then((res) => {
  175. console.log('下移治安重点部位', res);
  176. getTableData();
  177. });
  178. };
  179. const handleEditSecurityPosition = (row: PositionMonitorCameraListRes) => {
  180. console.log('编辑治安重点部位', row);
  181. titleOfUpdatePositionMonitorCamera.value = '编辑重点监控部位';
  182. dataOfPosition.value = row;
  183. initDataOfPosition();
  184. updatePositionMonitorCameraVisible.value = true;
  185. };
  186. const handleDeleteSecurityPosition = (id: number) => {
  187. console.log('删除治安重点部位', id);
  188. deleteCameraGroupApi(id).then((res) => {
  189. console.log('删除治安重点部位', res);
  190. getTableData();
  191. });
  192. };
  193. const handleConfirmPositionMonitorCamera = () => {
  194. const params: AddOrUpdatePositionInfoParams = {
  195. id: idOfPosition.value ?? undefined,
  196. groupName: nameOfPosition.value,
  197. type: POSITION_TYPE.SECURITY_POSITION,
  198. cameraIdList: selectedCameraIdsOfPosition.value.map((item) => item.id),
  199. };
  200. addOrUpdatePositionInfo(params).then(() => {
  201. ElMessage.success(idOfPosition.value ? '治安重点部位编辑成功' : '治安重点部位新建成功');
  202. getTableData();
  203. });
  204. updatePositionMonitorCameraVisible.value = false;
  205. };
  206. const handleClosePositionMonitorCamera = () => {
  207. ElMessage.info('取消操作');
  208. updatePositionMonitorCameraVisible.value = false;
  209. };
  210. const getTableData = () => {
  211. tableConfig.loading = true;
  212. getSecurityPositionList(searchData).then((res) => {
  213. console.log('获取治安重点部位列表', res);
  214. tableData.value = res;
  215. });
  216. tableConfig.loading = false;
  217. };
  218. onMounted(() => {
  219. securityPositionManagePermission.value = Boolean(
  220. permissions.find(
  221. (item: { code: string }) => item.code === SECURITY_CONFIDENTIALITY_PERMISSIONS.SECURITY_POSITION_MANAGEMENT,
  222. ),
  223. );
  224. tableConfig.maxHeight = securityPositionManagePermission.value
  225. ? SECURITY_POSITION_LIST_TABLE_MAX_HEIGHT_PERMISSION
  226. : SECURITY_POSITION_LIST_TABLE_MAX_HEIGHT_DEFAULT;
  227. });
  228. getTableData();
  229. </script>
  230. <style scoped lang="scss">
  231. @use '@/styles/page-main-layout.scss' as *;
  232. @use '@/styles/page-details-layout.scss' as *;
  233. @use '@/styles/basic-table-action.scss' as *;
  234. </style>