Просмотр исходного кода

Merge branch 'wyf-dev' into 'all-v4'

Wyf dev 车间管理修改,添加公司车间工位树

See merge request skyeye/skyeye_frontend/skyeye-admin!202
Fei Liu 1 год назад
Родитель
Сommit
1ae9242609
29 измененных файлов с 1672 добавлено и 1508 удалено
  1. 0 42
      src/api/scene/scene-relate.ts
  2. 285 172
      src/api/scene/scene.ts
  3. 0 232
      src/api/scene/sceneOperate.ts
  4. 0 137
      src/api/scene/secene-templet.ts
  5. 5 5
      src/hooks/useSceneInfos.ts
  6. 36 0
      src/types/scene/constant.ts
  7. 438 0
      src/types/scene/type.ts
  8. 2 1
      src/views/map-config/mini-map/use-mini-map.ts
  9. 8 8
      src/views/message/systemNotifications/components/WorkShopTree.vue
  10. 1 1
      src/views/page-config/ConfigEdit.vue
  11. 1 1
      src/views/page-config/stores/useMapEditor.ts
  12. 291 312
      src/views/system-config/scene-manage/SceneManage.vue
  13. 21 20
      src/views/system-config/scene-manage/actionColomns.vue
  14. 15 16
      src/views/system-config/scene-manage/AddCompanyInfo.vue
  15. 8 6
      src/views/system-config/scene-manage/CompanyDrawer-shangfei.vue
  16. 106 103
      src/views/system-config/scene-manage/CompanyDrawer.vue
  17. 14 8
      src/views/system-config/scene-manage/SceneDialog.vue
  18. 35 34
      src/views/system-config/scene-manage/WorkshopDrawer-shangfei.vue
  19. 51 50
      src/views/system-config/scene-manage/WorkshopDrawer.vue
  20. 4 4
      src/views/system-config/scene-manage/WorkspaceDrawer-shangfei.vue
  21. 52 52
      src/views/system-config/scene-manage/WorkspaceDrawer.vue
  22. 0 16
      src/views/system-config/scene-manage/constant.ts
  23. 2 8
      src/views/system-config/scene-manage/use-sence-templete.ts
  24. 239 0
      src/views/system-config/scene-manage/hook/use-table-method.tsx
  25. 48 0
      src/views/system-config/scene-manage/store/use-com-tree.ts
  26. 0 240
      src/views/system-config/scene-manage/use-method.tsx
  27. 0 30
      src/views/system-config/scene-manage/use-scene.ts
  28. 9 9
      src/views/system/role/CreateUserDrawer.vue
  29. 1 1
      utils/devProxy/local/proxy.ts

+ 0 - 42
src/api/scene/scene-relate.ts

@@ -1,42 +0,0 @@
-import { http } from '@/utils/http/axios';
-
-//查询场景标签
-
-export interface CompanyType {
-  tenantId: number;
-  userId: number;
-  createDate: string;
-  modifyDate: string;
-  tenantCode: string;
-  tenantName: string;
-  beginDate: string;
-  endDate: string;
-  tenantStatus:number;
-  isDelete:boolean;
-}
-
-export const getCompanyList = (): Promise<CompanyType[]> => {
-  return http.request({
-    url: '/relationship/getEnterpriseList',
-    method: 'get',
-  });
-};
-
-//查询场景模板
-
-export interface InputType {
-  tenantCode: string;
-  tenantId: number;
-  type: string;
-}
-
-export const changeRelate = (data: InputType) => {
-  return http.request({
-    url: '/relationship/addEnterpriseRel',
-    method: 'put',
-    data,
-  });
-};
-
-
-

+ 285 - 172
src/api/scene/scene.ts

@@ -1,198 +1,50 @@
 import { http } from '@/utils/http/axios';
-
-/** 场景标签信息 */
-export type SceneLabelOrModuleItem = {
-  /** 标签id */
-  id: number;
-  /** 标签代码 */
-  code: string;
-  /** 创建时间 */
-  createdAt: string;
-  /** 0-未删除,大于0-已删除 */
-  isDeleted: number;
-  /** 标签名称 */
-  name: string;
-  /** 说明 */
-  remark: string;
-  /** 状态: 0-正常,1-不正常 */
-  status: number;
-  /** 更新时间 */
-  updatedAt: string;
-};
-
-/** 工位信息 */
-export type WorkSpaceInfoItem = {
-  /** 工位id */
-  id: number;
-  /** 所属工厂id */
-  workshopId: number;
-  /** 工位名称 */
-  name: string;
-  /** 工位code */
-  code: string;
-  /** 工位描述 */
-  remark: string;
-  /** 状态: 0-启用, 1-禁用 */
-  status: number;
-  /** 创建时间 */
-  createdAt: string;
-  /** 更新时间 */
-  updatedAt: string;
-  /** 	0-未删除,大于0-已删除 */
-  isDeleted: number;
-  /** 工位负责人 */
-  principal: string;
-  /** 排序序号 */
-  serial: number;
-};
-
-/** 工厂信息 */
-export type WorkShopInfoItem = {
-  /** 工厂id */
-  id: number;
-  /** 所属公司id */
-  companyId: number;
-  /** 1-生产安全 2-安全环保 */
-  // type: number;
-  /** 工厂名称 */
-  name: string;
-  /** 工厂code */
-  code: string;
-  /** 工厂描述 */
-  remark: string;
-  /** 状态: 0-启用, 1-禁用 */
-  status: number;
-  /** 创建时间 */
-  createdAt: string;
-  /** 更新时间 */
-  updatedAt: string;
-  /** 	0-未删除,大于0-已删除 */
-  isDeleted: number;
-  /** 下属工位列表 */
-  children: WorkSpaceInfoItem[];
-  /** 场景标签 */
-  labelName: string;
-  /** 场景标签id */
-  sceneLabelId: number;
-  /** 排序序号 */
-  serial: number;
-  /** 车间模板 */
-  workshopModule: SceneLabelOrModuleItem;
-};
-
-/** 公司信息 */
-export type CompanyInfoItem = {
-  /** 公司id */
-  id: number;
-  /** 上级公司ID, 无上级为0 */
-  parentId: number;
-  /** 公司名称 */
-  name: string;
-  /** 公司code */
-  code: string;
-  /** 公司描述 */
-  remark: string;
-  /** 状态: 0-启用, 1-禁用 */
-  status: number;
-  /** 创建时间 */
-  createdAt: string;
-  /** 更新时间 */
-  updatedAt: string;
-  /** 排序序号 */
-  serial: number;
-  /** 	0-未删除,大于0-已删除 */
-  isDeleted: number;
-  /** 下属工厂列表 */
-  children: WorkShopInfoItem[];
-  /** 场景标签列表 */
-  labelList: SceneLabelOrModuleItem[];
-  /** 场景模板列表 */
-  moduleList: SceneLabelOrModuleItem[];
-  // 模板列表信息
-  labelModuleList: { sceneLabel: SceneLabelOrModuleItem; sceneModule: SceneLabelOrModuleItem }[];
-};
+import { ViewType } from '@/types/scene/constant.ts';
+import * as SceneTypes from '@/types/scene/type.ts';
 
 /** 获取公司-工厂-工位数据 */
 export const getShopSpaceList = () => {
-  return http.request<CompanyInfoItem[]>({
+  return http.request<SceneTypes.CompanyInfoItem[]>({
     url: '/scene/getList',
     method: 'get',
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
   });
 };
 
-interface LayoutResp {
-  /** 创建时间 */
-  createdAt: string;
-  /** 自增主键 */
-  id: number;
-  /** 页面布局json	 */
-  layout: string;
-  /** 目标id: 对应公司ID/车间ID */
-  targetId: number;
-  viewType: ViewType;
-  integrationState?: number;
-}
-
 /** 查询地图布局 */
 export const getLayoutApi = (param: { workshopId: string; viewType: ViewType }) => {
-  return http.request<LayoutResp[]>({
+  return http.request<SceneTypes.LayoutResp[]>({
     url: `/layout/getWorkshopLayout?viewType=${param.viewType}&workshopId=${param.workshopId}`,
     method: 'get',
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
   });
 };
+
 /** 查询车间小地图布局 */
 export const getWorkshopMiniMapLayoutApi = (workshopId: string) => {
   return getLayoutApi({ viewType: ViewType.minMap, workshopId }).then((res) => res[0]);
 };
 
-enum ViewType {
-  safety = 1,
-  minMap = 2,
-}
-
-interface UpdateViewLayoutParam {
-  layout: string;
-  targetId: string;
-  viewType: ViewType;
-}
-
 /** 更新-新增小地图页面布局 */
-export const updateLayoutApi = (data: UpdateViewLayoutParam) => {
-  return http.request<LayoutResp[]>({
+export const updateLayoutApi = (data: SceneTypes.UpdateViewLayoutParam) => {
+  return http.request<SceneTypes.LayoutResp[]>({
     url: `/layout/updateViewLayout`,
     method: 'post',
     data: new URLSearchParams(data as any).toString(),
     headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
   });
 };
+
 /** 更新-新增小地图页面布局 */
 export const updateMinMapViewLayoutApi = (
-  param: Pick<UpdateViewLayoutParam, 'layout' | 'targetId'>,
+  param: Pick<SceneTypes.UpdateViewLayoutParam, 'layout' | 'targetId'>,
 ) => {
   return updateLayoutApi({ viewType: ViewType.minMap, ...param });
 };
 
-export type CameraItem = {
-  /** 相机名称 */
-  name: string;
-  /** 相机code */
-  code: string;
-  /** 相机IP地址 */
-  cameraIp: string;
-  /** 相机描述 */
-  remark: string;
-  /** 状态: 0-启用, 1-禁用 */
-  status: number;
-  /** 推流地址 */
-  pushstreamIp: string;
-};
-
-export type WorkSpaceCameraRelative = WorkSpaceInfoItem & { cameraList: CameraItem[] };
-
+/** ??? */
 export const getCamerasByWorkSpace = (params: { workshopId: number }) => {
-  return http.request<WorkSpaceCameraRelative[]>({
+  return http.request<SceneTypes.WorkSpaceCameraRelative[]>({
     url: '/workshop/getWorkspaceCameraList',
     method: 'get',
     params,
@@ -200,17 +52,8 @@ export const getCamerasByWorkSpace = (params: { workshopId: number }) => {
   });
 };
 
-/** 公司主页配置 */
-interface UpdateCompanyLayoutParam extends Omit<UpdateViewLayoutParam, 'targetId'> {
-  /** 标签id */
-  labelId: number;
-  targetId: number;
-  /** 更新时需要上传layout布局id */
-  id?: number;
-}
-
 /** 新增公司主页配置 */
-export const uploadCompanyLayoutApi = (data: UpdateCompanyLayoutParam) => {
+export const uploadCompanyLayoutApi = (data: SceneTypes.UpdateCompanyLayoutParam) => {
   return http.request({
     url: '/homepageConfig/saveCompanyLayout',
     method: 'post',
@@ -218,12 +61,15 @@ export const uploadCompanyLayoutApi = (data: UpdateCompanyLayoutParam) => {
   });
 };
 
-export const uploadCompanyLayout = (param: Omit<UpdateCompanyLayoutParam, 'viewType'>) => {
+/** ??? */
+export const uploadCompanyLayout = (
+  param: Omit<SceneTypes.UpdateCompanyLayoutParam, 'viewType'>,
+) => {
   return uploadCompanyLayoutApi({ ...param, viewType: ViewType.safety });
 };
 
 /** 更新公司主页配置 */
-export const updateCompanyLayoutApi = (data: UpdateCompanyLayoutParam) => {
+export const updateCompanyLayoutApi = (data: SceneTypes.UpdateCompanyLayoutParam) => {
   return http.request({
     url: '/homepageConfig/updateCompanyLayout',
     method: 'put',
@@ -231,7 +77,10 @@ export const updateCompanyLayoutApi = (data: UpdateCompanyLayoutParam) => {
   });
 };
 
-export const updateCompanyLayout = (param: Omit<UpdateCompanyLayoutParam, 'viewType'>) => {
+/** ??? */
+export const updateCompanyLayout = (
+  param: Omit<SceneTypes.UpdateCompanyLayoutParam, 'viewType'>,
+) => {
   return updateCompanyLayoutApi({ ...param, viewType: ViewType.safety });
 };
 
@@ -269,3 +118,267 @@ export const delCompanyLayout = (params: number) => {
     method: 'delete',
   });
 };
+
+/**
+ * @description: 添加公司
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const addCompany = (data: SceneTypes.ComAddDatas): Promise<number> => {
+  return http.request({
+    url: '/admin/workshop/saveCompany',
+    method: 'post',
+    data,
+  });
+};
+
+/**
+ * @description: 编辑公司
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const editCompany = (data: SceneTypes.ComAddDatas): Promise<number> => {
+  return http.request({
+    url: '/admin/workshop/updateCompany',
+    method: 'put',
+    data,
+  });
+};
+
+/**
+ * @description: 删除公司
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const delCompany = (companyId: number) => {
+  return http.request({
+    url: `/admin/workshop/deleteCompany?companyId=${companyId}`,
+    method: 'DELETE',
+  });
+};
+
+/**
+ * @description: 添加车间
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const addWorkshop = (data: SceneTypes.WorkshopAddDatas): Promise<number> => {
+  return http.request({
+    url: '/admin/workshop/saveWorkshop',
+    method: 'post',
+    data,
+  });
+};
+
+/**
+ * @description: 编辑车间
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const editWorkshop = (data: SceneTypes.WorkshopAddDatas): Promise<number> => {
+  return http.request({
+    url: '/admin/workshop/updateWorkshop',
+    method: 'put',
+    data,
+  });
+};
+
+/**
+ * @description: 删除车间
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const delWorkshop = (workshopId: number) => {
+  return http.request({
+    url: `/admin/workshop/deleteWorkshop?workshopId=${workshopId}`,
+    method: 'DELETE',
+  });
+};
+
+/**
+ * @description: 添加工位
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const addWorkspace = (data: SceneTypes.WorkspaceAddDatas): Promise<number> => {
+  return http.request({
+    url: '/admin/workshop/saveWorkspace',
+    method: 'post',
+    data,
+  });
+};
+
+/**
+ * @description: 编辑工位
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const editWorkspace = (data: SceneTypes.WorkspaceAddDatas): Promise<number> => {
+  return http.request({
+    url: '/admin/workshop/updateWorkspace',
+    method: 'put',
+    data,
+  });
+};
+
+/**
+ * @description: 删除工位
+ * @modifications
+ *  - 2025-01-13: Yunfeng
+ *  - V4-平台权限重构
+ */
+export const delWorkspace = (workspaceId: number) => {
+  return http.request({
+    url: `/admin/workshop/deleteWorkspace?workspaceId=${workspaceId}`,
+    method: 'DELETE',
+  });
+};
+
+/** ??? Deprecated in V4 */
+// export const getSceneList = (
+//   skipPerm: boolean = true,
+// ): Promise<
+//   SceneTypes.SceneListType<
+//     SceneTypes.GetListWorkshop<SceneTypes.WorkspaceAddDatas, SceneTypes.WorkShopTempleteType>,
+//     SceneTypes.LabelModuleListType
+//   >[]
+// > => {
+//   return http.request({
+//     url: `/scene/getList?skipPerm=${skipPerm}`,
+//     method: 'get',
+//   });
+// };
+
+/**
+ * @description 获取场景管理-车间管理表格的所有数据
+ * @version V4
+ * @author Yunfeng
+ * @date 2025-1-10
+ */
+export const getComShopSpaceTree = (): Promise<SceneTypes.ComTreeType[]> => {
+  return http.request({
+    url: '/admin/workshop/queryCompanyShopSpaceList',
+    method: 'get',
+  });
+};
+
+/**
+ * @description 场景管理-车间管理表格的更新排序
+ * @version V4
+ * @author Yunfeng
+ * @date 2025-1-10
+ */
+export const updateComShopSpaceTreeSort = (data: SceneTypes.ComTreeType) => {
+  return http.request({
+    url: '/admin/workshop/updateWorkshopSort',
+    method: 'post',
+    data,
+  });
+};
+
+//排序列表 Deprecated in V4
+// export const sortSceneList = (
+//   data: SceneTypes.SceneListType<
+//     SceneTypes.GetListWorkshop<SceneTypes.WorkspaceAddDatas, SceneTypes.WorkShopTempleteType>,
+//     SceneTypes.LabelModuleListType
+//   >[],
+// ) => {
+//   return http.request({
+//     url: '/scene/updateSort',
+//     method: 'put',
+//     data,
+//   });
+// };
+
+/** ??? */
+export const getCompanyList = (): Promise<SceneTypes.CompanyType[]> => {
+  return http.request({
+    url: '/admin/relationship/getEnterpriseList',
+    method: 'get',
+  });
+};
+
+/** ??? */
+export const changeRelate = (data: SceneTypes.InputType) => {
+  return http.request({
+    url: '/relationship/addEnterpriseRel',
+    method: 'put',
+    data,
+  });
+};
+
+/** ??? */
+export const querySceneLabel = (): Promise<SceneTypes.SceneLabelType[]> => {
+  return http.request({
+    url: '/template/getSceneLabelList',
+    method: 'get',
+  });
+};
+
+/** ??? */
+export const querytemplate = (): Promise<SceneTypes.TemplateType[]> => {
+  return http.request({
+    url: '/template/getSceneModuleList',
+    method: 'get',
+  });
+};
+
+/** ??? */
+export const queryWorkshopModule = (): Promise<SceneTypes.WorkshopModuleType[]> => {
+  return http.request({
+    url: '/template/getWorkshopModuleList',
+    method: 'get',
+  });
+};
+
+/** ??? */
+export const querySceneLabelByCompany = (): Promise<SceneTypes.SceneLabelByCompanyType[]> => {
+  return http.request({
+    url: '/template/findSceneLabelByCompany',
+    method: 'get',
+  });
+};
+
+/** ??? */
+export const addCompanyModuleLabel = (data: SceneTypes.SceneTempleteType[]) => {
+  return http.request({
+    url: '/template/saveCompanyModuleLabelRel',
+    method: 'post',
+    data,
+  });
+};
+
+//编辑公司-场景标签-场景模板关系
+export const editCompanyModuleLabel = (data: SceneTypes.SceneTempleteType[]) => {
+  return http.request({
+    url: '/template/updateCompanyModuleLabelRel',
+    method: 'post',
+    data,
+  });
+};
+
+/** ??? */
+export const addWorkshopModuleLabel = (data: SceneTypes.WorkShopTempleteType) => {
+  return http.request({
+    url: '/template/saveWorkshopModuleRel',
+    method: 'post',
+    data,
+  });
+};
+
+/** ??? */
+export const editWorkshopModuleLabel = (data: SceneTypes.WorkShopTempleteType) => {
+  return http.request({
+    url: '/template/updateWorkshopModuleRel',
+    method: 'post',
+    data,
+  });
+};

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

@@ -1,232 +0,0 @@
-import { http } from '@/utils/http/axios';
-import { WorkShopTempleteType } from './secene-templet';
-
-// 传入参数类型    还缺个场景list
-export interface ComAddDatas {
-  code?: string; //公司编码
-  createdAt?: string; //创建时间
-  id?: number; //新增后返回的唯一com的id
-  isDeleted?: number; //是否删除
-  name: string; //公司名字
-  parentId?: number; //上级公司id  无上级为0
-  remark?: string; //描述
-  status?: number; //状态  0-启动  1-禁用
-  updatedAt?: string;
-  serial?: number; //排序
-  labelList?: string[]; //创建的多个场景标签   自定义后面需要修改 这里没
-  parent?: null | ComAddDatas;
-  longitude?: number; //经度
-  latitude?: number; //纬度
-  regionCode?: string;
-  thumbnail?: string;
-}
-
-/**
- * @description: 添加公司
- */
-export const addCompany = (data: ComAddDatas): Promise<number> => {
-  return http.request({
-    url: '/scene/saveCompany',
-    method: 'post',
-    data,
-  });
-};
-
-/**
- * @description: 编辑公司
- */
-export const editCompany = (data: ComAddDatas): Promise<number> => {
-  return http.request({
-    url: '/scene/updateCompany',
-    method: 'put',
-    data,
-  });
-};
-
-/**
- * @description: 删除公司
- */
-export const delCompany = (companyId: number) => {
-  return http.request({
-    url: `/scene/deleteCompany?companyId=${companyId}`,
-    method: 'DELETE',
-  });
-};
-
-// 传入参数类型
-export interface WorkshopAddDatas {
-  code?: string;
-  companyId?: number; //公司id
-  sceneLabelId?: number; //类型  1-车间  2-危险点  3-物流  4-生活园区
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name: string;
-  remark?: string;
-  status?: number;
-  updatedAt?: string;
-  serial?: number;
-  parent?: null | WorkshopAddDatas;
-  workshopModule?: WorkShopTempleteType;
-  labelList?: WorkShopTempleteType[];
-  longitude?: number; //经度
-  latitude?: number; //纬度
-  // templete?: string; //车间模板
-  // tag?: string; //场景标签
-}
-
-/**
- * @description: 添加车间
- */
-export const addWorkshop = (data: WorkshopAddDatas): Promise<number> => {
-  return http.request({
-    url: '/scene/saveWorkshop',
-    method: 'post',
-    data,
-  });
-};
-
-/**
- * @description: 编辑车间
- */
-export const editWorkshop = (data: WorkshopAddDatas): Promise<number> => {
-  return http.request({
-    url: '/scene/updateWorkshop',
-    method: 'put',
-    data,
-  });
-};
-
-/**
- * @description: 删除车间
- */
-export const delWorkshop = (workshopId: number) => {
-  return http.request({
-    url: `/scene/deleteWorkshop?workshopId=${workshopId}`,
-    method: 'DELETE',
-  });
-};
-
-// 传入参数类型
-export interface WorkspaceAddDatas {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name: string;
-  principal?: string; //工位负责人
-  remark?: string;
-  status?: number;
-  serial?: number;
-  updatedAt?: string;
-  workshopId?: number; //车间id
-  parent?: null | WorkspaceAddDatas;
-  longitude?: number; //经度
-  latitude?: number; //纬度
-  // tag?: string; //场景标签
-}
-
-/**
- * @description: 添加工位
- */
-export const addWorkspace = (data: WorkspaceAddDatas): Promise<number> => {
-  return http.request({
-    url: '/scene/saveWorkspace',
-    method: 'post',
-    data,
-  });
-};
-
-/**
- * @description: 编辑工位
- */
-export const editWorkspace = (data: WorkspaceAddDatas): Promise<number> => {
-  return http.request({
-    url: '/scene/updateWorkspace',
-    method: 'put',
-    data,
-  });
-};
-
-/**
- * @description: 删除工位
- */
-export const delWorkspace = (workspaceId: number) => {
-  return http.request({
-    url: `/scene/deleteWorkspace?workspaceId=${workspaceId}`,
-    method: 'DELETE',
-  });
-};
-
-//获取列表
-// 传入参数类型
-export interface SceneListType<T, S> {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  parentId?: number;
-  remark?: string;
-  status?: number;
-  serial?: number;
-  updatedAt?: string;
-  children?: T[]; //车间-工位信息
-  labelList?: S[]; //创建的多个场景标签
-  moduleList?: S[]; //创建得多个模板
-}
-
-export interface LabelModuleListType {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  remark?: string;
-  status?: number;
-  updatedAt?: string;
-}
-
-export interface GetListWorkshop<U, A> {
-  code?: string;
-  companyId?: number; //公司id
-  sceneLabelId?: number; //类型  1-车间  2-危险点  3-物流  4-生活园区
-  labelName?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  remark?: string;
-  serial?: number;
-  status?: number;
-  updatedAt?: string;
-  children?: U[]; //工位信息
-  workshopModule?: A; //车间模板
-  workshopFuncPermissions: number[];
-  // tag?: string; //场景标签  自定义  后面需要修改
-}
-
-export const getSceneList = (
-  skipPerm: boolean = true,
-): Promise<
-  SceneListType<GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>, LabelModuleListType>[]
-> => {
-  return http.request({
-    url: `/scene/getList?skipPerm=${skipPerm}`,
-    method: 'get',
-  });
-};
-
-//排序列表
-export const sortSceneList = (
-  data: SceneListType<
-    GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>,
-    LabelModuleListType
-  >[],
-) => {
-  return http.request({
-    url: '/scene/updateSort',
-    method: 'put',
-    data,
-  });
-};

+ 0 - 137
src/api/scene/secene-templet.ts

@@ -1,137 +0,0 @@
-import { http } from '@/utils/http/axios';
-
-//查询场景标签
-
-export interface SceneLabelType {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  remark?: string;
-  status?: number;
-  updatedAt?: string;
-}
-
-export const querySceneLabel = (): Promise<SceneLabelType[]> => {
-  return http.request({
-    url: '/template/getSceneLabelList',
-    method: 'get',
-  });
-};
-
-//查询场景模板
-
-export interface TemplateType {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  remark?: string;
-  status?: number;
-  updatedAt?: string;
-}
-
-export const querytemplate = (): Promise<TemplateType[]> => {
-  return http.request({
-    url: '/template/getSceneModuleList',
-    method: 'get',
-  });
-};
-
-//查询车间模板
-
-export interface WorkshopModuleType {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  remark?: string;
-  status?: number;
-  updatedAt?: string;
-}
-
-export const queryWorkshopModule = (): Promise<WorkshopModuleType[]> => {
-  return http.request({
-    url: '/template/getWorkshopModuleList',
-    method: 'get',
-  });
-};
-
-//根据公司ID查询场景标签
-export interface SceneLabelByCompanyType {
-  code?: string;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  name?: string;
-  remark?: string;
-  status?: number;
-  updatedAt?: string;
-}
-
-export const querySceneLabelByCompany = (): Promise<SceneLabelByCompanyType[]> => {
-  return http.request({
-    url: '/template/findSceneLabelByCompany',
-    method: 'get',
-  });
-};
-
-//保存公司-场景标签-场景模板关系
-
-export interface SceneTempleteType {
-  companyId?: number;
-  createdAt?: string;
-  id?: number;
-  isDeleted?: number;
-  remark?: string;
-  sceneLabelId?: number;
-  sceneModuleId?: number;
-  updatedAt?: string;
-}
-
-export const addCompanyModuleLabel = (data: SceneTempleteType[]) => {
-  return http.request({
-    url: '/template/saveCompanyModuleLabelRel',
-    method: 'post',
-    data,
-  });
-};
-
-//编辑公司-场景标签-场景模板关系
-export const editCompanyModuleLabel = (data: SceneTempleteType[]) => {
-  return http.request({
-    url: '/template/updateCompanyModuleLabelRel',
-    method: 'post',
-    data,
-  });
-};
-
-//保存车间-车间模板关系
-export interface WorkShopTempleteType {
-  id?: number;
-  workshopId?: number;
-  workshopModuleId?: number;
-  remark?: string;
-  createdAt?: string;
-  isDeleted?: number;
-  updatedAt?: string;
-}
-
-export const addWorkshopModuleLabel = (data: WorkShopTempleteType) => {
-  return http.request({
-    url: '/template/saveWorkshopModuleRel',
-    method: 'post',
-    data,
-  });
-};
-
-export const editWorkshopModuleLabel = (data: WorkShopTempleteType) => {
-  return http.request({
-    url: '/template/updateWorkshopModuleRel',
-    method: 'post',
-    data,
-  });
-};

+ 5 - 5
src/hooks/useSceneInfos.ts

@@ -1,13 +1,13 @@
 import { computed, ref } from 'vue';
-import { CompanyInfoItem, getShopSpaceList, getCamerasByWorkSpace } from '@/api/scene/scene';
-
- type ElTreeItem = {
+import { getShopSpaceList, getCamerasByWorkSpace } from '@/api/scene/scene';
+import { CompanyInfoItem } from '@/types/scene/type.ts';
+type ElTreeItem = {
   value: any;
   label: string;
   children?: ElTreeItem[];
 };
 
- type TreeProps = {
+type TreeProps = {
   /** level:1-数据读取至公司 2-数据读取至工厂 3-数据读取至工位 */
   level: number;
   labelKey: string;
@@ -36,7 +36,7 @@ export function useSceneInfos() {
     }, []);
   });
 
-   const calculateTreeData = (infos: any[], treeProps: TreeProps, level: number): ElTreeItem[] => {
+  const calculateTreeData = (infos: any[], treeProps: TreeProps, level: number): ElTreeItem[] => {
     return infos.map((data) => {
       return {
         value: data[treeProps.valueKey],

+ 36 - 0
src/types/scene/constant.ts

@@ -0,0 +1,36 @@
+export enum ENABLED {
+  FALSE = 1,
+  TRUE = 0,
+}
+
+export enum DATA_LEVEL {
+  'company' = 0,
+  'workshop' = 1,
+  'workspace' = 2,
+}
+
+export enum DrawerType {
+  company = 'company',
+  workshop = 'workshop',
+  workspace = 'workspace',
+}
+
+export enum ViewType {
+  safety = 1,
+  minMap = 2,
+}
+
+export const OPTIONS = [
+  {
+    value: 'industry',
+    label: '工业企业',
+  },
+  {
+    value: 'gas',
+    label: '燃气企业',
+  },
+  {
+    value: 'other',
+    label: '其他企业',
+  },
+];

+ 438 - 0
src/types/scene/type.ts

@@ -0,0 +1,438 @@
+import { ViewType } from './constant';
+
+/** 场景标签信息 */
+export type SceneLabelOrModuleItem = {
+  /** 标签id */
+  id: number;
+  /** 标签代码 */
+  code: string;
+  /** 创建时间 */
+  createdAt: string;
+  /** 0-未删除,大于0-已删除 */
+  isDeleted: number;
+  /** 标签名称 */
+  name: string;
+  /** 说明 */
+  remark: string;
+  /** 状态: 0-正常,1-不正常 */
+  status: number;
+  /** 更新时间 */
+  updatedAt: string;
+};
+
+/** 工位信息 */
+export type WorkSpaceInfoItem = {
+  /** 工位id */
+  id: number;
+  /** 所属工厂id */
+  workshopId: number;
+  /** 工位名称 */
+  name: string;
+  /** 工位code */
+  code: string;
+  /** 工位描述 */
+  remark: string;
+  /** 状态: 0-启用, 1-禁用 */
+  status: number;
+  /** 创建时间 */
+  createdAt: string;
+  /** 更新时间 */
+  updatedAt: string;
+  /** 	0-未删除,大于0-已删除 */
+  isDeleted: number;
+  /** 工位负责人 */
+  principal: string;
+  /** 排序序号 */
+  serial: number;
+};
+
+/** 工厂信息 */
+export type WorkShopInfoItem = {
+  /** 工厂id */
+  id: number;
+  /** 所属公司id */
+  companyId: number;
+  /** 1-生产安全 2-安全环保 */
+  // type: number;
+  /** 工厂名称 */
+  name: string;
+  /** 工厂code */
+  code: string;
+  /** 工厂描述 */
+  remark: string;
+  /** 状态: 0-启用, 1-禁用 */
+  status: number;
+  /** 创建时间 */
+  createdAt: string;
+  /** 更新时间 */
+  updatedAt: string;
+  /** 	0-未删除,大于0-已删除 */
+  isDeleted: number;
+  /** 下属工位列表 */
+  children: WorkSpaceInfoItem[];
+  /** 场景标签 */
+  labelName: string;
+  /** 场景标签id */
+  sceneLabelId: number;
+  /** 排序序号 */
+  serial: number;
+  /** 车间模板 */
+  workshopModule: SceneLabelOrModuleItem;
+};
+
+/** 公司信息 */
+export type CompanyInfoItem = {
+  /** 公司id */
+  id: number;
+  /** 上级公司ID, 无上级为0 */
+  parentId: number;
+  /** 公司名称 */
+  name: string;
+  /** 公司code */
+  code: string;
+  /** 公司描述 */
+  remark: string;
+  /** 状态: 0-启用, 1-禁用 */
+  status: number;
+  /** 创建时间 */
+  createdAt: string;
+  /** 更新时间 */
+  updatedAt: string;
+  /** 排序序号 */
+  serial: number;
+  /** 	0-未删除,大于0-已删除 */
+  isDeleted: number;
+  /** 下属工厂列表 */
+  children: WorkShopInfoItem[];
+  /** 场景标签列表 */
+  labelList: SceneLabelOrModuleItem[];
+  /** 场景模板列表 */
+  moduleList: SceneLabelOrModuleItem[];
+  // 模板列表信息
+  labelModuleList: { sceneLabel: SceneLabelOrModuleItem; sceneModule: SceneLabelOrModuleItem }[];
+};
+
+/** 公司主页配置 */
+export interface UpdateCompanyLayoutParam extends Omit<UpdateViewLayoutParam, 'targetId'> {
+  /** 标签id */
+  labelId: number;
+  targetId: number;
+  /** 更新时需要上传layout布局id */
+  id?: number;
+}
+
+/** ??? */
+export interface LayoutResp {
+  /** 创建时间 */
+  createdAt: string;
+  /** 自增主键 */
+  id: number;
+  /** 页面布局json	 */
+  layout: string;
+  /** 目标id: 对应公司ID/车间ID */
+  targetId: number;
+  viewType: ViewType;
+  integrationState?: number;
+}
+
+/** ??? */
+export interface UpdateViewLayoutParam {
+  layout: string;
+  targetId: string;
+  viewType: ViewType;
+}
+
+/** ??? */
+export type CameraItem = {
+  /** 相机名称 */
+  name: string;
+  /** 相机code */
+  code: string;
+  /** 相机IP地址 */
+  cameraIp: string;
+  /** 相机描述 */
+  remark: string;
+  /** 状态: 0-启用, 1-禁用 */
+  status: number;
+  /** 推流地址 */
+  pushstreamIp: string;
+};
+
+/** ??? */
+export type WorkSpaceCameraRelative = WorkSpaceInfoItem & { cameraList: CameraItem[] };
+
+// 传入参数类型    还缺个场景list
+export interface ComAddDatas {
+  code?: string; //公司编码
+  createdAt?: string; //创建时间
+  id?: number; //新增后返回的唯一com的id
+  isDeleted?: number; //是否删除
+  name: string; //公司名字
+  parentId?: number; //上级公司id  无上级为0
+  remark?: string; //描述
+  status?: number; //状态  0-启动  1-禁用
+  updatedAt?: string;
+  serial?: number; //排序
+  labelList?: string[]; //创建的多个场景标签   自定义后面需要修改 这里没
+  parent?: null | ComAddDatas;
+  longitude?: number; //经度
+  latitude?: number; //纬度
+  regionCode?: string;
+  thumbnail?: string;
+}
+
+// 传入参数类型
+export interface WorkshopAddDatas {
+  code?: string;
+  companyId?: number; //公司id
+  sceneLabelId?: number; //类型  1-车间  2-危险点  3-物流  4-生活园区
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name: string;
+  remark?: string;
+  status?: number;
+  updatedAt?: string;
+  serial?: number;
+  parent?: null | WorkshopAddDatas;
+  workshopModule?: WorkShopTempleteType;
+  labelList?: WorkShopTempleteType[];
+  longitude?: number; //经度
+  latitude?: number; //纬度
+  // templete?: string; //车间模板
+  // tag?: string; //场景标签
+}
+
+// 传入参数类型
+export interface WorkspaceAddDatas {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name: string;
+  principal?: string; //工位负责人
+  remark?: string;
+  status?: number;
+  serial?: number;
+  updatedAt?: string;
+  workshopId?: number; //车间id
+  parent?: null | WorkspaceAddDatas;
+  longitude?: number; //经度
+  latitude?: number; //纬度
+  // tag?: string; //场景标签
+}
+
+// 传入参数类型
+export interface SceneListType<T, S> {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  parentId?: number;
+  remark?: string;
+  status?: number;
+  serial?: number;
+  updatedAt?: string;
+  children?: T[]; //车间-工位信息
+  labelList?: S[]; //创建的多个场景标签
+  moduleList?: S[]; //创建得多个模板
+}
+
+/** ??? */
+export interface LabelModuleListType {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  remark?: string;
+  status?: number;
+  updatedAt?: string;
+}
+
+/** ??? */
+export interface GetListWorkshop<U, A> {
+  code?: string;
+  companyId?: number; //公司id
+  sceneLabelId?: number; //类型  1-车间  2-危险点  3-物流  4-生活园区
+  labelName?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  remark?: string;
+  serial?: number;
+  status?: number;
+  updatedAt?: string;
+  children?: U[]; //工位信息
+  workshopModule?: A; //车间模板
+  workshopFuncPermissions: number[];
+  // tag?: string; //场景标签  自定义  后面需要修改
+}
+
+//查询场景标签
+export interface CompanyType {
+  tenantId: number;
+  userId: number;
+  createDate: string;
+  modifyDate: string;
+  tenantCode: string;
+  tenantName: string;
+  beginDate: string;
+  endDate: string;
+  tenantStatus: number;
+  isDelete: boolean;
+}
+
+//查询场景模板
+export interface InputType {
+  tenantCode: string;
+  tenantId: number;
+  type: string;
+}
+
+//查询场景标签
+export interface SceneLabelType {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  remark?: string;
+  status?: number;
+  updatedAt?: string;
+}
+
+//查询场景模板
+export interface TemplateType {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  remark?: string;
+  status?: number;
+  updatedAt?: string;
+}
+
+//查询车间模板
+export interface WorkshopModuleType {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  remark?: string;
+  status?: number;
+  updatedAt?: string;
+}
+
+//根据公司ID查询场景标签
+export interface SceneLabelByCompanyType {
+  code?: string;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  name?: string;
+  remark?: string;
+  status?: number;
+  updatedAt?: string;
+}
+
+//保存公司-场景标签-场景模板关系
+export interface SceneTempleteType {
+  companyId?: number;
+  createdAt?: string;
+  id?: number;
+  isDeleted?: number;
+  remark?: string;
+  sceneLabelId?: number;
+  sceneModuleId?: number;
+  updatedAt?: string;
+}
+
+//保存车间-车间模板关系
+export interface WorkShopTempleteType {
+  id?: number;
+  workshopId?: number;
+  workshopModuleId?: number;
+  remark?: string;
+  createdAt?: string;
+  isDeleted?: number;
+  updatedAt?: string;
+}
+
+/** ---------------------------------------------------------------------------------
+ * V4版 接口定义修改说明
+ * date: 2025-01-09
+ * 修改了原场景相关的接口定义
+ * 获取公司数据的结构整合为一个树
+ * 公司-车间-工位单独的结构用于增改查的接口参数
+ * 原传入参数类型不变
+ * 区分公司-车间-工位类型的原因为目前树节点结构趋同但不保证以后相同
+------------------------------------------------------------------------------------ */
+
+/** 带指向父节点的公司-车间-工位树结构 */
+export interface ComTreeType extends UseComType<UseWorkshopType<UseWorkspaceType>> {}
+
+/** 公司信息类型,注释的属性会返回但不用,下同 */
+export interface UseComType<T> {
+  uniqueCode?: string;
+  // createdAt: string;
+  // createdBy: number;
+  id: number;
+  // isDeleted: number;
+  isDisabled: number;
+  latitude?: number;
+  longitude?: number;
+  name: string;
+  orderNum: number;
+  parentId: number;
+  regionCode: string;
+  remark: string;
+  tenantId: number;
+  thumbnail: string;
+  // updatedAt:string;
+  // updatedBy:number;
+  children?: T[];
+}
+
+/** 车间信息类型 */
+export interface UseWorkshopType<T> {
+  uniqueCode?: string;
+  companyId: number;
+  // createdAt: string;
+  // createdBy: number;
+  id: number;
+  // isDeleted: number;
+  isDisabled: number;
+  name: string;
+  orderNum: number;
+  remark: string;
+  tenantId: number;
+  // updatedAt: string;
+  // updatedBy: number;
+  children?: T[];
+}
+
+/** 工位信息类型 */
+export interface UseWorkspaceType {
+  uniqueCode?: string;
+  workshopId: number;
+  companyId: number;
+  // createdAt: string;
+  // createdBy: number;
+  id: number;
+  isDeleted: number;
+  isDisabled: number;
+  name: string;
+  orderNum: number;
+  principalId: number;
+  principalName: string;
+  remark: string;
+  tenantId: number;
+  // updatedAt: string;
+  // updatedBy: number;
+}
+/** --------------------------------------------------------------------------------- */

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

@@ -1,6 +1,7 @@
 import { computed, ref, toRefs } from 'vue';
 import useSceneInfos from '@/hooks/useSceneInfos';
-import { CameraItem, getWorkshopMiniMapLayoutApi } from '@/api/scene/scene';
+import { getWorkshopMiniMapLayoutApi } from '@/api/scene/scene';
+import { CameraItem } from '@/types/scene/type.ts';
 import { defineStore } from 'pinia';
 import safeParse from '@/utils/safeParse';
 import { ElMessage } from 'element-plus';

+ 8 - 8
src/views/message/systemNotifications/components/WorkShopTree.vue

@@ -37,7 +37,7 @@
             color: rgba(0, 0, 0, 0.45);
             line-height: 22px;
           "
-          >/&nbsp;{{ total }})</span
+          >/&nbsp;{{ total }}</span
         >
       </div>
       <div class="selected">
@@ -64,20 +64,20 @@
   import { ElTree } from 'element-plus';
   import { countLeafNodes } from '@/views/message/persongroup/utils/index';
   import { getList } from '@/api/message/system-notifications';
-  import useScene from '@/views/system-config/scene-manage/use-scene';
+  import useComTree from '@/views/system-config/scene-manage/store/use-com-tree';
   import { storeToRefs } from 'pinia';
   import { cloneDeep } from 'lodash-es';
   import { TreeKey } from 'element-plus/es/components/tree/src/tree.type';
-  const sceneInfos = useScene();
-  const { tableData } = storeToRefs(sceneInfos);
+  const comTree = useComTree();
+  const { comTreeData } = storeToRefs(comTree);
   const loading = ref(true);
   const queryStr = ref<string>('');
   const defaultProps = { label: 'name' };
   const nodeData = computed(() => {
     const newList: any[] = [];
-    if (tableData.value && tableData.value.length) {
-      for (let i = 0; i < tableData.value.length; i++) {
-        const data = tableData.value[i];
+    if (comTreeData.value && comTreeData.value.length) {
+      for (let i = 0; i < comTreeData.value.length; i++) {
+        const data = comTreeData.value[i];
         if (data.children && data.children.length) {
           const treeItem = {
             id: data.id,
@@ -175,7 +175,7 @@
     }
     selected.value = selectedPeople.value.length;
     getList().then((res) => {
-      tableData.value = res;
+      comTreeData.value = res;
       total.value = countLeafNodes(nodeData.value);
       const selectedIds: TreeKey[] = selectedPeople.value.map((item) => item.code);
       treeRef.value!.setCheckedKeys(selectedIds);

+ 1 - 1
src/views/page-config/ConfigEdit.vue

@@ -170,7 +170,7 @@
   import { storeToRefs } from 'pinia';
   import { ElMessage, ElInput, ElSwitch } from 'element-plus';
   import { onBeforeUnmount, onMounted, ref, watch } from 'vue';
-  import { WorkShopInfoItem } from '@/api/scene/scene';
+  import { WorkShopInfoItem } from '@/types/scene/type.ts';
   import { computed } from 'vue';
   import { Search, Refresh, ArrowLeftBold } from '@element-plus/icons-vue';
   import usePageConfig from './usePageConfig';

+ 1 - 1
src/views/page-config/stores/useMapEditor.ts

@@ -1,6 +1,6 @@
 import { ref } from 'vue';
 import { defineStore } from 'pinia';
-import { WorkShopInfoItem } from '@/api/scene/scene';
+import { WorkShopInfoItem } from '@/types/scene/type.ts';
 import { cloneDeep } from 'lodash-es';
 import { useGlobSetting } from '@/hooks/setting';
 import safeParse from '@/utils/safeParse';

+ 291 - 312
src/views/system-config/scene-manage/SceneManage.vue

@@ -1,13 +1,13 @@
 <template>
   <page-wrapper>
     <el-card :bordered="false" class="proCard">
+      <!-- row-key 属性,用于设置树形表格的行键,默认为id,这里设置为code,保证唯一性 不能为空字符串 -->
       <BasicTable
         :columns="colomns"
-        :data-source="showTableData"
-        :row-key="(row) => row.code"
+        :data-source="comTreeData"
+        :row-key="(row) => row.uniqueCode"
         :action-column="actionColumn"
         :expend-row="expendRowKeys"
-        :pagination="{ total: total, pageSize: size, hideOnSinglePage: false }"
         :tableSetting="{
           width: 200,
           size: false,
@@ -19,8 +19,6 @@
         ref="tableRef"
         @checked-row-change="onCheckedRow"
         @order-change="orderByItem"
-        @page-num-change="handlePageNumChange"
-        @page-size-change="handlePageSizeChange"
       >
         <template #tableTitle>
           <div>
@@ -30,21 +28,21 @@
                   <Plus />
                 </el-icon>
               </template>
-              添加
+              添加公司
             </el-button>
           </div>
         </template>
         <template #empty>
           <div class="empty-content flex flex-col items-center">
             <img src="@/assets/icons/no-content.png" class="empty-img" />
-            <span class="empty-text">目前无内容,请先添加场景</span>
+            <span class="empty-text">目前无内容,请先添加公司</span>
           </div>
         </template>
       </BasicTable>
     </el-card>
 
     <div v-if="disableDepartmentEdit">
-      <!-- 添加的抽屉内容 -->
+      <!-- 上飞定制的抽屉表单 -->
       <!-- 公司 -->
       <CompanyDrawer_shangfei
         v-if="showDrawer === DrawerType.company"
@@ -52,7 +50,6 @@
         :sceneList="sceneList"
         :templateList="templateList"
         :detail="detail"
-        :allCodes="allCodes"
         @on-ok="subCompany"
         @on-close="handleUpdateTableCom"
       />
@@ -61,28 +58,26 @@
         v-if="showDrawer === DrawerType.workshop"
         :workshopTemplateList="workshopTemplateList"
         :detail="detail"
-        :allCodes="allCodes"
         @on-close="handleUpdataWorkshopTab"
         @on-ok="subWorkshop"
       />
-
       <!-- 工位 -->
       <WorkspaceDrawer_shangfei
         v-if="showDrawer === DrawerType.workspace"
-        :allCodes="allCodes"
         :detail="detail"
         @on-close="handleUpdataWorkspaceTab"
         @on-ok="subWorkspace"
       />
     </div>
     <div v-else>
+      <!-- 其他项目的抽屉表单 -->
+      <!-- 公司 -->
       <CompanyDrawer
         v-if="showDrawer === DrawerType.company"
         :comEdit="comEdit"
         :sceneList="sceneList"
         :templateList="templateList"
         :detail="detail"
-        :allCodes="allCodes"
         @on-ok="subCompany"
         @on-close="handleUpdateTableCom" />
       <!-- 车间 -->
@@ -90,173 +85,123 @@
         v-if="showDrawer === DrawerType.workshop"
         :workshopTemplateList="workshopTemplateList"
         :detail="detail"
-        :allCodes="allCodes"
         @on-close="handleUpdataWorkshopTab"
         @on-ok="subWorkshop" />
 
       <!-- 工位 -->
       <WorkspaceDrawer
         v-if="showDrawer === DrawerType.workspace"
-        :allCodes="allCodes"
         :detail="detail"
         @on-close="handleUpdataWorkspaceTab"
         @on-ok="subWorkspace"
     /></div>
 
+    <!-- 用于渝北项目政府租户绑定企业 -->
     <SceneDialog v-if="dialogVisible" @close-dialog="closeDialog" />
-    <!-- <el-dialog v-model="dialogVisible" title="添加企业信息" width="500">
-      <div>
-        <div class="relate-select">
-          <div class="select-title">企业分类</div>
-          <el-select v-model="companyType" placeholder="请选择企业类型" style="width: 180px">
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </div>
-        <div class="relate-select">
-          <div class="select-title">企业名称</div>
-          <el-select
-            v-model="tenantName"
-            placeholder="请选择企业租户信息"
-            style="width: 180px"
-            @change="changeCom"
-          >
-            <el-option
-              v-for="item in companyList"
-              :key="item.tenantCode"
-              :label="item.tenantName"
-              :value="item.tenantCode"
-            />
-          </el-select>
-        </div>
-        <div v-if="tenantCode" class="relate-select">
-          <div class="select-title">企业租户信息</div>
-          <el-input v-model="tenantCode" style="width: 180px" disabled />
-        </div>
-      </div>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">取消</el-button>
-          <el-button type="primary" @click="close"> 确定 </el-button>
-        </div>
-      </template>
-    </el-dialog> -->
   </page-wrapper>
 </template>
 
 <script setup lang="ts">
-  import { ref, onMounted, reactive, h, computed } from 'vue';
+  import { ref, onMounted, reactive, h, computed, Ref } from 'vue';
   import { Plus } from '@element-plus/icons-vue';
   import { BasicTable, BasicColumn } from '@/components/Table';
-  import ActionColomn from './actionColomns.vue';
-  import CompanyDrawer from './CompanyDrawer.vue';
-  import CompanyDrawer_shangfei from './CompanyDrawer-shangfei.vue';
-  import WorkshopDrawer from './WorkshopDrawer.vue';
-  import WorkshopDrawer_shangfei from './WorkshopDrawer-shangfei.vue';
-  import WorkspaceDrawer from './WorkspaceDrawer.vue';
-  import WorkspaceDrawer_shangfei from './WorkspaceDrawer-shangfei.vue';
-  import AddCompanyInfo from './AddCompanyInfo.vue';
-  import { DATA_LEVEL, DrawerType, ENABLED } from './constant';
-  import SceneDialog from './SceneDialog.vue';
+  import ActionColomn from './components/ActionColomns.vue';
+  import CompanyDrawer from './components/CompanyDrawer.vue';
+  import CompanyDrawer_shangfei from './components/CompanyDrawer-shangfei.vue';
+  import WorkshopDrawer from './components/WorkshopDrawer.vue';
+  import WorkshopDrawer_shangfei from './components/WorkshopDrawer-shangfei.vue';
+  import WorkspaceDrawer from './components/WorkspaceDrawer.vue';
+  import WorkspaceDrawer_shangfei from './components/WorkspaceDrawer-shangfei.vue';
+  import { DATA_LEVEL, DrawerType, ENABLED } from '@/types/scene/constant.ts';
+  import SceneDialog from './components/SceneDialog.vue';
   import {
     colomns,
-    updateSerials,
-    findItemLevel,
-    removeParent,
-    flattenCodes,
-    getParent,
-  } from './use-method.tsx';
+    // updateSerials,
+    // findItemLevel,
+    // removeParent,
+    // flattenCodes,
+    // getParent,
+  } from './hook/use-table-method';
+  // import {
+  //   delCompany,
+  //   delWorkshop,
+  //   delWorkspace,
+  //   updateComShopSpaceTreeSort,
+  // } from '@/api/scene/scene';
   import {
-    ComAddDatas,
-    delCompany,
-    WorkshopAddDatas,
-    delWorkshop,
-    WorkspaceAddDatas,
-    delWorkspace,
-    sortSceneList,
-  } from '@/api/scene/sceneOperate';
-  import useScene from './use-scene';
-  import useSceneTemplete from './use-sence-templete';
-  import { useRouter } from 'vue-router';
+    // ComAddDatas,
+    // WorkshopAddDatas,
+    // WorkspaceAddDatas,
+    UseComType,
+    UseWorkshopType,
+    UseWorkspaceType,
+  } from '@/types/scene/type.ts';
+  import useComTree from './store/use-com-tree';
+  import useSceneTemplete from './hook/use-sence-templete';
   import { storeToRefs } from 'pinia';
-  import { cloneDeep } from 'lodash-es';
-  import { ElMessageBox } from 'element-plus';
+  // import { ElMessageBox } from 'element-plus';
   import { useGlobSetting } from '@/hooks/setting';
 
+  // 此处获取了全局变量,关系到用不用sf定制的组件
   const globSetting = useGlobSetting();
   const disableDepartmentEdit = globSetting.disableDepartmentEdit;
 
-  const router = useRouter();
+  // 公司车间工位数据
+  const comTree = useComTree();
+  const { comTreeData } = storeToRefs(comTree);
 
-  const useSceneList = useScene();
-  const { tableData } = storeToRefs(useSceneList);
-  const { getSceneDetail } = useSceneList;
+  const { getComTreeDetail } = comTree;
   const useSceneTempleteDetail = useSceneTemplete();
   const { sceneList, templateList, workshopTemplateList } = useSceneTempleteDetail;
   const expendRowKeys = ref(['']);
 
   const showDrawer = ref<DrawerType | null>(null);
-  const showTableData = computed(() => {
-    const temp = cloneDeep(tableData.value);
-    return temp.splice((page.value - 1) * size.value, page.value * size.value);
-  });
 
-  const page = ref(1);
-  const size = ref(10);
-  const total = computed(() => tableData.value.length);
   const dialogVisible = ref<boolean>(false);
 
   const closeDialog = () => {
     dialogVisible.value = false;
   };
 
-  //改变el-drawer公司的状态
+  // 改变el-drawer公司的状态
   const handleUpdateTableCom = () => {
     showDrawer.value = null;
   };
 
-  //改变el-drawer车间的状态
+  // 改变el-drawer车间的状态
   const handleUpdataWorkshopTab = () => {
     showDrawer.value = null;
   };
 
-  //改变el-drawer工位的状态
+  // 改变el-drawer工位的状态
   const handleUpdataWorkspaceTab = () => {
     showDrawer.value = null;
   };
 
-  //是否公司编辑
+  // 判断是否公司编辑
   const comEdit = ref<boolean>(false);
 
-  const level = ref<number>();
+  // const level = ref<number>();
 
   onMounted(() => {
-    //添加父级,主要用于排序功能
-    //dataSourceWithParent(tableData.value, null);
-
-    //获取tableData数据
-    getSceneDetail();
-    // getCompanyList().then((res) => {
-    //   companyList.value = res;
-    // });
+    //获取公司树数据
+    getComTreeDetail();
   });
 
   function onCheckedRow(rowKeys) {
     console.log(rowKeys);
   }
 
-  const orderByItem = () => {};
-  const handlePageNumChange = (pageNum) => {
-    page.value = pageNum;
-  };
-  const handlePageSizeChange = (pageSize) => {
-    size.value = pageSize;
+  const orderByItem = (rowKeys) => {
+    console.log(rowKeys);
   };
 
+  /**
+   * 新建公司时的表单初始化
+   * @modifications
+   *  - 2025-01-09: Yunfeng
+   *  - V4-平台权限重构
+   */
   const companyAdd = () => {
     showDrawer.value = DrawerType.company;
     detail.value = {
@@ -269,21 +214,20 @@
     comEdit.value = false;
   };
 
-  //用于新增场景
-  const selectItems = ref([{ tag: '', template: '' }] as { tag: string; template: string }[]);
-
-  const allCodes = computed(() => {
-    return flattenCodes(tableData.value);
-  });
+  // 用于新增场景
+  // const selectItems = ref([{ tag: '', template: '' }] as { tag: string; template: string }[]);
+  // const allCodes = computed(() => {
+  //   return flattenCodes(comTreeData.value);
+  // });
 
   //新增车间
   const subWorkshop = () => {
-    getSceneDetail();
+    getComTreeDetail();
     showDrawer.value = null;
   };
 
   const subWorkspace = () => {
-    getSceneDetail();
+    getComTreeDetail();
     showDrawer.value = null;
   };
 
@@ -300,7 +244,7 @@
         // rowDownDisable:
         subItem: record.row,
         handleRelate: handleRelate,
-        handleConig: handleConfig,
+        // handleConfig: handleConfig,
         handleAdd: handleAdd,
         handleEdit: handleEdit,
         handleDelete: handleDelete,
@@ -312,212 +256,248 @@
 
   //绑定
   const handleRelate = (row) => {
-    console.log('row', row);
+    console.log(row);
     dialogVisible.value = true;
   };
 
-  //页面设置函数
-  const handleConfig = (row) => {
-    router.push({
-      path: '/page-config/config',
-      query: { companyId: row.id },
-    });
-  };
-
-  const handleAdd = (row) => {
-    editedItem.value = { ...row }; // 将当前行的内容拷贝到 editedItem 中,以便编辑
-    //得出当前的数据的层级
-    level.value = findItemLevel(tableData.value, row.id, row.name);
-    if ((expendRowKeys.value[0] = row.name)) {
-      expendRowKeys.value[0] = '';
-    }
-    expendRowKeys.value[0] = row.name;
-    if (level.value === DATA_LEVEL.company) {
-      showDrawer.value = DrawerType.workshop;
-      detail.value = {
-        id: editedItem.value?.id,
-        seniorScene: editedItem.value?.name,
-        tagList: row?.labelList,
-        addEnable: ENABLED.TRUE,
-        name: '',
-        code: '',
-        tagWorkshop: null,
-        templateWorkshop: null,
-      };
-    } else if (level.value === DATA_LEVEL.workshop) {
-      detail.value = {
-        id: editedItem.value?.id,
-        seniorScene: editedItem.value?.name,
-        addEnable: ENABLED.TRUE,
-        name: '',
-        code: '',
-        principal: '',
-      };
-      if (disableDepartmentEdit) detail.value['workshopCode'] = editedItem.value?.code;
-      showDrawer.value = DrawerType.workspace;
-    }
-  };
-
   //公司,车间,工位的模板数据
-  const editedItem = ref<ComAddDatas | WorkshopAddDatas | WorkspaceAddDatas | null>(null);
+  // const editedItem: Ref<(ComAddDatas & WorkshopAddDatas & WorkspaceAddDatas) | undefined> = ref();
+  const editedItem: Ref<
+    (UseComType<undefined> & UseWorkshopType<undefined> & UseWorkspaceType) | undefined
+  > = ref();
 
-  //点击编辑时显示的数据内容
+  //点击所有添加和编辑时显示的数据内容
   const detail = ref({});
 
-  // 在这里实现删除行的函数
-  const handleDelete = (row: Recordable) => {
-    level.value = findItemLevel(tableData.value, row.id, row.name);
-    if (row.children?.length > 0) {
-      ElMessageBox.confirm('存在下级场景,无法删除该场景', '无法删除该条信息', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'error',
-      })
-        .then(() => {
-          console.log('存在子集');
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        });
-    } else {
-      ElMessageBox.confirm('确认要删除该场景吗', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          //删除接口的调用
-          if (level.value === DATA_LEVEL.company) {
-            return delCompany(row.id);
-          } else if (level.value === DATA_LEVEL.workshop) {
-            return delWorkshop(row.id);
-          } else {
-            return delWorkspace(row.id);
-          }
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        })
-        .finally(() => {
-          getSceneDetail();
-        });
-    }
+  // 点击添加时
+  const handleAdd = (row) => {
+    console.log(row);
   };
 
+  // 点击编辑时
   const handleEdit = (row) => {
     editedItem.value = { ...row }; // 将当前行的内容拷贝到 editedItem 中,以便编辑
-    level.value = findItemLevel(tableData.value, row.id, row.name);
-    if (level.value === DATA_LEVEL.company) {
-      showDrawer.value = DrawerType.company;
-      comEdit.value = true;
-      //复原公司选择的场景集合
-      if (row.labelList && Array.isArray(row.labelList)) {
-        selectItems.value = row.labelList.map((item, index) => ({
-          tag: item.id,
-          template: row.moduleList[index]?.id,
-        }));
-      }
-      detail.value = {
-        id: editedItem.value?.id,
-        name: editedItem.value!.name,
-        code: editedItem.value!.code,
-        seniorScene: '顶级场景',
-        addEnable: editedItem.value!.status,
-        selectItems: selectItems.value,
-        remark: editedItem.value?.remark,
-        longitude: editedItem.value?.longitude!,
-        latitude: editedItem.value?.latitude!,
-        regionCode: editedItem.value?.regionCode,
-        thumbnail: editedItem.value?.thumbnail,
-      };
-    } else if (level.value === DATA_LEVEL.workshop && 'companyId' in editedItem.value!) {
-      showDrawer.value = DrawerType.workshop;
-
-      detail.value = {
-        id: editedItem.value.id,
-        name: editedItem.value.name,
-        code: editedItem.value.code,
-        seniorScene: editedItem.value.parent?.name || '',
-        tagWorkshop: editedItem.value.sceneLabelId,
-        templateWorkshop: editedItem.value.workshopModule?.id,
-        addEnable: editedItem.value.status,
-        tagList: editedItem.value.parent?.labelList || [],
-        companyId: editedItem.value.companyId,
-      };
-    } else if (level.value === DATA_LEVEL.workspace && 'workshopId' in editedItem.value!) {
-      detail.value = {
-        id: editedItem.value.id,
-        name: editedItem.value.name,
-        code: editedItem.value.code,
-        seniorScene: editedItem.value.parent?.name || '',
-        principal: editedItem.value.principal,
-        addEnable: editedItem.value.status,
-      };
-
-      showDrawer.value = DrawerType.workspace;
-    }
+    console.log(row);
   };
 
-  //编辑时的提交按钮功能
-
-  //编辑公司的提交按钮
-  const subCompany = () => {
-    getSceneDetail();
-    showDrawer.value = null;
+  // 点击删除时
+  const handleDelete = (row) => {
+    console.log(row);
   };
 
-  //向上排序
+  // 点击上移时
   const rowUp = (row) => {
-    if (row.parent) {
-      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.code);
-        // 进行交换位置
-        targetParent.children!.splice(parentIndex - 1, 2, row, previousRow);
-      }
-    } else {
-      const index = tableData.value.findIndex((item) => item.id === row.id);
-      if (index > 0) {
-        tableData.value.splice(index - 1, 2, row, tableData.value[index - 1]);
-      }
-    }
-    tableData.value = updateSerials(tableData.value);
-    sortSceneList(removeParent(tableData.value))
-      .then(() => {
-        getSceneDetail();
-      })
-      .catch((...e) => {
-        console.error('catch error', ...e);
-      });
+    console.log(row);
   };
 
-  //向下排序
+  // 点击下移时
   const rowDown = (row) => {
-    if (row.parent) {
-      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.code);
-        // 进行交换位置
-        targetParent.children!.splice(parentIndex, 2, behindRow, row);
-      }
-    } else {
-      const index = tableData.value.findIndex((item) => item.id === row.id);
-      if (index < tableData.value.length - 1) {
-        tableData.value.splice(index, 2, tableData.value[index + 1], row);
-      }
-    }
-    tableData.value = updateSerials(tableData.value);
-
-    sortSceneList(removeParent(tableData.value))
-      .then(() => {
-        getSceneDetail();
-      })
-      .catch((...e) => {
-        console.error('catch error', ...e);
-      });
+    console.log(row);
   };
+
+  //页面设置函数 Deprecated in V4
+  // const handleConfig = (row) => {
+  //   router.push({
+  //     path: '/page-config/config',
+  //     query: { companyId: row.id },
+  //   });
+  // };
+
+  // TODO 处理添加
+  // const handleAdd = (row) => {
+  //   editedItem.value = { ...row }; // 将当前行的内容拷贝到 editedItem 中,以便编辑
+  //   //得出当前的数据的层级
+  //   level.value = findItemLevel(comTreeData.value, row.id, row.name);
+  //   if ((expendRowKeys.value[0] = row.name)) {
+  //     expendRowKeys.value[0] = '';
+  //   }
+  //   expendRowKeys.value[0] = row.name;
+  //   if (level.value === DATA_LEVEL.company) {
+  //     showDrawer.value = DrawerType.workshop;
+  //     detail.value = {
+  //       id: editedItem.value?.id,
+  //       seniorScene: editedItem.value?.name,
+  //       tagList: row?.labelList,
+  //       addEnable: ENABLED.TRUE,
+  //       name: '',
+  //       code: '',
+  //       tagWorkshop: null,
+  //       templateWorkshop: null,
+  //     };
+  //   } else if (level.value === DATA_LEVEL.workshop) {
+  //     detail.value = {
+  //       id: editedItem.value?.id,
+  //       seniorScene: editedItem.value?.name,
+  //       addEnable: ENABLED.TRUE,
+  //       name: '',
+  //       code: '',
+  //       principal: '',
+  //     };
+  //     if (disableDepartmentEdit) detail.value['workshopCode'] = editedItem.value?.code;
+  //     showDrawer.value = DrawerType.workspace;
+  //   }
+  // };
+
+  // TODO 在这里实现删除行的函数
+  // const handleDelete = (row: Recordable) => {
+  //   level.value = findItemLevel(comTreeData.value, row.id, row.name);
+  //   if (row.children?.length > 0) {
+  //     ElMessageBox.confirm('存在下级场景,无法删除该场景', '无法删除该条信息', {
+  //       confirmButtonText: '确认',
+  //       cancelButtonText: '取消',
+  //       type: 'error',
+  //     })
+  //       .then(() => {
+  //         console.log('存在子集');
+  //       })
+  //       .catch(() => {
+  //         console.log('取消删除物件');
+  //       });
+  //   } else {
+  //     ElMessageBox.confirm('确认要删除该场景吗', {
+  //       confirmButtonText: '确认',
+  //       cancelButtonText: '取消',
+  //       type: 'warning',
+  //     })
+  //       .then(() => {
+  //         //删除接口的调用
+  //         if (level.value === DATA_LEVEL.company) {
+  //           return delCompany(row.id);
+  //         } else if (level.value === DATA_LEVEL.workshop) {
+  //           return delWorkshop(row.id);
+  //         } else {
+  //           return delWorkspace(row.id);
+  //         }
+  //       })
+  //       .catch(() => {
+  //         console.log('取消删除物件');
+  //       })
+  //       .finally(() => {
+  //         getComTreeDetail();
+  //       });
+  //   }
+  // };
+
+  /**
+   * TODO
+   * 处理公司/车间/工位编辑表单数据的初始化
+   * @modifications
+   *  - 2025-01-09: Yunfeng
+   *  - V4-平台权限重构
+   */
+  // const handleEdit = (row) => {
+  //   editedItem.value = { ...row }; // 将当前行的内容拷贝到 editedItem 中,以便编辑
+  //   level.value = findItemLevel(comTreeData.value, row.id, row.name);
+  //   if (level.value === DATA_LEVEL.company) {
+  //     showDrawer.value = DrawerType.company;
+  //     comEdit.value = true;
+  //     //复原公司选择的场景集合
+  //     if (row.labelList && Array.isArray(row.labelList)) {
+  //       selectItems.value = row.labelList.map((item, index) => ({
+  //         tag: item.id,
+  //         template: row.moduleList[index]?.id,
+  //       }));
+  //     }
+  //     detail.value = {
+  //       id: editedItem.value?.id,
+  //       name: editedItem.value!.name,
+  //       code: editedItem.value!.code,
+  //       seniorScene: '顶级场景',
+  //       addEnable: editedItem.value!.status,
+  //       selectItems: selectItems.value,
+  //       remark: editedItem.value?.remark,
+  //       longitude: editedItem.value?.longitude!,
+  //       latitude: editedItem.value?.latitude!,
+  //       regionCode: editedItem.value?.regionCode,
+  //       thumbnail: editedItem.value?.thumbnail,
+  //     };
+  //   } else if (level.value === DATA_LEVEL.workshop && 'companyId' in editedItem.value!) {
+  //     showDrawer.value = DrawerType.workshop;
+  //     detail.value = {
+  //       id: editedItem.value.id,
+  //       name: editedItem.value.name,
+  //       code: editedItem.value.code,
+  //       seniorScene: editedItem.value.parent?.name || '',
+  //       tagWorkshop: editedItem.value.sceneLabelId,
+  //       templateWorkshop: editedItem.value.workshopModule?.id,
+  //       addEnable: editedItem.value.status,
+  //       tagList: editedItem.value.parent?.labelList || [],
+  //       companyId: editedItem.value.companyId,
+  //     };
+  //   } else if (level.value === DATA_LEVEL.workspace && 'workshopId' in editedItem.value!) {
+  //     detail.value = {
+  //       id: editedItem.value.id,
+  //       name: editedItem.value.name,
+  //       code: editedItem.value.code,
+  //       seniorScene: editedItem.value.parent?.name || '',
+  //       principal: editedItem.value.principal,
+  //       addEnable: editedItem.value.status,
+  //     };
+
+  //     showDrawer.value = DrawerType.workspace;
+  //   }
+  // };
+
+  //编辑时的提交按钮功能
+
+  //编辑公司的提交按钮
+  const subCompany = () => {
+    getComTreeDetail();
+    showDrawer.value = null;
+  };
+
+  // TODO 向上排序
+  // const rowUp = (row) => {
+  //   if (row.parent) {
+  //     const parentIndex = row.parent.children!.findIndex((item) => item.id === row.id);
+  //     if (parentIndex > 0) {
+  //       const previousRow = row.parent.children![parentIndex - 1];
+  //       const targetParent = getParent(comTreeData.value, previousRow.parent.code);
+  //       // 进行交换位置
+  //       targetParent.children!.splice(parentIndex - 1, 2, row, previousRow);
+  //     }
+  //   } else {
+  //     const index = comTreeData.value.findIndex((item) => item.id === row.id);
+  //     if (index > 0) {
+  //       comTreeData.value.splice(index - 1, 2, row, comTreeData.value[index - 1]);
+  //     }
+  //   }
+  //   comTreeData.value = updateSerials(comTreeData.value);
+  //   updateComShopSpaceTreeSort(removeParent(comTreeData.value))
+  //     .then(() => {
+  //       getComTreeDetail();
+  //     })
+  //     .catch((...e) => {
+  //       console.error('catch error', ...e);
+  //     });
+  // };
+
+  // TODO 向下排序
+  // const rowDown = (row) => {
+  //   if (row.parent) {
+  //     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(comTreeData.value, behindRow.parent.code);
+  //       // 进行交换位置
+  //       targetParent.children!.splice(parentIndex, 2, behindRow, row);
+  //     }
+  //   } else {
+  //     const index = comTreeData.value.findIndex((item) => item.id === row.id);
+  //     if (index < comTreeData.value.length - 1) {
+  //       comTreeData.value.splice(index, 2, comTreeData.value[index + 1], row);
+  //     }
+  //   }
+  //   comTreeData.value = updateSerials(comTreeData.value);
+
+  //   updateComShopSpaceTreeSort(removeParent(comTreeData.value))
+  //     .then(() => {
+  //       getComTreeDetail();
+  //     })
+  //     .catch((...e) => {
+  //       console.error('catch error', ...e);
+  //     });
+  // };
 </script>
 
 <style scoped>
@@ -535,7 +515,6 @@
 
   .relate-select {
     display: flex;
-
     align-items: center;
     margin-bottom: 20px;
   }

+ 21 - 20
src/views/system-config/scene-manage/actionColomns.vue

@@ -2,34 +2,35 @@
   <div style="display: flex">
     <div style="display: flex; margin-right: 7px">
       <div
-        v-if="userStore?.info?.tenantCode === 'gov'"
+        v-if="userStore?.info?.tenantCode === 'gov' && (props.subItem as ComAddDatas).parentId !== undefined"
         @click="changeRelate"
         class="wordStyle"
         style="margin-right: 10px"
-        >绑定企业</div
+        >绑定</div
       >
-      <div
+      <div v-else style="margin-right: 10px; width: 27px"></div>
+      <!-- <div
         v-if="(props.subItem as ComAddDatas).parentId !== undefined"
         @click="changeConig"
         class="wordStyle"
         style="margin-right: 10px; width: 122px"
         >页面设置</div
-      >
-      <div v-else style="margin-right: 10px; width: 122px"></div>
+      > -->
+      <!-- <div v-else style="margin-right: 10px; width: 122px"></div> -->
       <div v-if="!isWorkshop" @click="changeAdd" class="wordStyle">添加下一级</div>
       <div v-else style="margin-right: 10px; width: 67px"></div
     ></div>
     <div style="width: 1px; height: 14px; color: #e9e9e9; margin-right: 14px">|</div>
-    <img src="../../../assets/icons/edit.png" @click="changeEdit" class="action-img" alt="" />
-    <img src="../../../assets/icons/delete.png" @click="changeDelete" class="action-img" alt="" />
+    <img src="@/assets/icons/edit.png" @click="changeEdit" class="action-img" alt="" />
+    <img src="@/assets/icons/delete.png" @click="changeDelete" class="action-img" alt="" />
     <img
-      src="../../../assets/icons/up.png"
+      src="@/assets/icons/up.png"
       @click="changeUp"
       :class="{ 'action-disable': isFirst, 'action-img': !isFirst }"
       alt=""
     />
     <img
-      src="../../../assets/icons/down.png"
+      src="@/assets/icons/down.png"
       @click="changeDown"
       :class="{ 'action-disable': isLast, 'action-img': !isLast }"
       alt=""
@@ -39,20 +40,19 @@
 
 <script setup lang="ts">
   import { computed } from 'vue';
-  import { ComAddDatas, WorkshopAddDatas, WorkspaceAddDatas } from '@/api/scene/sceneOperate.ts';
-  import useScene from './use-scene';
+  import { ComAddDatas, WorkshopAddDatas, WorkspaceAddDatas } from '@/types/scene/type.ts';
+  import useComTree from '../store/use-com-tree';
   import { storeToRefs } from 'pinia';
   import { useUserStore } from '@/store/modules/user';
 
-  // '
- const userStore = useUserStore();
-  const useSceneList = useScene();
-  const { tableData } = storeToRefs(useSceneList);
+  const userStore = useUserStore();
+  const comTree = useComTree();
+  const { comTreeData } = storeToRefs(comTree);
 
   const props = defineProps<{
     subItem: ComAddDatas | WorkshopAddDatas | WorkspaceAddDatas;
     handleRelate: (row) => unknown;
-    handleConig: (row) => unknown;
+    // handleConig: (row) => unknown; //Deprecated in V4
     handleAdd: (row) => unknown;
     handleEdit: (row) => unknown;
     handleDelete: (row) => unknown;
@@ -64,13 +64,14 @@
     return (props.subItem as any).workshopId ? true : false;
   });
 
+  // TODO serial 改为 orderNum
   const isFirst = computed(() => {
     return (props.subItem as any).serial === 0 ? true : false;
   });
 
   const isLast = computed(() => {
     if ((props.subItem as any).parentId === 0) {
-      return (props.subItem as any).serial === tableData.value.length - 1 ? true : false;
+      return (props.subItem as any).serial === comTreeData.value.length - 1 ? true : false;
     } else {
       return (props.subItem as any).serial === (props.subItem as any).parent?.children.length - 1
         ? true
@@ -82,9 +83,9 @@
     props.handleRelate(props.subItem);
   };
 
-  const changeConig = () => {
-    props.handleConig(props.subItem);
-  };
+  // const changeConig = () => { //Deprecated in V4
+  //   props.handleConig(props.subItem);
+  // };
 
   const changeAdd = () => {
     props.handleAdd(props.subItem);

+ 15 - 16
src/views/system-config/scene-manage/AddCompanyInfo.vue

@@ -1,11 +1,12 @@
 <template>
+  <!-- This component is not referenced by any other components. -->
   <el-dialog v-model="dialogVisible" title="添加企业信息" width="500" @close="() => emit('close')">
     <div>
       <div class="relate-select">
         <div class="select-title">企业分类</div>
         <el-select v-model="companyType" placeholder="请选择企业类型" style="width: 180px">
           <el-option
-            v-for="item in options"
+            v-for="item in OPTIONS"
             :key="item.value"
             :label="item.label"
             :value="item.value"
@@ -44,12 +45,12 @@
 
 <script setup lang="ts">
   import { onMounted, ref } from 'vue';
-  import { options } from './use-method.tsx';
-  import { getCompanyList, CompanyType, changeRelate } from '@/api/scene/scene-relate';
-import { ElMessage } from 'element-plus';
+  import { OPTIONS } from '@/types/scene/constant.ts';
+  import { getCompanyList, changeRelate } from '@/api/scene/scene.ts';
+  import { CompanyType } from '@/types/scene/type.ts';
+  import { ElMessage } from 'element-plus';
 
-
-const emit = defineEmits(['close']);
+  const emit = defineEmits(['close']);
   onMounted(() => {
     getCompanyList().then((res) => {
       companyList.value = res;
@@ -81,22 +82,20 @@ const emit = defineEmits(['close']);
         type: 'success',
       });
       reset();
-      emit('close')
+      emit('close');
     });
   };
 
-  const reset=()=>{
-  tenantName.value = '';
-  tenantCode.value = '';
-  tenantId.value = null;
-  companyType.value =''
-  }
-
+  const reset = () => {
+    tenantName.value = '';
+    tenantCode.value = '';
+    tenantId.value = null;
+    companyType.value = '';
+  };
 </script>
 
 <style lang="scss" scoped>
-
-.relate-select {
+  .relate-select {
     display: flex;
 
     align-items: center;

+ 8 - 6
src/views/system-config/scene-manage/CompanyDrawer-shangfei.vue

@@ -120,17 +120,19 @@
 
 <script setup lang="ts">
   import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
+
   import {
     addCompanyModuleLabel,
     editCompanyModuleLabel,
-    SceneLabelType,
-    TemplateType,
-  } from '@/api/scene/secene-templet';
-  import { ENABLED } from './constant';
+    addCompany,
+    editCompany,
+  } from '@/api/scene/scene.ts';
+  import { SceneLabelType, TemplateType } from '@/types/scene/type.ts';
+
+  import { ENABLED } from '@/types/scene/constant.ts';
   import type { FormInstance, FormRules } from 'element-plus';
   import { ElMessage, ElMessageBox } from 'element-plus';
   import { CirclePlus } from '@element-plus/icons-vue';
-  import { addCompany, editCompany } from '@/api/scene/sceneOperate';
   import { getProvinceList } from '@/api/system/region';
   import { useRequest } from 'vue-hooks-plus';
 
@@ -142,7 +144,7 @@
   const props = defineProps<{
     sceneList: SceneLabelType[];
     templateList: TemplateType[];
-    allCodes: string[];
+    // allCodes: string[];
     comEdit: boolean;
     detail: {
       id?: number;

+ 106 - 103
src/views/system-config/scene-manage/CompanyDrawer.vue

@@ -24,13 +24,14 @@
         <el-form-item label="公司名称" prop="name">
           <el-input v-model="ruleForm.name" style="width: 200px" />
         </el-form-item>
+        <!-- 上级场景改为固定 0 -->
         <el-form-item label="上级场景" prop="seniorScene">
           <el-input v-model="ruleForm.seniorScene" style="width: 200px" disabled />
         </el-form-item>
         <el-form-item v-if="!props.comEdit" label="公司代码" prop="code">
           <el-input v-model="ruleForm.code" style="width: 200px" />
         </el-form-item>
-        <el-form-item label="标签&模板" required>
+        <!-- <el-form-item label="标签&模板" required>
           <div style="display: flex; flex-direction: column; align-items: flex-start">
             <div
               v-for="(item, index) in ruleForm.selectItems"
@@ -74,7 +75,7 @@
                 ><CirclePlus /></el-icon
             ></div>
           </div>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item label="所在省市" prop="regionCode" required>
           <el-select v-model="ruleForm.regionCode" placeholder="请选择省市" style="width: 200px">
             <el-option
@@ -141,17 +142,19 @@
 
 <script setup lang="ts">
   import { computed, reactive, ref, defineProps, defineEmits, watch, onMounted } from 'vue';
+
   import {
     addCompanyModuleLabel,
     editCompanyModuleLabel,
-    SceneLabelType,
-    TemplateType,
-  } from '@/api/scene/secene-templet';
-  import { ENABLED } from './constant';
+    addCompany,
+    editCompany,
+  } from '@/api/scene/scene.ts';
+  import { SceneLabelType, TemplateType } from '@/types/scene/type.ts';
+
+  import { ENABLED } from '@/types/scene/constant.ts';
   import type { FormInstance, FormRules } from 'element-plus';
-  import { ElMessage, ElMessageBox } from 'element-plus';
-  import { CirclePlus } from '@element-plus/icons-vue';
-  import { addCompany, editCompany } from '@/api/scene/sceneOperate';
+  import { ElMessage } from 'element-plus';
+  // import { CirclePlus } from '@element-plus/icons-vue';
   import { getProvinceList } from '@/api/system/region';
   import { useRequest } from 'vue-hooks-plus';
   import { Plus } from '@element-plus/icons-vue';
@@ -168,7 +171,7 @@
   const props = defineProps<{
     sceneList: SceneLabelType[];
     templateList: TemplateType[];
-    allCodes: string[];
+    // allCodes: string[];
     comEdit: boolean;
     detail: {
       id?: number;
@@ -300,12 +303,12 @@
   const { data: provinceList } = useRequest(getProvinceList);
 
   //增加空的场景&模板
-  const addChange = () => {
-    ruleForm.selectItems!.push({
-      tag: '',
-      template: '',
-    });
-  };
+  // const addChange = () => {
+  //   ruleForm.selectItems!.push({
+  //     tag: '',
+  //     template: '',
+  //   });
+  // };
 
   //编辑时需要传入子组件的数据
   watch(
@@ -326,25 +329,25 @@
   );
 
   //删除场景&模板
-  const deleScene = (index) => {
-    if (ruleForm.selectItems!.length > 1) {
-      ElMessageBox.confirm('请确认是否关闭该场景?', '状态关闭', {
-        confirmButtonText: '确认',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          ruleForm.selectItems!.splice(index, 1);
-        })
-        .catch(() => {
-          console.log('取消删除物件');
-        });
-    } else {
-      ElMessage.warning({
-        message: '无法删除',
-      });
-    }
-  };
+  // const deleScene = (index) => {
+  //   if (ruleForm.selectItems!.length > 1) {
+  //     ElMessageBox.confirm('请确认是否关闭该场景?', '状态关闭', {
+  //       confirmButtonText: '确认',
+  //       cancelButtonText: '取消',
+  //       type: 'warning',
+  //     })
+  //       .then(() => {
+  //         ruleForm.selectItems!.splice(index, 1);
+  //       })
+  //       .catch(() => {
+  //         console.log('取消删除物件');
+  //       });
+  //   } else {
+  //     ElMessage.warning({
+  //       message: '无法删除',
+  //     });
+  //   }
+  // };
   //添加新公司的提交
   const newCompanyAdd = () => {
     if (!ruleFormRef.value) return;
@@ -365,60 +368,60 @@
         return;
       }
 
-      if (props.allCodes.indexOf(ruleForm.code) > -1) {
-        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-          confirmButtonText: '确认',
-          cancelButtonText: '取消',
-          type: 'error',
-        })
-          .then(() => {
-            // ruleFormCom.code = '';
-            console.log('场景代码重复,请重新填写');
-          })
-          .catch(() => {
-            console.log('取消删除物件');
+      // if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      //   ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //     confirmButtonText: '确认',
+      //     cancelButtonText: '取消',
+      //     type: 'error',
+      //   })
+      //     .then(() => {
+      //       // ruleFormCom.code = '';
+      //       console.log('场景代码重复,请重新填写');
+      //     })
+      //     .catch(() => {
+      //       console.log('取消删除物件');
+      //     });
+      // } else {
+      const newComData = {
+        name: ruleForm.name,
+        code: ruleForm.code,
+        status: Number(ruleForm.addEnable),
+        isDeleted: 0,
+        parentId: 0,
+        serial: 0,
+        remark: ruleForm.remark,
+        longitude: ruleForm.longitude,
+        latitude: ruleForm.latitude,
+        regionCode: ruleForm.regionCode,
+        thumbnail: ruleForm.thumbnail,
+      };
+      //提交数据并重置关闭el-draw
+      addCompany(newComData)
+        .then((res) => {
+          //选出不为空字符串的数据
+          ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
+            return item.tag && item.template;
           });
-      } else {
-        const newComData = {
-          name: ruleForm.name,
-          code: ruleForm.code,
-          status: Number(ruleForm.addEnable),
-          isDeleted: 0,
-          parentId: 0,
-          serial: 0,
-          remark: ruleForm.remark,
-          longitude: ruleForm.longitude,
-          latitude: ruleForm.latitude,
-          regionCode: ruleForm.regionCode,
-          thumbnail: ruleForm.thumbnail,
-        };
-        //提交数据并重置关闭el-draw
-        addCompany(newComData)
-          .then((res) => {
-            //选出不为空字符串的数据
-            ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
-              return item.tag && item.template;
-            });
-            //将selectItems加工成保存公司-模板的数据类型
-            const newModuleLabel = ruleForm.selectItems!.map((item) => {
-              return {
-                companyId: res,
-                isDeleted: 0,
-                sceneLabelId: Number(item.tag), //item.tag
-                sceneModuleId: Number(item.template), ///item.template
-              };
-            });
-
-            //保存公司-场景标签-场景模板关系
-            return addCompanyModuleLabel(newModuleLabel);
-          })
-          .catch((err) => {
-            console.log(err);
-          })
-          .finally(() => {
-            emit('onOk');
+          //将selectItems加工成保存公司-模板的数据类型
+          const newModuleLabel = ruleForm.selectItems!.map((item) => {
+            return {
+              companyId: res,
+              isDeleted: 0,
+              sceneLabelId: Number(item.tag), //item.tag
+              sceneModuleId: Number(item.template), ///item.template
+            };
           });
-      }
+
+          //保存公司-场景标签-场景模板关系
+          return addCompanyModuleLabel(newModuleLabel);
+        })
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+      // }
     });
   };
 
@@ -430,22 +433,22 @@
         return;
       }
 
-      if (props.allCodes.indexOf(ruleForm.code) > -1) {
-        if (props.detail.code !== ruleForm.code) {
-          ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-            confirmButtonText: '确认',
-            cancelButtonText: '取消',
-            type: 'error',
-          })
-            .then(() => {
-              console.log('代码重复');
-            })
-            .catch(() => {
-              console.log('取消删除物件');
-            });
-          return;
-        }
-      }
+      // if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      //   if (props.detail.code !== ruleForm.code) {
+      //     ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //       confirmButtonText: '确认',
+      //       cancelButtonText: '取消',
+      //       type: 'error',
+      //     })
+      //       .then(() => {
+      //         console.log('代码重复');
+      //       })
+      //       .catch(() => {
+      //         console.log('取消删除物件');
+      //       });
+      //     return;
+      //   }
+      // }
 
       ruleForm.selectItems = ruleForm.selectItems!.filter((item) => {
         return item.tag && item.template;

+ 14 - 8
src/views/system-config/scene-manage/SceneDialog.vue

@@ -1,13 +1,18 @@
 <template>
   <page-wrapper>
-    <el-dialog :model-value="true" @close="() => emit('closeDialog')" title="添加企业信息" width="500">
+    <el-dialog
+      :model-value="true"
+      @close="() => emit('closeDialog')"
+      title="添加企业信息"
+      width="500"
+    >
       <!-- <span>This is a message</span> -->
       <div>
         <div class="relate-select">
           <div class="select-title">企业分类</div>
           <el-select v-model="companyType" placeholder="请选择企业类型" style="width: 180px">
             <el-option
-              v-for="item in options"
+              v-for="item in OPTIONS"
               :key="item.value"
               :label="item.label"
               :value="item.value"
@@ -48,8 +53,9 @@
 <script setup lang="ts">
   import { ref, onMounted } from 'vue';
   import { ElMessage } from 'element-plus';
-  import { options } from './use-method.tsx';
-  import { getCompanyList, CompanyType, changeRelate } from '@/api/scene/scene-relate';
+  import { OPTIONS } from '@/types/scene/constant.ts';
+  import { getCompanyList, changeRelate } from '@/api/scene/scene.ts';
+  import { CompanyType } from '@/types/scene/type.ts';
 
   const emit = defineEmits<{
     (e: 'closeDialog'): unknown;
@@ -82,7 +88,7 @@
         type: 'success',
       });
       reset();
-      emit('closeDialog')
+      emit('closeDialog');
     });
   };
   const changeCom = (val: any) => {
@@ -99,9 +105,9 @@
       companyList.value = res;
     });
   });
-  const cancel = ()=>{
-    emit('closeDialog')
-  }
+  const cancel = () => {
+    emit('closeDialog');
+  };
 </script>
 
 <style scoped>

+ 35 - 34
src/views/system-config/scene-manage/WorkshopDrawer-shangfei.vue

@@ -93,14 +93,15 @@
 
 <script setup lang="ts">
   import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
-  import { ENABLED } from './constant';
-  import { ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
-  import { LabelModuleListType, addWorkshop, editWorkshop } from '@/api/scene/sceneOperate';
+  import { ENABLED } from '@/types/scene/constant.ts';
+  import { type FormInstance, type FormRules } from 'element-plus';
   import {
-    WorkshopModuleType,
+    addWorkshop,
+    editWorkshop,
     addWorkshopModuleLabel,
     editWorkshopModuleLabel,
-  } from '@/api/scene/secene-templet';
+  } from '@/api/scene/scene.ts';
+  import { LabelModuleListType, WorkshopModuleType } from '@/types/scene/type.ts';
   import { getWorkshopInfoList } from '@/api/workShopData';
 
   type WorkshopListType = {
@@ -120,7 +121,7 @@
   };
 
   const props = defineProps<{
-    allCodes: string[];
+    // allCodes: string[];
     workshopTemplateList: WorkshopModuleType[];
     detail: {
       id?: number;
@@ -216,35 +217,35 @@
         serial: 0,
       };
 
-      if (props.allCodes.includes(ruleForm.code)) {
-        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-          confirmButtonText: '确认',
-          cancelButtonText: '取消',
-          type: 'error',
+      // if (props.allCodes.includes(ruleForm.code)) {
+      //   ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //     confirmButtonText: '确认',
+      //     cancelButtonText: '取消',
+      //     type: 'error',
+      //   })
+      //     .then(() => {
+      //       console.log('场景代码重复,请重新填写');
+      //     })
+      //     .catch(() => {
+      //       console.log('取消删除物件');
+      //     });
+      // } else {
+      addWorkshop(newAddData)
+        .then((res) => {
+          const newWorkshopModule = {
+            workshopId: res,
+            isDeleted: 0,
+            workshopModuleId: ruleForm.templateWorkshop!,
+          };
+          return addWorkshopModuleLabel(newWorkshopModule);
         })
-          .then(() => {
-            console.log('场景代码重复,请重新填写');
-          })
-          .catch(() => {
-            console.log('取消删除物件');
-          });
-      } else {
-        addWorkshop(newAddData)
-          .then((res) => {
-            const newWorkshopModule = {
-              workshopId: res,
-              isDeleted: 0,
-              workshopModuleId: ruleForm.templateWorkshop!,
-            };
-            return addWorkshopModuleLabel(newWorkshopModule);
-          })
-          .catch((err) => {
-            console.log(err);
-          })
-          .finally(() => {
-            emit('onOk');
-          });
-      }
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+      // }
     });
   };
 

+ 51 - 50
src/views/system-config/scene-manage/WorkshopDrawer.vue

@@ -83,17 +83,18 @@
 
 <script setup lang="ts">
   import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
-  import { ENABLED } from './constant';
-  import { ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
-  import { LabelModuleListType, addWorkshop, editWorkshop } from '@/api/scene/sceneOperate';
+  import { ENABLED } from '@/types/scene/constant.ts';
+  import { type FormInstance, type FormRules } from 'element-plus';
   import {
-    WorkshopModuleType,
     addWorkshopModuleLabel,
     editWorkshopModuleLabel,
-  } from '@/api/scene/secene-templet';
+    addWorkshop,
+    editWorkshop,
+  } from '@/api/scene/scene.ts';
+  import { LabelModuleListType, WorkshopModuleType } from '@/types/scene/type.ts';
 
   const props = defineProps<{
-    allCodes: string[];
+    // allCodes: string[];
     workshopTemplateList: WorkshopModuleType[];
     detail: {
       id?: number;
@@ -189,35 +190,35 @@
         serial: 0,
       };
 
-      if (props.allCodes.includes(ruleForm.code)) {
-        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-          confirmButtonText: '确认',
-          cancelButtonText: '取消',
-          type: 'error',
+      // if (props.allCodes.includes(ruleForm.code)) {
+      //   ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //     confirmButtonText: '确认',
+      //     cancelButtonText: '取消',
+      //     type: 'error',
+      //   })
+      //     .then(() => {
+      //       console.log('场景代码重复,请重新填写');
+      //     })
+      //     .catch(() => {
+      //       console.log('取消删除物件');
+      //     });
+      // } else {
+      addWorkshop(newAddData)
+        .then((res) => {
+          const newWorkshopModule = {
+            workshopId: res,
+            isDeleted: 0,
+            workshopModuleId: ruleForm.templateWorkshop!,
+          };
+          return addWorkshopModuleLabel(newWorkshopModule);
         })
-          .then(() => {
-            console.log('场景代码重复,请重新填写');
-          })
-          .catch(() => {
-            console.log('取消删除物件');
-          });
-      } else {
-        addWorkshop(newAddData)
-          .then((res) => {
-            const newWorkshopModule = {
-              workshopId: res,
-              isDeleted: 0,
-              workshopModuleId: ruleForm.templateWorkshop!,
-            };
-            return addWorkshopModuleLabel(newWorkshopModule);
-          })
-          .catch((err) => {
-            console.log(err);
-          })
-          .finally(() => {
-            emit('onOk');
-          });
-      }
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+      // }
     });
   };
 
@@ -228,22 +229,22 @@
       if (!valid) {
         return;
       }
-      if (props.allCodes.includes(ruleForm.code)) {
-        if (props.detail.code !== ruleForm.code) {
-          ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-            confirmButtonText: '确认',
-            cancelButtonText: '取消',
-            type: 'error',
-          })
-            .then(() => {
-              console.log('代码重复');
-            })
-            .catch(() => {
-              console.log('取消删除物件');
-            });
-          return;
-        }
-      }
+      // if (props.allCodes.includes(ruleForm.code)) {
+      //   if (props.detail.code !== ruleForm.code) {
+      //     ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //       confirmButtonText: '确认',
+      //       cancelButtonText: '取消',
+      //       type: 'error',
+      //     })
+      //       .then(() => {
+      //         console.log('代码重复');
+      //       })
+      //       .catch(() => {
+      //         console.log('取消删除物件');
+      //       });
+      //     return;
+      //   }
+      // }
 
       const editNewWorkshopData = {
         code: ruleForm.code,

+ 4 - 4
src/views/system-config/scene-manage/WorkspaceDrawer-shangfei.vue

@@ -65,13 +65,13 @@
 
 <script setup lang="ts">
   import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
-  import { ENABLED } from './constant';
-  import { ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
-  import { addWorkspace, editWorkspace } from '@/api/scene/sceneOperate';
+  import { ENABLED } from '@/types/scene/constant.ts';
+  import { type FormInstance, type FormRules } from 'element-plus';
+  import { addWorkspace, editWorkspace } from '@/api/scene/scene.ts';
   import { getWorkSpaceInfoList } from '@/api/workShopData';
 
   const props = defineProps<{
-    allCodes: string[];
+    // allCodes: string[];
     detail: {
       id?: number;
       name?: string;

+ 52 - 52
src/views/system-config/scene-manage/WorkspaceDrawer.vue

@@ -55,12 +55,12 @@
 
 <script setup lang="ts">
   import { computed, reactive, ref, defineProps, defineEmits, watch } from 'vue';
-  import { ENABLED } from './constant';
-  import { ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
-  import { addWorkspace, editWorkspace } from '@/api/scene/sceneOperate';
+  import { ENABLED } from '@/types/scene/constant.ts';
+  import { type FormInstance, type FormRules } from 'element-plus';
+  import { addWorkspace, editWorkspace } from '@/api/scene/scene.ts';
 
   const props = defineProps<{
-    allCodes: string[];
+    // allCodes: string[];
     detail: {
       id?: number;
       name?: string;
@@ -139,39 +139,39 @@
       if (!valid) {
         return;
       }
-      if (props.allCodes.indexOf(ruleForm.code) > -1) {
-        ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-          confirmButtonText: '确认',
-          cancelButtonText: '取消',
-          type: 'error',
+      // if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      //   ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //     confirmButtonText: '确认',
+      //     cancelButtonText: '取消',
+      //     type: 'error',
+      //   })
+      //     .then(() => {
+      //       console.log('场景代码重复,请重新填写');
+      //     })
+      //     .catch(() => {
+      //       console.log('取消删除物件');
+      //     });
+      // } else {
+      const newAddData = {
+        code: ruleForm.code,
+        workshopId: props.detail.id,
+        isDeleted: 0,
+        name: ruleForm.name,
+        principal: ruleForm.principal,
+        status: Number(ruleForm.addEnable),
+        serial: 0,
+      };
+      addWorkspace(newAddData)
+        .catch((err) => {
+          console.log(err);
         })
-          .then(() => {
-            console.log('场景代码重复,请重新填写');
-          })
-          .catch(() => {
-            console.log('取消删除物件');
-          });
-      } else {
-        const newAddData = {
-          code: ruleForm.code,
-          workshopId: props.detail.id,
-          isDeleted: 0,
-          name: ruleForm.name,
-          principal: ruleForm.principal,
-          status: Number(ruleForm.addEnable),
-          serial: 0,
-        };
-        addWorkspace(newAddData)
-          .catch((err) => {
-            console.log(err);
-          })
-          .catch((err) => {
-            console.log(err);
-          })
-          .finally(() => {
-            emit('onOk');
-          });
-      }
+        .catch((err) => {
+          console.log(err);
+        })
+        .finally(() => {
+          emit('onOk');
+        });
+      // }
     });
   };
 
@@ -183,22 +183,22 @@
       if (!valid) {
         return;
       }
-      if (props.allCodes.indexOf(ruleForm.code) > -1) {
-        if (props.detail.code !== ruleForm.code) {
-          ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
-            confirmButtonText: '确认',
-            cancelButtonText: '取消',
-            type: 'error',
-          })
-            .then(() => {
-              console.log('代码重复');
-            })
-            .catch(() => {
-              console.log('取消删除物件');
-            });
-          return;
-        }
-      }
+      // if (props.allCodes.indexOf(ruleForm.code) > -1) {
+      //   if (props.detail.code !== ruleForm.code) {
+      //     ElMessageBox.confirm('场景代码重复,请重新填写', '代码重复', {
+      //       confirmButtonText: '确认',
+      //       cancelButtonText: '取消',
+      //       type: 'error',
+      //     })
+      //       .then(() => {
+      //         console.log('代码重复');
+      //       })
+      //       .catch(() => {
+      //         console.log('取消删除物件');
+      //       });
+      //     return;
+      //   }
+      // }
 
       const editNewWorkspaceData = {
         code: ruleForm.code,

+ 0 - 16
src/views/system-config/scene-manage/constant.ts

@@ -1,16 +0,0 @@
-export enum ENABLED {
-  FALSE = 1,
-  TRUE = 0,
-}
-
-export enum DATA_LEVEL {
-  'company' = 0,
-  'workshop' = 1,
-  'workspace' = 2,
-}
-
-export enum DrawerType {
-  company = 'company',
-  workshop = 'workshop',
-  workspace = 'workspace',
-}

+ 2 - 8
src/views/system-config/scene-manage/use-sence-templete.ts

@@ -1,11 +1,5 @@
-import {
-  SceneLabelType,
-  querySceneLabel,
-  TemplateType,
-  querytemplate,
-  queryWorkshopModule,
-  WorkshopModuleType,
-} from '@/api/scene/secene-templet';
+import { querySceneLabel, querytemplate, queryWorkshopModule } from '@/api/scene/scene.ts';
+import { TemplateType, SceneLabelType, WorkshopModuleType } from '@/types/scene/type.ts';
 import { onMounted, ref } from 'vue';
 
 export function useSceneTemplete() {

+ 239 - 0
src/views/system-config/scene-manage/hook/use-table-method.tsx

@@ -0,0 +1,239 @@
+import {
+  // SceneListType,
+  // GetListWorkshop,
+  // WorkspaceAddDatas,
+  // LabelModuleListType,WorkShopTempleteType
+  
+} from '@/types/scene/type.ts';
+import { useGlobSetting } from '@/hooks/setting';
+
+const { appPCUrl } = useGlobSetting()
+
+export const colomns = [
+  { label: '名称', prop: 'name', minWidth: 300 },
+  { label: '设置', prop: 'labelName', minWidth: 300,
+      render: ({ row }) => {
+        if(!row.parent && row.labelList?.[0]?.id) {
+          return (
+            <a
+              href={`/#/page-config/config?companyId=${row.id}`}
+            >
+              布局设置
+            </a>
+          );  
+        } else if (row.parent && !row.parent.parent) {
+          return (
+            <a href={`/#/map-config/layout?id=${row.id}`}>
+              相机导航设置
+            </a>
+          );
+        }
+      }, 
+    },
+  // { label: '场景标签', prop: 'labelName', minWidth: 300 },
+  // { label: '代码', prop: 'code' },
+  {
+    label: '预览',
+    prop: 'preview',
+    minWidth: 300,
+    render: ({ row, column }) => {
+      if (!row.parent && row.labelList?.[0]?.id) {
+        return (
+          <a
+            href={`${appPCUrl}#/company?companyId=${row.id}&labelId=${row.labelList[0]?.id}`}
+            target="_blank"
+          >
+            公司预览
+          </a>
+        );
+      } else if (row.parent && !row.parent.parent) {
+        return (
+          <a href={`${appPCUrl}#/shop?id=${row.id}`} target="_blank">
+            车间预览
+          </a>
+        );
+      }
+    },
+  },
+];
+
+// interface DataSourceUser
+//   extends UseComType<UseWorkshopType<UseWorkspaceType>> {
+//   parent?: UseComType<UseWorkshopType<UseWorkspaceType>> | null;
+// }
+// 修改: 现在排序车间或工位时按上一级id找 找到公司id为止
+
+// export const dataSourceWithParent = (d: DataSourceUser[], parent: DataSourceUser | null) => {
+//   d.forEach((item, _index) => {
+//     item.parent = parent;
+
+//     if (item.children && item.children?.length > 0) {
+//       dataSourceWithParent(item.children as DataSourceUser[], item);
+//     }
+//   });
+
+//   return d;
+// };
+
+// export function removeParent(data) {
+//   return data.map((item) => {
+//     // 删除 tag 属性
+//     delete item.parent;
+
+//     // 递归处理子项
+//     if (item.children && item.children.length > 0) {
+//       item.children = removeParent(item.children);
+//     }
+
+//     return item;
+//   });
+// }
+
+//找到各个层级
+// export function findIndexByItem(data, targetItem, path = []) {
+//   for (let i = 0; i < data.length; i++) {
+//     const currentPath = path.concat(i);
+//     if (data[i].id === targetItem.id && data[i].name === targetItem.name) {
+//       return currentPath;
+//     }
+//     if (data[i].children && data[i].children.length > 0) {
+//       const childResult = findIndexByItem(data[i].children, targetItem, currentPath);
+//       if (childResult.length > 0) {
+//         return childResult;
+//       }
+//     }
+//   }
+//   return [];
+// }
+
+//用于重新修改serial
+// export const updateSerials = (data) => {
+//   for (let i = 0; i < data.length; i++) {
+//     data[i].serial = i;
+
+//     // 如果有子项,递归查找
+//     if (data[i].children && data[i].children.length > 0) {
+//       updateSerials(data[i].children);
+//     }
+//   }
+//   return data;
+//   // return false; // 表示未找到目标项
+// };
+
+//用于新增数据
+// export const updateData = (data, targetId, newAdd) => {
+//   for (let i = 0; i < data.length; i++) {
+//     const currentItem = data[i];
+
+//     if (currentItem.id === targetId) {
+//       if (!currentItem.children) {
+//         currentItem.children = [];
+//       }
+//       currentItem.children.push(newAdd);
+//       return true; // 表示已经找到并修改
+//     }
+
+//     // 如果有子项,递归查找
+//     if (currentItem.children && currentItem.children.length > 0) {
+//       const found = updateData(currentItem.children, targetId, newAdd);
+
+//       if (found) {
+//         return true; // 如果在子项中找到目标项,停止继续查找
+//       }
+//     }
+//   }
+
+//   return false; // 表示未找到目标项
+// };
+
+//判断该条数据的层级
+// export const findItemLevel = (data, targetId, targetName, currentLevel = 0) => {
+//   for (let i = 0; i < data.length; i++) {
+//     const item = data[i];
+
+//     if (item.id === targetId && item.name === targetName) {
+//       return currentLevel;
+//     }
+
+//     if (item.children && item.children.length > 0) {
+//       const childLevel = findItemLevel(item.children, targetId, targetName, currentLevel + 1);
+//       if (childLevel !== -1) {
+//         return childLevel;
+//       }
+//     }
+//   }
+
+//   return -1;
+// };
+
+
+//得到parent
+// 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.code === targetCode) {
+//       // parentNode = item
+//       return item
+//     }
+
+//     if (item.children && item.children.length > 0) {
+//       const foundItem = getParent(item.children as DataSourceUser[], targetCode);
+//       if (foundItem) {
+//         return foundItem
+//       }
+//     }
+//   }
+
+//   return null;
+// };
+
+//删除行
+// export const deleteTableRow = (dataSource, targetId) => {
+//   const deleteRecursive = (data) => {
+//     for (let i = 0; i < data.length; i++) {
+//       const currentItem = data[i];
+
+//       if (currentItem.id === targetId) {
+//         // 删除当前项
+//         data.splice(i, 1);
+//         return true;
+//       }
+
+//       // 如果有子项,递归查找
+//       if (currentItem.children && currentItem.children.length > 0) {
+//         const found = deleteRecursive(currentItem.children);
+
+//         if (found) {
+//           return true; // 如果在子项中找到目标项,停止继续查找
+//         }
+//       }
+//     }
+
+//     return false; // 表示未找到目标项
+//   };
+
+//   // 从顶层开始递归删除
+//   deleteRecursive(dataSource);
+// };
+
+//找出数据中的全部code
+// export const flattenCodes = (data) => {
+//   const codes: string[] = [];
+//   const traverse = (node: { code: string; children: any[] }) => {
+//     codes.push(node.code);
+//     if (node.children && node.children.length > 0) {
+//       node.children.forEach(traverse);
+//     }
+//   };
+//   data.forEach(traverse);
+//   return codes;
+// };
+
+// export enum ENABLED {
+//   FALSE = 1,
+//   TRUE = 0,
+// }

+ 48 - 0
src/views/system-config/scene-manage/store/use-com-tree.ts

@@ -0,0 +1,48 @@
+import { getComShopSpaceTree } from '@/api/scene/scene.ts';
+import { ComTreeType } from '@/types/scene/type.ts';
+import { defineStore } from 'pinia';
+import { ref } from 'vue';
+// import { dataSourceWithParent } from './use-table-method';
+
+export const useComTree = defineStore('scene-data', () => {
+  //场景数据
+  const comTreeData = ref<ComTreeType[]>([]);
+
+  /**
+   * @description 获取公司树结构数据并预处理
+   * @version V4
+   * @author Yunfeng
+   * @date 2025-01-13
+   */
+  const getComTreeDetail = () => {
+    getComShopSpaceTree().then((res) => {
+      comTreeData.value = comTreeWithUniqueCode(res);
+    });
+  };
+
+  /**
+   * @description 为公司树中每个节点添加唯一性标识UniqueCode,用于表格树结构的row-key
+   * @version V4
+   * @author Yunfeng
+   * @date 2025-01-13
+   */
+  const comTreeWithUniqueCode = (tree: ComTreeType[]) => {
+    tree.forEach((item) => {
+      item.uniqueCode = `${item.id}`;
+      item.children &&
+        item.children.forEach((item) => {
+          item.uniqueCode = `${item.uniqueCode}-${item.id}`;
+          if (item.children) {
+            item.children.forEach((child) => {
+              child.uniqueCode = `${item.uniqueCode}-${child.id}`;
+            });
+          }
+        });
+    });
+    return tree;
+  };
+
+  return { comTreeData, getComTreeDetail };
+});
+
+export default useComTree;

+ 0 - 240
src/views/system-config/scene-manage/use-method.tsx

@@ -1,240 +0,0 @@
-import {
-  SceneListType,
-  GetListWorkshop,
-  WorkspaceAddDatas,
-  LabelModuleListType,
-} from '@/api/scene/sceneOperate';
-import { WorkShopTempleteType } from '@/api/scene/secene-templet';
-import { useGlobSetting } from '@/hooks/setting';
-
-const { appPCUrl } = useGlobSetting()
-
-export const colomns = [
-  { label: '场景名称', prop: 'name', minWidth: 300 },
-  { label: '场景标签', prop: 'labelName', minWidth: 300 },
-  // { label: '代码', prop: 'code' },
-  {
-    label: '预览',
-    prop: 'preview',
-    minWidth: 300,
-    render: ({ row, column }) => {
-      if (!row.parent && row.labelList?.[0]?.id) {
-        return (
-          <a
-            href={`${appPCUrl}#/company?companyId=${row.id}&labelId=${row.labelList[0]?.id}`}
-            target="_blank"
-          >
-            公司预览
-          </a>
-        );
-      } else if (row.parent && !row.parent.parent) {
-        return (
-          <a href={`${appPCUrl}#/shop?id=${row.id}`} target="_blank">
-            车间预览
-          </a>
-        );
-      }
-    },
-  },
-];
-
-interface DataSourceUser
-  extends SceneListType<
-  GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>,
-  LabelModuleListType
-  > {
-  parent?: SceneListType<
-    GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>,
-    LabelModuleListType
-  > | null;
-}
-
-export const dataSourceWithParent = (d: DataSourceUser[], parent: DataSourceUser | null) => {
-  d.forEach((item, _index) => {
-    item.parent = parent;
-
-    if (item.children && item.children?.length > 0) {
-      dataSourceWithParent(item.children, item);
-    }
-  });
-
-  return d;
-};
-
-export const options = [
-  {
-    value: 'industry',
-    label: '工业企业',
-  },
-  {
-    value: 'gas',
-    label: '燃气企业',
-  },
-  {
-    value: 'other',
-    label: '其他企业',
-  },
-];
-
-export function removeParent(data) {
-  return data.map((item) => {
-    // 删除 tag 属性
-    delete item.parent;
-
-    // 递归处理子项
-    if (item.children && item.children.length > 0) {
-      item.children = removeParent(item.children);
-    }
-
-    return item;
-  });
-}
-
-//找到各个层级
-// export function findIndexByItem(data, targetItem, path = []) {
-//   for (let i = 0; i < data.length; i++) {
-//     const currentPath = path.concat(i);
-//     if (data[i].id === targetItem.id && data[i].name === targetItem.name) {
-//       return currentPath;
-//     }
-//     if (data[i].children && data[i].children.length > 0) {
-//       const childResult = findIndexByItem(data[i].children, targetItem, currentPath);
-//       if (childResult.length > 0) {
-//         return childResult;
-//       }
-//     }
-//   }
-//   return [];
-// }
-
-//用于重新修改serial
-export const updateSerials = (data) => {
-  for (let i = 0; i < data.length; i++) {
-    data[i].serial = i;
-
-    // 如果有子项,递归查找
-    if (data[i].children && data[i].children.length > 0) {
-      updateSerials(data[i].children);
-    }
-  }
-  return data;
-  // return false; // 表示未找到目标项
-};
-
-//用于新增数据
-export const updateData = (data, targetId, newAdd) => {
-  for (let i = 0; i < data.length; i++) {
-    const currentItem = data[i];
-
-    if (currentItem.id === targetId) {
-      if (!currentItem.children) {
-        currentItem.children = [];
-      }
-      currentItem.children.push(newAdd);
-      return true; // 表示已经找到并修改
-    }
-
-    // 如果有子项,递归查找
-    if (currentItem.children && currentItem.children.length > 0) {
-      const found = updateData(currentItem.children, targetId, newAdd);
-
-      if (found) {
-        return true; // 如果在子项中找到目标项,停止继续查找
-      }
-    }
-  }
-
-  return false; // 表示未找到目标项
-};
-
-//判断该条数据的层级
-export const findItemLevel = (data, targetId, targetName, currentLevel = 0) => {
-  for (let i = 0; i < data.length; i++) {
-    const item = data[i];
-
-    if (item.id === targetId && item.name === targetName) {
-      return currentLevel;
-    }
-
-    if (item.children && item.children.length > 0) {
-      const childLevel = findItemLevel(item.children, targetId, targetName, currentLevel + 1);
-      if (childLevel !== -1) {
-        return childLevel;
-      }
-    }
-  }
-
-  return -1;
-};
-
-
-//得到parent
-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.code === targetCode) {
-      // parentNode = item
-      return item
-    }
-
-    if (item.children && item.children.length > 0) {
-      const foundItem = getParent(item.children, targetCode);
-      if (foundItem) {
-        return foundItem
-      }
-    }
-  }
-
-  return null;
-};
-
-//删除行
-export const deleteTableRow = (dataSource, targetId) => {
-  const deleteRecursive = (data) => {
-    for (let i = 0; i < data.length; i++) {
-      const currentItem = data[i];
-
-      if (currentItem.id === targetId) {
-        // 删除当前项
-        data.splice(i, 1);
-        return true;
-      }
-
-      // 如果有子项,递归查找
-      if (currentItem.children && currentItem.children.length > 0) {
-        const found = deleteRecursive(currentItem.children);
-
-        if (found) {
-          return true; // 如果在子项中找到目标项,停止继续查找
-        }
-      }
-    }
-
-    return false; // 表示未找到目标项
-  };
-
-  // 从顶层开始递归删除
-  deleteRecursive(dataSource);
-};
-
-//找出数据中的全部code
-export const flattenCodes = (data) => {
-  const codes: string[] = [];
-  const traverse = (node: { code: string; children: any[] }) => {
-    codes.push(node.code);
-    if (node.children && node.children.length > 0) {
-      node.children.forEach(traverse);
-    }
-  };
-  data.forEach(traverse);
-  return codes;
-};
-
-// export enum ENABLED {
-//   FALSE = 1,
-//   TRUE = 0,
-// }

+ 0 - 30
src/views/system-config/scene-manage/use-scene.ts

@@ -1,30 +0,0 @@
-import {
-  WorkspaceAddDatas,
-  SceneListType,
-  GetListWorkshop,
-  getSceneList,
-  LabelModuleListType,
-} from '@/api/scene/sceneOperate';
-import { WorkShopTempleteType } from '@/api/scene/secene-templet';
-import { defineStore } from 'pinia';
-import { ref } from 'vue';
-import { dataSourceWithParent } from './use-method';
-
-export const useScene = defineStore('scene-data', () => {
-  //场景数据
-  const tableData = ref<
-    SceneListType<GetListWorkshop<WorkspaceAddDatas, WorkShopTempleteType>, LabelModuleListType>[]
-  >([]);
-
-  const getSceneDetail = () => {
-    getSceneList().then((res) => {
-      tableData.value = res;
-      //添加父级,主要用于排序功能
-      tableData.value = dataSourceWithParent(tableData.value, null);
-    });
-  };
-
-  return { tableData, getSceneDetail };
-});
-
-export default useScene;

+ 9 - 9
src/views/system/role/CreateUserDrawer.vue

@@ -90,7 +90,7 @@
   import { ElMessage } from 'element-plus';
   import type { userFormParamsType } from './types';
   import { addRole, getFeaturePermissions, roleUserInfo, updateRole } from '@/api/system/role';
-  import useScene from '@/views/system-config/scene-manage/use-scene';
+  import useComTree from '@/views/system-config/scene-manage/store/use-com-tree';
   import { storeToRefs } from 'pinia';
   import { useGlobSetting } from '@/hooks/setting';
   import { uid } from 'uid';
@@ -98,13 +98,13 @@
   const globSetting = useGlobSetting();
   const disableDepartmentEdit = globSetting.disableDepartmentEdit;
 
-  const sceneInfos = useScene();
-  const { tableData } = storeToRefs(sceneInfos);
-  const { getSceneDetail } = sceneInfos;
+  const comTree = useComTree();
+  const { comTreeData } = storeToRefs(comTree);
+  const { getComTreeDetail } = comTree;
 
   const workshopFuncPermissionMap = computed(() => {
     const tempMap = {};
-    tableData.value.forEach((company) => {
+    comTreeData.value.forEach((company) => {
       const shops = company.children;
       if (shops && shops.length) {
         shops.forEach((shop) => {
@@ -140,9 +140,9 @@
 
   const treeData = computed(() => {
     const newList: any[] = [];
-    if (tableData.value && tableData.value.length) {
-      for (let i = 0; i < tableData.value.length; i++) {
-        const data = tableData.value[i];
+    if (comTreeData.value && comTreeData.value.length) {
+      for (let i = 0; i < comTreeData.value.length; i++) {
+        const data = comTreeData.value[i];
         if (data.children && data.children.length) {
           const treeItem = {
             id: data.id,
@@ -461,7 +461,7 @@
   }
 
   onMounted(() => {
-    getSceneDetail();
+    getComTreeDetail();
     getFeaturePermissions().then((res) => {
       if (res[0]?.children) {
         modeList.value = res[0].children;

+ 1 - 1
utils/devProxy/local/proxy.ts

@@ -3,7 +3,7 @@ import path from 'path';
 
 // 连后端本机时的代理staff环境
 const proxyStaff: PROXY_TYPE = {
-  serverHost: 'http://192.168.22.233:8800/',
+  serverHost: 'http://192.168.13.68/eye_api_bak',
   loginHost: 'http://192.168.13.68/skyeye-login/',
   skyeyeFileUploadHost: 'http://192.168.13.68/skyeye-file-upload',
   nvrDownload: 'http://192.168.13.68/nvr_download',