Browse Source

feat(photography): 添加生成目录自动打开功能- 在 LoadingDialog 组件中新增 onOpenFolder 回调属性,用于传递打开目录的方法
- 修改 ProgressSteps 组件,支持点击“查看结果”时自动打开对应生成目录
- 更新 detail.vue 中的进度处理逻辑,确保每个步骤可携带 folder 字段并控制只打开一次-为 shot.vue 页面中的菜单项名称从“生成目录”更正为“生成图目录”
- 引入全局变量标记目录是否已打开,防止重复触发打开操作
- 调整进度步骤数据结构,增加 folder 字段以存储生成目录路径
- 完善 IPC 消息处理流程,在处理完成时根据条件自动调用打开目录函数
- 移除页面卸载前未清理的事件监听器,并优化相关生命周期钩子逻辑

panqiuyao 1 tháng trước cách đây
mục cha
commit
72eda905a7

+ 5 - 1
frontend/src/views/Photography/components/LoadingDialog.vue

@@ -17,6 +17,7 @@
         :disabled-button="disabledButton"
         :use-new-progress="useNewProgress"
         @complete="handleButtonClick"
+        :on-open-folder="onOpenFolder"
       />
 
       <!-- 原有的简单进度条 -->
@@ -61,6 +62,7 @@ interface StepData {
   current: number
   total: number
   error: number
+  folder?: string // 添加folder字段
 }
 
 interface Props {
@@ -72,6 +74,7 @@ interface Props {
   requesting?: boolean
   useNewProgress?: boolean
   progressSteps?: StepData[]
+  onOpenFolder?: (folder: string) => void // 添加打开目录的回调函数
 }
 
 const props = withDefaults(defineProps<Props>(), {
@@ -81,7 +84,8 @@ const props = withDefaults(defineProps<Props>(), {
   buttonText: '处理完毕,点击打开最终图片目录',
   requesting: false,
   useNewProgress: false,
-  progressSteps: () => []
+  progressSteps: () => [],
+  onOpenFolder: () => {} // 默认空函数
 })
 
 const emit = defineEmits<{

+ 10 - 4
frontend/src/views/Photography/components/ProgressSteps.vue

@@ -36,9 +36,9 @@
 
             </div>
           </div>
-<!--          <div v-if="step.status === '处理完成'" class="step-actions">
+          <div v-if="step.folder" class="step-actions">
             <span class="view-results" @click="handleViewResults(step)">查看结果</span>
-          </div>-->
+          </div>
         </div>
 
         <!-- 连接线 -->
@@ -73,6 +73,7 @@ interface StepData {
   current: number
   total: number
   error: number
+  folder?: string // 添加folder字段
 }
 
 interface Props {
@@ -80,13 +81,15 @@ interface Props {
   disabledButton?: boolean
   useNewProgress?: boolean
   onComplete?: () => void
+  onOpenFolder?: (folder: string) => void // 添加打开目录的回调函数
 }
 
 const props = withDefaults(defineProps<Props>(), {
   steps: () => [],
   useNewProgress: false,
   disabledButton: true,
-  onComplete: () => {}
+  onComplete: () => {},
+  onOpenFolder: () => {} // 默认空函数
 })
 
 const emit = defineEmits<{
@@ -132,7 +135,10 @@ const getCurrentGoodsNo = (step: StepData) => {
 // 处理查看结果
 const handleViewResults = (step: StepData) => {
   console.log('查看结果:', step)
-  // 这里可以添加查看结果的逻辑
+  // 如果有folder路径,则调用外部传入的打开目录方法
+  if (step.folder && props.onOpenFolder) {
+    props.onOpenFolder(step.folder)
+  }
 }
 
 // 处理完成按钮点击

+ 42 - 18
frontend/src/views/Photography/detail.vue

@@ -295,7 +295,7 @@
 
 
   <loading-dialog v-if="loadingDialogVisible" v-model="loadingDialogVisible" :requesting="requesting" :progress="progress" :message="message"
-    :disabled-button="disabledButton" :use-new-progress="useNewProgress" :progress-steps="progressSteps" @button-click="handleComplete">
+    :disabled-button="disabledButton" :use-new-progress="useNewProgress" :progress-steps="progressSteps" @button-click="handleComplete" :on-open-folder="openOutputDir">
     <template v-if="partErrList && partErrList.length > 0" #errList>
       <div v-for="(item, idx) in partErrList" :key="idx">
         <span v-if="item.goods_art_no">{{ item.goods_art_no }}:</span><span>{{ item.info }}</span>
@@ -433,7 +433,8 @@ const updateProgressStep = (msgType: string, stepData: any) => {
       status: stepData.status,
       current: stepData.current || 0,
       total: stepData.total || 0,
-      error: stepData.error || 0
+      error: stepData.error || 0,
+      folder: stepData.folder || newSteps[stepIndex].folder // 保持已有的folder或使用新的
     }
     progressSteps.value = newSteps
     console.log('Updated step:', newSteps[stepIndex])
@@ -446,7 +447,8 @@ const updateProgressStep = (msgType: string, stepData: any) => {
       status: stepData.status,
       current: stepData.current || 0,
       total: stepData.total || 0,
-      error: stepData.error || 0
+      error: stepData.error || 0,
+      folder: stepData.folder // 添加folder字段
     }]
     console.log('Added new step:', progressSteps.value[progressSteps.value.length - 1])
   }
@@ -535,13 +537,13 @@ onMounted(() => {
   getLogolist()
 
   loadDetailCache()
-})
 
-// 监听数据类型变化,自动保存到缓存
-watch(() => form.dataType, (newValue) => {
-  if (newValue) {
-    saveDataTypeToCache(newValue)
-  }
+  // 初始化目录打开状态标记
+  window.segmentFolderOpened = false;
+  window.modelOrSceneFolderOpened = false;
+
+  // 监听子组件发出的打开目录事件
+  window.addEventListener('openFolder', handleOpenFolder);
 })
 
 // 页面卸载时清理监听器
@@ -553,8 +555,10 @@ onBeforeUnmount(() => {
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_upload_goods_progress');
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_detail_result_progress');
   clearInterval(INTERVAL.value);
-})
 
+  // 移除事件监听器
+  window.removeEventListener('openFolder', handleOpenFolder);
+})
 
 // 计算属性,获取当前页可见的模板
 const visibleTemplates = computed(() => {
@@ -863,8 +867,8 @@ const handleSegmentProgressMessage = (data: any) => {
     const messageData = {
       goods_no: '',
       temp_name: '',
-      status: data.data.status,
-      goods_art_nos: data.data.goods_art_nos,
+      status: data.data?.status || '',
+      goods_art_nos: data.data?.goods_art_nos || [],
       msg: data.msg,
       timestamp: Date.now()
     }
@@ -875,12 +879,13 @@ const handleSegmentProgressMessage = (data: any) => {
 
     // 更新新的进度条
     if (data.progress) {
-      if(['处理完成','处理失败'].includes( progressSteps.value[0].status)){
+      if(['处理完成','处理失败'].includes( progressSteps.value[0]?.status)){
         return;
       }
       updateProgressStep('segment_progress', data.progress)
-      if(data.progress?.folder){
-       openOutputDir(data.progress?.folder)
+      if(data.progress?.folder && !window.segmentFolderOpened){
+        window.segmentFolderOpened = true;
+        openOutputDir(data.progress?.folder)
       }
     }
   }
@@ -905,6 +910,11 @@ const handleUpperFooterProgressMessage = (data: any) => {
     // 更新新的进度条
     if (data.progress) {
       updateProgressStep('upper_footer_progress', data.progress)
+      // 如果是处理完成状态且目录还未打开,则打开目录
+      if(data.progress?.folder  && !window.modelOrSceneFolderOpened){
+        window.modelOrSceneFolderOpened = true;
+        openOutputDir(data.progress?.folder)
+      }
     }
   }
 }
@@ -928,6 +938,11 @@ const handleSceneProgressMessage = (data: any) => {
     // 更新新的进度条
     if (data.progress) {
       updateProgressStep('scene_progress', data.progress)
+      // 如果是处理完成状态且目录还未打开,则打开目录
+      if(data.progress?.folder  && !window.modelOrSceneFolderOpened){
+        window.modelOrSceneFolderOpened = true;
+        openOutputDir(data.progress?.folder)
+      }
     }
   }
 }
@@ -1041,6 +1056,10 @@ const generate = async function () {
     return
   }
 
+  // 重置目录打开状态
+  window.segmentFolderOpened = false;
+  window.modelOrSceneFolderOpened = false;
+
   if(form.services.length == 0){
     ElMessage.error('请选择服务内容')
     return
@@ -1258,7 +1277,7 @@ const generate = async function () {
       message.value = loadingMsg
       requesting.value = false  // 重置请求状态,允许再次生成
 
-      handleComplete()
+     // handleComplete()
     }
     // 部分成功
     function handlePartSuccess(output_folder: string, partSuccessList) {
@@ -1416,8 +1435,13 @@ function openPhotographySeniorDetail() {
   clientStore.ipc.send(icpList.utils.openMain, params);
 }
 
-
-
+// 处理打开目录事件
+const handleOpenFolder = (event) => {
+  const { folder } = event.detail;
+  if (folder) {
+    openOutputDir(folder);
+  }
+}
 
 const handleComplete = () => {
   // loadingDialogVisible.value = false

+ 3 - 3
frontend/src/views/Photography/shot.vue

@@ -252,7 +252,7 @@ const menu = computed(()=>{
         }
       },
       {
-        name:'生成目录',
+        name:'生成目录',
         click(){
           openOutputDir()
         }
@@ -271,7 +271,7 @@ const menu = computed(()=>{
         type:'developer'
       },
       {
-        name:'生成目录',
+        name:'生成目录',
         click(){
           openOutputDir()
         }
@@ -288,7 +288,7 @@ const menu = computed(()=>{
       type:'setting'
     },
     {
-      name:'生成目录',
+      name:'生成目录',
       click(){
         openOutputDir()
       }