Explorar el Código

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

bill hace 1 año
padre
commit
66b7462619

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1071 - 781
pnpm-lock.yaml


+ 3 - 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,8 @@ axios.interceptors.request.use(async (config) => {
 
 const responseInterceptor = (res: AxiosResponse<any, any>) => {
   closeLoading();
-  if (!successCode.includes(res.data.code)) {
+  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);
 

+ 10 - 0
src/request/urls.ts

@@ -180,6 +180,12 @@ export const insertCaseFile = "/fusion-xj/caseFiles/add";
 export const deleteCaseFile = "/fusion-xj/caseFiles/delete";
 export const updateCaseFile = "/fusion-xj/caseFiles/updateTitle";
 
+//勘验笔录信息
+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";
@@ -218,6 +224,10 @@ export const downloadSceneList = "/fusion-xj/sceneDownLog/list";
 export const offLine = "/web/fireProject/offLine"; //{roomId}
 export const onLine = "/web/fireProject/onLine"; //{roomId}
 export const onLineCheck = "/web/fireProject/onLineCheck";
+// 照片制卷
+export const caseApiList = "/fusion-xj/caseImg/list";
+export const saveApiOrUpdate = "/fusion-xj/caseImg/saveOrUpdate";
+export const caseApiDel = "/fusion-xj/caseImg/delete";
 
 export const getSysSetting = `/fusion-xj/systemSetting/info`;
 export const updateSysSetting = `/fusion-xj/systemSetting/save`;

+ 34 - 0
src/store/case.ts

@@ -7,6 +7,12 @@ import {
   setCasePsw,
   syncInfo,
   updateCaseFile,
+  caseApiList,
+  saveApiOrUpdate,
+  caseApiDel,
+  caseInquestInfo,
+  caseInquestOpt,
+  caseInquestExport
 } from "@/request";
 import { ModelScene, QuoteScene, Scene, SceneType } from "./scene";
 import { CaseFile } from "./caseFile";
@@ -20,6 +26,15 @@ export type Case = {
   userName: number;
 };
 
+export type CaseImg = {
+  id: number;
+  caseId: number;
+  imgInfo: string | null;
+  imgUrl: string | null;
+  status: number | null;
+  sort: number | null;
+};
+
 export const setCaseSharePWD = (params: { caseId: number; randCode: string }) =>
   axios.post(setCasePsw, params);
 
@@ -69,3 +84,22 @@ export const getCaseScenes = (scenes: Scene[]) => {
 
 export const replaceCaseScenes = (caseId: number, caseScenes: CaseScenes) =>
   axios.post(repCaseScenes, { sceneNumParam: caseScenes, caseId });
+
+export const caseImgList = (caseId: number, orderBy: string) =>
+  axios.post(caseApiList, { orderBy: orderBy || 'desc', caseId });
+
+export const saveOrUpdate = (params: CaseImg) =>
+  axios.post(saveApiOrUpdate, { ...params });
+
+export const caseDel = (id: number) =>
+  axios.post(caseApiDel, { id });
+
+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' });

+ 30 - 15
src/view/case/addPhotoFile.vue

@@ -13,7 +13,7 @@
         :disabled="!!file"
         :before-upload="upload"
         :file-list="fileList"
-        :http-request="() => {}"
+        :http-request="httpsApi"
         :on-preview="previewFile"
         :accept="accept"
         :before-remove="removeFile"
@@ -24,7 +24,7 @@
         <template v-slot:tip>
           <div class="el-upload__tip">注:可上传{{ size }}以内的{{ formatDesc }}</div>
         </template>
-        <template v-slot:file="{ file }: { file: UploadFile }">
+        <template v-slot:file="{ file }">
           <div class="file" @click.stop="previewFile()">
             <div>
               <el-icon><Document /></el-icon>
@@ -37,7 +37,7 @@
     </el-form-item>
     <el-form-item label="附件标题:" class="mandatory">
       <el-input
-        v-model="caseFile.filesTitle"
+        v-model="caseFile.imgInfo"
         placeholder="请输入最多不能超过50字"
         maxlength="50"
         show-word-limit
@@ -54,50 +54,65 @@ import {
   OtherFormatDesc,
   OtherFormats,
 } from "@/constant/caseFile";
+import { uploadFile } from "@/store/system";
 import { maxFileSize } from "@/constant/caseFile";
 import { useUpload } from "@/hook/upload";
-import { CaseFile, addCaseFile } from "@/store/caseFile";
-import { ElMessage, UploadFile } from "element-plus";
+import { saveOrUpdate, CaseImg } from "@/store/case";
+import { ElMessage } from "element-plus";
 import { computed, ref, watchEffect } from "vue";
 import { QuiskExpose } from "@/helper/mount";
 
 const props = defineProps<{
   caseId: number;
-  fileType: number;
+  data: CaseImg;
 }>();
 
-const caseFile = ref<CaseFile>({
+const caseFile = ref<CaseImg>({
   caseId: props.caseId,
-  filesTypeId: props.fileType,
-  filesTitle: "",
+  id: props.data?.id,
+  imgUrl: props.data.imgUrl,
+  imgInfo: props.data.imgInfo,
+  sort: props.data?.sort || '',
 } as any);
 
 const { size, fileList, upload, removeFile, previewFile, file, accept } = useUpload({
   maxSize: maxFileSize,
-  formats: props.fileType === FileDrawType ? DrawFormats : OtherFormats,
+  formats: DrawFormats,
 });
 
 const formatDesc = computed(() =>
-  props.fileType === FileDrawType ? DrawFormatDesc : OtherFormatDesc
+DrawFormatDesc
 );
 
 watchEffect(() => {
   if (file.value?.name) {
-    caseFile.value.filesTitle = file.value?.name.substring(0, 50);
+    caseFile.value.imgUrl = file.value && file.value[0]?.url;
+    caseFile.value.imgInfo = file.value?.name.substring(0, 50);
   }
 });
 
+const httpsApi = async ({file})=> {
+  console.log('httpsApi', file)
+  let fileUrl = await uploadFile(file);
+
+  file.value = [{
+    name: file.name,
+    url: fileUrl,
+  }]
+  console.log('httpsApi', file, fileUrl)
+}
+
 defineExpose<QuiskExpose>({
   async submit() {
     if (!file.value) {
       ElMessage.error("请上传附件");
       throw "请上传附件";
-    } else if (!caseFile.value.filesTitle.trim()) {
+    } else if (!caseFile.value.imgInfo.trim()) {
       ElMessage.error("附件标题不能为空!");
       throw "附件标题不能为空!";
     }
-
-    await addCaseFile({ ...caseFile.value, file: file.value });
+    console.log('defineExpose', caseFile.value, file.value.value[0]?.url)
+    await saveOrUpdate({ ...caseFile.value, imgUrl: file.value && file.value.value && file.value.value[0]?.url });
     return caseFile.value;
   },
 });

+ 4 - 0
src/view/case/caseFile.vue

@@ -8,6 +8,9 @@
     <template v-else-if="currentTypeId === 3">
       <Records :caseId="caseId" />
     </template>
+    <template v-else-if="currentTypeId === 5">
+      <Manifest :caseId="caseId" />
+    </template>
     <template v-else>
       <div class="body-head">
         <h3 style="visibility: hidden">场景管理</h3>
@@ -91,6 +94,7 @@ import { appConstant } from "@/app";
 import { ElIcon, ElInput, ElMessage } from "element-plus";
 import Photos from "./photos/index.vue";
 import Records from "./records/index.vue";
+import Manifest from "./records/manifest.vue";
 
 const caseId = computed(() => {
   const caseId = router.currentRoute.value.params.caseId;

+ 29 - 5
src/view/case/photos/draggable.vue

@@ -2,8 +2,11 @@
   <div class="VueDraggable">
     <VueDraggable v-if="list.length" class="draggable" ref="el" v-model="list" @sort="onChange">
       <div class="item" v-for="(item, index) in list" :key="item.id" @click="handleItem(index)">
-        <img class="itemImg" src="https://4dscene.4dage.com/new4dkk/v2/lang/images/home/caseList/bwg.png" alt="" />
-        <div class="text">{{ item.name }}</div>
+        <img class="itemImg" :src="item.imgUrl" alt="" />
+        <div class="text">
+          {{ item.imgInfo }}
+           <EditPen @click.stop="handleEdit(item)" class="EditPen" />
+        </div>
         <CircleCloseFilled @click.stop="handleDet(index)" class="itemIcon" />
       </div>
     </VueDraggable>
@@ -13,10 +16,11 @@
 
 <script setup lang="ts">
 import { ref, onMounted, watch } from 'vue'
-import { Case } from "@/store/case";
+import { caseImgList, CaseImg } from "@/store/case";
 import { VueDraggable } from 'vue-draggable-plus'
+import { addCaseImgFile } from "../quisk";
 // import { IconRabbish } from '@element-plus/icons-vue'
-const props = defineProps({ sortType: Boolean });
+const props = defineProps({ sortType: Boolean, caseId: Number });
 const emit = defineEmits<{
   (e: "changeList", value: Case[] | null): void;
   (e: "handleItem", value: Number | null): void;
@@ -125,13 +129,24 @@ function handleItem(index) {
   emit("handleItem", index);
   
 }
+async function getList () {
+  let lists = await caseImgList(props.caseId)
+  list.value = lists.data
+  emit("changeList", list.value);
+
+}
 function handleDet(index: Number) {
   list.value.splice(index, 1)
   emit("changeList", list.value);
   console.log('handleDet', list.value);
 }
+function handleEdit(params) {
+  addCaseImgFile({ caseId: props.caseId, data: {
+    ...params,
+  } });
+}
 onMounted(() => {
-  emit("changeList", list.value);
+  getList()
   // emit("update:list", props.list.value);
 })
 
@@ -152,6 +167,15 @@ onMounted(() => {
     margin-top: 16px;
     .itemImg{
       width: 100%;
+      height: 62px;
+      object-fit: cover;
+    }
+    .text{
+      .EditPen{
+        width: 20px;
+        height: 20px;
+        float: right;
+      }
     }
     .itemIcon{
       width: 20px;

+ 11 - 6
src/view/case/photos/index.vue

@@ -10,7 +10,7 @@
           >{{ sortType ? "横排" : "竖排" }}</el-button
         >
       </div>
-      <draggable :sortType="sortType" @changeList="changeList" @handleItem="handleItem" />
+      <draggable :caseId="caseId" :sortType="sortType" @changeList="changeList" @handleItem="handleItem" />
     </div>
     <div class="right">
       <swiper
@@ -32,10 +32,10 @@
             >
               <img
                 class="itemImg"
-                src="https://4dscene.4dage.com/new4dkk/v2/lang/images/home/caseList/bwg.png"
+                :src="eleItem.imgUrl"
                 alt=""
               />
-              <div class="text">{{ eleItem.name }}</div>
+              <div class="text">{{ eleItem.imgInfo }}</div>
             </div>
             <div class="page">
               <span style="margin-right: 16px">第 {{ index + 1 }} 页</span>
@@ -54,8 +54,8 @@ import { Menu, FullScreen } from "@element-plus/icons-vue";
 import { Swiper, SwiperSlide } from "swiper/vue";
 import "swiper/css";
 // import { addCaseFile } from "@/store/caseFile";
-import { addCaseFile } from "../quisk";
-import draggable from "./draggable.vue";
+import { addCaseImgFile } from "../quisk";
+import draggable from './draggable.vue';
 const props = defineProps({ caseId: Number });
 const newlist = ref([]);
 const swiperRef = ref(null);
@@ -63,7 +63,12 @@ const caseId = ref(props.caseId);
 const sortType = ref(false);
 console.log(props);
 const addCaseFileHandler = async () => {
-  await addCaseFile({ caseId: caseId.value, fileType: "currentTypeId.value!" });
+  await addCaseImgFile({ caseId: caseId.value, data: {
+    imgUrl: '',
+    imgInfo: '',
+    id: '',
+    sort: '',
+  } });
   refresh();
 };
 const changeList = (list) => {

+ 7 - 0
src/view/case/quisk.ts

@@ -1,3 +1,4 @@
+import addPhotoFile from "./addPhotoFile.vue";
 import AddCaseFile from "./addCaseFile.vue";
 import AddScenes from "./addScenes.vue";
 import ShareCase from "./share.vue";
@@ -15,6 +16,12 @@ export const addCaseFile = quiskMountFactory(AddCaseFile, {
   width: 500,
 });
 
+export const addCaseImgFile = quiskMountFactory(addPhotoFile, {
+  title: "上传附件",
+  width: 500,
+});
+
+
 export const addCaseScenes = quiskMountFactory(AddScenes, {
   title: "添加场景",
   width: 800,

+ 125 - 73
src/view/case/records/index.vue

@@ -3,7 +3,7 @@
   <div class="records">
     <div class="header">
       <el-button type="primary" @click="handleSave">保存</el-button>
-      <el-button>导出</el-button>
+      <el-button @click="handleExport">导出</el-button>
     </div>
     <h3 class="title">基本信息</h3>
     <div class="content">
@@ -11,47 +11,59 @@
       <div class="line">
         <span>勘验次数:</span>
         <span>第</span>
-        <el-input class="input" v-model="data.times" placeholder="" style="width: 80px;" />
+        <el-input class="input" v-model="data.count" placeholder="" style="width: 80px;" />
         <span>次勘验</span>
       </div>
 
       <div class="line">
         <span>勘验时间:</span>
         <div>
-          <el-input class="input" :maxlength="4" type="text" v-model="data.start.year" placeholder=""
+          <el-input class="input" :maxlength="4" type="text" v-model="data.startTime.year" placeholder=""
             style="width: 80px;" />
           <span>年</span>
-          <el-input class="input" :maxlength="2" type="text" v-model="data.start.month" placeholder=""
+          <el-input class="input" :maxlength="2" type="text" v-model="data.startTime.month" placeholder=""
             style="width: 80px;" />
           <span>月</span>
-          <el-input class="input" :maxlength="2" type="text" v-model="data.start.day" placeholder=""
+          <el-input class="input" :maxlength="2" type="text" v-model="data.startTime.day" placeholder=""
             style="width: 80px;" />
           <span>日</span>
+          <el-input class="input" :maxlength="2" type="text" v-model="data.startTime.hour" placeholder=""
+            style="width: 80px;" />
+          <span>时</span>
+          <el-input class="input" :maxlength="2" type="text" v-model="data.startTime.min" placeholder=""
+            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;" />
+          <el-input class="input" :maxlength="4" v-model="data.endTime.year" placeholder="" style="width: 80px;" />
           <span>年</span>
-          <el-input class="input" :maxlength="2" v-model="data.end.month" placeholder="" style="width: 80px;" />
+          <el-input class="input" :maxlength="2" v-model="data.endTime.month" placeholder="" style="width: 80px;" />
           <span>月</span>
-          <el-input class="input" :maxlength="2" v-model="data.end.day" placeholder="" style="width: 80px;" />
+          <el-input class="input" :maxlength="2" v-model="data.endTime.day" placeholder="" style="width: 80px;" />
           <span>日</span>
+          <el-input class="input" :maxlength="2" type="text" v-model="data.endTime.hour" placeholder=""
+            style="width: 80px;" />
+          <span>时</span>
+          <el-input class="input" :maxlength="2" type="text" v-model="data.endTime.min" 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%;" />
+        <el-input class="input" type="tel" v-model="data.address" placeholder="" style="width: 100%;" />
       </div>
       <div class="line">
         <span>勘验人员姓名、单位、职务(含技术职务):</span>
-        <el-input class="input" type="tel" v-model="data.job" placeholder="" style="width: 100%;" />
+        <el-input class="input" type="tel" v-model="data.userInfo" placeholder="" style="width: 100%;" />
 
       </div>
 
       <div class="line">
         <span>勘验气象条件(天气、风力、温度):</span>
-        <el-input class="input" type="tel" v-model="data.condition" placeholder="" style="width: 100%;" />
+        <el-input class="input" type="tel" v-model="data.weather" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="textarea">
@@ -61,32 +73,32 @@
       </div>
       <div class="textarea">
         <span>一、环境勘验</span>
-        <el-input type="textarea" :rows="4" v-model="data.situationEnv" placeholder="" style="width: 100%;" />
+        <el-input type="textarea" :rows="4" v-model="data.environment" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="textarea">
         <span>二、初步勘验</span>
-        <el-input type="textarea" :rows="4" v-model="data.situationPrimary" placeholder="" style="width: 100%;" />
+        <el-input type="textarea" :rows="4" v-model="data.firstInquest" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="textarea">
         <span>三、细项勘验</span>
-        <el-input type="textarea" :rows="4" v-model="data.situationDetail" placeholder="" style="width: 100%;" />
+        <el-input type="textarea" :rows="4" v-model="data.carefulInquest" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="textarea">
         <span>四、专项勘验</span>
-        <el-input type="textarea" :rows="6" v-model="data.situationTask" placeholder="" style="width: 100%;" />
+        <el-input type="textarea" :rows="6" v-model="data.specialInquest" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="textarea">
         <span>提取物品描述:</span>
-        <el-input type="textarea" :rows="6" v-model="data.objectDesc" placeholder="" style="width: 100%;" />
+        <el-input type="textarea" :rows="6" v-model="data.itemDescription" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="textarea">
         <span>现场拍照制图描述:</span>
-        <el-input type="textarea" :rows="6" v-model="data.sceneDesc" placeholder="" style="width: 100%;" />
+        <el-input type="textarea" :rows="6" v-model="data.imgDescription" placeholder="" style="width: 100%;" />
       </div>
 
       <div class="info">
@@ -94,47 +106,47 @@
         <div class="inner">
           <div class="sec">
             <span>勘验负责人</span>
-            <el-input class="input" v-model="data.start.month" placeholder="" />
+            <el-input class="input" v-model="data.leader" placeholder="" />
           </div>
 
           <div class="sec">
             <span> 记录人</span>
-            <el-input class="input" v-model="data.start.month" placeholder="" />
+            <el-input class="input" v-model="data.recorder" placeholder="" />
           </div>
 
           <div class="sec">
             <span>勘验人</span>
-            <el-input class="input" v-model="data.start.month" placeholder="" />
+            <el-input class="input" v-model="data.inspector" placeholder="" />
           </div>
         </div>
       </div>
 
       <div class="gap"></div>
       <!-- 证人 -->
-      <template v-for="index of witnesses">
-        <div class="witness">
+      <template v-for="item of data.witnessInfo">
+        <div class="witnessInfo">
           <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="item.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="item.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="item.month" 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="item.day" 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="item.id" placeholder="" style="width: 280px;" />
           </div>
         </div>
 
       </template>
 
       <div class="btn-container">
-        <el-button class="btn" @click="addWitness">+新增</el-button>
+        <el-button class="btn" @click="addwitnessInfo">+新增</el-button>
       </div>
 
       <div>
@@ -146,33 +158,47 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue';
 import { reactive } from 'vue'
+import {
+  getCaseInquestInfo,
+  saveCaseInquestInfo,
+  exportCaseInquestInfo
+} from "@/store/case";
+import { ElMessage } from 'element-plus'
+import saveAs from "@/util/file-serve";
 const props = defineProps({ caseId: Number })
 
 console.log(props)
 
 const data = reactive({
-  times: "",
-  start: {
+  count: "",
+  startTime: {
     year: "",
     month: "",
-    day: ""
+    day: "",
+    hour: "",
+    min: ""
   },
-  end: {
+  endTime: {
     year: "",
     month: "",
-    day: ""
+    day: "",
+    hour: "",
+    min: ""
   },
-  location: '',
-  job: '',
-  condition: '',
+  address: '',
+  userInfo: '',
+  weather: '',
   situation: '',
-  situationEnv: '',  //环境勘验
-  situationPrimary: '', //初步勘验
-  situationDetail: '', //初步勘验
-  situationTask: '', //专项勘验
-  objectDesc: '',
-  sceneDesc: '',
-  witness: [{
+  environment: '',  //环境勘验
+  firstInquest: '', //初步勘验
+  carefulInquest: '', //细项勘验
+  specialInquest: '', //专项勘验
+  itemDescription: '',
+  imgDescription: '',
+  leader: '',
+  recorder: '',
+  inspector: '',
+  witnessInfo: [{
     name: "",
     year: "",
     month: "",
@@ -189,27 +215,37 @@ const data = reactive({
 
 watch(data, newValue => {
   // data.userName = newValue.userName.replace(/[^0-9]/g, '');
-  const sMonth = newValue.start.month.replace(/[^0-9]/g, '');
-  const sDay = newValue.start.day.replace(/[^0-9]/g, '');
-
-  const eMonth = newValue.end.month.replace(/[^0-9]/g, '');
-  const eDay = newValue.end.day.replace(/[^0-9]/g, '');
-
-  data.start.year = newValue.start.year.replace(/[^0-9]/g, '');
-  data.start.month = Number(sMonth) > 12 ? '12' : sMonth;
-  data.start.day = Number(sDay) > 31 ? '31' : sDay;
-
-  data.end.year = newValue.end.year.replace(/[^0-9]/g, '');
-  data.end.month = Number(eMonth) > 12 ? '12' : eMonth;
-  data.end.day = Number(eDay) > 31 ? '31' : eDay;
-
-  newValue.witness.forEach((item, key) => {
-    const year = newValue.witness[key].year.replace(/[^0-9]/g, '');
-    const month = newValue.witness[key].month.replace(/[^0-9]/g, '');
-    const day = newValue.witness[key].day.replace(/[^0-9]/g, '');
-    data.witness[key].year = year;
-    data.witness[key].month = Number(month) > 12 ? '12' : month;
-    data.witness[key].day = Number(day) > 31 ? '31' : day;
+  const sMonth = newValue.startTime.month.replace(/[^0-9]/g, '');
+  const sDay = newValue.startTime.day.replace(/[^0-9]/g, '');
+  const sHour = newValue.startTime.hour.replace(/[^0-9]/g, '');
+  const sMin = newValue.startTime.min.replace(/[^0-9]/g, '');
+
+  const eMonth = newValue.endTime.month.replace(/[^0-9]/g, '');
+  const eDay = newValue.endTime.day.replace(/[^0-9]/g, '');
+  const eHour = newValue.endTime.hour.replace(/[^0-9]/g, '');
+  const eMin = newValue.endTime.min.replace(/[^0-9]/g, '');
+
+
+  data.startTime.year = newValue.startTime.year.replace(/[^0-9]/g, '');
+  data.startTime.month = Number(sMonth) > 12 ? '12' : sMonth;
+  data.startTime.day = Number(sDay) > 31 ? '31' : sDay;
+  data.startTime.hour = Number(sDay) > 24 ? '24' : sHour;
+  data.startTime.min = Number(sMin) > 60 ? '0' : sMin;
+
+  data.endTime.year = newValue.endTime.year.replace(/[^0-9]/g, '');
+  data.endTime.month = Number(eMonth) > 12 ? '12' : eMonth;
+  data.endTime.day = Number(eDay) > 31 ? '31' : eDay;
+  data.endTime.hour = Number(eHour) > 24 ? '24' : eHour;
+  data.endTime.min = Number(eMin) > 60 ? '0' : eMin;
+
+
+  newValue.witnessInfo.forEach((item, key) => {
+    const year = newValue.witnessInfo[key].year.replace(/[^0-9]/g, '');
+    const month = newValue.witnessInfo[key].month.replace(/[^0-9]/g, '');
+    const day = newValue.witnessInfo[key].day.replace(/[^0-9]/g, '');
+    data.witnessInfo[key].year = year;
+    data.witnessInfo[key].month = Number(month) > 12 ? '12' : month;
+    data.witnessInfo[key].day = Number(day) > 31 ? '31' : day;
   })
 
 }, {
@@ -217,13 +253,21 @@ watch(data, newValue => {
   deep: true
 })
 
-const witnesses = ref(2)
-onMounted(() => {
+onMounted(async () => {
+  const res = await getCaseInquestInfo(props.caseId);
+  console.log('res', res)
+  for (var k in data) {
+    if (res.data && res.data.hasOwnProperty(k)) {
+      console.log("Key is " + k)
+      data[k] = res.data[k]
+    }
+  }
+
 })
 
-const addWitness = () => {
-  witnesses.value += 1
-  data.witness.push({
+const addwitnessInfo = () => {
+  // witnessInfoes.value += 1
+  data.witnessInfo.push({
     name: "",
     year: "",
     month: "",
@@ -232,9 +276,17 @@ const addWitness = () => {
   })
 }
 
-const handleSave = () => {
+const handleSave = async () => {
   console.log('data', data)
-
+  const res = await saveCaseInquestInfo(props.caseId, data);
+  if (res.code === 0) {
+    ElMessage.success('保存成功!')
+  }
+}
+const handleExport = async () => {
+  const res = await exportCaseInquestInfo(props.caseId);
+  console.log('res', res)
+  saveAs(res, `勘验笔录-${props.caseId}.docx`)
 }
 
 </script>
@@ -247,7 +299,7 @@ const handleSave = () => {
 
   .header {
     display: flex;
-    justify-content: flex-end;
+    justify-content: flex-endTime;
   }
 
   .input {
@@ -318,7 +370,7 @@ const handleSave = () => {
 
 }
 
-.witness {
+.witnessInfo {
   background: #F5F5F5;
   padding: 15px;
   margin-top: 20px;

src/view/case/records/index copy.vue → src/view/case/records/manifest.vue