AlgorithmsSetting.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <template>
  2. <div id="algoSetting">
  3. <div>
  4. <div class="algoTagWrapper">
  5. <!-- <AddAlgoDialog v-if="algoDialogVisible" @close="closeDialog" /> -->
  6. <AlgoSwitchCard
  7. v-for="item in cameraAlgoList"
  8. :key="item.code"
  9. :label="item.algoInfo?.name"
  10. :is-selected="item.algoId === selectedAlgoId"
  11. :is-algo-open="item.status === ALGO_ENABLED_STATUS.enabled"
  12. @click.capture="handleSelectAlgo(item.algoId, $event)"
  13. @remove="confirmRemove(item.algoId, item)"
  14. @toggle-algo="confirmToggleAlgoOpen(item, $event)"
  15. :is-fence-open="item.electronicFence === FENCE_ENBALED_STATUS.enabled"
  16. @toggle-fence-tool="toggleFenceTool(item, $event)"
  17. @toggle-setting="handleToggleSetting(item.algoId)"
  18. />
  19. </div>
  20. <div>
  21. <AlgoParamsSetting
  22. @on-submit="handleSubmit"
  23. @on-cancel="handleCancel"
  24. @change="handleSettingChange"
  25. :is-changed="isChanged"
  26. :algo-detail="selectedAlgoDetail"
  27. v-if="selectedAlgoId && algoSettingIsOpen"
  28. />
  29. </div>
  30. </div>
  31. </div>
  32. </template>
  33. <script lang="ts" setup>
  34. import useCameraAlgoStore from '../../store/useCameraAlgoStore';
  35. import AlgoParamsSetting from '@/modules/algo/algo-params-edit/index.vue';
  36. import { storeToRefs } from 'pinia';
  37. import {
  38. deleteCameraAlgoApi,
  39. updateCameraAlgoApi,
  40. FENCE_ENBALED_STATUS,
  41. CameraAlgoItem,
  42. updateCameraAlgoRelStatus,
  43. } from '@/api/camera/camera-preview';
  44. import { ElMessage, ElMessageBox } from 'element-plus';
  45. import AlgoSwitchCard from '../AlgoSwitchCard/AlgoSwitchCard.vue';
  46. import useFenceStore from '../../store/useFenceStore';
  47. import useCameraDetailStore from '../../store/useCameraDetailStore';
  48. import usePresetListStore from '../../store/usePresetListStore';
  49. // import AddAlgoDialog from './AddAlgoDialog.vue';
  50. import { createAlgoSubmitParams, algoDetailToJSON } from '@/modules/algo/algo-params-edit/utils';
  51. import { ALGO_ENABLED_STATUS } from '@/api/camera/camera-preview';
  52. import { ref, watchEffect } from 'vue';
  53. const cameraAlgoStore = useCameraAlgoStore();
  54. const fenceStore = useFenceStore();
  55. const presetStore = usePresetListStore();
  56. const { getCameraAlgoList, getAlgoDetail } = cameraAlgoStore;
  57. const { cameraAlgoList, selectedAlgoId, selectedAlgoDetail } = storeToRefs(cameraAlgoStore);
  58. const cameraDetailStore = useCameraDetailStore();
  59. // const hasAddPermission = () => userStore.checkPermission(PERM_ALGO.CONFIG_ADD);
  60. const algoSettingIsOpen = ref(false);
  61. // 是否修改过参数配置
  62. const isParamsChanged = ref(false);
  63. const handleSettingChange = () => {
  64. isParamsChanged.value = true;
  65. };
  66. const handleToggleSetting = (algoId: number) => {
  67. // 如果是在当前选中的卡片上切换设置开关,那么反选即可
  68. if (selectedAlgoId.value === algoId) {
  69. algoSettingIsOpen.value = !algoSettingIsOpen.value;
  70. return;
  71. }
  72. };
  73. /** 检测是否要离开参数设置 */
  74. const checkExitParams = (): Promise<unknown> => {
  75. if (isParamsChanged.value) {
  76. return confirmSwitchAlgo();
  77. } else {
  78. return Promise.resolve();
  79. }
  80. };
  81. const handleSelectAlgo = (algoId: number, e) => {
  82. // 如果点击的是它自己,那么取消选中当前的算法
  83. if (selectedAlgoId.value === algoId) {
  84. return;
  85. }
  86. // 如果点击的是其他卡片,那么先切换到这个卡片,不执行按钮的默认操作
  87. e.stopPropagation();
  88. const switchToNewAlgo = (_algoId: number) => {
  89. selectedAlgoId.value = _algoId;
  90. algoSettingIsOpen.value = false;
  91. isParamsChanged.value = false;
  92. fenceStore.showFenceTool = false;
  93. };
  94. /** 确认电子围栏是否要离开,如果确认离开,再确认算法参数配置要不要离开 */
  95. fenceStore
  96. .confirmExitFence()
  97. .then(checkExitParams)
  98. .then(() => {
  99. switchToNewAlgo(algoId);
  100. // 切换成功后要把原来的电子围栏数据给清空
  101. fenceStore.clear();
  102. });
  103. };
  104. watchEffect(() => {
  105. const algoId = selectedAlgoId.value;
  106. if (!algoId) return;
  107. const detail = getAlgoDetail(algoId);
  108. if (!detail) return;
  109. selectedAlgoDetail.value = algoDetailToJSON(detail);
  110. fenceStore.getFence({
  111. algoId: algoId,
  112. cameraId: cameraDetailStore.cameraId,
  113. presetToken: presetStore.currentPresetToken,
  114. });
  115. });
  116. const toggleFenceTool = () => {
  117. const nextShowFenceTool = !fenceStore.showFenceTool;
  118. fenceStore.showFenceTool = nextShowFenceTool;
  119. };
  120. const confirmToggleAlgoOpen = (detail: CameraAlgoItem, algoStatus: boolean) => {
  121. if (detail.algoId !== selectedAlgoId.value && algoSettingIsOpen.value) {
  122. confirmSwitchAlgo().then(() => {
  123. handleToggleAlgoOpen(detail, algoStatus);
  124. });
  125. } else {
  126. handleToggleAlgoOpen(detail, algoStatus);
  127. }
  128. };
  129. const handleToggleAlgoOpen = (detail: CameraAlgoItem, algoStatus: boolean) => {
  130. // 如果是在已选中的卡片上切换或者其他卡片设置是关闭的情况下,直接切不提示。
  131. // 只有切到其他卡片并且当前的设置是打开的情况下,才需要提示。
  132. const cameraId = cameraDetailStore.cameraId;
  133. const algoId = detail.algoId;
  134. // console.log({ detail, status });
  135. const status = algoStatus ? ALGO_ENABLED_STATUS.enabled : ALGO_ENABLED_STATUS.disabled;
  136. const params = {
  137. cameraId: cameraId,
  138. id: detail.id as number,
  139. algoId,
  140. status,
  141. };
  142. const initialStatus = detail.status;
  143. detail.status = status;
  144. selectedAlgoId.value = algoId;
  145. isParamsChanged.value = false;
  146. algoSettingIsOpen.value = false;
  147. updateCameraAlgoRelStatus(params)
  148. .then(() => {
  149. ElMessage.success(algoStatus ? '算法已开启' : '算法已关闭');
  150. })
  151. .catch(() => {
  152. detail.status = initialStatus;
  153. });
  154. };
  155. const handleSubmit = (param) => {
  156. const cameraId = cameraDetailStore.cameraId;
  157. const newParam = { cameraId: cameraId, ...createAlgoSubmitParams(param, selectedAlgoDetail.value) };
  158. if (param.id) {
  159. updateCameraAlgoApi({ ...newParam, id: param.id }).then(() => {
  160. ElMessage.success('更新成功');
  161. getCameraAlgoList(cameraId);
  162. isParamsChanged.value = false;
  163. });
  164. }
  165. };
  166. const confirmRemove = (algoId: number, item) => {
  167. ElMessageBox.confirm(`请确定是否删除【${item.algoInfo.name}】算法?`, '提示', {
  168. confirmButtonText: '确定',
  169. cancelButtonText: '取消',
  170. type: 'warning',
  171. }).then(() => {
  172. handleRemove(algoId);
  173. });
  174. };
  175. const confirmSwitchAlgo = (): Promise<boolean> => {
  176. return ElMessageBox.confirm('<strong>确认切换算法吗?</strong><br />切换后未保存的算法配置将被丢弃。', '', {
  177. confirmButtonText: '确定',
  178. cancelButtonText: '取消',
  179. type: 'warning',
  180. dangerouslyUseHTMLString: true,
  181. }).then(() => {
  182. return true;
  183. });
  184. };
  185. const handleRemove = (algoId: number) => {
  186. deleteCameraAlgoApi({ algoId, cameraId: cameraDetailStore.cameraId }).then(() => {
  187. ElMessage.success('删除成功');
  188. getCameraAlgoList(cameraDetailStore.cameraId);
  189. selectedAlgoId.value = undefined;
  190. isParamsChanged.value = false;
  191. });
  192. };
  193. const handleCancel = () => {
  194. isParamsChanged.value = false;
  195. selectedAlgoId.value = undefined;
  196. };
  197. </script>
  198. <style scoped>
  199. .algoTagWrapper {
  200. min-width: 150px;
  201. margin-right: 15px;
  202. display: flex;
  203. flex-wrap: wrap;
  204. }
  205. :deep(.el-message-box__status.el-icon) {
  206. top: 0 !important;
  207. transform: none !important;
  208. }
  209. </style>