bill vor 1 Jahr
Ursprung
Commit
5cdc6aeaf5

+ 1 - 1
src/app/fire/constant/fire.ts

@@ -85,7 +85,7 @@ export const reason = [
   { label: "不排除原因", value: "不排除原因" },
 ];
 
-// 起火场所
+// 天气情况等标准化勘验信息
 export const place = [
   {
     label: "非建构筑物",

+ 11 - 11
src/app/fire/store/fire.ts

@@ -36,6 +36,7 @@ export type Fire = {
   organizerDeptName: string;
   organizerUsers: string;
   projectAddress: string;
+  latlng: string;
   projectName: string;
   projectSite: string;
   projectSiteCode: string;
@@ -44,6 +45,11 @@ export type Fire = {
   statusDesc: string;
   updateTime: string;
   isDelete?: number;
+
+  field1: string;
+  field2: string;
+  field3: string;
+  field4: string;
 };
 
 export enum FirePaggingRoute {
@@ -55,8 +61,7 @@ type FirePaggingParams = PaggingReq<Fire & { queryType: FirePaggingRoute }>;
 export const getFirePagging = async (params: FirePaggingParams) =>
   (await axios.get(getFireList, { params })).data as PaggingRes<Fire>;
 
-export const addFire = async (fire: Omit<Fire, "id">) =>
-  axios.post(insertFire, fire);
+export const addFire = async (fire: Omit<Fire, "id">) => axios.post(insertFire, fire);
 
 export const setFire = async (fire: Fire) => await axios.post(updateFire, fire);
 
@@ -78,13 +83,8 @@ export type FireLeaveMsg = {
   createTime: number;
 };
 
-export const getFireLeaveMsgPagging = async (
-  params: PaggingReq<{ projectId: string }>
-) =>
-  (await axios.get(getMessageList, { params }))
-    .data as PaggingRes<FireLeaveMsg>;
+export const getFireLeaveMsgPagging = async (params: PaggingReq<{ projectId: string }>) =>
+  (await axios.get(getMessageList, { params })).data as PaggingRes<FireLeaveMsg>;
 
-export const addFireLeaveMsg = (params: {
-  content: string;
-  projectId: string;
-}) => axios.post(insertMessage, params);
+export const addFireLeaveMsg = (params: { content: string; projectId: string }) =>
+  axios.post(insertMessage, params);

+ 175 - 30
src/app/fire/view/dispatch/editFire.vue

@@ -1,41 +1,60 @@
 <template>
-  <el-form ref="form" label-width="84px" class="camera-from">
+  <el-form ref="form" label-width="94px" class="camera-from">
+    <div class="def-select-map" ref="mapEl"></div>
     <div class="el-form-item">
       <el-col :span="12">
-        <el-form-item label="项目编号" class="mandatory">
+        <el-form-item label="事件分类" class="mandatory">
           <el-input
             v-model="bindFire.projectSn"
             maxlength="18"
-            placeholder="请输入项目编号"
+            placeholder="请输入事件分类"
           />
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="起火对象" class="mandatory">
+        <el-form-item label="分类登记" class="mandatory">
           <el-input
             v-model="bindFire.projectName"
             maxlength="50"
-            placeholder="请输入起火对象"
+            placeholder="请输入分类登记"
           />
         </el-form-item>
       </el-col>
     </div>
-    <el-form-item label="起火地址" class="mandatory">
-      <el-input
+    <el-form-item label="详细地址" class="mandatory asdasd">
+      <!-- <el-input
         v-model="bindFire.projectAddress"
         maxlength="50"
-        placeholder="请输入起火地址"
-      />
+        placeholder="请输入详细地址"
+      /> -->
+      <el-input v-model="keyword" placeholder="输入名称搜索" clearable @change="search">
+        <template #append>
+          <el-button :icon="Search" @click="search" />
+        </template>
+      </el-input>
+      <div class="search-result" v-show="!info" ref="resultEl"></div>
+    </el-form-item>
+    <el-form-item label="勘验地址" class="mandatory">
+      <el-input v-model="bindFire.field1" maxlength="50" placeholder="请输入勘验地址" />
     </el-form-item>
-    <el-form-item label="起火场所" class="mandatory">
+    <el-form-item label="勘验信息" class="mandatory">
+      <el-input
+        v-model="bindFire.projectSite"
+        placeholder="请输入天气情况等标准化勘验信息"
+      />
+      <!--       
       <el-cascader
         style="width: 100%"
         v-model="projectSite"
-        placeholder="起火场所"
+        placeholder="天气情况等标准化勘验信息"
         :options="place"
         :props="{ expandTrigger: 'hover' }"
-      />
+      /> -->
+    </el-form-item>
+    <el-form-item label="全宗名称" class="mandatory">
+      <el-input v-model="bindFire.field2" maxlength="50" placeholder="请输入全宗名称" />
     </el-form-item>
+
     <div class="el-form-item">
       <el-col :span="12">
         <el-form-item label="承办单位" class="mandatory">
@@ -43,14 +62,34 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="承办人员" class="mandatory" placeholder="请输入承办人员">
+        <el-form-item label="勘验人员" class="mandatory" placeholder="请输入勘验人员">
           <el-input v-model="bindFire.organizerUsers" maxlength="50" />
         </el-form-item>
       </el-col>
     </div>
     <div class="el-form-item">
       <el-col :span="12">
-        <el-form-item label="事故日期" class="mandatory" placeholder="请选择事故日期">
+        <el-form-item label="勘验人姓名" class="mandatory">
+          <el-input
+            v-model="bindFire.field3"
+            maxlength="18"
+            placeholder="请输入勘验人姓名"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="单位、职务" class="mandatory">
+          <el-input
+            v-model="bindFire.field4"
+            maxlength="50"
+            placeholder="请输入勘验人单位、职务"
+          />
+        </el-form-item>
+      </el-col>
+    </div>
+    <div class="el-form-item">
+      <el-col :span="12">
+        <el-form-item label="勘验日期" class="mandatory" placeholder="请选择勘验日期">
           <el-date-picker
             type="date"
             v-model="accidentDate"
@@ -60,7 +99,7 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="火灾原因" class="mandatory">
+        <!-- <el-form-item label="火灾原因" class="mandatory">
           <el-cascader
             style="width: 100%"
             v-model="fireReason"
@@ -68,7 +107,7 @@
             :options="reason"
             :props="{ expandTrigger: 'hover' }"
           />
-        </el-form-item>
+        </el-form-item> -->
       </el-col>
     </div>
   </el-form>
@@ -76,14 +115,16 @@
 
 <script setup lang="ts">
 import companySelect from "@/components/company-select/index.vue";
-import { ref } from "vue";
+import { ref, watchEffect } from "vue";
 import { Fire, setFire, addFire } from "@/app/fire/store/fire";
 import { reason, place } from "@/app/fire/constant/fire";
 import { ElMessage } from "element-plus";
-import { dateFormat } from "@/util";
+import { dateFormat, debounce } from "@/util";
 import { genCascaderValue, getCode } from "@/helper/cascader";
 import { QuiskExpose } from "@/helper/mount";
+import AMapLoader from "@amap/amap-jsapi-loader";
 import { user } from "@/store/user";
+import { Search } from "@element-plus/icons-vue";
 
 const props = defineProps<{ fire?: Fire }>();
 
@@ -100,30 +141,83 @@ const projectSite = genCascaderValue(bindFire, "projectSite");
 const accidentDate = ref(
   bindFire.value.accidentDate ? new Date(bindFire.value.accidentDate) : new Date()
 );
+const keyword = ref("");
+const resultEl = ref<HTMLDivElement>();
+const searchAMap = ref<any>();
+type MapInfo = { lat: number; lng: number };
+const info = ref<MapInfo>();
+const mapEl = ref<HTMLDivElement>();
+
+watchEffect(async (onCleanup) => {
+  if (!mapEl.value || !resultEl.value) {
+    return;
+  }
+  const AMap = await AMapLoader.load({
+    plugins: ["AMap.PlaceSearch"],
+    key: "e661b00bdf2c44cccf71ef6070ef41b8",
+    version: "2.0",
+  });
+
+  const map = new AMap.Map(mapEl.value, {
+    WebGLParams: {
+      preserveDrawingBuffer: true,
+    },
+    resizeEnable: true,
+  });
+  const placeSearch = new AMap.PlaceSearch({
+    pageSize: 5,
+    pageIndex: 1,
+    map: map,
+    panel: resultEl.value,
+    autoFitView: true,
+  });
+  placeSearch.on("listElementClick", (e) => {
+    bindFire.value.projectAddress =
+      e.data.pname + e.data.cityname + e.data.adname + e.data.address;
+    keyword.value = bindFire.value.projectAddress;
+    bindFire.value.latlng = `${e.data.lat},${e.data.lng}`;
+    info.value = {
+      lat: e.data.lat,
+      lng: e.data.lng,
+    };
+  });
+
+  searchAMap.value = placeSearch;
+  console.log(placeSearch.listElementClick);
+  onCleanup(() => {
+    searchAMap.value = null;
+    map.destroy();
+  });
+});
+
+const search = () => {
+  info.value = undefined;
+  searchAMap.value.search(keyword.value);
+};
 
 defineExpose<QuiskExpose>({
   async submit() {
     if (!bindFire.value.projectAddress || !bindFire.value.projectAddress.trim()) {
-      ElMessage.error("起火地址不能为空!");
-      throw "起火地址不能为空!";
+      ElMessage.error("详细地址不能为空!");
+      throw "详细地址不能为空!";
     } else if (!bindFire.value.projectSn || !bindFire.value.projectSn.trim()) {
-      ElMessage.error("项目编号不能为空!");
-      throw "项目编号不能为空!";
+      ElMessage.error("事件分类不能为空!");
+      throw "事件分类不能为空!";
     } else if (!bindFire.value.projectName || !bindFire.value.projectName.trim()) {
-      ElMessage.error("起火对象不能为空!");
-      throw "起火对象不能为空!";
+      ElMessage.error("分类登记不能为空!");
+      throw "分类登记不能为空!";
     } else if (!bindFire.value.projectSite || !bindFire.value.projectSite.trim()) {
-      ElMessage.error("起火场所不能为空!");
-      throw "起火场所不能为空!";
+      ElMessage.error("天气情况等标准化勘验信息不能为空!");
+      throw "天气情况等标准化勘验信息不能为空!";
     } else if (!bindFire.value.deptId || !bindFire.value.deptId.trim()) {
       ElMessage.error("承办单位不能为空!");
       throw "承办单位不能为空!";
     } else if (!bindFire.value.organizerUsers || !bindFire.value.organizerUsers.trim()) {
-      ElMessage.error("承办人员不能为空!");
-      throw "承办人员不能为空!";
+      ElMessage.error("勘验人员不能为空!");
+      throw "勘验人员不能为空!";
     } else if (!accidentDate) {
-      ElMessage.error("事故日期不能为空!");
-      throw "事故日期不能为空!";
+      ElMessage.error("勘验日期不能为空!");
+      throw "勘验日期不能为空!";
     } else if (!bindFire.value.fireReason || !bindFire.value.fireReason.trim()) {
       ElMessage.error("火灾原因不能为空!");
       throw "火灾原因不能为空!";
@@ -137,3 +231,54 @@ defineExpose<QuiskExpose>({
   },
 });
 </script>
+
+<style scoped>
+.search-result {
+  position: absolute;
+  left: 0;
+  right: 0;
+  z-index: 1;
+  overflow: hidden;
+  top: 100%;
+
+  &.show {
+    max-height: 450px;
+    overflow-y: auto;
+  }
+}
+
+.def-map-info {
+  margin-top: 10px;
+  p {
+    font-size: 14px;
+    color: rgba(0, 0, 0, 0.85);
+    display: inline;
+    &:not(:last-child)::after {
+      content: ",";
+      margin-right: 6px;
+    }
+  }
+
+  span::after {
+    content: ":";
+  }
+}
+
+.def-select-map {
+  position: absolute;
+  opacity: 0;
+  z-index: -1;
+  width: 540px;
+  height: 390px;
+  z-index: 1;
+  left: -100vw;
+  top: -100vh;
+  display: none;
+}
+
+.asdasd {
+  position: relative;
+  margin-bottom: 15px;
+  z-index: 2;
+}
+</style>

+ 13 - 9
src/app/fire/view/dispatch/header.vue

@@ -1,34 +1,38 @@
 <template>
   <com-head :options="head" showCtrl>
     <el-form label-width="84px">
-      <el-form-item label="项目编号:">
+      <el-form-item label="事件分类:">
         <el-input v-model="pagging.state.query.projectSn" placeholder="请输入"></el-input>
       </el-form-item>
-      <el-form-item label="起火对象:">
+      <el-form-item label="分类登记:">
         <el-input
           v-model="pagging.state.query.projectName"
           placeholder="请输入"
         ></el-input>
       </el-form-item>
-      <el-form-item label="起火地址:">
+      <el-form-item label="详细地址:">
         <el-input
           v-model="pagging.state.query.projectAddress"
           placeholder="请输入"
         ></el-input>
       </el-form-item>
-      <el-form-item label="起火场所:">
-        <el-cascader
+      <el-form-item label="勘验信息:">
+        <el-input
+          v-model="pagging.state.query.projectSite"
+          placeholder="请输入"
+        ></el-input>
+        <!-- <el-cascader
           style="width: 100%"
           v-model="projectSite"
           placeholder="请选择"
           :options="[{ label: '全部', value: UN_REQ_NUM.toString() }].concat(place)"
           :props="{ expandTrigger: 'hover', checkStrictly: true }"
-        ></el-cascader>
+        ></el-cascader> -->
       </el-form-item>
       <el-form-item label="承办单位:">
         <com-company v-model="pagging.state.query.deptId" />
       </el-form-item>
-      <el-form-item label="事故日期:">
+      <el-form-item label="勘验日期:">
         <el-date-picker
           type="date"
           v-model="pagging.state.query.accidentDate"
@@ -36,7 +40,7 @@
           style="width: 100%"
         />
       </el-form-item>
-      <el-form-item label="火灾原因:">
+      <!-- <el-form-item label="火灾原因:">
         <el-cascader
           style="width: 100%"
           v-model="fireReason"
@@ -44,7 +48,7 @@
           :options="[{ label: '全部', value: UN_REQ_NUM.toString() }].concat(reason)"
           :props="{ expandTrigger: 'hover', checkStrictly: true }"
         ></el-cascader>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="项目状态:">
         <el-select placeholder="请选择" v-model="pagging.state.query.status" showAll>
           <el-option

+ 16 - 7
src/app/fire/view/dispatch/list.vue

@@ -25,8 +25,8 @@
           {{ pagging.state.pag.size * (pagging.state.pag.currentPage - 1) + $index + 1 }}
         </div>
       </el-table-column>
-      <el-table-column label="项目编号" prop="projectSn"></el-table-column>
-      <el-table-column label="起火对象" prop="projectName" v-slot:default="{ row }">
+      <el-table-column label="事件分类" prop="projectSn"></el-table-column>
+      <el-table-column label="分类登记" prop="projectName" v-slot:default="{ row }">
         <el-tooltip
           class="item"
           effect="dark"
@@ -38,7 +38,7 @@
         </el-tooltip>
         <p class="tip" v-else>{{ row.projectName }}</p>
       </el-table-column>
-      <el-table-column label="起火地址" prop="projectAddress" v-slot:default="{ row }">
+      <el-table-column label="详细地址" prop="projectAddress" v-slot:default="{ row }">
         <el-tooltip
           class="item"
           effect="dark"
@@ -50,7 +50,11 @@
         </el-tooltip>
         <p class="tip" v-else>{{ row.projectAddress }}</p>
       </el-table-column>
-      <el-table-column label="起火场所" prop="projectSite" v-slot:default="{ row }">
+      <el-table-column
+        label="天气情况等标准化勘验信息"
+        prop="projectSite"
+        v-slot:default="{ row }"
+      >
         <el-tooltip
           class="item"
           effect="dark"
@@ -62,9 +66,14 @@
         </el-tooltip>
         <p class="tip" v-else>{{ row.projectSite }}</p>
       </el-table-column>
+      <el-table-column label="勘验地址" prop="field1"></el-table-column>
+      <el-table-column label="全宗名称" prop="field2"></el-table-column>
+      <el-table-column label="勘验人姓名" prop="field3"></el-table-column>
+      <el-table-column label="勘验人单位、职务" prop="field4"></el-table-column>
+
       <el-table-column label="承办单位" prop="organizerDeptName"></el-table-column>
-      <el-table-column label="事故日期" prop="accidentDate"></el-table-column>
-      <el-table-column label="火灾原因" prop="fireReason" v-slot:default="{ row }">
+      <el-table-column label="勘验日期" prop="accidentDate"></el-table-column>
+      <!-- <el-table-column label="火灾原因" prop="fireReason" v-slot:default="{ row }">
         <el-tooltip
           class="item"
           effect="dark"
@@ -75,7 +84,7 @@
           <p class="tip oper-user">{{ row.fireReason }}</p>
         </el-tooltip>
         <p class="tip" v-else>{{ row.fireReason }}</p>
-      </el-table-column>
+      </el-table-column> -->
       <el-table-column label="项目状态" v-slot:default="{ row }">
         {{ fireStatusDesc[row.status as FireStatus] }}
       </el-table-column>

+ 2 - 0
src/request/urls.ts

@@ -65,6 +65,7 @@ export const getCompanyList = "/web/department/getAll";
 // 获取场景列表
 export const getSceneList = "/fusion/scene/list";
 export const delScene = "/fusion/scene/deleteNum";
+export const copyScene = "/fusion/scene/deleteNum";
 export const checkGenMeshScene = "/fusion/scene/sceneDetail";
 export const genMeshSceneByCloud = "/fusion/scene/buildSceneObj";
 
@@ -82,6 +83,7 @@ export const updateModelScene = `/fusion/model/updateTitle`;
 // 取消模型场景上传
 export const cancelUModel = `/fusion/model/cancelUpload`;
 export const deleteModel = `/fusion/model/delete`;
+export const copyModel = `/fusion/model/copy`;
 export const uploadModel = `/fusion/model/uploadObj`;
 export const getModelRunProgress = `/fusion/model/uploadObjProgress`;
 

+ 8 - 0
src/store/scene.ts

@@ -5,6 +5,8 @@ import {
   axios,
   cancelUModel,
   checkGenMeshScene,
+  copyModel,
+  copyScene,
   delScene,
   deleteModel,
   downloadSceneList,
@@ -101,6 +103,9 @@ export const cancelUploadModelScene = (scene: ModelScene) =>
 export const delModelScene = (scene: ModelScene) =>
   axios.post(deleteModel, { modelId: scene.modelId });
 
+export const copyModelScene = (scene: ModelScene) =>
+  axios.post(copyModel, { modelId: scene.modelId });
+
 export const uploadModelScene = (
   file: File,
   progressCallback: (progress: number) => void
@@ -158,6 +163,9 @@ export const getScenePagging = async (params: ScenePaggingParams) => {
 export const delQuoteScene = (scene: QuoteScene) =>
   axios.get(delScene, { params: { num: scene.num } });
 
+export const copyQuoteScene = (scene: QuoteScene) =>
+  axios.get(copyScene, { params: { num: scene.num } });
+
 export type QueryDownloadQuoteSceneParams = PaggingReq<{
   deptId: string;
   userName: string;

+ 1 - 1
src/view/case/share.vue

@@ -1,7 +1,7 @@
 <template>
   <el-form ref="form" label-width="80px" class="share-from">
     <el-form-item label="链接">
-      <el-input :modelValue="shareLink" placeholder="请输入项目编号" disabled />
+      <el-input :modelValue="shareLink" placeholder="请输入事件分类" disabled />
     </el-form-item>
     <el-form-item label="密码">
       <el-input

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

@@ -139,7 +139,7 @@ export const statisticsConfigs: ConfigItem[] = reactive([
     },
   },
   {
-    title: "起火场所统计",
+    title: "天气情况等标准化勘验信息统计",
     data: {
       tooltip: {
         trigger: "axis",

+ 14 - 0
src/view/vrmodel/modelContent.vue

@@ -46,6 +46,13 @@
     <el-table-column label="操作" v-slot:default="{ row }">
       <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"
@@ -89,6 +96,7 @@ import {
   uploadModelScene,
   delModelScene,
   getModelSceneStatus,
+  copyModelScene,
 } from "@/store/scene";
 import {
   ModelMaxSize,
@@ -132,6 +140,12 @@ const editHanlder = async (scene: ModelScene) => {
   }
 };
 
+const copyHanlder = async (scene: ModelScene) => {
+  if (await copyModelScene(scene)) {
+    props.pagging.refresh();
+  }
+};
+
 const {
   percentage,
   upload: uploadCheck,

+ 12 - 0
src/view/vrmodel/sceneContent.vue

@@ -28,6 +28,13 @@
     <el-table-column label="操作" v-slot:default="{ row }: { row: QuoteScene }">
       <span
         class="oper-span"
+        @click="copySceneHandler(row)"
+        v-if="row.status === QuoteSceneStatus.SUCCESS"
+      >
+        复制
+      </span>
+      <span
+        class="oper-span"
         v-pdpath="['view']"
         @click="openSceneUrl(row, OpenType.query)"
         v-if="row.status === QuoteSceneStatus.SUCCESS"
@@ -87,6 +94,7 @@ import {
   SceneType,
   genMeshScene,
   LocationEnum,
+  copyQuoteScene,
 } from "@/store/scene";
 import { ScenePagging } from "./pagging";
 import { QuoteSceneStatusDesc } from "@/constant/scene";
@@ -101,6 +109,10 @@ const delSceneHandler = async (scene: QuoteScene) => {
     props.pagging.refresh();
   }
 };
+const copySceneHandler = async (scene: QuoteScene) => {
+  await copyQuoteScene(scene);
+  props.pagging.refresh();
+};
 const sceneDownloadHandler = (scene: QuoteScene) => {
   sceneDownload({ scene });
 };

+ 1 - 1
vite.config.ts

@@ -3,7 +3,7 @@ import vue from "@vitejs/plugin-vue";
 import { resolve } from "path";
 import ElementPlus from "unplugin-element-plus/vite";
 
-let app = "criminal";
+let app = "fire";
 if (process.argv.length > 3) {
   app = process.argv[process.argv.length - 1].trim();
 }