| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- <template>
- <div class="algoCardWrapper">
- <div class="algoCardTitle">
- <div>{{ selectedAlgoDetail?.algoInfo?.name }}</div>
- <ElSwitch v-model="selectedAlgoDetail.enableCardBool" size="small" />
- </div>
- <div class="algoCardMain">
- <div class="algoRow">
- <div class="algoLabel">电子围栏:</div>
- <div>
- <div>
- <ElSwitch v-model="selectedAlgoDetail.electronicFenceBool" size="small" />
- <span style="font-size: 10px; margin-left: 20px; color: #262626"
- >备注:请绘制电子围栏</span
- >
- </div>
- <div class="presetList"> 预置位1 预置位2 预置位3 </div>
- </div>
- </div>
- <div class="algoRow">
- <div class="algoLabel">检测时间:</div>
- <div>
- <div v-for="x in selectedAlgoDetail.timeRangeArr" :key="x.id">
- <el-time-picker
- v-model="x.value"
- is-range
- range-separator="-"
- start-placeholder="Start time"
- end-placeholder="End time"
- :clearable="false"
- size="small"
- style="width: 180px; margin-bottom: 10px"
- />
- <span @click="removeTime(x.id)" v-if="selectedAlgoDetail.timeRangeArr.length > 1">
- <el-icon class="removeIcon"><CircleCloseFilled /></el-icon
- ></span>
- </div>
- <div @click="handleAddTimeRange" class="addTimeIcon">
- <img :src="addTimeIcon" width="28" height="28" />
- </div>
- </div>
- </div>
- <div class="algoRow" style="align-items: center">
- <div class="algoLabel">检测频率:</div>
- <ElInputNumber
- v-model="selectedAlgoDetail.detectionJSON.detectionNum"
- controls-position="right"
- :min="0"
- size="small"
- style="width: 80px"
- />
- <ElSelect
- size="small"
- style="width: 60px; margin-left: 10px"
- v-model="selectedAlgoDetail.detectionJSON.detectionUnit"
- >
- <ElOption
- v-for="x in frequencyOptions"
- :key="x.value"
- :value="x.value"
- :label="x.label"
- />
- </ElSelect>
- <span style="font-size: 12px; margin-left: 5px">/次</span>
- </div>
- <div style="display: flex; justify-content: flex-end">
- <ElButton size="small" @click="handleRemoveAlgo" :disabled="!selectedAlgoId">删除</ElButton>
- <ElButton size="small" type="primary" @click="handleSave" :disabled="!selectedAlgoId"
- >保存</ElButton
- >
- </div>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { ElSelect, ElOption, ElSwitch, ElInputNumber, ElTimePicker } from 'element-plus';
- import { CircleCloseFilled } from '@element-plus/icons-vue';
- import { storeToRefs } from 'pinia';
- import dayjs, { Dayjs } from 'dayjs';
- import addTimeIcon from '@/assets/icons/addTimeIcon.png';
- import useCameraAlgoStore from '../../store/useCameraAlgoStore';
- import { STATUS } from './types';
- import { createDefaultTime, frequencyOptions } from './utils';
- // const { data: algoList, loading } = useAllAlgos();
- const cameraAlgoStore = useCameraAlgoStore();
- const { selectedAlgoId, selectedAlgoDetail } = storeToRefs(cameraAlgoStore);
- interface Param {
- /** 算法id */
- algoId: number;
- /** 检测频率,单位是秒 */
- detectionFrequency: number;
- /** 检测时间段,可以有多个,转化为字符串,格式为 09:00-10:00;11:00-12:00 */
- detectionTime: string;
- /** 电子围栏是否开启 */
- electronicFence: STATUS;
- /** 算法是否启用 */
- status: STATUS;
- }
- const emits = defineEmits<{
- (e: 'onSubmit', param: Param): Promise<unknown>;
- (e: 'onRemove', algoId: number): Promise<unknown>;
- }>();
- const handleAddTimeRange = () => {
- selectedAlgoDetail.value.timeRangeArr.push(createDefaultTime());
- };
- 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 handleSave = () => {
- const detail = selectedAlgoDetail.value;
- if (!detail) return;
- const param = {
- id: detail.id,
- algoId: detail.algoId,
- detectionFrequency: detail.detectionJSON.detectionNum * detail.detectionJSON.detectionUnit,
- detectionTime: detail.timeRangeArr
- .map((x) => {
- return getTimeStrs(x.value);
- })
- .join(';'),
- electronicFence: detail.electronicFenceBool ? STATUS.enabled : STATUS.disabled,
- status: detail.enableCardBool ? STATUS.enabled : STATUS.disabled,
- };
- emits('onSubmit', param);
- console.log('param', param);
- };
- const handleRemoveAlgo = () => {
- if (!selectedAlgoId.value) return;
- emits('onRemove', selectedAlgoId.value);
- };
- </script>
- <style scoped>
- .algoCardWrapper {
- border: 1px solid #ccc;
- border-radius: 4px;
- /* padding: 10px; */
- width: 400px;
- }
- .algoRow {
- display: flex;
- margin: 10px 0;
- }
- .algoLabel {
- margin-right: 10px;
- }
- .presetList {
- font-size: 12px;
- display: none;
- }
- .removeIcon {
- margin-left: 10px;
- color: #8c8c8c;
- cursor: pointer;
- }
- .addTimeIcon {
- cursor: pointer;
- }
- .algoCardTitle {
- background: #f0f2f5;
- display: flex;
- justify-content: space-between;
- padding: 4px 20px;
- align-items: center;
- }
- .algoCardMain {
- padding: 10px 20px;
- }
- </style>
|