Browse Source

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

tangning 1 year ago
parent
commit
9ec02f4f11

+ 47 - 54
src/app/map/App.vue

@@ -7,55 +7,41 @@
 import AMapLoader from "@amap/amap-jsapi-loader";
 import { onMounted, ref } from "vue";
 import axios from 'axios';
-
-
-
-
-const mockData = [
-  {
-    id: "1",
-    pos: [113.49950059050184, 22.32067452371977],
-    title: "tttsaaa",
-    icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
-    url: "https://baidu.com"
+import { getFuseCodeLink } from "../../view/case/help";
+
+const getQuery = (
+  caseId: number,
+  share: boolean = false,
+  single: boolean = false
+) =>
+  `${getFuseCodeLink(caseId, true)}${share ? "&share=1" : ""}${single ? "&single=1" : ""
+  }#show/summary`;
+
+const request = axios.create({
+  baseURL: '',
+  timeout: 1000,
+  headers: {
+    share: 1,
+    'Content-Type': 'application/json'
   },
-  {
-    id: "2",
-    pos: [113.4705899650537, 22.154966705378126],
-    title: "hello string11",
-    icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
-    url: "https://google.com"
-  },
-  {
-    id: "3",
-    pos: [113.60847140949818, 22.235271980933565],
-    title: "hello string11",
-    icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
-    url: "https://yahoo.com"
-  }
-]
+});
 const mapEl = ref<HTMLDivElement>();
 
-const getDataQuest = async () => {
-  const res = await axios(
-    {
-      url: "https://xj-mix3d.4dkankan.com/fusion-xj/web/fireProject/queryProject",
-      headers: {
-        share: 1,
-        'Content-Type': 'application/json'
-      },
-      method: 'post',
-      data: {
-        pageNum: 1,
-        pageSize: 10000
-      }
+const getDataQuest = () => {
+  return new Promise(async (reslove, reject) => {
+
+    const res = await request.post('https://xj-mix3d.4dkankan.com/fusion-xj/web/fireProject/queryProject', {
+      pageNum: 1,
+      pageSize: 10000
+    })
+    console.log('res.data', res)
+    if (res.status === 200 && res.data.code === 0) {
+      reslove(res.data.data.list)
+    } else {
+      reslove([])
     }
-  )
-  if (res.data && res.data.code === 0) {
-    return Promise.resolve(res.data.data.list)
-  } else {
-    return Promise.resolve([])
-  }
+  })
+
 
 
 }
@@ -76,7 +62,6 @@ const loadMap = async () => {
     resizeEnable: true,
   });
 
-
   //添加插件
   AMap.plugin(["AMap.ToolBar", "AMap.Scale", "AMap.HawkEye", 'AMap.MapType'], function () {
     //异步同时加载多个插件
@@ -84,24 +69,32 @@ const loadMap = async () => {
     map.addControl(new AMap.Scale()); //显示当前地图中心的比例尺
     map.addControl(new AMap.MapType()); //显示当前地图中心的比例尺
   });
-  console.log('map', map)
+  console.log('map', map,)
 
   const initMakers = async () => {
-    const data = await getDataQuest();
-    // console.log('data', data)
+    const data = await getDataQuest() as any as any[];
+    console.log('data', data)
     Array.from(data).forEach((item: any) => {
       // console.log(item)
       const latlng = item.latlng
       const coord = latlng.split(',')
 
-      console.log('coord',coord)
-      
+
+      console.log('coord', coord, item.caseId)
+      const url = getQuery(item.caseId, true)
+      console.log('url', url)
+      const icon = new AMap.Icon({
+        image: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
+        size: new AMap.Size(22, 28),  //图标所处区域大小
+        imageSize: new AMap.Size(22, 28) //图标大小
+      });
+
       const marker = new AMap.Marker({
-        icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
-        position: coord,
+        icon: icon,
+        position: coord.reverse(),
         title: item.title,
         label: item.title,
-        extData: { url: item.url, id: item.id }
+        extData: { url: url, id: item.caseId }
         // offset: new AMap.Pixel(-26, -54),
       });
 

+ 4 - 2
src/request/index.ts

@@ -26,7 +26,7 @@ export type AuthHook = () => {
   clear: () => void;
 };
 export const setAuthHook = (hook: AuthHook) => (getAuth = hook);
-let getAuth: AuthHook = () => ({ token: "", userId: "0", clear: () => { } });
+let getAuth: AuthHook = () => ({ token: "", userId: "0", clear: () => {} });
 
 axios.defaults.baseURL = baseURL;
 
@@ -83,7 +83,9 @@ axios.interceptors.request.use(async (config) => {
 
 const responseInterceptor = (res: AxiosResponse<any, any>) => {
   closeLoading();
-  const hasIgnore = res.config.params ? 'ingoreRes' in res.config.params : false
+  const hasIgnore = res.config.params
+    ? "ingoreRes" in res.config.params
+    : false;
   if (!successCode.includes(res.data.code) && !hasIgnore) {
     let errMsg = res.data.msg || res.data.message;
     openErrorMsg(errMsg);

+ 3 - 3
src/request/urls.ts

@@ -66,6 +66,7 @@ export const getCompanyList = "/web/department/getAll";
 export const getSceneList = "/fusion-xj/scene/list";
 export const delScene = "/fusion-xj/scene/deleteNum";
 export const copyScene = "/fusion-xj/scene/copyScene";
+export const downSceneHash = `/fusion-xj/scene/downMD5`;
 export const checkGenMeshScene = "/fusion-xj/scene/sceneDetail";
 export const genMeshSceneByCloud = "/fusion-xj/scene/buildSceneObj";
 
@@ -84,6 +85,7 @@ export const updateModelScene = `/fusion-xj/model/updateTitle`;
 export const cancelUModel = `/fusion-xj/model/cancelUpload`;
 export const deleteModel = `/fusion-xj/model/delete`;
 export const copyModel = `/fusion-xj/model/copyModel`;
+export const downModelHash = `/fusion-xj/model/downMD5`;
 export const uploadModel = `/fusion-xj/model/uploadObj`;
 export const getModelRunProgress = `/fusion-xj/model/uploadObjProgress`;
 
@@ -166,8 +168,7 @@ 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相关
@@ -185,7 +186,6 @@ export const caseInquestInfo = "/fusion-xj/caseInquest/info";
 export const caseInquestOpt = "/fusion-xj/caseInquest/saveOrUpdate";
 export const caseInquestExport = "/fusion-xj/caseInquest/downDocx";
 
-
 // 火调链接地址设置密码
 export const setCasePsw = "/fusion-xj/web/fireProject/updateRandomCode";
 export const getCasePsw = "/fusion-xj/web/fireProject/getRandCode";

+ 27 - 0
src/store/scene.ts

@@ -9,6 +9,8 @@ import {
   copyScene,
   delScene,
   deleteModel,
+  downModelHash,
+  downSceneHash,
   downloadSceneList,
   genMeshSceneByCloud,
   getModelRunProgress,
@@ -17,6 +19,7 @@ import {
   updateModelScene,
   uploadModel,
 } from "@/request";
+import saveAs from "@/util/file-serve";
 import { ElMessage } from "element-plus";
 
 interface BaseScene {
@@ -91,6 +94,14 @@ export enum ModelSceneStatus {
   CANCEL = -2,
 }
 
+const downHash = async (res: string, name: string) => {
+  if (res.includes("code")) {
+    ElMessage.error(JSON.parse(res).message);
+  } else {
+    await saveAs(new Blob([res], { type: "text/plain" }), name + "-hash.txt");
+  }
+};
+
 export const setModelScene = (scene: ModelScene) =>
   axios.post(updateModelScene, {
     modelId: scene.modelId,
@@ -106,6 +117,14 @@ export const delModelScene = (scene: ModelScene) =>
 export const copyModelScene = (scene: ModelScene) =>
   axios.post(copyModel, { modelId: scene.modelId });
 
+export const downModelSceneHash = async (scene: ModelScene) => {
+  const res = (await axios.get(downModelHash, {
+    params: { modelId: scene.modelId, ingoreRes: true },
+    responseType: "text",
+  })) as string;
+  await downHash(res, scene.modelTitle);
+};
+
 export const uploadModelScene = (
   file: File,
   progressCallback: (progress: number) => void
@@ -166,6 +185,14 @@ export const delQuoteScene = (scene: QuoteScene) =>
 export const copyQuoteScene = (scene: QuoteScene) =>
   axios.post(copyScene, { num: scene.num });
 
+export const downQuoteSceneHash = async (scene: QuoteScene) => {
+  const res = (await axios.get(downSceneHash, {
+    params: { num: scene.num, ingoreRes: true },
+    responseType: "text",
+  })) as any;
+  await downHash(res, scene.sceneName);
+};
+
 export type QueryDownloadQuoteSceneParams = PaggingReq<{
   deptId: string;
   userName: string;

+ 147 - 97
src/view/case/records/manifest.vue

@@ -5,18 +5,16 @@
       <el-button type="primary" @click="handleSave">保存</el-button>
       <el-button>导出</el-button>
     </div>
-    <h3 class="title">基本信息</h3>
-    <div class="content">
 
+    <div class="content">
       <div class="line">
-        <span>勘验次数:</span>
-        <span>第</span>
-        <el-input class="input" v-model="data.times" placeholder="" style="width: 80px;" />
-        <span>次勘验</span>
+        <span>起火单位/地址:</span>
+        <el-input class="input" v-model="data.times" placeholder="" style="width: 100%;" />
+
       </div>
 
       <div class="line">
-        <span>勘验时间:</span>
+        <span>提取日期:</span>
         <div>
           <el-input class="input" :maxlength="4" type="text" v-model="data.start.year" placeholder=""
             style="width: 80px;" />
@@ -28,106 +26,92 @@
             style="width: 80px;" />
           <span>日</span>
         </div>
-        <span style="width: 60px;text-align: center">至</span>
-        <div>
-          <el-input class="input" :maxlength="4" v-model="data.end.year" placeholder="" style="width: 80px;" />
-          <span>年</span>
-          <el-input class="input" :maxlength="2" v-model="data.end.month" placeholder="" style="width: 80px;" />
-          <span>月</span>
-          <el-input class="input" :maxlength="2" v-model="data.end.day" placeholder="" style="width: 80px;" />
-          <span>日</span>
-        </div>
-      </div>
-
-      <div class="line">
-        <span>勘验地点:</span>
-        <el-input class="input" type="tel" v-model="data.location" placeholder="" style="width: 100%;" />
-      </div>
-      <div class="line">
-        <span>勘验人员姓名、单位、职务(含技术职务):</span>
-        <el-input class="input" type="tel" v-model="data.job" placeholder="" style="width: 100%;" />
 
       </div>
 
-      <div class="line">
-        <span>勘验气象条件(天气、风力、温度):</span>
-        <el-input class="input" type="tel" v-model="data.condition" placeholder="" style="width: 100%;" />
-      </div>
-
-      <div class="textarea">
-        <span>勘验情况:</span>
-        <el-input type="textarea" :rows="4" v-model="data.situation" placeholder="" style="width: 100%;" />
-
-      </div>
-      <div class="textarea">
-        <span>一、环境勘验</span>
-        <el-input type="textarea" :rows="4" v-model="data.situationEnv" placeholder="" style="width: 100%;" />
-      </div>
+      <div class="lists">
+        <span class="sub-tit">提取清单:</span>
+        <template v-for=" (list, index) in data.lists">
+          <div class="con">
+            <span class="sub-tit">编号 {{ index + 1 }}: </span>
+            <div class="info">
+              <div class="inner">
+                <div class="sec">
+                  <span>名称: </span>
+                  <el-input class="input" v-model="data.leader" placeholder="" />
+                </div>
+
+                <div class="sec">
+                  <span>规格: </span>
+                  <el-input class="input" v-model="data.recorder" placeholder="" />
+                </div>
+
+                <div class="sec">
+                  <span>数量: </span>
+                  <el-input class="input" v-model="data.inspector" placeholder="" />
+                </div>
+              </div>
+              <div class="inner">
+                <div class="sec">
+                  <span>提取部位: </span>
+                  <el-input class="input" v-model="data.leader" placeholder="" />
+                </div>
+
+
+              </div>
+              <div class="inner">
+                <div class="sec">
+                  <span>特征: </span>
+                  <el-input class="input" v-model="data.leader" placeholder="" />
+                </div>
+
+              </div>
+            </div>
 
-      <div class="textarea">
-        <span>二、初步勘验</span>
-        <el-input type="textarea" :rows="4" v-model="data.situationPrimary" placeholder="" style="width: 100%;" />
-      </div>
+          </div>
 
-      <div class="textarea">
-        <span>三、细项勘验</span>
-        <el-input type="textarea" :rows="4" v-model="data.situationDetail" placeholder="" style="width: 100%;" />
-      </div>
+        </template>
 
-      <div class="textarea">
-        <span>四、专项勘验</span>
-        <el-input type="textarea" :rows="6" v-model="data.situationTask" placeholder="" style="width: 100%;" />
-      </div>
 
-      <div class="textarea">
-        <span>提取物品描述:</span>
-        <el-input type="textarea" :rows="6" v-model="data.objectDesc" placeholder="" style="width: 100%;" />
       </div>
-
-      <div class="textarea">
-        <span>现场拍照制图描述:</span>
-        <el-input type="textarea" :rows="6" v-model="data.sceneDesc" placeholder="" style="width: 100%;" />
+      <div class="btn-container">
+        <el-button class="btn" @click="addItem">+新增</el-button>
       </div>
+      <div class="gap"></div>
 
-      <div class="info">
-        <span class="sub-tit">勘验信息:</span>
-        <div class="inner">
-          <div class="sec">
-            <span>勘验负责人</span>
-            <el-input class="input" v-model="data.start.month" placeholder="" />
-          </div>
-
-          <div class="sec">
-            <span> 记录人</span>
-            <el-input class="input" v-model="data.start.month" placeholder="" />
+      <div class="man">
+        <span class="sub-tit">提取人:</span>
+        <template v-for="man in data.man">
+          <div class="line">
+            <span>姓名:</span>
+            <el-input class="input" placeholder="" style="width: 20%" />
+            <span>工作单位:</span>
+            <el-input class="input" placeholder="" style="width: 70%" />
           </div>
 
-          <div class="sec">
-            <span>勘验人</span>
-            <el-input class="input" v-model="data.start.month" placeholder="" />
-          </div>
-        </div>
+        </template>
+      </div>
+      <div class="btn-container">
+        <el-button class="btn" @click="addMan">+新增</el-button>
       </div>
-
-      <div class="gap"></div>
       <!-- 证人 -->
-      <template v-for="index of witnesses">
+      <template v-for="wit in data.witness">
         <div class="witness">
           <span class="sub-tit">证人信息:</span>
           <div class="line">
             <span>证人或当事人:</span>
-            <el-input class="input" v-model="data.witness[index - 1].name" placeholder="" style="width: 180px;" />
+            <el-input class="input" v-model="wit.name" placeholder="" style="width: 180px;" />
             <div>
-              <el-input class="input" v-model="data.witness[index - 1].year" placeholder="" style="width: 80px;" />
+              <el-input class="input" v-model="wit.year" placeholder="" style="width: 80px;" />
               <span>年</span>
-              <el-input class="input" v-model="data.witness[index - 1].month" placeholder="" style="width: 80px;" />
+              <el-input class="input" v-model="wit.year" placeholder="" style="width: 80px;" />
               <span>月</span>
-              <el-input class="input" v-model="data.witness[index - 1].day" placeholder="" style="width: 80px;" />
+              <el-input class="input" v-model="wit.year" placeholder="" style="width: 80px;" />
               <span>日</span>
             </div>
 
             <span style="margin-left:50px">身份证件号码:</span>
-            <el-input class="input" v-model="data.witness[index - 1].id" placeholder="" style="width: 280px;" />
+            <el-input class="input" v-model="wit.id" placeholder="" style="width: 280px;" />
           </div>
         </div>
 
@@ -162,15 +146,36 @@ const data = reactive({
     day: ""
   },
   location: '',
-  job: '',
-  condition: '',
-  situation: '',
-  situationEnv: '',  //环境勘验
-  situationPrimary: '', //初步勘验
-  situationDetail: '', //初步勘验
-  situationTask: '', //专项勘验
-  objectDesc: '',
-  sceneDesc: '',
+  lists: [{
+    id: "1",
+    name: "",
+    spec: "",
+    num: "",
+    part: "",
+    desc: "",
+  },
+  {
+    id: "2",
+    name: "",
+    spec: "",
+    num: "",
+    part: "",
+    desc: "",
+  }],
+  man: [
+    {
+      name: "",
+      workplace: "",
+      id: ""
+    },
+
+    {
+      name: "",
+      workplace: "",
+      id: ""
+    },
+  ],
+
   witness: [{
     name: "",
     year: "",
@@ -216,12 +221,11 @@ watch(data, newValue => {
   deep: true
 })
 
-const witnesses = ref(2)
+
 onMounted(() => {
 })
 
 const addWitness = () => {
-  witnesses.value += 1
   data.witness.push({
     name: "",
     year: "",
@@ -230,7 +234,26 @@ const addWitness = () => {
     id: ""
   })
 }
-
+const addItem = () => {
+  data.lists.push({
+    id: "1",
+    name: "",
+    spec: "",
+    num: "",
+    part: "",
+    desc: "",
+  })
+}
+const addMan = () => {
+  data.man.push({
+    id: "1",
+    name: "",
+    spec: "",
+    num: "",
+    part: "",
+    desc: "",
+  })
+}
 const handleSave = () => {
   console.log('data', data)
 
@@ -247,6 +270,7 @@ const handleSave = () => {
   .header {
     display: flex;
     justify-content: flex-end;
+    margin-bottom: 50px;
   }
 
   .input {
@@ -293,8 +317,6 @@ const handleSave = () => {
 .info {
   display: block;
 
-
-
   .inner {
     display: flex;
     flex-direction: row;
@@ -321,7 +343,7 @@ const handleSave = () => {
   background: #F5F5F5;
   padding: 15px;
   margin-top: 20px;
-  margin-right: 8px;
+  // margin-right: 8px;
 }
 
 .gap {
@@ -341,4 +363,32 @@ const handleSave = () => {
     }
   }
 }
+
+.lists {
+
+
+  .con {
+    padding: 20px;
+    background-color: #F5F5F5;
+  }
+
+  .info {
+    .inner {
+      margin-bottom: 20px;
+    }
+  }
+
+}
+
+.man {
+  margin-right: 0px;
+
+  .line {
+    background-color: #F5F5F5;
+    padding: 15px;
+    width: calc(100% - 30px);
+    display: inline-flex;
+    margin-bottom: 15px;
+  }
+}
 </style>

+ 24 - 24
src/view/statistics/statisticsInject.ts

@@ -162,30 +162,30 @@ export const statisticsConfigs: ConfigItem[] = reactive([
       ],
     },
   },
-  {
-    title: "火灾原因统计",
-    data: {
-      tooltip: {
-        trigger: "axis",
-      },
-      xAxis: {
-        type: "category",
-        data: [],
-      },
-      yAxis: {
-        type: "value",
-      },
-      series: [
-        {
-          label: {
-            show: true,
-          },
-          data: [],
-          type: "bar",
-        },
-      ],
-    },
-  },
+  // {
+  //   title: "火灾原因统计",
+  //   data: {
+  //     tooltip: {
+  //       trigger: "axis",
+  //     },
+  //     xAxis: {
+  //       type: "category",
+  //       data: [],
+  //     },
+  //     yAxis: {
+  //       type: "value",
+  //     },
+  //     series: [
+  //       {
+  //         label: {
+  //           show: true,
+  //         },
+  //         data: [],
+  //         type: "bar",
+  //       },
+  //     ],
+  //   },
+  // },
 ]);
 
 const numRotate = 8;

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

@@ -43,7 +43,14 @@
       {{ getStatusText(row) }}
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
-    <el-table-column label="操作" v-slot:default="{ row }">
+    <el-table-column label="操作" v-slot:default="{ row }" width="350px">
+      <span
+        class="oper-span"
+        @click="downHash(row)"
+        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
+      >
+        下载Hash
+      </span>
       <span
         class="oper-span"
         @click="copyHanlder(row)"
@@ -97,6 +104,7 @@ import {
   delModelScene,
   getModelSceneStatus,
   copyModelScene,
+  downModelSceneHash,
 } from "@/store/scene";
 import {
   ModelMaxSize,
@@ -111,6 +119,7 @@ import { watchPolling } from "@/hook/watchPolling";
 import { OpenType, openSceneUrl } from "../case/help";
 import { operateIsPermissionByPath } from "@/directive/permission";
 import { editModelScene } from "./quisk";
+import { downModelHash } from "@/request";
 
 const props = defineProps<{ pagging: ScenePagging }>();
 
@@ -145,6 +154,9 @@ const copyHanlder = async (scene: ModelScene) => {
     props.pagging.refresh();
   }
 };
+const downHash = async (scene: ModelScene) => {
+  downModelSceneHash(scene);
+};
 
 const {
   percentage,

+ 17 - 1
src/view/vrmodel/sceneContent.vue

@@ -25,7 +25,18 @@
       {{ QuoteSceneStatusDesc[row.status] }}
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
-    <el-table-column label="操作" v-slot:default="{ row }: { row: QuoteScene }">
+    <el-table-column
+      label="操作"
+      v-slot:default="{ row }: { row: QuoteScene }"
+      width="350px"
+    >
+      <span
+        class="oper-span"
+        @click="downHash(row)"
+        v-if="row.status === QuoteSceneStatus.SUCCESS"
+      >
+        下载Hash
+      </span>
       <span
         class="oper-span"
         @click="copySceneHandler(row)"
@@ -95,12 +106,14 @@ import {
   genMeshScene,
   LocationEnum,
   copyQuoteScene,
+  downQuoteSceneHash,
 } from "@/store/scene";
 import { ScenePagging } from "./pagging";
 import { QuoteSceneStatusDesc } from "@/constant/scene";
 import { OpenType, openSceneUrl } from "../case/help";
 import { confirm } from "@/helper/message";
 import { sceneDownload } from "./quisk";
+import { downSceneHash } from "@/request";
 
 const props = defineProps<{ pagging: ScenePagging }>();
 const delSceneHandler = async (scene: QuoteScene) => {
@@ -113,6 +126,9 @@ const copySceneHandler = async (scene: QuoteScene) => {
   await copyQuoteScene(scene);
   props.pagging.refresh();
 };
+const downHash = async (scene: QuoteScene) => {
+  downQuoteSceneHash(scene);
+};
 const sceneDownloadHandler = (scene: QuoteScene) => {
   sceneDownload({ scene });
 };