Ver código fonte

Merge branch 'FixBUG' into 'master'

Fix bug 场景管理添加方式枚举&删除相机重复提醒

See merge request tian-group/skyeye-admin-fe!73
楼航飞 2 anos atrás
pai
commit
49f6bd1c05

+ 4 - 3
.env.development

@@ -16,15 +16,16 @@ VITE_DROP_CONSOLE = true
 # VITE_PROXY=[["/skyeye-admin-api","http://172.16.23.144:8800/api"]]
 #VITE_PROXY=[["/skyeye-admin-api","http://58.144.197.158:19980/skyeye-admin-api"],["/eye_api","http://58.144.197.158:19980/eye_api"],["/push_stream_host","http://58.144.197.158:19980/push_stream_host"],["/skyeye-login","http://58.144.197.158:19980/skyeye-login"]]
 # VITE_PROXY=[["/skyeye-admin-api","http://36.133.176.76:19980/skyeye-admin-api"],["/eye_api","http://36.133.176.76:19980/eye_api"],["/push_stream_host","http://36.133.176.76:19980/push_stream_host"],["/skyeye-login","http://36.133.176.76:19980/skyeye-login"]]
-# VITE_PROXY=[["/skyeye-admin-api","http://172.16.23.144/skyeye-admin-api"],["/eye_api","http://172.16.23.144/eye_api"],["/push_stream_host","http://172.16.23.144/push_stream_host"],["/skyeye-login","http://172.16.23.144/skyeye-login"]]
-VITE_PROXY=[["/skyeye-admin-api","http://192.168.32.47/skyeye-admin-api"],["/eye_api","http://192.168.32.47/eye_api"],["/push_stream_host","http:/192.168.32.47/push_stream_host"],["/skyeye-login","http://192.168.32.47/skyeye-login"]]
+VITE_PROXY=[["/skyeye-admin-api","http://172.16.23.144/skyeye-admin-api"],["/eye_api","http://172.16.23.144/eye_api"],["/push_stream_host","http://172.16.23.144/push_stream_host"],["/skyeye-login","http://172.16.23.144/skyeye-login"]]
+# VITE_PROXY=[["/skyeye-admin-api","http://192.168.32.47/skyeye-admin-api"],["/eye_api","http://192.168.32.47/eye_api"],["/push_stream_host","http:/192.168.32.47/push_stream_host"],["/skyeye-login","http://192.168.32.47/skyeye-login"]]
 # API 接口地址
 VITE_GLOB_API_URL = 
 # 图片上传地址
 VITE_GLOB_UPLOAD_URL=  
 
 # 图片前缀地址
-VITE_GLOB_IMG_URL = //36.133.176.76:19980/skyeye_static/
+#VITE_GLOB_IMG_URL = //36.133.176.76:19980/skyeye_static/
+VITE_GLOB_IMG_URL = //172.16.23.144/skyeye_static/
 
 
 # 接口前缀

+ 1 - 0
src/api/scene/scene.ts

@@ -129,6 +129,7 @@ interface LayoutResp {
   /** 目标id: 对应公司ID/车间ID */
   targetId: number;
   viewType: ViewType;
+  integrationState?: number;
 }
 
 /** 查询地图布局 */

+ 6 - 0
src/api/scene/sceneOperate.ts

@@ -15,6 +15,8 @@ export interface ComAddDatas {
   serial?: number; //排序
   labelList?: string[]; //创建的多个场景标签   自定义后面需要修改 这里没
   parent?: null | ComAddDatas;
+  longitude?: number; //经度
+  latitude?: number; //纬度
 }
 
 /**
@@ -65,6 +67,8 @@ export interface WorkshopAddDatas {
   parent?: null | WorkshopAddDatas;
   workshopModule?: WorkShopTempleteType;
   labelList?: WorkShopTempleteType[];
+  longitude?: number; //经度
+  latitude?: number; //纬度
   // templete?: string; //车间模板
   // tag?: string; //场景标签
 }
@@ -115,6 +119,8 @@ export interface WorkspaceAddDatas {
   updatedAt?: string;
   workshopId?: number; //车间id
   parent?: null | WorkspaceAddDatas;
+  longitude?: number; //经度
+  latitude?: number; //纬度
   // tag?: string; //场景标签
 }
 

+ 20 - 10
src/api/system/user-operate.ts

@@ -41,11 +41,16 @@ export function addAdminUser(params: AdminUserType) {
 
 //添加用户
 export function addSingleUser(params: UserType) {
-  return http.request({
-    url: '/user/add',
-    method: 'POST',
-    params,
-  });
+  return http.request(
+    {
+      url: '/user/add',
+      method: 'POST',
+      params,
+    },
+    {
+      isTransformResponse: false,
+    },
+  );
 }
 
 //添加批量用户
@@ -88,11 +93,16 @@ export function delUser(params: UserTypeDel) {
 
 //修改用户
 export function updateUser(params: UserType) {
-  return http.request({
-    url: '/user/update',
-    method: 'POST',
-    params,
-  });
+  return http.request(
+    {
+      url: '/user/update',
+      method: 'POST',
+      params,
+    },
+    {
+      isTransformResponse: false,
+    },
+  );
 }
 
 //获取单个用户信息

+ 8 - 0
src/views/cameras/overview/CamerasOverview.vue

@@ -192,11 +192,19 @@
   };
 
   const handleEdit = (row) => {
+    console.log('ROW', row.sourceType);
+
     if (row.sourceType === AddType.srs) {
+      console.log('RSTP');
+
       showEditSRSPopover.value = true;
     } else if (row.sourceType === AddType.ip) {
+      console.log('IP');
+
       showEditPopover.value = true;
     } else {
+      console.log('NVR');
+
       showEditNVRPopover.value = true;
     }
     editCameraData.value = row;

+ 3 - 3
src/views/cameras/overview/constant.ts

@@ -55,9 +55,9 @@ export const cameraAddType = [
 ];
 
 export enum AddType {
-  ip = 'IP地址/域名',
-  nvr = 'NVR平台添加',
-  srs = '流媒体地址',
+  ip = 'IP',
+  nvr = 'NVR',
+  srs = 'RTSP',
 }
 
 export const serviceTypeSelect = [

+ 1 - 0
src/views/cameras/preview/CameraPreview.vue

@@ -51,6 +51,7 @@
       const matchedNode = targetData.find((item) => item.cameraCode === node.code);
       if (matchedNode) {
         node.networkingState = matchedNode.status;
+        node.integrationState = matchedNode.integrationState;
       }
       if (node.integrationState === 1) {
         integrationCount++;

+ 40 - 2
src/views/map-config/mini-map/MapBase/KonvaMap.vue

@@ -46,14 +46,27 @@
   import { cloneDeep } from 'lodash-es';
   import useMiniMap from '../use-mini-map';
   import { storeToRefs } from 'pinia';
+  import { updateMinMapViewLayoutApi } from '@/api/scene/scene';
 
   const globSetting = useGlobSetting();
 
   const miniMap = useMiniMap();
   const { shopCameraList } = storeToRefs(miniMap);
 
-  const emit = defineEmits(['changeDefaultCamera', 'sendCameraId']);
+  interface DataType {
+    name: string;
+    code: string;
+    cameraIp: string;
+    remark: string;
+    status: number;
+    pushstreamIp: string;
+    isSet: number;
+    workSpaceName: string;
+    integrationState?: number;
+  }
 
+  const emit = defineEmits(['changeDefaultCamera', 'sendCameraId']);
+  const props = defineProps<{ filterData: DataType[] }>();
   const camImg = new Image();
 
   const stageConfig = ref({
@@ -87,6 +100,16 @@
   const transformer = ref();
   const defaultIcon = ref();
 
+  function addIntegrationState(data: camerasGroupType[], updateData: DataType[]) {
+    for (let i = 0; i < data.length; i++) {
+      const camera = data[i];
+      const matchedCamera = updateData.find((item) => item.code === camera.id);
+      if (matchedCamera) {
+        camera.groupConfig.visible = matchedCamera.integrationState === 0 ? true : false;
+      }
+    }
+  }
+
   const bgConfig = ref({
     x: 0,
     y: 0,
@@ -271,6 +294,14 @@
     { immediate: true, deep: true },
   );
 
+  watch(
+    () => props.filterData,
+    () => {
+      addIntegrationState(cameras.value, props.filterData);
+    },
+    { immediate: true, deep: true },
+  );
+
   const clearBg = () => {
     bgImg.src = null as any as string;
     layer.value.getNode().draw();
@@ -361,7 +392,7 @@
   };
 
   /** 导入布局json */
-  const createMap = (layout) => {
+  const createMap = (layout, selectId) => {
     addBg(layout.bgImgUrl).then((_res) => {
       const unExitList = [] as any[];
       stageConfig.value = layout.stageConfig;
@@ -381,7 +412,14 @@
         });
       if (unExitList.length > 0) {
         ElMessage.warning('部分相机不存在,已为您删除!');
+
+        const layoutNew = cloneDeep(layout);
+        updateMinMapViewLayoutApi({
+          layout: JSON.stringify({ ...layoutNew, isUploadBg: true }),
+          targetId: String(selectId),
+        });
       }
+
       cameras.value = layout.cameraList;
     });
   };

+ 32 - 2
src/views/map-config/mini-map/MiniMapConfig.vue

@@ -79,6 +79,7 @@
             :class="{
               isAdded: isAddedCamera(item.code),
               isActive: item.code === caremaActiveId,
+              integrationState: item.integrationState === 1,
             }"
             @click="handleAddCamera(item.code)"
           >
@@ -104,6 +105,7 @@
       >
         <KonvaMap
           ref="konvaMap"
+          :filter-data="filterShopCameraList"
           @change-default-camera="changeDefault"
           @send-camera-id="sendCameras"
           v-moveable:1
@@ -135,12 +137,16 @@
   import useMiniMap from './use-mini-map';
   import { storeToRefs } from 'pinia';
   import { ElMessage, ElInput } from 'element-plus';
-  import { onMounted, ref } from 'vue';
+  import { onMounted, onUnmounted, ref } from 'vue';
   import { updateMinMapViewLayoutApi } from '@/api/scene/scene';
   import { computed } from 'vue';
   import { Search, Refresh, ArrowLeft } from '@element-plus/icons-vue';
   import KonvaMap from './MapBase/KonvaMap.vue';
   import { useUserStore } from '@/store/modules/user';
+  import useCameraStatus from '@/views/cameras/preview/store/useCameraStatus';
+
+  const cameraStatus = useCameraStatus();
+  const { openInterval, closeInterval } = cameraStatus;
 
   const userStore = useUserStore();
   const getHeaders = () => {
@@ -166,6 +172,17 @@
   const isUploadBg = ref<boolean>(true);
   const isMap = ref(false);
 
+  function updataState(data, updateData) {
+    for (let i = 0; i < data.length; i++) {
+      const camera = data[i];
+      const matchedCamera = updateData.find((item) => item.cameraCode === camera.code);
+      if (matchedCamera) {
+        camera.status = matchedCamera.status;
+        camera.integrationState = matchedCamera.integrationState;
+      }
+    }
+  }
+
   const changeUploadBg = () => {
     if (isUploadBg.value && !isMap.value) {
       konvaMap.value.resetMap();
@@ -211,6 +228,10 @@
 
   const getShopContent = (code: string) => {
     getShowCameras(code).then(() => {
+      const codeList = filterShopCameraList.value.map((item) => item.code);
+      openInterval(codeList, (targetData) => {
+        updataState(filterShopCameraList.value, targetData);
+      });
       getMapLayout(code).then((res) => {
         if (!res) {
           return;
@@ -219,7 +240,7 @@
         isMap.value = res.isUploadBg;
         if (res.isUploadBg) {
           isUploadBg.value = true;
-          konvaMap.value.createMap(res);
+          konvaMap.value.createMap(res, selectedShopDetail.value?.id);
         } else {
           hasBg.value = false;
           isUploadBg.value = res.isUploadBg;
@@ -239,6 +260,10 @@
     }
   });
 
+  onUnmounted(() => {
+    closeInterval();
+  });
+
   const filterShopCameraList = computed(() => {
     const k = searchKey.value.trim();
     if (!k) return shopCameraList.value;
@@ -387,6 +412,11 @@
     background-color: rgba(0, 0, 0, 0.6);
   }
 
+  .integrationState {
+    cursor: not-allowed;
+    color: #ccc;
+  }
+
   :deep(.search-put .el-input__wrapper) {
     background-color: #f0f2f5;
   }

+ 1 - 0
src/views/map-config/mini-map/type.ts

@@ -17,6 +17,7 @@ export interface camerasImgType {
   image?: HTMLImageElement;
   name?: string;
   url?: string;
+  visible?: boolean;
 }
 
 export interface camerasGroupType {

+ 1 - 0
src/views/map-config/mini-map/use-mini-map.ts

@@ -10,6 +10,7 @@ type ShopMapCamera = CameraItem & {
   isSet: number;
   /** 工位名称 */
   workSpaceName: string;
+  integrationState?: number;
 };
 
 export const useMiniMap = defineStore('mini-map', () => {

+ 30 - 1
src/views/system-config/scene-manage/CompanyDrawer.vue

@@ -74,6 +74,13 @@
             ></div>
           </div>
         </el-form-item>
+        <el-form-item label="坐标位置" prop="location">
+          <el-input
+            v-model="ruleForm.location"
+            style="width: 200px"
+            placeholder="经度:121.53 ;纬度:31.22"
+          />
+        </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="ruleForm.remark" style="width: 200px" />
         </el-form-item>
@@ -128,7 +135,10 @@
       seniorScene?: string;
       addEnable?: ENABLED;
       selectItems?: SelectItemType[];
-      remark: string;
+      remark?: string;
+      location?: string;
+      longitude?: number; //经度
+      latitude?: number; //纬度
     };
   }>();
 
@@ -145,6 +155,8 @@
 
   //表格中的规则
   const ruleFormRef = ref<FormInstance>();
+  //匹配规则
+  const pattern = /经度\s*[::]\s*([0-9.]+)\s*[;;]\s*纬度\s*[::]\s*([0-9.]+)/;
 
   interface RuleForm {
     name: string; //名称
@@ -158,6 +170,9 @@
     selectItems?: SelectItemType[];
     addEnable?: ENABLED;
     remark?: string; //备注,可用于添加经纬度,非必要
+    location?: string; //坐标位置
+    longitude?: number; //经度
+    latitude?: number; //纬度
   }
 
   const ruleForm = reactive<RuleForm>({
@@ -172,6 +187,9 @@
     selectItems: [{ tag: '', template: '' }],
     addEnable: ENABLED.TRUE,
     remark: '',
+    location: '',
+    longitude: undefined, //经度
+    latitude: undefined, //纬度
   });
   const rules = reactive<FormRules>({
     name: [
@@ -203,6 +221,9 @@
       ruleForm.addEnable = data.addEnable;
       ruleForm.selectItems = data.selectItems;
       ruleForm.remark = data.remark;
+      if (data.longitude && data.latitude) {
+        ruleForm.location = `经度:${data.longitude} ;纬度:${data.latitude}`;
+      }
     },
     { immediate: true },
   );
@@ -261,6 +282,8 @@
             console.log('取消删除物件');
           });
       } else {
+        const matchResult = ruleForm.location?.match(pattern)!;
+        // 经度:43.22;纬度:34234
         const newComData = {
           name: ruleForm.name,
           code: ruleForm.code,
@@ -269,6 +292,8 @@
           parentId: 0,
           serial: 0,
           remark: ruleForm.remark,
+          longitude: Number(matchResult[1]),
+          latitude: Number(matchResult[2]),
         };
         //提交数据并重置关闭el-draw
         addCompany(newComData)
@@ -329,6 +354,8 @@
         return item.tag && item.template;
       });
 
+      const matchResult = ruleForm.location?.match(pattern)!;
+
       //新增的数据
       const editNewCom = {
         id: props.detail.id,
@@ -336,6 +363,8 @@
         code: ruleForm.code,
         status: Number(ruleForm.addEnable),
         remark: ruleForm.remark,
+        longitude: Number(matchResult[1]),
+        latitude: Number(matchResult[2]),
       };
       // 编辑上传
       editCompany(editNewCom)

+ 4 - 2
src/views/system-config/scene-manage/SceneManage.vue

@@ -328,6 +328,8 @@
         addEnable: editedItem.value!.status,
         selectItems: selectItems.value,
         remark: editedItem.value?.remark,
+        longitude: editedItem.value?.longitude!,
+        latitude: editedItem.value?.latitude!,
       };
     } else if (level.value === DATA_LEVEL.workshop && 'companyId' in editedItem.value!) {
       showDrawer.value = DrawerType.workshop;
@@ -371,7 +373,7 @@
       const parentIndex = row.parent.children!.findIndex((item) => item.id === row.id);
       if (parentIndex > 0) {
         const previousRow = row.parent.children![parentIndex - 1];
-        const targetParent = getParent(tableData.value, previousRow.parent.id);
+        const targetParent = getParent(tableData.value, previousRow.parent.code);
         // 进行交换位置
         targetParent.children!.splice(parentIndex - 1, 2, row, previousRow);
       }
@@ -397,7 +399,7 @@
       const parentIndex = row.parent.children!.findIndex((item) => item.id === row.id);
       if (parentIndex < row.parent.children?.length - 1) {
         const behindRow = row.parent.children![parentIndex + 1];
-        const targetParent = getParent(tableData.value, behindRow.parent.id);
+        const targetParent = getParent(tableData.value, behindRow.parent.code);
         // 进行交换位置
         targetParent.children!.splice(parentIndex, 2, behindRow, row);
       }

+ 13 - 6
src/views/system-config/scene-manage/use-method.tsx

@@ -151,21 +151,28 @@ export const findItemLevel = (data, targetId, targetName, currentLevel = 0) => {
 
 
 //得到parent
-export const getParent = (data:DataSourceUser[], targetId:number) => {
-  let parentNode = {} as DataSourceUser
+export const getParent = (data:DataSourceUser[], targetCode:string) => {
+
+  
+  
+  //let parentNode = {} as DataSourceUser
   for (let i = 0; i < data.length; i++) {
     const item = data[i];
 
-    if (item.id === targetId ) {
-      parentNode = item
+    if (item.code === targetCode ) {
+      // parentNode = item
+      return item
     }
 
     if (item.children && item.children.length > 0) {
-       getParent(item.children, targetId);
+      const foundItem = getParent(item.children, targetCode);
+      if(foundItem){
+        return foundItem
+      }
     }
   }
 
-  return parentNode;
+  return null;
 };
 
 //删除行

+ 25 - 11
src/views/system/user/CreateDrawer.vue

@@ -80,7 +80,7 @@
   import { useDictionary } from '@/hooks/web/useDictionary';
   import { userInfo } from '@/api/system/user';
   import { postList } from '@/api/common/index';
-  import { cloneDeep } from 'lodash-es';
+  import { cloneDeep, reject } from 'lodash-es';
   import { UserType, addSingleUser, updateUser } from '@/api/system/user-operate';
   import useSelectContent from './hooks/use-user-para';
 
@@ -217,11 +217,18 @@
           nickname: formParams.value.nickname,
           roleIds: formParams.value.roleIds,
         };
-        addSingleUser(addData).then(() => {
-          emit('change');
-          handleReset();
-          closeDrawer();
-        });
+        addSingleUser(addData)
+          .then((res) => {
+            if (res.code !== 200) {
+              return Promise.reject(res.msg);
+            }
+            emit('change');
+            handleReset();
+            closeDrawer();
+          })
+          .catch((error) => {
+            ElMessage.error(error);
+          });
       } else {
         const updateData = {
           userId: params.userId,
@@ -235,11 +242,18 @@
           roleIds: formParams.value.roleIds,
           deleteStatus: '1',
         };
-        updateUser(updateData).then(() => {
-          emit('change');
-          handleReset();
-          closeDrawer();
-        });
+        updateUser(updateData)
+          .then((res) => {
+            if (res.code !== 200) {
+              return Promise.reject(res.msg);
+            }
+            emit('change');
+            handleReset();
+            closeDrawer();
+          })
+          .catch((error) => {
+            ElMessage.error(error);
+          });
       }
     });
   }