فهرست منبع

Merge remote-tracking branch 'origin/dev-frontend_v132' into dev-frontend_yi

# Conflicts:
#	frontend/src/views/Photography/detail.vue
panqiuyao 1 ماه پیش
والد
کامیت
82049138b1

+ 2 - 1
.gitignore

@@ -1,5 +1,6 @@
 node_modules
 out/
+output/
 logs/
 run/
 .idea/
@@ -12,4 +13,4 @@ __pycache__
 *.pyc
 build/*
 **/dist/
-.DS_Store
+.DS_Store

+ 4 - 1
electron/controller/setting.js

@@ -210,7 +210,10 @@ class SettingController extends Controller {
   async syncActions(args) {
     try {
       const result = await syncActions(args);
-      if(result.data)  return result.data
+      if(result.data){
+        await syncSysConfigs(args);
+        return result.data
+      }
       return errData;
     } catch (error) {
       Log.error('同步左右脚配置:', error);

+ 6 - 3
electron/controller/utils.js

@@ -39,14 +39,17 @@ class UtilsController extends Controller {
    * upload
    */
   async shellFun (params) {
-    console.log(params)
     // 如果是打开路径操作,确保路径存在
-    if (params.action === 'openPath') {
+    if (params.action === 'openMkPath') {
       try {
         // 确保目录存在,如果不存在就创建
         if (!fs.existsSync(params.params)) {
           fs.mkdirSync(params.params, { recursive: true });
         }
+
+        shell.openPath(params.params)
+
+        return;
       } catch (err) {
         console.error('创建目录失败:', err);
         // 即使创建目录失败,也尝试打开路径(可能已经存在)
@@ -202,7 +205,7 @@ class UtilsController extends Controller {
 
   getAppConfig(){
     const config  =  readConfigFile()
-    const appPath = app.getAppPath();
+    const appPath = path.join(app.getAppPath(), '../..');
     const pyPath = path.join(path.dirname(appPath), 'extraResources', 'py');
     return  {
       ...config,

+ 23 - 7
frontend/src/views/Photography/components/LoadingDialog.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    v-model="visible"
+    v-model.sync="visible"
     :show-close="!requesting"
     :close-on-click-modal="false"
     :close-on-press-escape="false"
@@ -17,8 +17,11 @@
         :disabled-button="disabledButton"
         :use-new-progress="useNewProgress"
         @complete="handleButtonClick"
+        :on-open-folder="onOpenFolder"
+        :message="message"
       />
 
+
       <!-- 原有的简单进度条 -->
       <div v-else class="progress-container">
         <div class="progress-bar">
@@ -37,14 +40,24 @@
       <slot name="progressMessages"></slot>
 
       <el-button
-        v-if="!disabledButton && !useNewProgress"
-        :disabled="disabledButton"
-        type="primary"
-        class="action-button   button--primary1  mar-top-20"
-        @click="handleButtonClick"
+          v-if="!disabledButton && !useNewProgress"
+          :disabled="disabledButton"
+          type="primary"
+          class="action-button   button--primary1  mar-top-20"
+          @click="handleButtonClick"
       >
         {{ buttonText }}
       </el-button>
+
+
+      <el-button
+          v-if="message  === '全部货号生成失败'"
+          type="primary"
+          class="action-button   button--primary1  mar-top-20"
+          @click="visible = false"
+      >
+        {{ message }}
+      </el-button>
     </div>
   </el-dialog>
 </template>
@@ -61,6 +74,7 @@ interface StepData {
   current: number
   total: number
   error: number
+  folder?: string // 添加folder字段
 }
 
 interface Props {
@@ -72,6 +86,7 @@ interface Props {
   requesting?: boolean
   useNewProgress?: boolean
   progressSteps?: StepData[]
+  onOpenFolder?: (folder: string) => void // 添加打开目录的回调函数
 }
 
 const props = withDefaults(defineProps<Props>(), {
@@ -81,7 +96,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)
+  }
 }
 
 // 处理完成按钮点击

+ 54 - 24
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: newSteps[stepIndex].folder || stepData.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?.status === '处理完成'){
-      //  openOutputDir()
+      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)
+      }
     }
   }
 }
@@ -955,14 +970,20 @@ const handleUploadGoodsProgressMessage = (data: any) => {
 }
 
 // 打开输出目录:appConfig.appPath + '/build/extraResources/py/output'
-const openOutputDir = () => {
+const openOutputDir = (path) => {
   try {
-    const pyPath = useConfigInfoStore?.appConfig?.pyPath || ''
-    if (!pyPath) {
-      ElMessage.error('未获取到应用目录 appPath')
-      return
+    let fullPath = ''
+    if(path){
+      fullPath = path
+    }else{
+
+      const appPath = useConfigInfoStore?.appConfig?.appPath || ''
+      if (!appPath) {
+        ElMessage.error('未获取到应用目录 appPath')
+        return
+      }
+      fullPath  = `${pyPath}\\output`
     }
-    const fullPath = `${pyPath}\\output`
     clientStore.ipc.removeAllListeners(icpList.utils.shellFun);
     clientStore.ipc.send(icpList.utils.shellFun, {
       action: 'openPath',
@@ -1035,6 +1056,10 @@ const generate = async function () {
     return
   }
 
+  // 重置目录打开状态
+  window.segmentFolderOpened = false;
+  window.modelOrSceneFolderOpened = false;
+
   if(form.services.length == 0){
     ElMessage.error('请选择服务内容')
     return
@@ -1252,7 +1277,7 @@ const generate = async function () {
       message.value = loadingMsg
       requesting.value = false  // 重置请求状态,允许再次生成
 
-      handleComplete()
+     // handleComplete()
     }
     // 部分成功
     function handlePartSuccess(output_folder: string, partSuccessList) {
@@ -1410,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

+ 7 - 7
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()
       }
@@ -305,15 +305,15 @@ const menu = computed(()=>{
 const openOutputDir = () => {
   try {
 
-    const pyPath = configInfoStore?.appConfig?.pyPath || ''
-    if (!pyPath) {
+    const appPath = configInfoStore?.appConfig?.appPath || ''
+    if (!appPath) {
       ElMessage.error('未获取到应用目录 appPath')
       return
     }
-    const fullPath = `${pyPath}\\output`
+    const fullPath = `${appPath}\\output`
     clientStore.ipc.removeAllListeners(icpList.utils.shellFun);
     clientStore.ipc.send(icpList.utils.shellFun, {
-      action: 'openPath',
+      action: 'openMkPath',
       params: fullPath.replace(/\//g, '\\')
     });
   } catch (e) {

+ 3 - 3
package.json

@@ -1,8 +1,8 @@
 {
   "name": "ZhiHuiYin",
-  "version": "1.3.2",
-  "description": "智慧拍照机是一种结合人工智能技术与传统摄影设备的创新产品,版本号为1.3.2",
-  "releaseNotes": "1.3.1 版本更新日志:修复自定义尺寸配置",
+  "version": "1.3.3",
+  "description": "智慧拍照机是一种结合人工智能技术与传统摄影设备的创新产品,版本号为1.3.3",
+  "releaseNotes": "1.3.3 详情页目录调整",
   "main": "main.js",
   "scripts": {
     "dev": "ee-bin dev",