瀏覽代碼

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

gemercheung 1 年之前
父節點
當前提交
e12a93f7e3

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" fixed="right">
         <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" }
   );

+ 190 - 31
src/app/mirror/App.vue

@@ -1,55 +1,129 @@
 <template>
   <div class="mirror-setting">
-
+    <!-- 图片预览 -->
+    <el-dialog v-model="dialogVisible">
+      <img style="width: 100%" w-full :src="dialogImageUrl" alt="Preview Image" />
+    </el-dialog>
     <!-- 分镜配置 -->
     <div class="project-title">
-      <el-input class="title" type="textarea" :autosize="{ minRows: 1, maxRows: 4 }" v-model="project.title" />
+      <el-input
+        class="title"
+        type="textarea"
+        :autosize="{ minRows: 1, maxRows: 4 }"
+        v-model="project.title"
+      />
+      <el-button type="primary" @click="saveProject">保存</el-button>
     </div>
     <div class="content">
-      <el-table class="main-table" key="id" border v-dragable="dragOptions" :data="data" header-row-class-name="t-head"
-        header-cell-class-name="t-cell">
+      <el-table
+        class="main-table"
+        key="id"
+        border
+        v-dragable="dragOptions"
+        :data="data"
+        header-row-class-name="t-head"
+        header-cell-class-name="t-cell"
+      >
         <!-- <template v-for="item in columns" :key="item.prop">
           <el-table-column  :prop="item.prop" :label="item.label" />
           大纲
-        </template> -->
+        </template> 
+        :on-preview="handlePictureCardPreview" :on-remove="handleRemove"
+        -->
         <el-table-column prop="name" label="大纲">
           <template v-slot="{ row }">
-            <el-input type="textarea" :autosize="{ minRows: 3 }" v-model="row.name" :row="3" placeholder="概括拍摄内容" />
+            <el-input
+              type="textarea"
+              :autosize="{ minRows: 3 }"
+              v-model="row.name"
+              :row="3"
+              placeholder="概括拍摄内容"
+            />
           </template>
         </el-table-column>
 
         <el-table-column prop="desc" label="分镜描述">
           <template v-slot="{ row }">
-            <el-input class="gray" type="textarea" :autosize="{ minRows: 3 }" v-model="row.desc" :row="3"
-              placeholder="详细描述分镜" />
+            <el-input
+              class="gray"
+              type="textarea"
+              :autosize="{ minRows: 3 }"
+              v-model="row.desc"
+              :row="3"
+              placeholder="详细描述分镜"
+            />
           </template>
         </el-table-column>
         <!-- show-overflow-tooltip -->
         <el-table-column prop="clip" label="已拍摄片段">
           <template v-slot="{ row }">
-            <el-input class="gray" type="textarea" :autosize="{ minRows: 3 }" v-model="row.clip" placeholder="详细描述分镜" />
+            <el-upload
+              ref="upload"
+              v-model:file-list="row.fileList"
+              class="list-upload-style"
+              :class="{ activefileList: row.fileList && row.fileList.length == 1 }"
+              list-type="picture-card"
+              :action="uploadFileUrl"
+              :on-success="handleUploadSuccess"
+              :limit="1"
+            >
+              <div class="uploadImg" v-if="row.fileList && row.fileList.length == 0">
+                  <el-icon><Plus /></el-icon>
+              </div>
+              <template #file="{ file }">
+                <div style="width: 100%">
+                  <img
+                    class="el-upload-list__item-thumbnail"
+                    :src="file.url"
+                    alt=""
+                  />
+                  <span class="el-upload-list__item-actions">
+                    <span
+                      class="el-upload-list__item-preview"
+                      @click="handlePictureCardPreview(file)"
+                    >
+                      <el-icon><zoom-in /></el-icon>
+                    </span>
+                    <span
+                      class="el-upload-list__item-delete"
+                      @click="handleRemove(row)"
+                    >
+                      <el-icon><Delete /></el-icon>
+                    </span>
+                  </span>
+                </div>
+              </template>
+            </el-upload>
           </template>
         </el-table-column>
 
         <el-table-column prop="words" label="台词文案">
           <template v-slot="{ row }">
-            <el-input class="gray" type="textarea" :autosize="{ minRows: 3 }" v-model="row.words"
-              placeholder="点击输入台词" />
+            <el-input
+              class="gray"
+              type="textarea"
+              :autosize="{ minRows: 3 }"
+              v-model="row.words"
+              placeholder="点击输入台词"
+            />
           </template>
         </el-table-column>
 
         <el-table-column prop="marks" label="备注">
           <template v-slot="{ row }">
-            <el-input class="gray" type="textarea" :autosize="{ minRows: 3 }" v-model="row.marks"
-              placeholder="点击输入内容" />
+            <el-input
+              class="gray"
+              type="textarea"
+              :autosize="{ minRows: 3 }"
+              v-model="row.marks"
+              placeholder="点击输入内容"
+            />
           </template>
         </el-table-column>
       </el-table>
-
     </div>
     <div class="add-handle">
-
-      <el-button type="primary">
+      <el-button type="primary" @click="handleAdd">
         <el-icon class="el-icon--right">
           <Plus />
         </el-icon>
@@ -65,13 +139,21 @@
 <script lang="ts" setup>
 import { vDragable } from "./dragable";
 import { ElMessage } from "element-plus";
-import { reactive, ref } from "vue";
+import { reactive, ref, onMounted } from "vue";
+import type { UploadFile } from "element-plus";
+import { uploadFile as uploadFileUrl } from "@/request";
+import { getCaseScriptInfo, CaseScriptSaveOrUpdate } from "@/app/mirror/store/script";
 
+const caseId = ref(null);
 const project = reactive({
-  title: "我的脚本"
-})
-const addLine = ref(3);
+  title: "我的脚本",
+});
+const dialogImageUrl = ref("");
+const dialogVisible = ref(false);
+const disabled = ref(false);
 
+const addLine = ref(1);
+const active = ref(0);
 const dragOptions = [
   {
     selector: "thead tr", // add drag support for column
@@ -114,15 +196,62 @@ const columns = ref([
 ]);
 
 const data = reactive([
-  { id: 1, name: "", desc: "" },
-  { id: 2, name: "", desc: "" },
-  { id: 3, name: "", desc: "" },
-
+  { id: 1, name: "", desc: "", fileList:[] },
+  { id: 2, name: "", desc: "", fileList:[] },
+  { id: 3, name: "", desc: "", fileList:[] },
 ]);
+onMounted(()=> {
+  caseId.value = GetRequest('caseId');
+  getCaseScriptInfo(caseId.value).then((res) => {
+    console.log('getCaseScriptInfo', res)  //query传参
+  })
+  console.log('caseId', caseId)  //query传参
+})
+function handleAdd() {
+  for(var i = 1; i <= addLine.value; i++) {
+    console.log(i);
+    data.push({ id: data.length + 1, name: "", desc: "", fileList:[] });
+  }
+}
+const handleRemove = (data) => {
+  data.fileList = []
+};
+
+const handlePictureCardPreview = (file: UploadFile) => {
+  dialogImageUrl.value = file.url!;
+  dialogVisible.value = true;
+};
+
+const saveProject = () => {
+  CaseScriptSaveOrUpdate({
+    caseId: caseId.value, 
+    name: project.title,
+    content: data,
+  }).then((res) => {
+    console.log('saveProject');
+  })
+};
+function handleUploadSuccess(response: any, uploadFile: UploadFile ) {
+  uploadFile.url = response.data;
+  console.log(response, uploadFile);
+}
 
+function GetRequest(value) {
+    var url = decodeURI(window.location.search); //?id="123456"&name="www";
+    var object = {};
+    if (url.indexOf("?") != -1)//url中存在问号,也就说有参数。  
+    {
+      var str = url.substr(1);  //得到?后面的字符串
+      var strs = str.split("&");  //将得到的参数分隔成数组[id="123456",name="www"];
+      for (var i = 0; i < strs.length; i++) {
+        object[strs[i].split("=")[0]] = strs[i].split("=")[1];//得到{id:'123456',name:'www'}
+      }
+    }
+    return object[value];
+  }
 </script>
 
-<style>
+<style lang="scss">
 body,
 #app {
   margin: 0;
@@ -142,7 +271,6 @@ body,
   margin: 0 auto;
   display: flex;
   padding: 0 40px;
-
 }
 
 .t-head {
@@ -164,6 +292,7 @@ tbody {
 .project-title {
   display: flex;
   padding: 0 40px;
+  align-items: center;
   /* justify-content: center; */
 }
 
@@ -187,18 +316,17 @@ tbody {
 }
 
 .el-textarea__inner:focus {
-  box-shadow: none
+  box-shadow: none;
 }
 
 .el-textarea__inner:hover {
-  box-shadow: none
+  box-shadow: none;
 }
 
 .add-handle {
   padding: 30px 0;
   display: flex;
   justify-content: center;
-
 }
 
 .add-line {
@@ -208,11 +336,42 @@ tbody {
 
 .add-line .el-input__wrapper {
   box-shadow: none;
-  background: rgba(23, 41, 46, .2);
+  background: rgba(23, 41, 46, 0.2);
 }
 
 .add-line input {
   color: white;
-  text-align: center
+  text-align: center;
+}
+.activefileList{
+  .el-upload-list--picture-card{
+
+
+  }
+  .el-upload--picture-card{
+    display: none;
+  }
+}
+.list-upload-style {
+  width: 100%;
+  text-align: center;
+  .el-upload-list, .el-upload--text {
+    width: 100%;
+  }
+  .el-upload-list__item-thumbnail, .el-upload--picture-card{
+    min-height: 73px;
+    height: 73px;
+    width: 100%;
+  }
+  .uploadImg, .el-upload-list__item {
+    width: 100%;
+    min-height: 73px;
+    height: 73px;
+    line-height: 73px;
+    .el-upload-list__item-thumbnail{
+      width: 100%;
+      object-fit: cover;
+    }
+  }
 }
 </style>

+ 1 - 1
src/app/mirror/main.ts

@@ -3,7 +3,7 @@ import "element-plus/dist/index.css";
 import * as ElementPlusIconsVue from "@element-plus/icons-vue";
 import App from "./App.vue";
 import ElementPlus from "element-plus";
-
+import "@/store/user";
 const app = createApp(App);
 
 for (const [key, component] of Object.entries(ElementPlusIconsVue)) {

+ 65 - 0
src/app/mirror/store/script.ts

@@ -0,0 +1,65 @@
+import { UN_REQ_NUM } from "@/constant/sys";
+import {
+  getCaseScriptSaveOrUpdateUrl,
+  getCaseScriptInfoUrl,
+  axios,
+} from "@/request";
+
+export enum FireStatus {
+  all = UN_REQ_NUM,
+  incomplete = 0,
+  complete = 1,
+}
+
+export type Fire = {
+  accidentDate: string;
+  createTime: string;
+  creatorDeptId: string;
+  caseId: number;
+  mapShow: boolean;
+  creatorId: string;
+  creatorName: string;
+  deptId: string;
+  editTime: string;
+  editorId: string;
+  editorName: string;
+  fireReason: string;
+  id: string;
+  isTeached: number;
+  organizerDeptName: string;
+  organizerUsers: string;
+  projectAddress: string;
+  latAndLong: string;
+  latlng: string;
+  projectName: string;
+  projectSite: string;
+  projectSiteCode: string;
+  projectSn: string;
+  status: FireStatus;
+  statusDesc: string;
+  updateTime: string;
+  isDelete?: number;
+
+  field1: string;
+  field2: string;
+  field3: string;
+  field4: string;
+
+  field5: string;
+  field6: string;
+  field7: string;
+  field8: string;
+  field9: string;
+  field10: string;
+};
+
+export enum FirePaggingRoute {
+  fire = 1,
+  teached = 2,
+}
+
+export const getCaseScriptInfo = async (caseId) =>
+  (await axios.get(getCaseScriptInfoUrl, { params:{caseId, ingoreRes: true} }));
+
+export const CaseScriptSaveOrUpdate = async (fire: Omit<Fire, "id">) =>
+  axios.post(getCaseScriptSaveOrUpdateUrl, fire, {params: {ingoreRes: true}});

+ 1 - 0
src/constant/scene.ts

@@ -51,6 +51,7 @@ export const ModelSceneStatusDesc: { [key in ModelSceneStatus]: string } = {
   [ModelSceneStatus.CANCEL]: "已取消",
   [ModelSceneStatus.ERR]: "上传失败",
   [ModelSceneStatus.RUN]: "上传中",
+  [ModelSceneStatus.REV]: "转换中",
   [ModelSceneStatus.SUCCESS]: "成功",
 };
 

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

@@ -1,5 +1,5 @@
 import * as THREE from "three";
-import HorizontalBox from "./horizontalBox";
+import HorizontalBox from "./HorizontalBox";
 import VerticalBox from "./VerticalBox";
 import SimpleLabel from "./object/SimpleLabel";
 

+ 2 - 0
src/request/config.ts

@@ -23,6 +23,8 @@ import {
   uploadModel,
   userLogin,
   userReg,
+  getCaseScriptInfoUrl,
+  getCaseScriptSaveOrUpdateUrl,
 } from "./urls";
 
 // 不需要登录就能请求的接口

+ 8 - 5
src/request/index.ts

@@ -45,14 +45,17 @@ axios.interceptors.request.use(async (config) => {
   }
 
   const { token, userId } = getAuth();
-  if (!token && !~notLoginUrls.indexOf(config.url)) {
-    router.replace({ name: RouteName.login });
-    throw "用户未登录";
-  }
-
   config.headers.token = token;
   config.headers.userid = userId;
 
+  const hasIgnore = config.params ? "ingoreRes" in config.params : false;
+  if (!hasIgnore) {
+    if (!token && !~notLoginUrls.indexOf(config.url)) {
+      router.replace({ name: RouteName.login });
+      throw "用户未登录";
+    }
+  }
+
   if (~GetUrls.indexOf(config.url)) {
     config.method = "GET";
   } else if (~PostUrls.indexOf(config.url)) {

+ 6 - 1
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相关
@@ -240,3 +242,6 @@ export const caseApiUpdateSort = "/fusion-xj/caseImg/updateSort";
 
 export const getSysSetting = `/fusion-xj/systemSetting/info`;
 export const updateSysSetting = `/fusion-xj/systemSetting/save`;
+// 脚本管理
+export const getCaseScriptInfoUrl = `/fusion-xj/caseScript/info`;
+export const getCaseScriptSaveOrUpdateUrl = `/fusion-xj/caseScript/saveOrUpdate`;

+ 13 - 8
src/store/case.ts

@@ -17,6 +17,7 @@ import {
   caseExtractDetail,
   caseExtractDetailOpt,
   caseExtractDetailExport,
+  copyExample,
   saveCaseImgTag
 } from "@/request";
 import { ModelScene, QuoteScene, Scene, SceneType } from "./scene";
@@ -49,6 +50,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,
@@ -91,13 +94,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 });
@@ -105,23 +107,26 @@ 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",
+  });
 
 // 
 

+ 11 - 2
src/store/scene.ts

@@ -91,6 +91,7 @@ export enum SceneType {
 export enum ModelSceneStatus {
   ERR = -1,
   RUN = 0,
+  REV = 2,
   SUCCESS = 1,
   CANCEL = -2,
 }
@@ -135,7 +136,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);
+      }
     },
   });
 
@@ -170,7 +177,7 @@ type ScenePaggingParams = PaggingReq<
   }
 >;
 export const getScenePagging = async (params: ScenePaggingParams) => {
-  return (
+  const data = (
     await axios.get(
       params.type === SceneType.SWMX ? getModelSceneList : getSceneList,
       {
@@ -178,6 +185,8 @@ export const getScenePagging = async (params: ScenePaggingParams) => {
       }
     )
   ).data as PaggingRes<Scene>;
+
+  return data;
 };
 
 export const delQuoteScene = (scene: QuoteScene) =>

+ 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),

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

@@ -173,7 +173,7 @@ onMounted(refresh);
         font-size: 14px;
         padding-right: 8px;
         .butList {
-          width: 140px;
+          width: 200px;
           a {
             margin: 0 8px;
           }

+ 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">

+ 22 - 34
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"
@@ -44,44 +44,32 @@
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
     <el-table-column label="操作" v-slot:default="{ row }" width="350px">
+      <template v-if="row.createStatus === ModelSceneStatus.SUCCESS">
+        <span class="oper-span" @click="downOrigin(row)" v-if="row.fileNewName">
+          下载原始资源
+        </span>
+        <span class="oper-span" @click="downHash(row)"> Hash </span>
+        <span class="oper-span" @click="copyHanlder(row)"> 复制 </span>
+        <span class="oper-span" v-pdpath="['edit']" @click="editHanlder(row)">
+          修改
+        </span>
+        <span
+          class="oper-span"
+          v-pdpath="['view']"
+          @click="openSceneUrl(row, OpenType.query)"
+        >
+          查看
+        </span>
+      </template>
       <span
+        v-else-if="row.createStatus === ModelSceneStatus.REV"
         class="oper-span"
-        @click="downOrigin(row)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS && row.fileNewName"
+        v-pdpath="['viewaaa']"
       >
-        下载原始资源
-      </span>
-      <span
-        class="oper-span"
-        @click="downHash(row)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
-      >
-        Hash
-      </span>
-      <span
-        class="oper-span"
-        @click="copyHanlder(row)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
-      >
-        复制
-      </span>
-      <span
-        class="oper-span"
-        v-pdpath="['edit']"
-        @click="editHanlder(row)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
-      >
-        修改
-      </span>
-      <span
-        class="oper-span"
-        v-pdpath="['view']"
-        @click="openSceneUrl(row, OpenType.query)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
-      >
-        查看
+        模型转换中…
       </span>
       <span
+        v-else
         class="oper-span delBtn"
         v-pdscene="row"
         @click="delOrCancel(row)"

+ 2 - 1
vite.config.ts

@@ -20,6 +20,7 @@ export default defineConfig({
       input: {
         index: resolve(__dirname, "index.html"),
         map: resolve(__dirname, "map.html"),
+        mirror: resolve(__dirname, "mirror.html"),
         // 在这里继续添加更多页面
       },
     },
@@ -90,7 +91,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
+ 723 - 36
yarn.lock