Procházet zdrojové kódy

Merge branch 'v1.9.0-jm' of http://192.168.0.115:3000/bill/fuse-code into v1.9.0-jm

xzw před 7 měsíci
rodič
revize
6da61b723a

+ 1 - 1
src/api/floder.ts

@@ -35,7 +35,7 @@ export const fetchFloders = async () => {
     res.data.data.forEach((item:any, ndx: any) => {
       floders.push({
         filesId: 100 + ndx,
-        filesTypeId: 100,
+        filesTypeId: -1,
         filesTitle: '照片制卷图',
         caseId: params.caseId.toString(),
         filesUrl: item.imgUrl

+ 18 - 11
src/api/folder-type.ts

@@ -1,17 +1,24 @@
-import { FOLDER_TYPE_LIST } from './constant'
-import axios from './instance'
+import { FOLDER_TYPE_LIST } from "./constant";
+import axios from "./instance";
 
 export interface FloderType {
-  filesTypeId: number,
-  filesTypeName: string,
-  parentId: number,
-  modalShow?: boolean
-  flatShow?: boolean
+  filesTypeId: number;
+  filesTypeName: string;
+  parentId: number;
+  modalShow?: boolean;
+  flatShow?: boolean;
 }
 
-export type FloderTypes = FloderType[]
+export type FloderTypes = FloderType[];
 
 export const fetchFloderTypes = async () => {
-  const types =await axios.get<FloderTypes>(FOLDER_TYPE_LIST)
-  return types
-}
+  const types = await axios.get<FloderTypes>(FOLDER_TYPE_LIST);
+  types.push({
+    filesTypeId: -1,
+    filesTypeName: "照片制卷",
+    flatShow: false,
+    modalShow: false,
+    parentId: 39,
+  });
+  return types;
+};

+ 1 - 1
src/api/instance.ts

@@ -37,7 +37,7 @@ const gotoLogin = () => {
       setTimeout(() => location.reload())
     });
   } else {
-    const loginHref = `/admin/#/login`
+    const loginHref = `/admin/#/statistics/scene`
     location.href = loginHref + '?redirect=' + escape(location.href)
   }
 };

+ 7 - 7
src/api/scene.ts

@@ -22,14 +22,14 @@ export enum SceneType {
   DSFXJ = 7,
 }
 export const SceneTypeDesc: Record<SceneType, string>  = {
-  [SceneType.SWKK]: '八目-四维现勘 Kankan',
-  [SceneType.SWKJ]: '四维现勘 Minion',
-  [SceneType.SWSS]: '四维现勘 Mega 点云',
+  [SceneType.SWKK]: '四维看看/Mesh',
+  [SceneType.SWKJ]: '四维看见/Mesh',
+  [SceneType.SWSS]: '四维深时/点云',
   [SceneType.SWMX]: '媒体库',
-  [SceneType.SWSSMX]: '四维现勘 Mega Mesh',
-  [SceneType.SWYDSS]: '四维现勘 Meta 点云',
-  [SceneType.SWYDMX]: '四维现勘 Meta Mesh',
-  [SceneType.DSFXJ]: '四维现勘 PanoX'
+  [SceneType.SWSSMX]: '四维深时/Mesh',
+  [SceneType.SWYDSS]: '四维深光/点云',
+  [SceneType.SWYDMX]: '四维深光/Mesh',
+  [SceneType.DSFXJ]: '圆周率/Mesh'
 }
 
 

+ 16 - 6
src/app.vue

@@ -25,13 +25,14 @@
         </router-view>
       </div>
 
-      <span
+      <!-- <span
+        v-if="fuseModels.length > 0 || scenes.length === 0"
         class="taggle map-type"
         @click="isStandard = !isStandard"
         @touchend="isStandard = !isStandard"
       >
-        <img :src="isStandard ? '/images/satellite.jpg' : '/images/standard.jpg'" />
-      </span>
+        <img :src="isStandard ? 'images/satellite.jpg' : 'images/standard.jpg'" />
+      </span> -->
     </ui-editor-layout>
 
     <PwdModel v-if="inputPwd" @close="inputPwd = false" />
@@ -41,17 +42,26 @@
 <script lang="ts" setup>
 import { custom, params } from "@/env";
 import { computed, ref, watch, watchEffect, nextTick } from "vue";
-import { isEdit, prefix, appEl, initialSetting, caseProject, refreshCase } from "@/store";
+import {
+  isEdit,
+  prefix,
+  appEl,
+  initialSetting,
+  caseProject,
+  refreshCase,
+  fuseModels,
+  scenes,
+} from "@/store";
 import router, { currentLayout, RoutesName } from "./router";
 import { loadPack, needMounts } from "@/utils";
 import { ConfigProvider } from "ant-design-vue";
 import PwdModel from "@/layout/pwd.vue";
 import { config } from "./config";
 import { sdk, sdkLoaded } from "./sdk";
-
+// https://192.168.0.13:7173/index.html?caseId=509&sign=vGxCu4X5321fkWpZN6HnqYBiE6iI71DDWzdgjEaUKIh7vDWo3o5yhqHdHhGr4Z3W#/show
 const isStandard = ref(true);
 watchEffect(() => {
-  if (sdkLoaded.value) {
+  if (sdkLoaded.value && !params.testMap) {
     sdk.switchMapType(isStandard.value ? "satellite" : "standard");
   }
 });

+ 23 - 0
src/components/materials/index.vue

@@ -53,6 +53,13 @@
           @change="handleTableChange"
         >
           <template #bodyCell="{ column, record }">
+            <template v-if="column.key === 'name'">
+              <div class="name">
+                <span>
+                  {{ record.name }}
+                </span>
+              </div>
+            </template>
             <template v-if="column.key === 'size'">
               {{ getSizeStr(record.size) }}
             </template>
@@ -182,6 +189,7 @@ const cloumns = computed(() => [
     })),
   },
   {
+    width: "100px",
     title: "操作",
     key: "action",
   },
@@ -293,4 +301,19 @@ const handleTableChange: TableProps["onChange"] = (pag, filters) => {
   text-overflow: ellipsis;
   white-space: nowrap;
 }
+
+.name {
+  position: relative;
+  display: flex;
+  align-items: center;
+
+  span {
+    position: absolute;
+    max-width: 100%;
+    display: block;
+    overflow: hidden;
+    text-overflow: ellipsis; //文本溢出显示省略号
+    white-space: nowrap; //文本不会换行
+  }
+}
 </style>

+ 2 - 2
src/components/static-preview/index.vue

@@ -11,8 +11,8 @@
         :items="items"
         showInfos
       >
-        <template v-slot="{ raw }">
-          <Sign :media="raw" />
+        <template v-slot="{ raw, active }">
+          <Sign :media="raw" :focus="active === raw" />
         </template>
       </ui-slide>
       <Sign :media="items[0]" v-else />

+ 9 - 2
src/components/static-preview/resource.vue

@@ -1,5 +1,5 @@
 <template>
-  <div>
+  <div v-if="focus">
     <video
       v-if="type === MetaType.video"
       controls
@@ -31,7 +31,14 @@ import { getResource } from "@/env";
 import { computed } from "vue";
 import { getUrlType, MetaType } from "@/utils/meta";
 
-const props = defineProps<{ data: string | Blob | File; type?: MetaType }>();
+const props = withDefaults(
+  defineProps<{
+    data: string | Blob | File;
+    type?: MetaType;
+    focus?: boolean;
+  }>(),
+  { focus: true }
+);
 
 const url = computed(() =>
   typeof props.data === "string"

+ 10 - 2
src/components/static-preview/sign.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="preview-layer">
     <div class="pull-meta">
-      <ResourceView :data="media.url" :type="media.type" />
+      <ResourceView :data="media.url" :type="media.type" :focus="focus" />
     </div>
   </div>
 </template>
@@ -12,7 +12,7 @@ import { getResource } from "@/env";
 import ResourceView from "./resource.vue";
 import type { MediaItem } from "./index.vue";
 
-const props = defineProps<{ media: MediaItem }>();
+const props = defineProps<{ media: MediaItem; focus?: boolean }>();
 defineEmits<{ (e: "close", v: boolean): void }>();
 
 const staticURL = ref("");
@@ -26,3 +26,11 @@ watchEffect(() => {
 </script>
 
 <style scoped lang="scss" src="./style.scss"></style>
+
+<style scoped>
+.preview-layer,
+.pull-meta {
+  width: 100%;
+  height: 100%;
+}
+</style>

+ 8 - 3
src/components/tagging/sign-new.vue

@@ -26,10 +26,10 @@
           />
         </h2>
         <div class="content">
-          <p>
+          <div class="p">
             <span v-if="defStyleType.id !== taggingStyle?.typeId"> 特征描述: </span>
-            {{ tagging.desc }}
-          </p>
+            <div v-html="tagging.desc"></div>
+          </div>
           <template v-if="defStyleType.id !== taggingStyle?.typeId">
             <p><span>遗留部位:</span>{{ tagging.part }}</p>
             <p><span>提取方法:</span>{{ tagging.method }}</p>
@@ -266,8 +266,13 @@ defineExpose(tag);
       margin-bottom: 20px;
       word-break: break-all;
 
+      .p,
       p {
         margin-bottom: 10px;
+        display: flex;
+        span {
+          flex: 0 0 auto;
+        }
       }
     }
   }

+ 1 - 0
src/env/index.ts

@@ -58,6 +58,7 @@ export type Params = {
   fileUrl?: string
   sign?: string
   type?: string
+  testMap?: boolean
   title?: string
   m?: string
   share?: boolean,

+ 24 - 10
src/layout/scene-list/index.vue

@@ -27,10 +27,14 @@
         class="scene"
         :class="{ disabled: item.raw.status !== SceneStatus.SUCCESS }"
         @click="updateCurrent(item.raw)"
-        v-else
+        v-else-if="item.raw.type !== SceneType.SWMX"
       >
-        <div>
-          <p>{{ item.raw.name }}</p>
+        <div
+          :class="{full:!(canSync(item as Scene) && !voffline && currentLayout === RoutesName.show)} "
+        >
+          <p>
+            {{ item.raw.name }}
+          </p>
           <p>
             {{ SceneTypeDesc[item.raw.type as SceneType] }}
           </p>
@@ -91,13 +95,15 @@ const sync = async (scene: Scene) => {
 
 const list = computed(() => {
   const sceneList = true
-    ? scenes.value.map((scene) => ({
-        raw: scene,
-        select:
-          props.current !== fuseModel &&
-          props.current.num === scene.num &&
-          props.current.type === scene.type,
-      }))
+    ? scenes.value
+        .filter((scene) => scene.type !== SceneType.SWMX)
+        .map((scene) => ({
+          raw: scene,
+          select:
+            props.current !== fuseModel &&
+            props.current.num === scene.num &&
+            props.current.type === scene.type,
+        }))
     : [];
   if (fuseModels.value.length) {
     return [{ raw: fuseModel }, ...sceneList];
@@ -135,9 +141,17 @@ const stopWatch = watch(
   padding: 0 20px;
   display: flex;
   align-items: center;
+  overflow: hidden;
   justify-content: space-between;
   > div {
     flex: 1;
+    max-width: 100%;
+    &.full {
+      max-width: 100%;
+    }
+    &:not(.full) {
+      max-width: calc(100% - 80px);
+    }
   }
 
   p {

+ 6 - 5
src/main.ts

@@ -59,6 +59,7 @@ watchEffect(
         URL.MESASURE_LIST,
         URL.GUIDE_LIST,
         URL.GUIDE_PATH_LIST,
+        URL.CASE_FIRE_INFO,
         URL.RECORD_LIST,
         URL.RECORD_FRAGMENT_LIST,
         URL.VIEW_LIST,
@@ -68,11 +69,11 @@ watchEffect(
         URL.CASE_INFO,
         URL.PATH_LIST,
         URL.AUTH_PWD,
-        '/fusion-xj/caseInquest/info',
-        '/fusion-xj/caseExtractDetail/info',
-        '/fusion-xj/caseInquest/downDocx',
-        '/fusion-xj/caseExtractDetail/downDocx',
-        '/fusion-xj/caseImg/getFfmpegImage'
+        '/fusion/caseInquest/info',
+        '/fusion/caseExtractDetail/info',
+        '/fusion/caseInquest/downDocx',
+        '/fusion/caseExtractDetail/downDocx',
+        '/fusion/caseImg/getFfmpegImage'
       ]
       addUnsetTokenURLS(...untokenURLS);
       onCleanup(() => {

+ 31 - 16
src/model/app.vue

@@ -60,6 +60,7 @@ export const Model = defineComponent({
         return setUrl("");
       }
       const type = scene.value.type;
+      const sign = params.sign ? `&sign=${params.sign}` : "";
       const urls = offline
         ? {
             [SceneType.SWKK]: `${offlinePrev}swkk/${scene.value.num}/wwwroot/spg.html?m=${scene.value.num}&lang=zh`,
@@ -72,28 +73,42 @@ export const Model = defineComponent({
             [SceneType.SWYDMX]: `${offlinePrev}swkk/${scene.value.num}/wwwroot/spg.html?m=${scene.value.num}&lang=zh`,
           }
         : {
-            [SceneType.SWKK]: `/swkk/spg.html?m=${scene.value.num}`,
-            [SceneType.DSFXJ]: `/swkk/spg.html?m=${scene.value.num}`,
-            [SceneType.SWKJ]: `/swkk/spg.html?m=${scene.value.num}`,
-            [SceneType.SWSS]: `/swss/index.html?m=${scene.value.num}`,
-            [SceneType.SWSSMX]: `/swkk/spg.html?m=${scene.value.num}`,
-            [SceneType.SWMX]: `index.html?caseId=${params.caseId}&modelId=${scene.value.num}#sign-model`,
-            [SceneType.SWYDSS]: `/swss/index.html?m=${scene.value.num}`,
-            [SceneType.SWYDMX]: `/swkk/spg.html?m=${scene.value.num}`,
+            [SceneType.SWKK]: `/swkk/spg.html?m=${scene.value.num}${sign}`,
+            [SceneType.DSFXJ]: `/swkk/spg.html?m=${scene.value.num}${sign}`,
+            [SceneType.SWKJ]: `/swkk/spg.html?m=${scene.value.num}${sign}`,
+            [SceneType.SWSS]: `/swss/index.html?m=${scene.value.num}${sign}`,
+            [SceneType.SWSSMX]: `/swkk/spg.html?m=${scene.value.num}${sign}`,
+            [SceneType.SWMX]: `index.html?caseId=${params.caseId}&modelId=${scene.value.num}${sign}#sign-model`,
+            [SceneType.SWYDSS]: `/swss/index.html?m=${scene.value.num}${sign}`,
+            [SceneType.SWYDMX]: `/swkk/spg.html?m=${scene.value.num}${sign}`,
           };
 
       if (import.meta.env.DEV && !offline) {
         Object.assign(urls, {
-          [SceneType.SWKK]: `/swkk/spg.html?m=${scene.value.num}&toen=${getToken()}`,
-          [SceneType.DSFXJ]: `/swkk/spg.html?m=${scene.value.num}&toen=${getToken()}`,
-          [SceneType.SWKJ]: `/swkk/spg.html?m=${scene.value.num}&toen=${getToken()}`,
-          [SceneType.SWSS]: `/swss/index.html?m=${scene.value.num}&toen=${getToken()}`,
-          [SceneType.SWSSMX]: `/swkk/spg.html?m=${scene.value.num}&toen=${getToken()}`,
+          [SceneType.SWKK]: `/swkk/spg.html?m=${
+            scene.value.num
+          }&toen=${getToken()}${sign}`,
+          [SceneType.DSFXJ]: `/swkk/spg.html?m=${
+            scene.value.num
+          }&toen=${getToken()}${sign}`,
+          [SceneType.SWKJ]: `/swkk/spg.html?m=${
+            scene.value.num
+          }&toen=${getToken()}${sign}`,
+          [SceneType.SWSS]: `/swss/index.html?m=${
+            scene.value.num
+          }&toen=${getToken()}${sign}`,
+          [SceneType.SWSSMX]: `/swkk/spg.html?m=${
+            scene.value.num
+          }&toen=${getToken()}${sign}`,
           [SceneType.SWMX]: `index.html?caseId=${params.caseId}&modelId=${
             scene.value.num
-          }&toen=${getToken()}#sign-model`,
-          [SceneType.SWYDSS]: `/swss/index.html?m=${scene.value.num}&toen=${getToken()}`,
-          [SceneType.SWYDMX]: `/swkk/spg.html?m=${scene.value.num}&toen=${getToken()}`,
+          }&toen=${getToken()}${sign}#sign-model`,
+          [SceneType.SWYDSS]: `/swss/index.html?m=${
+            scene.value.num
+          }${sign}&toen=${getToken()}`,
+          [SceneType.SWYDMX]: `/swkk/spg.html?m=${
+            scene.value.num
+          }${sign}&toen=${getToken()}`,
         });
       }
       setUrl(urls[type]);

+ 1 - 1
src/utils/meta.ts

@@ -7,7 +7,7 @@ export enum MetaType {
 }
 
 export const metaTypeExtnames = {
-  [MetaType.image]: ['bmp', 'jpg', 'png', 'tif', 'gif', 'pcx', 'tga', 'exif', 'fpx', 'svg', 'psd', 'cdr', 'pcd', 'dxf', 'ufo', 'eps', 'ai', 'raw', 'WMF', 'webp', 'avif', 'apng'],
+  [MetaType.image]: ['bmp', 'jpg', 'jpeg', 'png', 'tif', 'gif', 'pcx', 'tga', 'exif', 'fpx', 'svg', 'psd', 'cdr', 'pcd', 'dxf', 'ufo', 'eps', 'ai', 'raw', 'WMF', 'webp', 'avif', 'apng'],
   [MetaType.audio]: ['mp3'],
   [MetaType.video]: ['wmv', 'asf', 'asx', 'rm', 'rmvb', 'mp4', '3gp', 'mov', 'm4v', 'avi', 'dat', 'mkv', 'flv', 'vob'],
   [MetaType.xfile]: [".raw", ".dcm"]

+ 5 - 2
src/views/fire/index.vue

@@ -38,8 +38,11 @@ const tmLabelMap1 = {
   projectAddress: "立案编号",
   projectSite: "案件类别",
   organizerDeptName: "案发时间",
-  projectName: ["是否命案", (v: any) => (v ? "是" : "否")],
-  organizerUsers: ["是否刑件", (v: any) => (v ? "是" : "否")],
+  projectName: ["是否命案", (v: any) => (v === undefined ? "" : v ? "是" : "否")],
+  organizerUsers: ["是否刑案", (v: any) => {
+    console.error(v)
+    return v === undefined ? "" : v ? "是" : "否"
+  }],
   accidentDate: "案发区域",
   fireReason: "案发地点",
   statusDesc: "经纬度",

+ 10 - 2
src/views/folder/fire/index.vue

@@ -41,8 +41,14 @@ const tmLabelMap1 = {
   caseNum: "立案编号",
   caseCategory: "案件类别",
   crimeTime: "案发时间",
-  homicideCase: ["是否命案", (v: any) => (v ? "是" : "否")],
-  criminalCase: ["是否刑件", (v: any) => (v ? "是" : "否")],
+  homicideCase: ["是否命案", (v: any) => (v === null ? "" : v ? "是" : "否")],
+  criminalCase: [
+    "是否刑案",
+    (v: any) => {
+      console.error(v);
+      return v === null ? "" : v ? "是" : "否";
+    },
+  ],
   caseRegion: ["案发区域", (v: string[]) => v.join("-")],
   caseAddress: "案发地点",
   latAndLong: "经纬度",
@@ -51,6 +57,8 @@ const tmLabelMap1 = {
 const tmLabelMap2 = {
   commandTime: "指挥中心电话时间",
   alarmTime: "报警时间",
+  alarmName: "报警人",
+  assignDept: "指派/报告单位",
   inquestDept: "现场勘验单位",
   assignType: "指派方式",
   inquestAddress: "勘验地点",

+ 4 - 3
src/views/folder/fire/info.vue

@@ -3,7 +3,7 @@
     <h2>{{ title }}</h2>
     <div>
       <p v-for="(label, key) in labelMap">
-        <span>{{ typeof label === "string" ? label : label[0] }}</span>
+        <span>{{ typeof label === "string" ? label : label[0] }}:</span>
         {{ typeof label === "string" ? data[key] : label[1](data[key]) }}
       </p>
     </div>
@@ -38,7 +38,8 @@ defineProps<{
   }
 
   p {
-    margin: 5px 0;
+    margin: 10px 0;
+    padding: 0 20px;
     color: rgba(255, 255, 255, 1);
     font-size: 14px;
     display: flex;
@@ -50,7 +51,7 @@ defineProps<{
       width: 70px;
       text-align: right;
       height: 100%;
-      margin-right: 20px;
+      margin-right: 10px;
       color: rgba(255, 255, 255, 0.7);
     }
   }

+ 9 - 2
src/views/folder/floder-view.vue

@@ -60,7 +60,7 @@
 </template>
 <script lang="ts" setup>
 import { Floder, FloderRoot, getFlatFloders } from "@/store";
-import { computed, ref } from "vue";
+import { computed, ref, toRaw, watchEffect } from "vue";
 import { MetaType } from "@/utils";
 import ModalFloderView from "./modal-floder-view.vue";
 import { Modal } from "ant-design-vue";
@@ -92,6 +92,11 @@ const children = computed(() => {
   }
 });
 const showChildren = ref(props.root.modal ? false : true);
+watchEffect(() => {
+  if (showChildren.value) {
+    console.log(toRaw(props.root));
+  }
+});
 </script>
 
 <style lang="scss" scoped>
@@ -165,7 +170,9 @@ const showChildren = ref(props.root.modal ? false : true);
     margin-left: 10px;
     font-size: 12px;
     color: currentColor;
-    word-break: break-all;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
   }
 }
 </style>

+ 11 - 4
src/views/folder/modal-floder-view.vue

@@ -18,7 +18,13 @@
           :style="{ '--rawLen': samLen }"
         >
           <div class="img-item-content">
-            <img :src="floders[i].filesUrl" @click="clickHandler(floders[i])" />
+            <div>
+              <Sign
+                :media="{ url: floders[i].filesUrl }"
+                @click="clickHandler(floders[i])"
+              />
+            </div>
+            <!-- <img :src="floders[i].filesUrl"  /> -->
           </div>
         </div>
       </div>
@@ -36,8 +42,7 @@
       </TabPane>
     </template>
   </Tabs>
-
-  <template v-for="c in children" :key="c.id">
+  <template v-for="c in children" :key="c.id" v-else>
     <ModalFloderView
       :root="c"
       v-if="isLastLevel(c)"
@@ -50,6 +55,7 @@ import { Floder, FloderRoot, getFlatFloders } from "@/store";
 import { computed, ref } from "vue";
 import { TabPane, Tabs } from "ant-design-vue";
 import { DownOutlined, UpOutlined } from "@ant-design/icons-vue";
+import Sign from "@/components/static-preview/sign.vue";
 
 const props = defineProps<{ root: FloderRoot }>();
 const emit = defineEmits<{ (e: "preview", v: [Floder, FloderRoot]): void }>();
@@ -100,7 +106,8 @@ const canAll = computed(() => len.value > samLen);
     padding-top: 56.25%;
     position: relative;
     cursor: pointer;
-    img {
+
+    > div {
       position: absolute;
       width: 100%;
       height: 100%;

+ 1 - 0
src/views/guide/path/sign.vue

@@ -94,6 +94,7 @@ const enterHandler = () => {
 
 const clickHandler = () => {
   node.value?.fly();
+  node.value?.focus(true);
 };
 </script>