|
|
@@ -1,158 +1,114 @@
|
|
|
<template>
|
|
|
<div id="algoCardWrapper" class="algoCardWrapper">
|
|
|
<div class="algoCardTitle">
|
|
|
- <div>{{ selectedAlgoDetail?.algoInfo?.name }} 算法参数配置</div>
|
|
|
- <div style="display: flex; align-items: center">
|
|
|
- <ElSwitch
|
|
|
- v-model="selectedAlgoDetail.enableCardBool"
|
|
|
- size="small"
|
|
|
- @change="handleAlgoEnable"
|
|
|
- />
|
|
|
- <el-tooltip class="box-item" effect="dark" placement="top">
|
|
|
- <template #content> 关闭后该算法对<br />此台相机不生效</template>
|
|
|
- <el-icon color="#d4d5d8" :size="16" class="tipIcon"><InfoCircleOutlined /></el-icon>
|
|
|
- </el-tooltip>
|
|
|
- </div>
|
|
|
+ <div>算法参数</div>
|
|
|
</div>
|
|
|
<div class="algoCardMain">
|
|
|
- <!-- <div class="algoRow" style="display: flex; align-items: center">
|
|
|
- <div class="algoLabel">绘制电子围栏:</div>
|
|
|
- <div>
|
|
|
- <div style="display: flex; align-items: center">
|
|
|
- <ElSwitch v-model="selectedAlgoDetail.electronicFenceBool" size="small" />
|
|
|
- <el-tooltip class="box-item" effect="dark" placement="top">
|
|
|
- <template #content>
|
|
|
- 默认检测全部范围,如需<br />指定范围,可打开开关,<br />在相机界面完成绘制
|
|
|
- </template>
|
|
|
- <el-icon color="#e2e2e2" :size="16" class="tipIcon"><InfoCircleOutlined /></el-icon>
|
|
|
- </el-tooltip>
|
|
|
- <el-radio-group
|
|
|
- v-model="selectedAlgoDetail.regionJudge"
|
|
|
- :disabled="!selectedAlgoDetail.electronicFenceBool"
|
|
|
- class="ml-3"
|
|
|
+ <div style="display: flex">
|
|
|
+ <div style="margin-right: 30px; display: flex; margin-top: 16px">
|
|
|
+ <div class="algoLabel">检测元数据:</div>
|
|
|
+ <div class="algoTimeContent">
|
|
|
+ <div
|
|
|
+ class="timeAdd"
|
|
|
+ :class="{ addDisable: unEmptyLabels.length >= metaObjList.length }"
|
|
|
+ @click="handleAddMetaObj"
|
|
|
>
|
|
|
- <el-radio :label="0">内</el-radio>
|
|
|
- <el-radio :label="1">外</el-radio>
|
|
|
- </el-radio-group>
|
|
|
+ <el-icon color="#d0d0d0"><Plus /></el-icon>
|
|
|
+ </div>
|
|
|
+ <div class="metaValuesList">
|
|
|
+ <AlgoParamsCard
|
|
|
+ v-for="(v, index) in selectedAlgoDetail.metaValues"
|
|
|
+ :key="v.id"
|
|
|
+ :ref="(el) => (paramCardRefs[index] = el)"
|
|
|
+ :id="v.id"
|
|
|
+ @change="handleChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="presetList"> 预置位1 预置位2 预置位3 </div>
|
|
|
</div>
|
|
|
- </div> -->
|
|
|
- <div class="algoRow">
|
|
|
- <div class="algoLabel">检测时间段:</div>
|
|
|
- <div class="algoTimeContent">
|
|
|
- <div class="timeAdd" @click="handleAddTimePeriod">
|
|
|
- <el-icon color="#d0d0d0"><Plus /></el-icon>
|
|
|
+ <div>
|
|
|
+ <div class="algoRow" style="align-items: center">
|
|
|
+ <div class="algoLabel">检测数量范围:</div>
|
|
|
+ <el-radio-group v-model="selectedAlgoDetail.judge" class="ml-4" @change="handleChange">
|
|
|
+ <el-radio :label="0">小于</el-radio>
|
|
|
+ <el-radio :label="1">大于</el-radio>
|
|
|
+ <el-radio :label="2">等于</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
</div>
|
|
|
- <div class="timeList">
|
|
|
- <PeriodCard
|
|
|
- v-for="(x, index) in selectedAlgoDetail.timeRangeArr"
|
|
|
- :key="x.id"
|
|
|
- :ref="(el) => (periodCardRefs[index] = el)"
|
|
|
- :id="x.id"
|
|
|
+ <div class="algoRow" style="align-items: center">
|
|
|
+ <div class="algoLabel">检测频率:</div>
|
|
|
+ <ElInputNumber
|
|
|
+ v-model="selectedAlgoDetail.detectionFrequency"
|
|
|
+ controls-position="right"
|
|
|
+ :min="1"
|
|
|
+ :step="1"
|
|
|
+ size="small"
|
|
|
+ style="width: 186px"
|
|
|
+ @blur="checkFrequencyValid"
|
|
|
+ @change="handleChange"
|
|
|
/>
|
|
|
+ <span style="font-size: 12px; margin-left: 5px">S/次</span>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="algoRow">
|
|
|
- <div class="algoLabel">检测元数据:</div>
|
|
|
- <div class="algoTimeContent">
|
|
|
- <div
|
|
|
- class="timeAdd"
|
|
|
- :class="{ addDisable: unEmptyLabels.length >= metaObjList.length }"
|
|
|
- @click="handleAddMetaObj"
|
|
|
- >
|
|
|
- <el-icon color="#d0d0d0"><Plus /></el-icon>
|
|
|
+ <div class="algoRow" style="align-items: center">
|
|
|
+ <div class="algoLabel">持续时间:</div>
|
|
|
+ <ElInputNumber
|
|
|
+ v-model="selectedAlgoDetail.eventDurationMinMs"
|
|
|
+ controls-position="right"
|
|
|
+ :min="1"
|
|
|
+ :step="1"
|
|
|
+ size="small"
|
|
|
+ style="width: 186px"
|
|
|
+ @blur="checkDurationMinMsValid"
|
|
|
+ @change="handleChange"
|
|
|
+ />
|
|
|
+ <span style="font-size: 12px; margin-left: 5px">毫秒</span>
|
|
|
+ </div>
|
|
|
+ <div class="algoRow" style="align-items: center">
|
|
|
+ <div class="algoLabel">持续帧数:</div>
|
|
|
+ <ElInputNumber
|
|
|
+ v-model="selectedAlgoDetail.eventDurationMinFrames"
|
|
|
+ controls-position="right"
|
|
|
+ :min="1"
|
|
|
+ :step="1"
|
|
|
+ size="small"
|
|
|
+ style="width: 186px"
|
|
|
+ @blur="checkDurationMinFramesValid"
|
|
|
+ @change="handleChange"
|
|
|
+ />
|
|
|
+ <span style="font-size: 12px; margin-left: 5px">帧</span>
|
|
|
+ </div>
|
|
|
+ <div class="algoRow" style="align-items: center">
|
|
|
+ <div class="algoLabel">报警时间间隔:</div>
|
|
|
+ <ElInputNumber
|
|
|
+ v-model="selectedAlgoDetail.eventAlarmIntervalMs"
|
|
|
+ controls-position="right"
|
|
|
+ :min="1"
|
|
|
+ :step="1"
|
|
|
+ size="small"
|
|
|
+ style="width: 186px"
|
|
|
+ @blur="checkAlarmIntervalMsValid"
|
|
|
+ @change="handleChange"
|
|
|
+ />
|
|
|
+ <span style="font-size: 12px; margin-left: 5px">秒</span>
|
|
|
</div>
|
|
|
- <div class="timeList">
|
|
|
- <ParamCard
|
|
|
- v-for="(v, index) in selectedAlgoDetail.metaValues"
|
|
|
- :key="v.id"
|
|
|
- :ref="(el) => (paramCardRefs[index] = el)"
|
|
|
- :id="v.id"
|
|
|
+ <div class="algoRow" style="align-items: center">
|
|
|
+ <div class="algoLabel">报警帧间隔:</div>
|
|
|
+ <ElInputNumber
|
|
|
+ v-model="selectedAlgoDetail.eventAlarmIntervalFrames"
|
|
|
+ controls-position="right"
|
|
|
+ :min="1"
|
|
|
+ :step="1"
|
|
|
+ size="small"
|
|
|
+ style="width: 186px"
|
|
|
+ @blur="checkAlarmIntervalFramesValid"
|
|
|
+ @change="handleChange"
|
|
|
/>
|
|
|
+ <span style="font-size: 12px; margin-left: 5px">帧</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="algoRow" style="align-items: center">
|
|
|
- <div class="algoLabel">检测数量范围:</div>
|
|
|
- <el-radio-group v-model="selectedAlgoDetail.judge" class="ml-4">
|
|
|
- <el-radio :label="0">小于</el-radio>
|
|
|
- <el-radio :label="1">大于</el-radio>
|
|
|
- <el-radio :label="2">等于</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </div>
|
|
|
- <div class="algoRow" style="align-items: center">
|
|
|
- <div class="algoLabel">检测频率:</div>
|
|
|
- <ElInputNumber
|
|
|
- v-model="selectedAlgoDetail.detectionFrequency"
|
|
|
- controls-position="right"
|
|
|
- :min="1"
|
|
|
- :step="1"
|
|
|
- size="small"
|
|
|
- style="width: 186px"
|
|
|
- @blur="checkFrequencyValid"
|
|
|
- />
|
|
|
- <span style="font-size: 12px; margin-left: 5px">S/次</span>
|
|
|
- </div>
|
|
|
- <div class="algoRow" style="align-items: center">
|
|
|
- <div class="algoLabel">持续时间:</div>
|
|
|
- <ElInputNumber
|
|
|
- v-model="selectedAlgoDetail.eventDurationMinMs"
|
|
|
- controls-position="right"
|
|
|
- :min="1"
|
|
|
- :step="1"
|
|
|
- size="small"
|
|
|
- style="width: 186px"
|
|
|
- @blur="checkDurationMinMsValid"
|
|
|
- />
|
|
|
- <span style="font-size: 12px; margin-left: 5px">毫秒</span>
|
|
|
- </div>
|
|
|
- <div class="algoRow" style="align-items: center">
|
|
|
- <div class="algoLabel">持续帧数:</div>
|
|
|
- <ElInputNumber
|
|
|
- v-model="selectedAlgoDetail.eventDurationMinFrames"
|
|
|
- controls-position="right"
|
|
|
- :min="1"
|
|
|
- :step="1"
|
|
|
- size="small"
|
|
|
- style="width: 186px"
|
|
|
- @blur="checkDurationMinFramesValid"
|
|
|
- />
|
|
|
- <span style="font-size: 12px; margin-left: 5px">帧</span>
|
|
|
- </div>
|
|
|
- <div class="algoRow" style="align-items: center">
|
|
|
- <div class="algoLabel">报警时间间隔:</div>
|
|
|
- <ElInputNumber
|
|
|
- v-model="selectedAlgoDetail.eventAlarmIntervalMs"
|
|
|
- controls-position="right"
|
|
|
- :min="1"
|
|
|
- :step="1"
|
|
|
- size="small"
|
|
|
- style="width: 186px"
|
|
|
- @blur="checkAlarmIntervalMsValid"
|
|
|
- />
|
|
|
- <span style="font-size: 12px; margin-left: 5px">秒</span>
|
|
|
- </div>
|
|
|
- <div class="algoRow" style="align-items: center">
|
|
|
- <div class="algoLabel">报警帧间隔:</div>
|
|
|
- <ElInputNumber
|
|
|
- v-model="selectedAlgoDetail.eventAlarmIntervalFrames"
|
|
|
- controls-position="right"
|
|
|
- :min="1"
|
|
|
- :step="1"
|
|
|
- size="small"
|
|
|
- style="width: 186px"
|
|
|
- @blur="checkAlarmIntervalFramesValid"
|
|
|
- />
|
|
|
- <span style="font-size: 12px; margin-left: 5px">帧</span>
|
|
|
- </div>
|
|
|
|
|
|
- <div
|
|
|
- v-if="selectedAlgoDetail.timeWindow !== undefined"
|
|
|
- class="algoRow"
|
|
|
- style="align-items: center"
|
|
|
- >
|
|
|
+ <div v-if="selectedAlgoDetail.timeWindow !== undefined" class="algoRow" style="align-items: center">
|
|
|
<div class="algoLabel">检测窗口时长:</div>
|
|
|
<ElInputNumber
|
|
|
v-model="selectedAlgoDetail.timeWindow"
|
|
|
@@ -162,50 +118,55 @@
|
|
|
style="width: 186px"
|
|
|
placeholder="请输入允许的最长时间"
|
|
|
@blur="checkTimeWindowValid"
|
|
|
+ @change="handleChange"
|
|
|
/>
|
|
|
<span style="font-size: 12px; margin-left: 5px">S</span>
|
|
|
</div>
|
|
|
+
|
|
|
+ <div class="algoRow" style="margin-top: 20px">
|
|
|
+ <div class="algoLabel">检测时间段:</div>
|
|
|
+ <div class="algoTimeContent">
|
|
|
+ <div class="timeAdd" @click="handleAddTimePeriod">
|
|
|
+ <el-icon color="#d0d0d0"><Plus /></el-icon>
|
|
|
+ </div>
|
|
|
+ <div class="timeList" v-if="selectedAlgoDetail.timeRangeArr?.length > 0">
|
|
|
+ <PeriodCard
|
|
|
+ v-for="(x, index) in selectedAlgoDetail.timeRangeArr"
|
|
|
+ :key="x.id"
|
|
|
+ :ref="(el) => (periodCardRefs[index] = el)"
|
|
|
+ :id="x.id"
|
|
|
+ @change="handleChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
<div style="display: flex; justify-content: flex-end">
|
|
|
- <ElButton size="small" :disabled="!selectedAlgoId" @click="handleRemoveAlgo">取消</ElButton>
|
|
|
- <ElButton size="small" type="primary" @click="handleSave(false)" :disabled="!selectedAlgoId"
|
|
|
- >保存</ElButton
|
|
|
- >
|
|
|
+ <ElButton size="small" @click="handleRemoveAlgo">取消</ElButton>
|
|
|
+ <ElButton size="small" type="primary" @click="handleSave">保存</ElButton>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script lang="ts" setup>
|
|
|
- import {
|
|
|
- ElSelect,
|
|
|
- ElOption,
|
|
|
- ElSwitch,
|
|
|
- ElInputNumber,
|
|
|
- ElTimePicker,
|
|
|
- ElMessage,
|
|
|
- ElMessageBox,
|
|
|
- } from 'element-plus';
|
|
|
- import { CircleCloseFilled, Plus } from '@element-plus/icons-vue';
|
|
|
+ import { ElInputNumber, ElMessage, ElMessageBox } from 'element-plus';
|
|
|
+ import { Plus } from '@element-plus/icons-vue';
|
|
|
import { storeToRefs } from 'pinia';
|
|
|
- import dayjs, { Dayjs } from 'dayjs';
|
|
|
- import addTimeIcon from '@/assets/icons/addTimeIcon.png';
|
|
|
- import useCameraAlgoStore, { AlgoParamMetaItem } from '../../store/useCameraAlgoStore';
|
|
|
- import { createDefaultTime, frequencyOptions, getTimeCompletion } from './utils';
|
|
|
- import { InfoCircleOutlined } from '@vicons/antd';
|
|
|
+ // import useCameraAlgoStore, { AlgoParamMetaItem } from './store/useCameraAlgoStore';
|
|
|
+ import useAlgoParamsSettingStore from './use-algo-params-edit-store';
|
|
|
+ import { AlgoParamMetaItem, CameraAlgoItemInCard } from './types';
|
|
|
+
|
|
|
+ import { createDefaultTime, getTimeCompletion } from './utils';
|
|
|
+
|
|
|
import { ALGO_ENABLED_STATUS, FENCE_ENBALED_STATUS } from '@/api/camera/camera-preview';
|
|
|
import PeriodCard from './AlgoPeriodCard.vue';
|
|
|
- import ParamCard from './AlgoParamsCard.vue';
|
|
|
+ import AlgoParamsCard from './AlgoParamsCard.vue';
|
|
|
import { uid } from 'uid';
|
|
|
- import { computed, ref } from 'vue';
|
|
|
+ import { computed, onMounted, onUnmounted, ref } from 'vue';
|
|
|
|
|
|
// const { data: algoList, loading } = useAllAlgos();
|
|
|
- const cameraAlgoStore = useCameraAlgoStore();
|
|
|
- const {
|
|
|
- selectedAlgoId,
|
|
|
- selectedAlgoDetail,
|
|
|
- metaObjList,
|
|
|
- markedTimeRangeIds,
|
|
|
- markedParamCardIds,
|
|
|
- } = storeToRefs(cameraAlgoStore);
|
|
|
+ const algoParamsSettingStore = useAlgoParamsSettingStore();
|
|
|
+ const { selectedAlgoDetail, metaObjList, markedTimeRangeIds, markedParamCardIds } =
|
|
|
+ storeToRefs(algoParamsSettingStore);
|
|
|
|
|
|
interface Param {
|
|
|
/** 算法id */
|
|
|
@@ -220,38 +181,50 @@
|
|
|
status: ALGO_ENABLED_STATUS;
|
|
|
}
|
|
|
|
|
|
+ const props = defineProps<{
|
|
|
+ isChanged: boolean;
|
|
|
+ algoDetail: CameraAlgoItemInCard;
|
|
|
+ }>();
|
|
|
+
|
|
|
const emits = defineEmits<{
|
|
|
(e: 'onSubmit', param: Param): Promise<unknown>;
|
|
|
- (e: 'onCancel', algoId: number): Promise<unknown>;
|
|
|
+ (e: 'onCancel'): Promise<unknown>;
|
|
|
+ (e: 'change'): unknown;
|
|
|
}>();
|
|
|
|
|
|
const periodCardRefs = ref<any>([]);
|
|
|
const paramCardRefs = ref<any>([]);
|
|
|
|
|
|
+ onMounted(() => {
|
|
|
+ selectedAlgoDetail.value = { ...props.algoDetail };
|
|
|
+ });
|
|
|
+ const handleChange = () => {
|
|
|
+ emits('change');
|
|
|
+ };
|
|
|
const handleAddTimePeriod = () => {
|
|
|
- const emptyList = selectedAlgoDetail.value.timeRangeArr.filter(
|
|
|
- (item) => !getTimeCompletion(item),
|
|
|
- );
|
|
|
+ const emptyList = selectedAlgoDetail.value.timeRangeArr?.filter((item) => !getTimeCompletion(item));
|
|
|
if (emptyList && emptyList.length > 0) {
|
|
|
emptyList.forEach((item) => markedTimeRangeIds.value.push(item.id));
|
|
|
ElMessage.error('请先完善检测时间段数据');
|
|
|
return;
|
|
|
}
|
|
|
- selectedAlgoDetail.value.timeRangeArr.push(createDefaultTime());
|
|
|
+ handleChange();
|
|
|
+ selectedAlgoDetail.value.timeRangeArr?.push(createDefaultTime());
|
|
|
};
|
|
|
|
|
|
const unEmptyLabels = computed(() => {
|
|
|
- return selectedAlgoDetail.value.metaValues.filter((item) => item.label);
|
|
|
+ return selectedAlgoDetail.value.metaValues?.filter((item) => item.label) || [];
|
|
|
});
|
|
|
|
|
|
const handleAddMetaObj = () => {
|
|
|
- if (unEmptyLabels.value.length < selectedAlgoDetail.value.metaValues.length) {
|
|
|
+ if (unEmptyLabels.value.length < selectedAlgoDetail.value.metaValues?.length) {
|
|
|
selectedAlgoDetail.value.metaValues
|
|
|
.filter((item) => !item.label)
|
|
|
.forEach((val) => markedParamCardIds.value.push(val.id));
|
|
|
ElMessage.error('存在未完善的检测元数据');
|
|
|
return;
|
|
|
}
|
|
|
+ handleChange();
|
|
|
// if (unemptyList.length == metaObjList.value.length) {
|
|
|
// ElMessage.warning('暂无更多检测对象');
|
|
|
// return;
|
|
|
@@ -259,61 +232,33 @@
|
|
|
selectedAlgoDetail.value.metaValues.push({ id: uid() } as AlgoParamMetaItem);
|
|
|
};
|
|
|
|
|
|
- const removeTime = (id: string) => {
|
|
|
- const timeRangeArr = selectedAlgoDetail.value.timeRangeArr;
|
|
|
- selectedAlgoDetail.value.timeRangeArr = timeRangeArr.filter((x) => x.id !== id);
|
|
|
- };
|
|
|
-
|
|
|
- const getTimeStr = (d: Dayjs) => {
|
|
|
- return dayjs(d).format('HH:mm:ss');
|
|
|
- };
|
|
|
- const getTimeStrs = (d: [Dayjs, Dayjs]) => {
|
|
|
- return getTimeStr(d[0]) + '-' + getTimeStr(d[1]);
|
|
|
- };
|
|
|
-
|
|
|
- const handleAlgoEnable = () => {
|
|
|
- handleSave(true);
|
|
|
- };
|
|
|
-
|
|
|
const checkFrequencyValid = () => {
|
|
|
- selectedAlgoDetail.value.detectionFrequency = Math.ceil(
|
|
|
- selectedAlgoDetail.value.detectionFrequency,
|
|
|
- );
|
|
|
+ selectedAlgoDetail.value.detectionFrequency = Math.ceil(selectedAlgoDetail.value.detectionFrequency);
|
|
|
};
|
|
|
const checkDurationMinMsValid = () => {
|
|
|
- selectedAlgoDetail.value.eventDurationMinMs = Math.ceil(
|
|
|
- selectedAlgoDetail.value.eventDurationMinMs,
|
|
|
- );
|
|
|
+ selectedAlgoDetail.value.eventDurationMinMs = Math.ceil(selectedAlgoDetail.value.eventDurationMinMs);
|
|
|
};
|
|
|
const checkDurationMinFramesValid = () => {
|
|
|
- selectedAlgoDetail.value.eventDurationMinFrames = Math.ceil(
|
|
|
- selectedAlgoDetail.value.eventDurationMinFrames,
|
|
|
- );
|
|
|
+ selectedAlgoDetail.value.eventDurationMinFrames = Math.ceil(selectedAlgoDetail.value.eventDurationMinFrames);
|
|
|
};
|
|
|
const checkAlarmIntervalMsValid = () => {
|
|
|
- selectedAlgoDetail.value.eventAlarmIntervalMs = Math.ceil(
|
|
|
- selectedAlgoDetail.value.eventAlarmIntervalMs,
|
|
|
- );
|
|
|
+ selectedAlgoDetail.value.eventAlarmIntervalMs = Math.ceil(selectedAlgoDetail.value.eventAlarmIntervalMs);
|
|
|
};
|
|
|
const checkAlarmIntervalFramesValid = () => {
|
|
|
- selectedAlgoDetail.value.eventAlarmIntervalFrames = Math.ceil(
|
|
|
- selectedAlgoDetail.value.eventAlarmIntervalFrames,
|
|
|
- );
|
|
|
+ selectedAlgoDetail.value.eventAlarmIntervalFrames = Math.ceil(selectedAlgoDetail.value.eventAlarmIntervalFrames);
|
|
|
};
|
|
|
|
|
|
const checkTimeWindowValid = () => {
|
|
|
selectedAlgoDetail.value.timeWindow = Math.ceil(selectedAlgoDetail.value.timeWindow || 1);
|
|
|
};
|
|
|
|
|
|
- const handleSave = async (isSwitch: boolean) => {
|
|
|
+ const handleSave = async () => {
|
|
|
//判断时间段是否合格
|
|
|
if (markedTimeRangeIds.value.length > 0) {
|
|
|
ElMessage.error('请正确填写检测时间段');
|
|
|
return;
|
|
|
}
|
|
|
- const emptyTimes = selectedAlgoDetail.value.timeRangeArr.filter(
|
|
|
- (item) => !item.startDay || !item.endDay,
|
|
|
- );
|
|
|
+ const emptyTimes = selectedAlgoDetail.value.timeRangeArr.filter((item) => !item.startDay || !item.endDay);
|
|
|
if (emptyTimes && emptyTimes.length > 0) {
|
|
|
emptyTimes.forEach((item) => {
|
|
|
markedTimeRangeIds.value.push(item.id);
|
|
|
@@ -355,7 +300,7 @@
|
|
|
//判断时间段和元数据都有值
|
|
|
const detail = selectedAlgoDetail.value;
|
|
|
if (!detail) return;
|
|
|
- const timeRanges = detail.timeRangeArr;
|
|
|
+ // const timeRanges = detail.timeRangeArr;
|
|
|
// if (timeRanges.length == 0) {
|
|
|
// ElMessage.error('至少添加一个检测时间段');
|
|
|
// return;
|
|
|
@@ -393,7 +338,6 @@
|
|
|
});
|
|
|
const param = {
|
|
|
id: detail.id,
|
|
|
- isSwitch,
|
|
|
inferCode: detail.inferCode,
|
|
|
algoId: detail.algoId,
|
|
|
detectionFrequency: detail.detectionFrequency,
|
|
|
@@ -406,9 +350,7 @@
|
|
|
metaObjs,
|
|
|
criticalCounts: metaValues.map((item) => item.criticalCount),
|
|
|
judge: detail.judge,
|
|
|
- electronicFence: detail.electronicFenceBool
|
|
|
- ? FENCE_ENBALED_STATUS.enabled
|
|
|
- : FENCE_ENBALED_STATUS.disabled,
|
|
|
+ electronicFence: detail.electronicFenceBool ? FENCE_ENBALED_STATUS.enabled : FENCE_ENBALED_STATUS.disabled,
|
|
|
status: detail.enableCardBool ? ALGO_ENABLED_STATUS.enabled : ALGO_ENABLED_STATUS.disabled,
|
|
|
} as any;
|
|
|
if (detail.timeWindow) {
|
|
|
@@ -419,31 +361,34 @@
|
|
|
};
|
|
|
|
|
|
const handleRemoveAlgo = () => {
|
|
|
- if (!selectedAlgoId.value) return;
|
|
|
const el = document.getElementById('algoCardWrapper') as HTMLElement;
|
|
|
- ElMessageBox.confirm(
|
|
|
- '<strong>确认取消算法配置吗?</strong><br />取消后配置的参数将不会被保存。',
|
|
|
- '',
|
|
|
- {
|
|
|
+ if (props.isChanged) {
|
|
|
+ ElMessageBox.confirm('<strong>确认取消算法配置吗?</strong><br />取消后配置的参数将不会被保存。', '', {
|
|
|
confirmButtonText: '确定',
|
|
|
cancelButtonText: '取消',
|
|
|
type: 'warning',
|
|
|
dangerouslyUseHTMLString: true,
|
|
|
appendTo: el,
|
|
|
- },
|
|
|
- )
|
|
|
- .then(() => {
|
|
|
- emits('onCancel', selectedAlgoId.value!);
|
|
|
})
|
|
|
- .catch(() => {});
|
|
|
+ .then(() => {
|
|
|
+ emits('onCancel');
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+ } else {
|
|
|
+ emits('onCancel');
|
|
|
+ }
|
|
|
};
|
|
|
+
|
|
|
+ onUnmounted(() => {
|
|
|
+ algoParamsSettingStore.clear();
|
|
|
+ });
|
|
|
</script>
|
|
|
<style scoped>
|
|
|
.algoCardWrapper {
|
|
|
border: 1px solid #ccc;
|
|
|
border-radius: 4px;
|
|
|
/* padding: 10px; */
|
|
|
- width: 780px;
|
|
|
+ width: 990px;
|
|
|
}
|
|
|
|
|
|
.algoRow {
|
|
|
@@ -455,6 +400,8 @@
|
|
|
margin-right: 10px;
|
|
|
width: 90px;
|
|
|
text-align: right;
|
|
|
+ flex-shrink: 0;
|
|
|
+ flex-grow: 0;
|
|
|
}
|
|
|
.algoTimeContent {
|
|
|
display: flex;
|
|
|
@@ -487,7 +434,7 @@
|
|
|
|
|
|
.timeAdd {
|
|
|
width: 28px;
|
|
|
- height: 90px;
|
|
|
+ height: 50px;
|
|
|
background: #ebebeb;
|
|
|
border-radius: 4px;
|
|
|
border: 1px dashed #00000026;
|
|
|
@@ -503,7 +450,15 @@
|
|
|
}
|
|
|
|
|
|
.timeList {
|
|
|
- width: 610px;
|
|
|
+ overflow-y: auto;
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-items: flex-start;
|
|
|
+ }
|
|
|
+ .metaValuesList {
|
|
|
+ width: 425px;
|
|
|
+ max-height: 350px;
|
|
|
+ overflow-y: auto;
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
align-items: flex-start;
|