فهرست منبع

fix: 相机管理部分接口对接+bug修复

bxy 1 سال پیش
والد
کامیت
f451becdef

+ 1 - 1
src/api/camera/camera-overview.ts

@@ -140,7 +140,7 @@ export const getCameraStateByIds = (data: { cameraIdList: number[] | string[] })
 export function downloadSpaceCode() {
   return http.request(
     {
-      url: '/admin/cameraConfig/exportWorkspaceCodeForm',
+      url: '/admin/cameraConfig/exportSceneCodeInfo',
       method: 'post',
       responseType: 'blob',
     },

+ 46 - 10
src/views/cameras/overview/CamerasOverview.vue

@@ -7,7 +7,10 @@
         <el-button :class="isActiveExport ? 'btn-active' : 'btn-normal'" @click="handleBatchExport"
           >导出</el-button
         >
-        <el-button :class="isActiveDelete ? 'btn-active' : 'btn-normal'" @click="handleBatchDelete"
+        <el-button
+          :class="isActiveDelete ? 'btn-active' : 'btn-normal'"
+          @click="handleBatchDelete"
+          v-if="hasCameraDeletePermission()"
           >删除</el-button
         >
         <span class="close-btn" @click="handleSelectNone"></span>
@@ -39,12 +42,20 @@
         @page-size-change="handlePageSizeChange"
       >
         <template #tableTitle>
-          <el-button type="primary" :icon="Plus" @click="showAddPopover = true">添加</el-button>
           <el-button
+            v-if="hasCameraAddPermission()"
+            type="primary"
+            :icon="Plus"
+            @click="showAddPopover = true"
+            style="margin-right: 18px"
+            >添加</el-button
+          >
+          <el-button
+            v-if="hasCameraAddPermission()"
+            plain
             color="#1890FF"
             @click="showBatchImportPopover = true"
-            style="margin-left: 18px"
-            plain
+            style="margin: 0 18px 0 0"
           >
             <template #icon>
               <el-icon>
@@ -54,10 +65,11 @@
             批量添加
           </el-button>
           <el-button
+            v-if="hasCameraEditPermission()"
+            plain
             color="#1890FF"
             @click="showBatchEditPopover = true"
-            style="margin-left: 18px"
-            plain
+            style="margin: 0 18px 0 0"
           >
             <template #icon>
               <el-icon>
@@ -67,7 +79,13 @@
             批量修改
           </el-button>
           <el-badge :value="totalRow" :hidden="totalRow < 1" class="item">
-            <el-button color="#1890FF" @click="showSharedPopover = true" plain>共享相机</el-button>
+            <el-button
+              plain
+              color="#1890FF"
+              @click="showSharedPopover = true"
+              style="margin: 0 18px 0 0"
+              >共享相机</el-button
+            >
           </el-badge>
         </template>
         <template #empty>
@@ -135,6 +153,19 @@
   import { getHeaders } from '@/utils/http/axios';
   import { useGlobSetting } from '@/hooks/setting';
   import { useSceneTemplateList } from './stores/useSceneTemplateList';
+  import { useUserStore } from '@/store/modules/user';
+  import { PERM_DEVICE } from '@/types/permission/constants';
+
+  const userStore = useUserStore();
+  const hasCameraAddPermission = () => {
+    return userStore.checkPermission(PERM_DEVICE.CAMERA_ADD);
+  };
+  const hasCameraEditPermission = () => {
+    return userStore.checkPermission(PERM_DEVICE.CAMERA_EDIT);
+  };
+  const hasCameraDeletePermission = () => {
+    return userStore.checkPermission(PERM_DEVICE.CAMERA_DELETE);
+  };
 
   const sceneTemplateListInfo = useSceneTemplateList();
   const { getSceneTemplateList } = sceneTemplateListInfo;
@@ -211,13 +242,18 @@
             label: '编辑',
             icon: editIcon,
             onClick: handleEdit.bind(null, record.row),
+            auth: hasCameraEditPermission,
           },
           {
             label: '删除',
             icon: deleteIcon,
             onClick: handleDelete.bind(null, record.row),
+            auth: hasCameraDeletePermission,
           },
-        ],
+        ].filter((x) => {
+          if (!x.auth) return true;
+          return x.auth();
+        }),
       });
     },
   });
@@ -326,7 +362,7 @@
   };
 
   const handleDelete = (row) => {
-    ElMessageBox.confirm(`您想删除相机${row.code}`, '提示', {
+    ElMessageBox.confirm(`是否删除相机${row.code}`, '提示', {
       confirmButtonText: '确定',
       cancelButtonText: '取消',
       type: 'warning',
@@ -486,7 +522,7 @@
   }
 
   .item {
-    margin: 0px 40px 0px 15px;
+    margin: 0px 40px 0px 0px;
   }
 </style>
 <style lang="less">

+ 13 - 5
src/views/cameras/overview/components/AddCameraByIP.vue

@@ -111,8 +111,7 @@
             v-model="cameraIPData.workspaceIdStr"
             :data="workspaceInfo"
             :render-after-expand="false"
-            :default-expand-all="props.formData ? true : false"
-            check-strictly
+            :default-expand-all="true"
             placeholder="请选择工位"
             style="width: 200px"
             @node-click="handleTreeSelect"
@@ -173,6 +172,13 @@
   type CameraDetailForm = CameraDetailServer & { workspaceIdStr?: string };
   const cameraIPData = ref<CameraDetailForm>({} as CameraDetailForm);
 
+  const validateSceneTemplate = (_rule, value, callback) => {
+    if (Object.keys(sceneCheckedDataRef.value).length === 0)
+      callback(new Error('请选择至少一个业务场景+应用模版'));
+    else if (value && Object.keys(sceneCheckedDataRef.value).length > value.length)
+      callback(new Error('请补充完整已选中业务场景下的应用模版(或取消选中未选择模版的场景)'));
+  };
+
   const rules = {
     name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
     code: [{ required: true, message: '请输入设备ID', trigger: 'blur' }],
@@ -183,11 +189,13 @@
     videoStandard: [{ required: true, message: '请选择视频编码标准', trigger: 'blur' }],
     cameraType: [{ required: true, message: '请选择协议类型', trigger: 'blur' }],
     workspaceIdStr: [{ required: true, message: '请选择工位', trigger: 'blur' }],
-    sceneTemplateList: [{ required: true, message: '请选择至少一个业务场景', trigger: 'blur' }],
+    sceneTemplateList: [{ required: true, validator: validateSceneTemplate, trigger: 'blur' }],
   };
 
-  const handleUpdateSceneTemplateList = (data) => {
-    cameraIPData.value.sceneTemplateList = data;
+  const sceneCheckedDataRef = ref([]);
+  const handleUpdateSceneTemplateList = (sceneTemplateData, sceneCheckedData) => {
+    sceneCheckedDataRef.value = sceneCheckedData;
+    cameraIPData.value.sceneTemplateList = sceneTemplateData;
   };
 
   const handleCancel = () => {

+ 3 - 2
src/views/cameras/overview/components/BatchImportCamera.vue

@@ -134,7 +134,8 @@
         responseType: 'blob',
       };
       const response = await axios.post(
-        urlPrefix + '/admin/cameraConfig/exportWorkspaceCodeForm',
+        urlPrefix + '/admin/cameraConfig/exportSceneCodeInfo',
+        null,
         config,
       );
       const blob = new Blob([response.data], {
@@ -162,7 +163,7 @@
         responseType: 'blob',
       };
       const response = await axios.get(
-        './skyeye-file-upload/skyeye/CAMERALIST_TEMPLATE/camera-upload-template.xlsx',
+        './skyeye-file-upload/skyeye-v4/CAMERALIST_TEMPLATE/camera-upload-template.xlsx',
         config,
       );
       const blob = new Blob([response.data], {

+ 9 - 1
src/views/cameras/overview/components/sysConfigItemOfAddCamera.vue

@@ -67,12 +67,20 @@
 
   function updateSceneCheckedList() {
     sceneCheckedList.value = getSceneCheckedList(templateCheckedValues.value);
-    emits('update:sceneCheckedList', sceneCheckedList.value);
+    emits('update:sceneCheckedList', sceneCheckedList.value, sceneCheckedValues.value);
   }
 
   const handleSceneIdChange = (id) => {
     if (!sceneCheckedValues.value[id]) delete templateCheckedValues.value[id];
     updateSceneCheckedList();
+    for (let key in sceneCheckedValues.value) {
+      if (
+        sceneCheckedValues.value.hasOwnProperty(key) &&
+        sceneCheckedValues.value[Number(key)] === false
+      ) {
+        delete sceneCheckedValues.value[Number(key)];
+      }
+    }
   };
 
   const handleTemplateIdChange = () => {

+ 36 - 9
src/views/cameras/overview/hooks/useTreeWorkspaceInfo.ts

@@ -19,7 +19,7 @@ interface ElTreeItem {
   value: string;
   label: string;
   children?: ElTreeItem[];
-  disabled?: boolean;
+  // disabled?: boolean;
   workshopId?: number;
   principalName?: string;
 }
@@ -27,19 +27,46 @@ interface ElTreeItem {
 export function useTreeWorkspaceInfo() {
   const workspaceInfo = ref<ElTreeItem[]>([]);
 
-  const setTreeWorkspaceInfo = (infos: TreeWorkspaceInfoType[]): ElTreeItem[] => {
-    return infos.map((item) => {
-      return {
+  // const setTreeWorkspaceInfo = (infos: TreeWorkspaceInfoType[]): ElTreeItem[] => {
+  //   return infos.map((item) => {
+  //     return {
+  //       value: `${item.nodeType}-${item.id}`,
+  //       label: item.name,
+  //       workshopId: item.workshopId,
+  //       principalName: item.principalName,
+  //       disabled: item.nodeType === 'workspace' ? false : true,
+  //       children:
+  //         item.children && item.children.length > 0 ? setTreeWorkspaceInfo(item.children) : [],
+  //     };
+  //   });
+  // };
+  function setTreeWorkspaceInfo(infos: TreeWorkspaceInfoType[], currentDepth = 1) {
+    const result = [] as ElTreeItem[];
+    if (!Array.isArray(infos)) {
+      return result;
+    }
+    for (const item of infos) {
+      const newItem = {
         value: `${item.nodeType}-${item.id}`,
         label: item.name,
         workshopId: item.workshopId,
         principalName: item.principalName,
-        disabled: item.nodeType === 'workspace' ? false : true,
-        children:
-          item.children && item.children.length > 0 ? setTreeWorkspaceInfo(item.children) : [],
+        // disabled: item.nodeType === 'workspace' ? false : true,
+        children: [] as ElTreeItem[],
       };
-    });
-  };
+      if (currentDepth === 3) {
+        result.push(newItem);
+      } else if (item.children && item.children.length > 0) {
+        const childResults = setTreeWorkspaceInfo(item.children, currentDepth + 1);
+        if (childResults.length > 0) {
+          // 如果子节点中有深度为 3 的节点,保留当前节点并添加子结果
+          newItem.children = childResults;
+          result.push(newItem);
+        }
+      }
+    }
+    return result;
+  }
 
   const getWorkspaceIdFromTreeNode = (inputStr: string) => {
     let dashIndex = inputStr.indexOf('-');