bill hace 1 año
padre
commit
84cd69a462

+ 13 - 4
src/store/caseFile.ts

@@ -55,10 +55,19 @@ export const delCaseFile = (props: Pick<CaseFile, "caseId" | "filesId">) =>
   axios.post(deleteCaseFile, props);
 
 export const getCaseFileImageInfo = async (fileId: number) => {
-  const data = (await axios.get(caseFileInfo, { params: { filesId: fileId } }))
-    .data;
-  data.content = JSON.parse(data.content);
-  return data as CaseFile;
+  const data = (
+    await axios.get<CaseFile | null>(caseFileInfo, {
+      params: { filesId: fileId },
+    })
+  ).data;
+
+  return (
+    data &&
+    ({
+      ...data,
+      content: JSON.parse(data.content as any),
+    } as CaseFile)
+  );
 };
 
 export type SaveCaseFileImageInfo = Pick<CaseFile, "caseId" | "filesTitle"> & {

+ 6 - 4
src/store/scene.ts

@@ -110,13 +110,15 @@ type ScenePaggingParams = PaggingReq<
     modelTitle: string;
     sceneName: string;
     status?: number;
+    caseId?: number;
+    deptId: string;
+    snCode: string;
   }
 >;
 export const getScenePagging = async (params: ScenePaggingParams) => {
   return (
-    await axios.get(
-      params.type === SceneType.SWMX ? getModelSceneList : getSceneList,
-      { params }
-    )
+    await axios.get(params.type === SceneType.SWMX ? getModelSceneList : getSceneList, {
+      params,
+    })
   ).data as PaggingRes<Scene>;
 };

+ 36 - 65
src/view/case/addScenes.vue

@@ -1,41 +1,39 @@
 <template>
-  <VRModel>
-    <template v-slot:content="{ pagging }: { pagging: ScenePagging }">
-      <div :style="{ display: 'none' }">{{ syncTableSelects(pagging) }}</div>
+  <VRModelList :params="params">
+    <template v-slot:header>
+      <el-form-item label="标题:" style="grid-area: 1 / 1 / 2 / 4">
+        <el-input v-model="params.keyword" placeholder="请输入" />
+      </el-form-item>
+    </template>
+    <template v-slot:content>
       <el-table
-        :data="pagging.state.table.rows"
+        :data="params.pagging.state.table.rows"
         tooltip-effect="dark"
         ref="tableRef"
         style="width: 100%"
         size="large"
-        @selection-change="
-          (val) =>
-            changeSelection(val, pagging.state.table.rows, pagging.state.query.type)
-        "
+        @selection-change="changeSelection"
       >
         <el-table-column type="selection" width="50" />
         <el-table-column label="标题" v-slot:default="{ row }">
-          {{ pagging.state.query.type === SceneType.SWMX ? row.modelTitle : row.name }}
+          {{ params.isSwmx ? row.modelTitle : row.name }}
         </el-table-column>
-        <el-table-column
-          label="原始数据格式"
-          prop="modelDateType"
-          v-if="pagging.state.query.type === SceneType.SWMX"
-        />
+        <el-table-column label="所属架构" prop="deptName"></el-table-column>
+        <el-table-column label="原始数据格式" prop="modelDateType" v-if="params.isSwmx" />
         <el-table-column label="拍摄时间" prop="createTime" v-slot:default="{ row }">
           {{ row.createTime.substr(0, 16) }}
         </el-table-column>
       </el-table>
     </template>
-  </VRModel>
+  </VRModelList>
 </template>
 
 <script setup lang="ts">
-import VRModel from "@/view/vrmodel/index.vue";
-import { Scene, SceneType } from "@/store/scene";
+import VRModelList from "@/view/vrmodel/list.vue";
+import { Scene } from "@/store/scene";
 import { CaseScenes } from "@/store/case";
-import { ScenePagging } from "@/view/vrmodel/pagging";
-import { Ref, onMounted, onUnmounted, ref, watchEffect } from "vue";
+import { useScenePaggingParams } from "@/view/vrmodel/pagging";
+import { onMounted, ref, watchEffect } from "vue";
 import {
   getCaseSceneList,
   getCaseScenes,
@@ -46,50 +44,28 @@ import { QuiskExpose } from "@/helper/mount";
 import { ElTable } from "element-plus";
 
 const props = defineProps<{ caseId: number }>();
-
+const params = useScenePaggingParams();
 const caseScenes = ref<CaseScenes>(getCaseScenes([]));
 const tableRef = ref<InstanceType<typeof ElTable>>();
-let paggingLoading: Ref<boolean>;
-// 同步table选择
-let stopSyncWatch: () => void;
-const syncTableSelects = (pagging: ScenePagging) => {
-  stopSyncWatch && stopSyncWatch();
 
-  const stopParamWatch = watchEffect(
-    () => {
-      console.log(pagging.state.query.status);
-      pagging.state.query.status = 2;
-    },
-    { flush: "sync" }
-  );
-  const stopSyncSelect = watchEffect(
-    () => {
-      paggingLoading = pagging.loading;
-      if (paggingLoading.value) {
-        return;
-      }
-      const selectKeys = caseScenes.value.find(
-        (item) => item.type === pagging.state.query.type
-      )!.numList;
-      pagging.state.table.rows.forEach((scene) => {
-        tableRef.value?.toggleRowSelection(
-          scene,
-          selectKeys.includes(getSceneKey(scene))
-        );
-      });
-    },
-    { flush: "post" }
-  );
+params.pagging.state.query.status = 2;
+params.pagging.state.query.caseId = props.caseId;
+// 复选框同步
+watchEffect(() => {
+  if (!tableRef.value) return;
+  const selectKeys = caseScenes.value.find(
+    (item) => item.type === params.pagging.state.query.type
+  )!.numList;
 
-  stopSyncWatch = () => {
-    stopSyncSelect();
-    stopParamWatch();
-  };
-};
-const changeSelection = (selectScenes: Scene[], pagScenes: Scene[], type: SceneType) => {
-  if (paggingLoading.value) {
-    return;
-  }
+  params.pagging.state.table.rows.forEach((scene) => {
+    tableRef.value!.toggleRowSelection(scene, selectKeys.includes(getSceneKey(scene)));
+  });
+});
+
+const changeSelection = (selectScenes: Scene[]) => {
+  if (params.pagging.loading) return;
+  const pagScenes = params.pagging.state.table.rows;
+  const type = params.pagging.state.query.type;
   const typeCaseScenes = caseScenes.value.find((item) => item.type === type)!;
   const oldKeys = caseScenes.value.find((item) => item.type === type)!.numList;
   const selectKeys = selectScenes.map(getSceneKey);
@@ -105,13 +81,8 @@ const changeSelection = (selectScenes: Scene[], pagScenes: Scene[], type: SceneT
 onMounted(async () => {
   caseScenes.value = getCaseScenes(await getCaseSceneList(props.caseId));
 });
-onUnmounted(() => {
-  stopSyncWatch();
-});
 
 defineExpose<QuiskExpose>({
-  async submit() {
-    await replaceCaseScenes(props.caseId, caseScenes.value);
-  },
+  submit: () => replaceCaseScenes(props.caseId, caseScenes.value),
 });
 </script>

+ 8 - 3
src/view/case/caseFile.vue

@@ -138,9 +138,14 @@ const gotoDraw = (type: BoardType, id: number) => {
 onMounted(async () => {
   types.value = await getCaseFileTypes();
   currentTypeId.value = types.value[0].filesTypeId;
-
-  title.value = (await getCaseInfo(caseId.value!)).caseTitle + " | 卷宗管理";
-  desc.value = "";
+  const caseInfo = await getCaseInfo(caseId.value!);
+  if (caseInfo) {
+    title.value = (await getCaseInfo(caseId.value!)).caseTitle + " | 卷宗管理";
+    desc.value = "";
+  } else {
+    console.error("该案件不存在!");
+    router.replace({ name: RouteName.vrmodel });
+  }
 });
 
 onUnmounted(() => {

+ 23 - 11
src/view/case/draw/board/useBoard.ts

@@ -5,6 +5,8 @@ import { Board } from "./";
 import { Ref, ref, watch, watchEffect } from "vue";
 import { BoardType } from "@/store/caseFile";
 import { BoardTypeDesc } from "@/constant/caseFile";
+import { RouteName, router } from "@/router";
+import { ElMessage } from "element-plus";
 
 const defaultStore = {
   id: -1,
@@ -56,15 +58,26 @@ const getStore = async (caseId: number, fileId: number, type: BoardType) => {
   let data: BoardData;
   if (fileId === -1) {
     const info = await getCaseInfo(caseId);
-    defaultStore.floors[0].title.value =
-      info.caseTitle + "案发" + BoardTypeDesc[type];
-    data = { ...defaultStore };
+    if (info) {
+      defaultStore.floors[0].title.value =
+        info.caseTitle + "案发" + BoardTypeDesc[type];
+      data = { ...defaultStore };
+    } else {
+      router.replace({ name: RouteName.vrmodel });
+      throw "案件不存在";
+    }
   } else {
     const fileInfo = await getCaseFileImageInfo(fileId);
-    data = {
-      ...fileInfo.content,
-      id: fileInfo.filesId,
-    };
+    if (fileInfo) {
+      console.log(fileInfo);
+      data = {
+        ...fileInfo.content,
+        id: fileInfo.filesId,
+      };
+    } else {
+      router.replace({ name: RouteName.caseFile, params: { caseId } });
+      throw "该图不存在!";
+    }
   }
   return data;
 };
@@ -96,16 +109,15 @@ export const useBoard = (props: Ref<BoardProps | null>) => {
       return;
     }
 
-    onCleanup(() => {
-      boardRaw && boardRaw.destroy();
-    });
-
     const store = await getStore(
       props.value.caseId,
       props.value.fileId,
       props.value.type
     );
     const boardRaw = (board.value = await boardFactory(store, props.value.dom));
+    onCleanup(() => {
+      boardRaw && boardRaw.destroy();
+    });
   });
 
   watchEffect(

+ 1 - 0
src/view/case/sceneList.vue

@@ -13,6 +13,7 @@
     <el-table-column label="拍摄/创建时间" prop="createTime" v-slot:default="{ row }">
       {{ row.createTime.substr(0, 16) }}
     </el-table-column>
+    <el-table-column label="所属架构" prop="deptName"></el-table-column>
     <el-table-column label="操作" v-slot:default="{ row }: { row: Scene }">
       <span
         class="oper-span"

+ 22 - 37
src/view/vrmodel/index.vue

@@ -1,48 +1,33 @@
 <template>
-  <com-head :options="headOptions" v-model="pagging.state.query.type">
-    <el-form label-width="84px" inline>
-      <el-form-item label="标题:" style="grid-area: 1 / 1 / 2 / 4">
-        <el-input v-model="keyword" placeholder="请输入"></el-input>
+  <List :params="params">
+    <template v-slot:header>
+      <el-form-item label="所属架构:">
+        <com-select v-model="params.pagging.state.query.deptId" />
       </el-form-item>
-      <el-form-item class="searh-btns" style="grid-area: 1 / 4 / 2 / 6">
-        <el-button type="primary" @click="pagging.refresh">查询</el-button>
-        <el-button type="primary" plain @click="pagging.queryReset">重置</el-button>
+      <el-form-item label="sn码:" v-if="!params.isSwmx">
+        <el-input
+          v-model="params.pagging.state.query.snCode"
+          placeholder="请输入"
+        ></el-input>
       </el-form-item>
-    </el-form>
-  </com-head>
-
-  <div class="body-layer">
-    <component :is="component" :pagging="pagging" v-if="!$slots.content" />
-    <slot v-else name="content" :pagging="pagging" />
-    <com-pagination
-      @size-change="pagging.changPageSize"
-      @current-change="pagging.changPageCurrent"
-      :current-page="pagging.state.pag.currentPage"
-      :page-size="pagging.state.pag.size"
-      :total="pagging.state.pag.total"
-    />
-  </div>
+      <el-form-item label="标题:">
+        <el-input v-model="params.keyword" placeholder="请输入"></el-input>
+      </el-form-item>
+    </template>
+    <template v-slot:content>
+      <component :is="component" :pagging="params.pagging" />
+    </template>
+  </List>
 </template>
 
 <script setup lang="ts">
-import comHead from "@/components/head/index.vue";
-import comPagination from "@/components/pagination/index.vue";
+import comSelect from "@/components/company-select/index.vue";
+import List from "./list.vue";
 import SceneContent from "./sceneContent.vue";
 import ModelContent from "./modelContent.vue";
-import { SceneType } from "@/store/scene";
-import { SceneTypeDesc } from "@/constant/scene";
-import { useScenePagging } from "./pagging";
+import { useScenePaggingParams } from "./pagging";
 import { computed } from "vue";
 
-const { pagging, keyword, isSwmx } = useScenePagging();
-
-const headOptions = [
-  { value: SceneType.SWKK, name: SceneTypeDesc[SceneType.SWKK] },
-  { value: SceneType.SWKJ, name: SceneTypeDesc[SceneType.SWKJ] },
-  { value: SceneType.SWSS, name: SceneTypeDesc[SceneType.SWSS] },
-  { value: SceneType.SWSSMX, name: SceneTypeDesc[SceneType.SWSSMX] },
-  { value: SceneType.SWMX, name: SceneTypeDesc[SceneType.SWMX] },
-];
-
-const component = computed(() => (isSwmx.value ? ModelContent : SceneContent));
+const params = useScenePaggingParams();
+const component = computed(() => (params.isSwmx ? ModelContent : SceneContent));
 </script>

+ 42 - 0
src/view/vrmodel/list.vue

@@ -0,0 +1,42 @@
+<template>
+  <com-head :options="headOptions" v-model="params.pagging.state.query.type">
+    <el-form label-width="84px" inline>
+      <slot name="header" />
+      <el-form-item class="searh-btns" style="grid-area: 1 / 4 / 2 / 4">
+        <el-button type="primary" @click="params.pagging.refresh">查询</el-button>
+        <el-button type="primary" plain @click="params.pagging.queryReset"
+          >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </com-head>
+
+  <div class="body-layer">
+    <slot name="content" />
+    <com-pagination
+      @size-change="params.pagging.changPageSize"
+      @current-change="params.pagging.changPageCurrent"
+      :current-page="params.pagging.state.pag.currentPage"
+      :page-size="params.pagging.state.pag.size"
+      :total="params.pagging.state.pag.total"
+    />
+  </div>
+</template>
+
+<script setup lang="ts">
+import comHead from "@/components/head/index.vue";
+import comPagination from "@/components/pagination/index.vue";
+import { SceneType } from "@/store/scene";
+import { SceneTypeDesc } from "@/constant/scene";
+import { useScenePaggingParams } from "./pagging";
+
+defineProps<{ params: ReturnType<typeof useScenePaggingParams> }>();
+
+const headOptions = [
+  { value: SceneType.SWKK, name: SceneTypeDesc[SceneType.SWKK] },
+  { value: SceneType.SWKJ, name: SceneTypeDesc[SceneType.SWKJ] },
+  { value: SceneType.SWSS, name: SceneTypeDesc[SceneType.SWSS] },
+  { value: SceneType.SWSSMX, name: SceneTypeDesc[SceneType.SWSSMX] },
+  { value: SceneType.SWMX, name: SceneTypeDesc[SceneType.SWMX] },
+];
+</script>

+ 16 - 4
src/view/vrmodel/pagging.ts

@@ -1,14 +1,16 @@
 import { usePagging } from "@/hook/pagging";
 import { SceneType, getScenePagging } from "@/store/scene";
-import { computed, watch, watchEffect } from "vue";
+import { computed, reactive, watch, watchEffect } from "vue";
 
-export const useScenePagging = () => {
+export const useScenePaggingParams = () => {
   const pagging = usePagging({
     get: getScenePagging,
     paramsTemlate: {
       type: SceneType.SWKK,
       sceneName: "",
       modelTitle: "",
+      deptId: "",
+      snCode: "",
     },
   });
 
@@ -24,6 +26,16 @@ export const useScenePagging = () => {
     },
   });
 
+  let oldSnCode = pagging.state.query.snCode;
+  watchEffect(() => {
+    if (isSwmx.value) {
+      oldSnCode = pagging.state.query.snCode;
+      pagging.state.query.snCode = "";
+    } else {
+      pagging.state.query.snCode = oldSnCode;
+    }
+  });
+
   watch(
     () => pagging.state.query.type,
     () => {
@@ -38,6 +50,6 @@ export const useScenePagging = () => {
     pagging.state.query.type = type;
   };
 
-  return { pagging, keyword, isSwmx };
+  return reactive({ pagging, keyword, isSwmx });
 };
-export type ScenePagging = ReturnType<typeof useScenePagging>["pagging"];
+export type ScenePagging = ReturnType<typeof useScenePaggingParams>["pagging"];