Browse Source

Merge branch 'xj' of http://192.168.0.115:3000/bill/public-fuse into xj

tangning 1 year ago
parent
commit
97e3877c3d

File diff suppressed because it is too large
+ 726 - 930
pnpm-lock.yaml


+ 7 - 7
src/app/fire/view/dispatch/editFire.vue

@@ -34,7 +34,7 @@
       </el-input>
       <div class="search-result" v-show="!info" ref="resultEl"></div>
     </el-form-item>
-    <el-form-item label="勘验地址" class="mandatory">
+    <el-form-item label="勘验地址">
       <el-input v-model="bindFire.field1" maxlength="50" placeholder="请输入勘验地址" />
     </el-form-item>
     <el-form-item label="起火场所" class="mandatory">
@@ -46,7 +46,7 @@
         :props="{ expandTrigger: 'hover' }"
       />
     </el-form-item>
-    <el-form-item label="全宗名称" class="mandatory">
+    <el-form-item label="全宗名称">
       <el-input v-model="bindFire.field2" maxlength="50" placeholder="请输入全宗名称" />
     </el-form-item>
 
@@ -64,7 +64,7 @@
     </div>
     <div class="el-form-item">
       <el-col :span="12">
-        <el-form-item label="勘验人姓名" class="mandatory">
+        <el-form-item label="勘验人姓名">
           <el-input
             v-model="bindFire.field3"
             maxlength="18"
@@ -73,7 +73,7 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="单位、职务" class="mandatory">
+        <el-form-item label="单位、职务">
           <el-input
             v-model="bindFire.field4"
             maxlength="50"
@@ -103,7 +103,7 @@
 
     <div class="el-form-item">
       <el-col :span="12">
-        <el-form-item label="事件分类" class="mandatory">
+        <el-form-item label="事件分类">
           <el-input
             v-model="bindFire.field5"
             maxlength="18"
@@ -112,7 +112,7 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="分类登记" class="mandatory">
+        <el-form-item label="分类登记">
           <el-input
             v-model="bindFire.field6"
             maxlength="50"
@@ -124,7 +124,7 @@
 
     <div class="el-form-item">
       <el-col :span="12">
-        <el-form-item label="勘验信息" class="mandatory">
+        <el-form-item label="勘验信息">
           <el-input
             v-model="bindFire.field7"
             placeholder="请输入天气情况等标准化勘验信息"

+ 0 - 7
src/app/fire/view/dispatch/header.vue

@@ -26,13 +26,6 @@
         ></el-cascader>
       </el-form-item>
 
-      <el-form-item label="勘验信息:">
-        <el-input
-          v-model="pagging.state.query.field7"
-          placeholder="请输入"
-        ></el-input>
-      </el-form-item>
-      
       <el-form-item label="承办单位:">
         <com-company v-model="pagging.state.query.deptId" />
       </el-form-item>

+ 9 - 1
src/app/fire/view/dispatch/index.vue

@@ -63,6 +63,9 @@
           <span class="oper-span" @click="gotoQuery(row.caseId)" v-pdpath="['view']">
             查看
           </span>
+          <span class="oper-span" @click="copy(row.caseId)" v-pdpath="['view']">
+            复制
+          </span>
           <span
             class="oper-span"
             @click="pagging.del(row)"
@@ -101,6 +104,7 @@ import Header from "./header.vue";
 import List from "./list.vue";
 import { useFirePagging } from "./pagging";
 import { Fire, revokeFireTeachs, setFireTeachs, setFire } from "@/app/fire/store/fire";
+import { copyCase } from "@/store/case";
 import CaseEditMenu from "@/view/case/editMenu.vue";
 import { gotoQuery } from "@/view/case/help";
 import { confirm } from "@/helper/message";
@@ -110,6 +114,11 @@ import { ElMessage } from "element-plus";
 
 const { pagging, isTeached, isRecycle } = useFirePagging();
 
+const copy = async (caseId: number) => {
+  await copyCase(caseId);
+  pagging.refresh();
+};
+
 // 撤销教学
 const revokeTeaching = async (row?: Fire) => {
   if (!(await confirm("撤销教学,火调项目将不再显示在教学平台。(火调项目不会删除)"))) {
@@ -155,5 +164,4 @@ const editHandler = async (row: Fire) => {
 const addHandler = async () => {
   (await addFire({})) && pagging.refresh();
 };
-
 </script>

+ 1 - 1
src/app/fire/view/dispatch/list.vue

@@ -89,7 +89,7 @@
         {{ fireStatusDesc[row.status as FireStatus] }}
       </el-table-column>
       <slot name="appendColumn" />
-      <el-table-column label="操作" v-slot:default="{ row }" :width="180">
+      <el-table-column label="操作" v-slot:default="{ row }" :width="220">
         <slot name="rowCtrl" :row="row" />
       </el-table-column>
     </el-table>

+ 3 - 1
src/app/fire/view/dispatch/pagging.ts

@@ -43,6 +43,7 @@ export const useFirePagging = () => {
   watch(
     () => [pagging.state.query.queryType, isTeached.value, isRecycle.value],
     () => {
+      console.log(isRecycle.value);
       if (isRecycle.value) {
         pagging.state.query.queryType = FirePaggingRoute.fire;
         pagging.state.query.isDelete = 2;
@@ -53,13 +54,14 @@ export const useFirePagging = () => {
           : FirePaggingRoute.fire;
       }
     },
-    { flush: "sync", immediate: true }
+    { flush: "post", immediate: true }
   );
 
   const params = [{ ...pagging.state.query }, { ...pagging.state.query }];
   watchEffect(
     () => {
       pagging.state.query = params[isTeached.value ? 0 : 1];
+      // pagging.state.query = params[isRecycle.value ? 0 : 1];
     },
     { flush: "sync" }
   );

+ 13 - 6
src/core/Scene.js

@@ -42,10 +42,11 @@ export default class Scene {
         1000
       );
       this.orthCamera.zoom = 250;
-      this.orthCamera.updateProjectionMatrix();
+
       this.orthCamera.position.set(0, 10, 0);
       this.orthCamera.lookAt(0, 0, 0);
-
+      // this.orthCamera.setViewOffset(this.width, this.height, 0, 0);
+      this.orthCamera.updateProjectionMatrix();
       //player
       this.player = new Player(this);
 
@@ -62,19 +63,25 @@ export default class Scene {
     };
   }
 
-  load = (list) => {
+  load = (list, type) => {
     if (!list) return;
-    console.log("scene: ", list);
+    console.log("scene: ", list, type);
     //axesHeloer
+    this.clearScene();
     const axesHelper = new THREE.AxesHelper(1);
     this.scene.add(axesHelper);
-
     this.boxManager = new BoxManager(this);
-    this.boxManager.load(list);
+    this.boxManager.load(list, type);
     //light
     this.loadLight();
   };
 
+  clearScene() {
+    for (var i = this.scene.children.length - 1; i >= 0; i--) {
+      let obj = this.scene.children[i];
+      this.scene.remove(obj);
+    }
+  }
   loadLight = () => {
     const light = new THREE.AmbientLight(0xffffff, 1.5); // 柔和的白光
     this.scene.add(light);

+ 12 - 4
src/core/box/BoxManager.js

@@ -1,12 +1,13 @@
 import * as THREE from "three";
 import HorizontalBox from "./horizontalBox";
-
+import VerticalBox from "./VerticalBox";
 export default class BoxManager {
   constructor(scene) {
     this.scene = scene;
     this.loadingManager = new THREE.LoadingManager();
     this.loader = new THREE.TextureLoader(this.loadingManager);
     this.model = new THREE.Group();
+    this.model.name = "boxManager";
     this.maps = {};
     this.imgList = [];
     this.opacity = 1;
@@ -14,18 +15,25 @@ export default class BoxManager {
     this.onBindEvent();
   }
 
-  load = (list) => {
+  load = (list, type) => {
+    console.log("this.model.name", this.model.name);
     list.forEach((item, index) => {
-      if (Array.isArray(item)) {
+      if (type === 1) {
         //横排
+        console.log("横排");
         const box = new HorizontalBox(this, item, index);
         this.model.add(box);
-      } else {
+      }
+      if (type === 2) {
         //竖排
+        const box = new VerticalBox(this, item, index);
+        // console.log("竖排");
+        this.model.add(box);
       }
     });
 
     this.scene.scene.add(this.model);
+    console.log("this.scene.scene", this.scene.scene);
   };
 
   onBindEvent = () => {

+ 5 - 1
src/core/box/HorizontalBox.js

@@ -8,6 +8,7 @@ export default class HorizontalBox extends THREE.Group {
     super();
     this.manager = manager;
     this.name = "horizontal_box";
+
     this.getStyle();
     this.load(data, index);
   }
@@ -19,6 +20,7 @@ export default class HorizontalBox extends THREE.Group {
 
   load(data, index) {
     //box
+
     const geometry = new THREE.PlaneGeometry(1, 1);
     geometry.rotateX(-Math.PI / 2);
 
@@ -33,7 +35,7 @@ export default class HorizontalBox extends THREE.Group {
     this.position.x = (this.width + 0.125) * index;
 
     const matLine = new LineMaterial({
-      color: 0x26559b,
+      color: 0xe44d54,
       linewidth: 3, // in world units with size attenuation, pixels otherwise
       dashed: false,
       alphaToCoverage: true,
@@ -46,9 +48,11 @@ export default class HorizontalBox extends THREE.Group {
     data.forEach((i, j) => {
       //img
       let img;
+
       this.manager.loader.load(i.imgUrl, (texture) => {
         texture.colorSpace = THREE.SRGBColorSpace;
         img = new ImgLabel(texture, matLine);
+        img.userData = i.id;
         img.position.y += 1;
         if (j === 0) {
           img.position.z -= 0.8;

+ 1 - 1
src/core/box/VerticalBox.js

@@ -33,7 +33,7 @@ export default class VerticalBox extends THREE.Group {
     this.position.x = (this.width + 0.125) * index;
 
     const matLine = new LineMaterial({
-      color: 0x26559b,
+      color: 0xe44d54,
       linewidth: 3, // in world units with size attenuation, pixels otherwise
       dashed: false,
       alphaToCoverage: true,

+ 1 - 1
src/core/box/object/ImgLabel.js

@@ -13,7 +13,7 @@ export default class ImgLabel extends THREE.Mesh {
       map: texture,
     });
     super(g, m);
-    console.log(g);
+    // console.log(g);
     const p = [
       [-0.75, 0, -0.425, 0.75, 0, -0.425],
       [-0.75, 0, -0.425, -0.75, 0, 0.425],

+ 7 - 4
src/core/box/object/Line.js

@@ -19,6 +19,7 @@ let m = new THREE.MeshBasicMaterial({
 export default class Line extends Line2 {
   constructor(startPoint, endPoint, endEdge, matLine) {
     let points;
+
     let g = new THREE.PlaneGeometry(0.1, 0.1);
     g.rotateX(-Math.PI / 2);
     let cross = new THREE.Mesh(g, m);
@@ -74,7 +75,6 @@ export default class Line extends Line2 {
       points = pointsToArray([a, b, c, d]);
     } else if (endEdge.name === 2) {
       //bottom
-
       let a = startPoint.clone();
       let b = new THREE.Vector3(
         startPoint.x,
@@ -97,7 +97,6 @@ export default class Line extends Line2 {
       points = pointsToArray([a, b, c, d]);
     } else {
       //right
-
       let a = startPoint.clone();
       let b = new THREE.Vector3(
         (startPoint.x + endPoint.x) / 2,
@@ -124,10 +123,14 @@ export default class Line extends Line2 {
     }
 
     const geometry = new LineGeometry();
-    console.log("points", points);
-    // console.log("endEdge", endEdge.name);
+  
+    cross.visible = false;
     geometry.setPositions(points);
     super(geometry, matLine);
+    this.userData = {
+      dir: endEdge.name,
+      points: points,
+    };
     this.scale.set(1, 1, 1);
     this.position.y += 0.5;
     this.add(cross);

+ 1 - 0
src/core/box/object/LinePoints.js

@@ -54,6 +54,7 @@ export default class LinePoints extends Line2 {
         break;
     }
     const geometry = new LineGeometry();
+    cross.visible = false;
     console.log("points", points);
     geometry.setPositions(points);
     super(geometry, matLine);

+ 1 - 1
src/core/box/object/TouchEdge.js

@@ -19,6 +19,6 @@ export default class TouchEdge extends THREE.Group {
       line.y = i[2];
       this.add(line);
     });
-    console.log(this);
+    // console.log(this);
   }
 }

+ 26 - 40
src/core/player/Player.js

@@ -34,6 +34,9 @@ export default class Player {
     this.drawing = false;
     this.inited = false;
     this.renderLines = [];
+    this.activeEdges = [];
+    this.matLine = null;
+    this.lineColor = 0xe44d54;
     this.init();
   }
 
@@ -45,40 +48,32 @@ export default class Player {
       this.scene.domElement
     );
 
-    // this.floorplanControls.enablePan = true;
-    // this.floorplanControls.target.set(0,0,0);
+    this.floorplanControls.enablePan = true;
+    // this.floorplanControls.target.set(0, 1, 0);
     // this.floorplanControls.rotateSpeed = 0.5;
     // this.floorplanControls.panSpeed = 0.75
     // this.floorplanControls.maxDistance = 100
     // this.floorplanControls.minDistance = 3.5
-    // this.floorplanControls.maxZoom = 500
-    // this.floorplanControls.minZoom = 1
+    this.floorplanControls.maxZoom = 500;
+    this.floorplanControls.minZoom = 100;
 
     this.floorplanControls.enableRotate = false;
     this.raycaster = new THREE.Raycaster();
     this.onBindEvent();
     this.inited = true;
+
     console.log("this.floorplanControls", this.floorplanControls);
 
-    // const demoData = [
-    //   -0.005454589843750136, 5, -0.4604446894034718, -0.005454589843750136, 5,
-    //   -0.175, -0.02363647460937501, 5, -0.175, -0.02363647460937501, 5,
-    //   0.07500000000000001,
-    // ];
-    const demoData = [
-      0.48909057617188, 5, -0.5113538080557902, 0.48909057617188, 5,
-      -0.12500000000000006, 2.0018179931640683, 5, -0.12500000000000006,
-      2.0018179931640683, 5, -0.37500000000000006,
-    ];
-    const matLine = new LineMaterial({
-      color: 0x26559b,
+    this.matLine = new LineMaterial({
+      color: this.lineColor,
       linewidth: 3, // in world units with size attenuation, pixels otherwise
       dashed: false,
       alphaToCoverage: true,
     });
-    matLine.resolution = new THREE.Vector2(this.scene.width, this.scene.height);
-    const demoLine = new LinePoints(demoData, 2, matLine);
-    this.scene.scene.add(demoLine);
+    this.matLine.resolution = new THREE.Vector2(
+      this.scene.width,
+      this.scene.height
+    );
   };
 
   onPointerMove = (e) => {
@@ -115,30 +110,23 @@ export default class Player {
     // this.floorplanControls.enabled = false;
   };
   onPointerUp = (e) => {
-    console.log("last Line dir", this.drawLine);
-    // this.renderLines.push(this.drawLine);
-    const points = this.getPostionsFromDrawLine();
-    console.log("last Line-wPos", points);
-
+    // console.log("last Line-wPos", points);
     this.pointerup = convertScreenToNDC(e, this.scene.domElement);
     this.drawing = false;
     this.floorplanControls.enabled = true;
     this.startObj = null;
-  };
 
-  getPostionsFromDrawLine() {
-    if (!this.drawLine) {
-      return [];
-    }
-    let gp = this.drawLine.geometry.attributes.position;
-    let wPos = [];
-    for (let i = 0; i < gp.count; i++) {
-      let p = new THREE.Vector3().fromBufferAttribute(gp, i); // set p from `position`
-      this.drawLine.localToWorld(p); // p has wordl coords
-      wPos.push(p);
+    if (this.drawLine) {
+      const points = this.drawLine.userData.points;
+      const dir = this.drawLine.userData.dir;
+      const finishLine = new LinePoints(points, 0, this.matLine);
+      this.renderLines.push(points);
+      this.scene.scene.add(finishLine);
+      const imageId = this.touchImg.object.userData;
+      console.log("this.touchImg", dir, imageId, points);
     }
-    return wPos;
-  }
+  };
+
   Listener = {
     onPointerDown: this.onPointerDown.bind(this),
     onPointerMove: this.onPointerMove.bind(this),
@@ -186,10 +174,8 @@ export default class Player {
     e.unproject(this.orthCamera);
     s.y = 5;
     e.y = 5;
-
-    // console.log(s)
     const matLine = new LineMaterial({
-      color: 0x26559b,
+      color: this.lineColor,
       linewidth: 3, // in world units with size attenuation, pixels otherwise
       dashed: false,
       alphaToCoverage: true,

+ 3 - 2
src/request/urls.ts

@@ -100,6 +100,7 @@ export const deleteScene = "/web/scene/delete";
 /** ------------------------------------------ */
 
 // ---------example案件接口--------
+export const copyExample = "/fusion-xj/case/copyCase";
 export const exampleList = "/fusion-xj/case/list";
 export const setExample = "/fusion-xj/case/addOrUpdate";
 export const deleteExample = "/fusion-xj/case/delete";
@@ -168,7 +169,8 @@ export const fireDetail = "/fusion-xj/web/fireProject/getDetailWithoutAuth";
 // export const fireDetailByPsw = '/web/fireProject/getDetailWithoutAuth'
 
 // 获取火调详情
-export const fireDetailByPsw = "/fusion-xj/web/fireProject/getDetailWithoutAuth"; //wxAnonGetDetail
+export const fireDetailByPsw =
+  "/fusion-xj/web/fireProject/getDetailWithoutAuth"; //wxAnonGetDetail
 /** ------------------------------------------ */
 
 // case相关
@@ -191,7 +193,6 @@ export const caseExtractDetail = "/fusion-xj/caseExtractDetail/info";
 export const caseExtractDetailOpt = "/fusion-xj/caseExtractDetail/saveOrUpdate";
 export const caseExtractDetailExport = "/fusion-xj/caseExtractDetail/downDocx";
 
-
 // 火调链接地址设置密码
 export const setCasePsw = "/fusion-xj/web/fireProject/updateRandomCode";
 export const getCasePsw = "/fusion-xj/web/fireProject/getRandCode";

+ 14 - 9
src/store/case.ts

@@ -16,7 +16,8 @@ import {
   caseInquestExport,
   caseExtractDetail,
   caseExtractDetailOpt,
-  caseExtractDetailExport
+  caseExtractDetailExport,
+  copyExample,
 } from "@/request";
 import { ModelScene, QuoteScene, Scene, SceneType } from "./scene";
 import { CaseFile } from "./caseFile";
@@ -48,6 +49,8 @@ export const getCaseSharePWD = async (params: { caseId: number }) =>
 export const getCaseInfo = async (caseId: number) =>
   (await axios.get<Case>(caseInfo, { params: { caseId } })).data;
 
+export const copyCase = (caseId: number) => axios.post(copyExample, { caseId });
+
 export const updateCaseInfo = async (caseFile: CaseFile) =>
   await axios.post(updateCaseFile, {
     filesId: caseFile.filesId,
@@ -90,13 +93,12 @@ export const replaceCaseScenes = (caseId: number, caseScenes: CaseScenes) =>
   axios.post(repCaseScenes, { sceneNumParam: caseScenes, caseId });
 
 export const caseImgList = (caseId: number, orderBy: string | null) =>
-  axios.post(caseApiList, { orderBy: orderBy || '', caseId });
+  axios.post(caseApiList, { orderBy: orderBy || "", caseId });
 
 export const saveOrUpdate = (params: CaseImg) =>
   axios.post(saveApiOrUpdate, { ...params });
 
-export const caseDel = (id: number) =>
-  axios.post(caseApiDel, { id });
+export const caseDel = (id: number) => axios.post(caseApiDel, { id });
 
 export const caseUpdateSort = (list: [CaseImg]) =>
   axios.post(caseApiUpdateSort, { paramList: list });
@@ -104,20 +106,23 @@ export const caseUpdateSort = (list: [CaseImg]) =>
 export const getCaseInquestInfo = (caseId: number) =>
   axios.get(caseInquestInfo, { params: { caseId } });
 
-
 export const saveCaseInquestInfo = (caseId: number, data) =>
   axios.post(caseInquestOpt, { caseId, ...data });
 
 export const exportCaseInquestInfo = (caseId: number) =>
-  axios.get(caseInquestExport, { params: { caseId, ingoreRes: true }, responseType: 'blob' });
-
+  axios.get(caseInquestExport, {
+    params: { caseId, ingoreRes: true },
+    responseType: "blob",
+  });
 
 export const getCaseDetailInfo = (caseId: number) =>
   axios.get(caseExtractDetail, { params: { caseId } });
 
-
 export const saveCaseDetailInfo = (caseId: number, data) =>
   axios.post(caseExtractDetailOpt, { caseId, ...data });
 
 export const exportCaseDetailInfo = (caseId: number) =>
-  axios.get(caseExtractDetailExport, { params: { caseId, ingoreRes: true }, responseType: 'blob' });
+  axios.get(caseExtractDetailExport, {
+    params: { caseId, ingoreRes: true },
+    responseType: "blob",
+  });

+ 7 - 1
src/store/scene.ts

@@ -135,7 +135,13 @@ export const uploadModelScene = (
     url: uploadModel,
     data: { file },
     onUploadProgress(event: any) {
-      progressCallback(Math.round((event.loaded / event.total) * 100) || 0);
+      const p = Math.round((event.loaded / event.total) * 100);
+      console.log(p);
+      if (p === 100) {
+        progressCallback(0);
+      } else {
+        progressCallback(p || 0);
+      }
     },
   });
 

+ 22 - 1
src/view/camera/bind.vue

@@ -8,6 +8,16 @@
         @update:modelValue="(val: string) => (bindCamera.snCode = val.trim())"
       />
     </el-form-item>
+    <el-form-item label="相机类型:" class="mandatory">
+      <el-select v-model="bindCamera.cameraType" placeholder="请选择" style="width: 100%">
+        <el-option
+          v-for="item in cameraTypes"
+          :key="item"
+          :label="cameraTypeDesc[item]"
+          :value="item.toString()"
+        />
+      </el-select>
+    </el-form-item>
     <el-form-item label="所属架构:" class="mandatory">
       <com-company
         v-model="bindCamera.deptId"
@@ -32,7 +42,8 @@
 import comCompany from "@/components/company-select/index.vue";
 import { operateIsPermissionByPath } from "@/directive/permission";
 
-import { Camera, addCamera, editCamera } from "@/store/camera";
+import { Camera, CameraType, addCamera, editCamera } from "@/store/camera";
+import { cameraTypeDesc } from "@/constant/camera";
 import { UserInfo, getUsers } from "@/store/user";
 import { ref, watchEffect } from "vue";
 import { ElMessage } from "element-plus";
@@ -42,6 +53,13 @@ const props = defineProps<{ camera?: Camera }>();
 const bindCamera = ref<Camera>(
   (props.camera ? { ...props.camera } : { cameraSn: "", snCode: "" }) as Camera
 );
+
+const cameraTypes = [
+  CameraType.SWKK,
+  CameraType.SWKJ,
+  CameraType.SWSS1,
+  CameraType.SWSS2,
+];
 const users = ref<UserInfo[]>([]);
 watchEffect(async () => {
   if (bindCamera.value.deptId) {
@@ -64,6 +82,9 @@ defineExpose<QuiskExpose>({
     if (!bindCamera.value.snCode || !bindCamera.value.snCode.trim()) {
       ElMessage.error("SN码不能为空");
       throw "SN码不能为空";
+    } else if (!bindCamera.value.cameraType) {
+      ElMessage.error("请选择相机类型");
+      throw "请选择相机类型";
     } else if (!bindCamera.value.userId) {
       ElMessage.error("请选择管理员");
       throw "请选择管理员";

+ 10 - 8
src/view/case/editMenu.vue

@@ -8,12 +8,8 @@
     </span>
     <template #dropdown>
       <el-dropdown-menu>
-        <el-dropdown-item
-          v-for="menu in menus"
-          :key="menu.key"
-          @click="menu.onClick()"
-          :disabled="!operateIsPermissionByPath('edit', menu.key)"
-        >
+        <!-- :disabled="!operateIsPermissionByPath('edit', menu.key)" -->
+        <el-dropdown-item v-for="menu in menus" :key="menu.key" @click="menu.onClick()">
           {{ menu.label }}
         </el-dropdown-item>
       </el-dropdown-menu>
@@ -26,9 +22,8 @@ import { computed } from "vue";
 import { getFuseCodeLink, checkScenesOpen, MenuItem, getSWKKSyncLink } from "./help";
 import { showCaseScenes, addCaseScenes, shareCase } from "./quisk";
 import { RouteName, router } from "@/router";
-import { getCaseSceneList } from "@/store/case";
+import { copyCase, getCaseSceneList } from "@/store/case";
 import { alert } from "@/helper/message";
-import { operateIsPermissionByPath } from "@/directive/permission";
 
 const props = defineProps<{
   caseId: number;
@@ -101,6 +96,13 @@ const menus = computed(() => {
         }
       },
     },
+    {
+      key: "fj",
+      label: "分镜配置",
+      onClick: async () => {
+        window.open(`mirror.html?caseId=${caseId}`);
+      },
+    },
     ...(props.lastMenu || []).map((item) => ({
       ...item,
       onClick: () => item.onClick(caseId),

+ 6 - 2
src/view/case/photos/index.vue

@@ -100,8 +100,12 @@ const changeList = (list) => {
   newlist.value = newList;
   const arr = []
   newList.map(i => arr.push(JSON.parse(JSON.stringify(i))))
-  if (scene) scene.load(arr)
-  console.log("changeList", arr);
+  const type = sortType.value ? 2 : 1
+  if (scene) {
+    scene.load(arr, type)
+    console.log("changeList", arr, type);
+  }
+
 };
 const renderCanvas = () => {
   const canvas = document.getElementById('canvas')

+ 1 - 1
src/view/setting/index.vue

@@ -4,7 +4,7 @@
   <div class="body-layer" style="padding: 24px" v-loading="loading">
     <el-form :model="form" label-width="auto" style="max-width: 600px">
       <el-form-item label="系统标题">
-        <el-input v-model="form.name" />
+        <el-input v-model="form.name" placeholder="请输入系统标题" />
       </el-form-item>
       <el-form-item label="系统主题色">
         <el-radio-group v-model="form.color">

+ 1 - 1
src/view/vrmodel/modelContent.vue

@@ -5,7 +5,7 @@
     <el-tooltip
       class="item"
       effect="dark"
-      :content="`请上传${format}(支持obj/ply/las/osgb/b3dm格式的数据),大小在${size}以内 `"
+      :content="`请上传${format}(支持obj/ply/las/laz/osgb/b3dm格式的数据),大小在${size}以内 `"
       placement="bottom-start"
       ><el-upload
         class="upload-demo"

+ 1 - 1
vite.config.ts

@@ -90,7 +90,7 @@ export default defineConfig({
           ? "https://uat-laser.4dkankan.com/uat"
           : "https://laser.4dkankan.com",
         changeOrigin: true,
-        rewrite: (path) => path.replace(new RegExp(`^/swss`), ""),
+        rewrite: (path) => path.replace(new RegExp(`^/fdkk`), "/fdkk"),
       },
     },
   },

File diff suppressed because it is too large
+ 700 - 13
yarn.lock