tangning 3 weeks ago
parent
commit
d690d72257

+ 1 - 0
src/view/case/newphotos/index.vue

@@ -150,6 +150,7 @@ const changeList = async (list) => {
   if (!loadedDrawData.value) {
     const imgId = typeof route.query.imgId === 'string' ? Number(route.query.imgId) : undefined;
     const res = await getCaseImgTagData(caseId.value, imgId);
+    console.log("getCaseImgTagData2", res);
     if (res.data) {
       if (res.data.data) {
         loadedDrawData.value = res.data.data;

+ 1 - 0
src/view/case/photos/index.vue

@@ -155,6 +155,7 @@ function refresh() {
 }
 const changeList = async (list) => {
   //同步数据
+  console.log("getCaseImgTagData1", loadedDrawData.value);
   if (!loadedDrawData.value) {
     const imgId = typeof route.query.imgId === 'string' ? Number(route.query.imgId) : undefined;
     const res = await getCaseImgTagData(caseId.value, imgId);

+ 1 - 1
src/view/newFireCase/newFireDetails/components/basicInfo.vue

@@ -33,7 +33,7 @@
         <div class="all-content">
           <!-- <div class="form-title">案件信息</div> -->
           <el-form-item label="案件名称">
-            <el-input v-model="bindFire.caseTitle" maxlength="50" placeholder="请输入案件名称" />
+            <el-input v-model="bindFire.caseTitle" maxlength="100" placeholder="请输入案件名称" />
           </el-form-item>
           <el-form-item label="详细地址" class="mandatory">
             <el-input v-model="bindFire.mapUrl" placeholder="输入名称搜索" clearable disabled>

+ 4 - 1
src/view/newFireCase/newFireDetails/components/headerTop.vue

@@ -10,7 +10,7 @@
     <div class="right-title" v-if="editOrShow === 'edit'">
       <span class="change-btn" v-if="!showSave" @click="openRenameDialog"><i class="iconfont icon-rename" /></span>
       <el-button type="primary" class="preview-btn" v-if="!showSave"  @click="preview">预览</el-button>
-      <el-button type="primary" class="preview-btn" v-if="showSave" @click="$emit('save')">保存</el-button>
+      <el-button type="primary" class="preview-btn" v-if="showSave" @click="autoSave">保存</el-button>
       <el-button
         type="primary"
         class="preview-btn"
@@ -50,6 +50,7 @@ import { ArrowLeft } from "@element-plus/icons-vue";
 import { useRoute } from 'vue-router';
 import { RouteName, router } from "@/router";
 import { ElMessage } from "element-plus";
+import { throttle } from "@/util";
 const props = defineProps<{
   caseId: number;
   currentRecord: object;
@@ -128,6 +129,8 @@ const emit = defineEmits<{
   export: [],
 }>()
 
+const autoSave = throttle(() => emit('save'), 400);
+
 // 导出相关状态与方法(复用 photos/index 的逻辑)
 const isSenseLoaded = ref(true);
 const exportReady = ref(false);

+ 8 - 4
src/view/newFireCase/newFireDetails/components/scene.vue

@@ -116,7 +116,7 @@
         </el-table-column>
         <el-table-column label="所属组织" width="180">
           <template #default="{ row }">
-            {{ row.deptName }}
+            {{ user.info.deptId == row.deptId ? '当前组织' : row.deptName }}
           </template>
         </el-table-column>
         <el-table-column label="拍摄时间" width="200">
@@ -225,8 +225,8 @@ const selectedKeySet = computed(() => {
   return set;
 });
 const rowKey = (row: any) => `${Number(row?.type)}__${String(row?.num)}`;
-const isRowImported = (row: any) => importedKeySet.value.has(rowKey(row));
-const isRowSelectable = (row: any) => !isRowImported(row);
+const isRowImported = (row: any) =>  importedKeySet.value.has(rowKey(row));
+const isRowSelectable = (row: any) => row.status != 2 ? false : !isRowImported(row);
 const rowClassName = ({ row }: { row: any }) => (isRowImported(row) ? 'is-imported-row' : '');
 const preselectRows = () => {
   nextTick(() => {
@@ -349,6 +349,7 @@ const onTitleInput = () => {
 };
 
 const onSelectionChange = (rows: Scene[]) => {
+  console.log(rows, 'rows')
   // 保证“已导入”的行始终在选中集合中,并与跨页选中合并
   const map = new Map<string, any>();
   // 先放入全局已选中的集合(跨页保持)
@@ -384,7 +385,10 @@ const onConfirmEdit = async () => {
     if (!caseId.value) return;
     // 组装 {type, numList},包含当前已有的场景
     const mergedList = mergeScenesWithSelection();
-    const payload = getCaseScenes(mergedList as any[]);
+    const numList = mergedList.map((s: any) => s.num);
+    const oldScene = scenes.value.filter(ele => !numList.includes(ele.num)).map(element => { return { ...element, num: element.num, type: element.sceneType } });
+    console.log(oldScene, 'oldScene',numList, 'numList', scenes.value, 'scenes')
+    const payload = getCaseScenes([...mergedList, ...oldScene] as any[]);
     await replaceCaseScenes(caseId.value, payload);
     // 刷新案件场景列表
     scenes.value = (await getFusionAndSceneList({ caseId: caseId.value, type: 'scene' })) as unknown as Scene[];

+ 3 - 2
src/view/newFireCase/newFireDetails/components/siteInspection.vue

@@ -280,7 +280,7 @@
               </div>
               <div v-else class="records-nopreview">
                 <div class="title">暂不支持预览</div>
-                <el-button  @click="openInquestFile(inquestData)">下载</el-button>
+                <el-button  @click="downloadSelected(inquestData)">下载</el-button>
               </div>
               <el-image-viewer
                 v-if="showViewer"
@@ -310,7 +310,7 @@
               </div>
               <div v-else class="records-nopreview">
                 <div class="title">暂不支持预览</div>
-                <el-button  @click="openInquestFile(inquestData)">下载</el-button>
+                <el-button  @click="downloadSelected(inquestData)">下载</el-button>
               </div>
               <el-image-viewer
                 v-if="showViewer"
@@ -992,6 +992,7 @@ const downloadSelected = async (item: any) => {
     }
     if (activeTab.value === 'extraction') {
       if (!caseId.value) return;
+      if (item.createType == 'upload') return downloadByUrl(item.filesUrl, item.filesTitle)
       const title = ((extractionList.value.find((i) => Number(i?.id) === Number(selectedExtractId.value))?.title) || '提取清单') + '.docx';
       const blob: Blob = await (exportCaseDetailInfo(caseId.value!, item.extractId) as any);
       await saveAs(blob, title);

+ 3 - 34
src/view/newFireCase/newFireDetails/editIndex.vue

@@ -62,6 +62,7 @@ const props = defineProps<{
 }>();
 const emit = defineEmits<{
   'start': any,
+  'showItem': any,
   'playVideo': [value: string | Blob],
 }>()
 // 从路由获取参数
@@ -91,43 +92,11 @@ watch(
 const startShot = (payload?: any) => {
   emit("start", payload);
 }
-const initData = async () => {
-    getFusionAndSceneList({ caseId: caseId.value, type: 'scene' }).then(res => {
-      console.log('getFusionAndSceneList', res)
-      scenes.value = res || []
-    })
-    getFusionAndSceneList({ caseId: caseId.value, type: 'fusion' }).then(res => {
-      console.log('getFusionAndSceneList', res)
-      fusionList.value = res || []
-    })
-    
-    caseFilesTypeGetTree(caseId.value).then(res => {
-      showObj.value.siteInspection = recursiveSearch(res.filter(item => item.filesTypeName != '其他资料'))
-      showObj.value.otherFiles = recursiveSearch(res.filter(item => item.filesTypeName == '其他资料'))
-      console.log('caseFilesTypeGetTree', res, showObj.value)
-      // fusionList.value = res || []
-    })
-    getRecordCaseVideo({ caseId: caseId.value }).then(res => {
-      console.log('getRecordCaseVideo', res)
-      showObj.value.screenRecord = res.length > 0;
-    })
-    // const res: any = await caseFilesTypeGetTree(caseId.value!);
-}
+
 const showItem = (item) => {
-  console.log('showItem', item)
-  if(editOrShow.value === 'edit') return true;
-  if(!item) return false;
-  switch (item.key) { 
-    case 'scene': return scenes.value.length;
-    case 'mix3d': return fusionList.value.length; // 暂时隐藏
-    case 'siteInspection': return showObj.value.siteInspection; // 暂时隐藏
-    case 'otherFiles': return showObj.value.otherFiles; // 暂时隐藏
-    case 'screenRecord': return showObj.value.screenRecord; // 暂时隐藏
-    default: return true;
-  }
+  return emit("showItem", item);
 }
 
-initData()
 // 从路由查询参数中获取当前菜单项,如果没有则默认为 'info'
 let currentMenuKey = ref(route.query.tab as string || 'info');
 // 处理菜单点击事件

+ 70 - 4
src/view/newFireCase/newFireDetails/index.vue

@@ -6,9 +6,9 @@
     <!-- <editInspection :caseId="caseId" :currentRecord="currentRecord" :editOrShow="editOrShow" ref="editInspectionRef" /> -->
     <photoEdit :caseId="caseId" :title="pageTitle" ref="photoEditRef" />
     <!-- 查看页 -->
-    <showIndex :caseId="caseId" :currentRecord="currentRecord" :fromRoute="fromRoute" :processingIds="processingIds" :recentAddedItem="recentAddedItem" @playVideo="playVideo" v-if="editOrShow === 'show'" />
+    <showIndex :caseId="caseId" :currentRecord="currentRecord" :fromRoute="fromRoute" @showItem="showItem" :processingIds="processingIds" :recentAddedItem="recentAddedItem" @playVideo="playVideo" v-if="editOrShow === 'show'" />
     <!-- 编辑页 -->
-    <editIndex :caseId="caseId" :currentRecord="currentRecord" :fromRoute="fromRoute" :processingIds="processingIds" :recentAddedItem="recentAddedItem" @start="startShot" @playVideo="playVideo" v-else />
+    <editIndex :caseId="caseId" :currentRecord="currentRecord" :fromRoute="fromRoute" @showItem="showItem" :processingIds="processingIds" :recentAddedItem="recentAddedItem" @start="startShot" @playVideo="playVideo" v-else />
   </div>
   <shot v-if="isShot" @close="closeHandler" @append="appendFragment" @playVideo="playVideo"
     @updateCover="(cover: string) => $emit('updateCover', cover)" @deleteRecord="$emit('delete')" :record="record" />
@@ -41,6 +41,7 @@ import editIndex from './editIndex.vue';
 import { copyCase, updateCaseInfo, exportCaseDetailInfo, getCaseDetailInfo, getCaseInquestInfo, exportCaseInquestInfo } from "@/store/case";
 import { getCaseInfoOffline as getCaseInfo, getCaseSceneListOffline as getCaseSceneList, uploadRecordFragments, getUploadRecordProgress } from "@/store/editCsae";
 import { RouteName, router } from "@/router";
+import { getFusionAndSceneList, caseFilesTypeGetTree, getRecordCaseVideo } from '@/store/editCsae';
 import shot from './components/shot.vue';
 import headerTop from './components/headerTop.vue';
 import editFilePage from './editFilePage.vue';
@@ -72,6 +73,13 @@ const editFilePageRef = ref<any>(null);
 const editInspectionRef = ref<any>(null);
 const photoEditRef = ref<any>(null);
 const currentRecord = ref<any>({}); // 当前的caseID获取的row
+const fusionList = ref([]);
+const scenes = ref([]);
+const showObj = ref<any>({
+  siteInspection: true,
+  otherFiles: true,
+  screenRecord: true
+});
 const pageTitle = computed(() => {
   const cr: any = currentRecord.value || {};
   return cr?.caseTitle || cr?.tmProject?.projectName || '';
@@ -107,7 +115,53 @@ const loadCaseInfo = async () => {
     vueRouter.replace({ name: RouteName.noCase, query: {} });
   }
 };
-
+const recursiveSearch = (nodes) => {
+    // 如果没有节点,直接返回
+    if (!nodes || !nodes.length) return;
+    
+    // 遍历当前节点
+    for (const node of nodes) {
+      // 检查是否符合条件
+      if (node.caseFilesList && node.caseFilesList.length > 0 && node.caseFilesList.some(file => file.filesUrl)) {
+        // 如果只需要第一个,直接返回
+            return true; // 终止递归
+      }
+      
+      // 如果有子节点,递归查询
+      if (node.childrenList && node.childrenList.length) {
+        const found = recursiveSearch(node.childrenList);
+        // 如果已经找到第一个,终止递归
+        if(found){
+          return true;
+        }
+      }
+    }
+    
+    return false;
+  }
+const initData = async () => {
+    getFusionAndSceneList({ caseId: caseId.value, type: 'scene' }).then(res => {
+      console.log('getFusionAndSceneList', res)
+      scenes.value = res || []
+    })
+    getFusionAndSceneList({ caseId: caseId.value, type: 'fusion' }).then(res => {
+      console.log('getFusionAndSceneList', res)
+      fusionList.value = res || []
+    })
+    
+    caseFilesTypeGetTree(caseId.value).then(res => {
+      showObj.value.siteInspection = recursiveSearch(res.filter(item => item.filesTypeName != '其他资料'))
+      showObj.value.otherFiles = recursiveSearch(res.filter(item => item.filesTypeName == '其他资料'))
+      console.log('caseFilesTypeGetTree', res, showObj.value)
+      // fusionList.value = res || []
+    })
+    getRecordCaseVideo({ caseId: caseId.value }).then(res => {
+      console.log('getRecordCaseVideo', res)
+      showObj.value.screenRecord = res.length > 0;
+    })
+    // const res: any = await caseFilesTypeGetTree(caseId.value!);
+}
+initData()
 onMounted(() => {
   // 路由守卫已校验分享密码,这里正常加载基本信息
   setTimeout(() => {
@@ -291,7 +345,19 @@ const closePreview = () => {
   previewVisible.value = false;
   palyUrl.value = null;
 }
-
+const showItem = (item) => {
+  console.log(item, 'showItem')
+  if(editOrShow.value === 'edit') return true;
+  if(!item) return false;
+  switch (item.key) { 
+    case 'scene': return scenes.value.length;
+    case 'mix3d': return fusionList.value.length; // 暂时隐藏
+    case 'siteInspection': return showObj.value.siteInspection; // 暂时隐藏
+    case 'otherFiles': return showObj.value.otherFiles; // 暂时隐藏
+    case 'screenRecord': return showObj.value.screenRecord; // 暂时隐藏
+    default: return true;
+  }
+}
 const saveEditSub = async () => {
   // 根据当前子编辑页选择对应组件保存
   const sub = route.query.editSub as string | '';

+ 1 - 0
src/view/newFireCase/newFireDetails/photoEdit.vue

@@ -31,6 +31,7 @@ const loadTagInfo = async () => {
   try {
     const res: any = await getCaseImgTagData(caseId.value!, imgId.value);
     const data = res?.data || {};
+    console.log("getCaseImgTagData3", res, data);
     tagId.value = (data?.id as number) || undefined;
     if (typeof data?.isHorizontal === 'boolean') {
       isHorizontal.value = data.isHorizontal as boolean;

+ 6 - 1
src/view/newFireCase/newFireDetails/showIndex.vue

@@ -5,6 +5,7 @@
         v-for="menu in menus" 
         :key="menu.key"
         :index="menu.key"
+        v-if="showItem(menu)"
         @click="handleMenuClick(menu)"
       >
         {{ menu.label }}
@@ -31,7 +32,7 @@
     </template>
   </div>
 </template>
-
+zz
 <script setup lang="ts">
 import { ref, computed, watch, onMounted } from "vue";
 import { useRoute, useRouter } from 'vue-router';
@@ -52,6 +53,7 @@ const props = defineProps<{
 }>();
 const emit = defineEmits<{
   'start': any,
+  'showItem': any,
   'playVideo': [value: string | Blob],
 }>()
 // 从路由获取参数
@@ -70,6 +72,9 @@ watch(() => props.currentRecord, (newVal, oldVal) => {
 const startShot = (payload?: any) => {
   emit("start", payload);
 }
+const showItem = (payload?: any) => {
+  return emit("showItem", payload);
+}
 // 从路由查询参数中获取当前菜单项,如果没有则默认为 'scene'
 let currentMenuKey = ref(route.query.tab as string || 'scene');