|
|
@@ -1,11 +1,11 @@
|
|
|
<template>
|
|
|
<div id="algoSetting">
|
|
|
- <div style="font-size: 14px; font-weight: bold">算法配置</div>
|
|
|
- <div style="display: flex">
|
|
|
+ <div style="font-size: 14px; font-weight: bold">算法开关</div>
|
|
|
+ <div>
|
|
|
<div class="algoTagWrapper">
|
|
|
- <AddAlgoDialog />
|
|
|
+ <AddAlgoDialog v-if="hasAddPermission()" />
|
|
|
|
|
|
- <AlgoTag
|
|
|
+ <!-- <AlgoTag
|
|
|
v-for="item in cameraAlgoList"
|
|
|
:key="item.code"
|
|
|
:label="item.algoInfo?.name"
|
|
|
@@ -14,6 +14,18 @@
|
|
|
@on-hit="handleSelectAlgo(item.algoId)"
|
|
|
@on-remove="handleRemove"
|
|
|
:is-open="item.status === ALGO_ENABLED_STATUS.enabled"
|
|
|
+ /> -->
|
|
|
+ <AlgoSwitchCard
|
|
|
+ v-for="item in cameraAlgoList"
|
|
|
+ :key="item.code"
|
|
|
+ :label="item.algoInfo?.name"
|
|
|
+ :is-selected="item.algoId === selectedAlgoId"
|
|
|
+ :is-algo-open="item.status === ALGO_ENABLED_STATUS.enabled"
|
|
|
+ @click="handleSelectAlgo(item.algoId)"
|
|
|
+ @remove="confirmRemove(item.algoId)"
|
|
|
+ @toggle-algo="handleToggleAlgo(item, $event)"
|
|
|
+ :is-fence-open="item.electronicFence === FENCE_ENBALED_STATUS.enabled"
|
|
|
+ @toggle-fence="handleToggleFence(item, $event)"
|
|
|
/>
|
|
|
</div>
|
|
|
<div>
|
|
|
@@ -22,7 +34,7 @@
|
|
|
@on-cancel="handleCancel"
|
|
|
v-if="selectedAlgoId"
|
|
|
/>
|
|
|
- <div style="color: #ccc; margin-top: 20px" v-else>请选择左侧算法</div>
|
|
|
+ <!-- <div style="color: #ccc; margin-top: 20px" v-else>请选择算法</div> -->
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -35,17 +47,15 @@
|
|
|
deleteCameraAlgoApi,
|
|
|
updateCameraAlgoApi,
|
|
|
FENCE_ENBALED_STATUS,
|
|
|
+ CameraAlgoItem,
|
|
|
} from '@/api/camera/camera-preview';
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
|
|
- import AlgoTag from './AlgoTag.vue';
|
|
|
+ import AlgoSwitchCard from '../AlgoSwitchCard/AlgoSwitchCard.vue';
|
|
|
import useFenceStore from '../../store/useFenceStore';
|
|
|
import useCameraDetailStore from '../../store/useCameraDetailStore';
|
|
|
import usePresetListStore from '../../store/usePresetListStore';
|
|
|
import AddAlgoDialog from './AddAlgoDialog.vue';
|
|
|
import {
|
|
|
- createDefaultTime,
|
|
|
- getDetectionJSON,
|
|
|
- getDetectionTimeJSON,
|
|
|
getInferCode,
|
|
|
getAlgoType,
|
|
|
getMetaValues,
|
|
|
@@ -55,6 +65,7 @@
|
|
|
} from './utils';
|
|
|
import { ALGO_ENABLED_STATUS } from '@/api/camera/camera-preview';
|
|
|
import { watchEffect } from 'vue';
|
|
|
+ import { useUserStore } from '@/store/modules/user';
|
|
|
|
|
|
const cameraAlgoStore = useCameraAlgoStore();
|
|
|
const fenceStore = useFenceStore();
|
|
|
@@ -63,6 +74,9 @@
|
|
|
const { getCameraAlgoList, getAlgoDetail } = cameraAlgoStore;
|
|
|
const { cameraAlgoList, selectedAlgoId, selectedAlgoDetail } = storeToRefs(cameraAlgoStore);
|
|
|
const cameraDetailStore = useCameraDetailStore();
|
|
|
+ const userStore = useUserStore();
|
|
|
+
|
|
|
+ const hasAddPermission = () => userStore.checkPermission('algo_add');
|
|
|
|
|
|
const handleSelectAlgo = (algoId: number) => {
|
|
|
if (selectedAlgoId.value === algoId) {
|
|
|
@@ -132,6 +146,50 @@
|
|
|
}
|
|
|
});
|
|
|
|
|
|
+ const handleToggleAlgo = (detail: CameraAlgoItem, algoStatus: boolean) => {
|
|
|
+ const cameraId = cameraDetailStore.cameraId;
|
|
|
+ const algoId = detail.algoId;
|
|
|
+ // console.log({ detail, status });
|
|
|
+ const status = algoStatus ? ALGO_ENABLED_STATUS.enabled : ALGO_ENABLED_STATUS.disabled;
|
|
|
+ const params = {
|
|
|
+ cameraId: cameraId,
|
|
|
+ id: detail.id as number,
|
|
|
+ algoId,
|
|
|
+ status,
|
|
|
+ };
|
|
|
+ const initialStatus = detail.status;
|
|
|
+ detail.status = status;
|
|
|
+ updateCameraAlgoApi(params)
|
|
|
+ .then(() => {
|
|
|
+ ElMessage.success(algoStatus ? '算法已开启' : '算法已关闭');
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ detail.status = initialStatus;
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ const handleToggleFence = (detail: CameraAlgoItem, fenceStatus: boolean) => {
|
|
|
+ const cameraId = cameraDetailStore.cameraId;
|
|
|
+ const algoId = detail.algoId;
|
|
|
+ // console.log({ detail, status });
|
|
|
+ const status = fenceStatus ? FENCE_ENBALED_STATUS.enabled : FENCE_ENBALED_STATUS.disabled;
|
|
|
+ const params = {
|
|
|
+ cameraId: cameraId,
|
|
|
+ id: detail.id as number,
|
|
|
+ algoId,
|
|
|
+ electronicFence: status,
|
|
|
+ };
|
|
|
+ const initialStatus = detail.electronicFence;
|
|
|
+ detail.electronicFence = status;
|
|
|
+ updateCameraAlgoApi(params)
|
|
|
+ .then(() => {
|
|
|
+ ElMessage.success(fenceStatus ? '电子围栏已开启' : '电子围栏已关闭');
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ detail.electronicFence = initialStatus;
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
const handleSubmit = (param) => {
|
|
|
console.log('submitParam', param);
|
|
|
const cameraId = cameraDetailStore.cameraId;
|
|
|
@@ -167,6 +225,16 @@
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+ const confirmRemove = (algoId: number) => {
|
|
|
+ ElMessageBox.confirm('删除后,该算法卡片将无法恢复,请确定是否删除?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ }).then(() => {
|
|
|
+ handleRemove(algoId);
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
const handleRemove = (algoId: number) => {
|
|
|
console.log('remove', algoId);
|
|
|
deleteCameraAlgoApi({ algoId, cameraId: cameraDetailStore.cameraId }).then(() => {
|
|
|
@@ -189,6 +257,8 @@
|
|
|
.algoTagWrapper {
|
|
|
min-width: 150px;
|
|
|
margin-right: 15px;
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
}
|
|
|
|
|
|
:deep(.el-message-box__status.el-icon) {
|