AlgorithmsSetting.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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="isParamsChanged"
  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, cameraAlgoToJSON } 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. checkExitParams().then(() => {
  70. algoSettingIsOpen.value = !algoSettingIsOpen.value;
  71. isParamsChanged.value = false;
  72. });
  73. }
  74. };
  75. /** 检测是否要离开参数设置 */
  76. const checkExitParams = (): Promise<unknown> => {
  77. if (isParamsChanged.value) {
  78. return confirmSwitchAlgo();
  79. } else {
  80. return Promise.resolve();
  81. }
  82. };
  83. const handleSelectAlgo = (algoId: number, e) => {
  84. // 如果点击的是它自己,那么取消选中当前的算法
  85. if (selectedAlgoId.value === algoId) {
  86. return;
  87. }
  88. // 如果点击的是其他卡片,那么先切换到这个卡片,不执行按钮的默认操作
  89. e.stopPropagation();
  90. const switchToNewAlgo = (_algoId: number) => {
  91. selectedAlgoId.value = _algoId;
  92. algoSettingIsOpen.value = false;
  93. isParamsChanged.value = false;
  94. fenceStore.showFenceTool = false;
  95. };
  96. /** 确认电子围栏是否要离开,如果确认离开,再确认算法参数配置要不要离开 */
  97. fenceStore
  98. .confirmExitFence()
  99. .then(checkExitParams)
  100. .then(() => {
  101. switchToNewAlgo(algoId);
  102. // 切换成功后要把原来的电子围栏数据给清空
  103. fenceStore.clear();
  104. });
  105. };
  106. watchEffect(() => {
  107. const algoId = selectedAlgoId.value;
  108. if (!algoId) return;
  109. const detail = getAlgoDetail(algoId);
  110. if (!detail) return;
  111. selectedAlgoDetail.value = cameraAlgoToJSON(detail);
  112. fenceStore.getFence({
  113. algoId: algoId,
  114. cameraId: cameraDetailStore.cameraId,
  115. presetToken: presetStore.currentPresetToken,
  116. });
  117. });
  118. const toggleFenceTool = () => {
  119. const nextShowFenceTool = !fenceStore.showFenceTool;
  120. fenceStore.showFenceTool = nextShowFenceTool;
  121. };
  122. const confirmToggleAlgoOpen = (detail: CameraAlgoItem, algoStatus: boolean) => {
  123. if (algoSettingIsOpen.value) {
  124. confirmSwitchAlgo().then(() => {
  125. handleToggleAlgoOpen(detail, algoStatus);
  126. });
  127. } else {
  128. handleToggleAlgoOpen(detail, algoStatus);
  129. }
  130. };
  131. const handleToggleAlgoOpen = (detail: CameraAlgoItem, algoStatus: boolean) => {
  132. // 如果是在已选中的卡片上切换或者其他卡片设置是关闭的情况下,直接切不提示。
  133. // 只有切到其他卡片并且当前的设置是打开的情况下,才需要提示。
  134. const cameraId = cameraDetailStore.cameraId;
  135. const algoId = detail.algoId;
  136. // console.log({ detail, status });
  137. const status = algoStatus ? ALGO_ENABLED_STATUS.enabled : ALGO_ENABLED_STATUS.disabled;
  138. const params = {
  139. cameraId: cameraId,
  140. id: detail.id as number,
  141. algoId,
  142. status,
  143. };
  144. const initialStatus = detail.status;
  145. detail.status = status;
  146. selectedAlgoId.value = algoId;
  147. isParamsChanged.value = false;
  148. algoSettingIsOpen.value = false;
  149. updateCameraAlgoRelStatus(params)
  150. .then(() => {
  151. ElMessage.success(algoStatus ? '算法已开启' : '算法已关闭');
  152. })
  153. .catch(() => {
  154. detail.status = initialStatus;
  155. });
  156. };
  157. const handleSubmit = (param) => {
  158. const cameraId = cameraDetailStore.cameraId;
  159. const newParam = { cameraId: cameraId, ...createAlgoSubmitParams(param, selectedAlgoDetail.value) };
  160. if (param.id) {
  161. updateCameraAlgoApi({ ...newParam, id: param.id }).then(() => {
  162. ElMessage.success('更新成功');
  163. getCameraAlgoList(cameraId);
  164. isParamsChanged.value = false;
  165. });
  166. }
  167. };
  168. const confirmRemove = (algoId: number, item) => {
  169. ElMessageBox.confirm(`请确定是否删除【${item.algoInfo.name}】算法?`, '提示', {
  170. confirmButtonText: '确定',
  171. cancelButtonText: '取消',
  172. type: 'warning',
  173. }).then(() => {
  174. handleRemove(algoId);
  175. });
  176. };
  177. const confirmSwitchAlgo = (): Promise<boolean> => {
  178. return ElMessageBox.confirm('算法参数设置未保存,离开后无法保存设置内容。', '', {
  179. confirmButtonText: '确定',
  180. cancelButtonText: '取消',
  181. type: 'warning',
  182. dangerouslyUseHTMLString: true,
  183. }).then(() => {
  184. return true;
  185. });
  186. };
  187. const handleRemove = (algoId: number) => {
  188. deleteCameraAlgoApi({ algoId, cameraId: cameraDetailStore.cameraId }).then(() => {
  189. ElMessage.success('删除成功');
  190. getCameraAlgoList(cameraDetailStore.cameraId);
  191. selectedAlgoId.value = undefined;
  192. isParamsChanged.value = false;
  193. });
  194. };
  195. const handleCancel = () => {
  196. isParamsChanged.value = false;
  197. selectedAlgoId.value = undefined;
  198. };
  199. </script>
  200. <style scoped>
  201. .algoTagWrapper {
  202. min-width: 150px;
  203. margin-right: 15px;
  204. display: flex;
  205. flex-wrap: wrap;
  206. }
  207. :deep(.el-message-box__status.el-icon) {
  208. top: 0 !important;
  209. transform: none !important;
  210. }
  211. </style>