소스 검색

feat(Photography): 添加商品上传进度展示并优化详情页面功能- 在详情页面添加打开输出目录按钮和功能
- 新增商品上传进度消息处理和展示
- 优化模型选择验证逻辑
- 调整进度消息监听器的移除时机
- 更新智能摄影配置信息获取方式

panqiuyao 3 달 전
부모
커밋
8d66e6601a
4개의 변경된 파일79개의 추가작업 그리고 8개의 파일을 삭제
  1. 2 1
      electron/controller/utils.js
  2. 5 1
      electron/utils/socket.js
  3. 2 1
      frontend/src/views/Photography/check.vue
  4. 70 5
      frontend/src/views/Photography/detail.vue

+ 2 - 1
electron/controller/utils.js

@@ -163,7 +163,8 @@ class UtilsController extends Controller {
     const config  =  readConfigFile()
     return  {
       ...config,
-      userDataPath: app.getPath('userData')
+      userDataPath: app.getPath('userData'),
+      appPath: app.getAppPath()
     }
   }
   async readFileImageForPath(filePath,maxWidth=1500){

+ 5 - 1
electron/utils/socket.js

@@ -17,7 +17,10 @@ const typeToMessage = {
   send_command:"developer",
   smart_shooter_get_camera_property:"seeting",
   detail_progress:"PhotographyDetail",
-  segment_progress:"PhotographyDetail"
+  segment_progress:"PhotographyDetail",
+  upper_footer_progress:"PhotographyDetail",
+  scene_progress:"PhotographyDetail",
+  upload_goods_progress:"PhotographyDetail"
 }
 
 
@@ -108,6 +111,7 @@ const pySocket = function () {
                   }
                 })
               }else{
+                console.log(this.app);
                 if(this.app.electron[typeToMessage[this_data.msg_type]]) this.app.electron[typeToMessage[this_data.msg_type]].webContents.send(channel, this_data);
               }
             }else{

+ 2 - 1
frontend/src/views/Photography/check.vue

@@ -200,6 +200,7 @@ const loading = ref(true)
 const editData = ref(null);
 const imageTplPath = ref(null)
 function takePictures() {
+  if(loading.value) return;
   console.log(editData);
   console.log(editData.value.editRowData);
 
@@ -287,7 +288,7 @@ clientStore.ipc.on(icpList.socket.message+'_run_mcu_single', async (event, resul
     step.value = 2
     loading.value = false;
   }else {
-    loading.value = false;
+ //   loading.value = false;
     showVideo()
     if(result.code !== 0 && result.msg) ElMessage.error(result.msg)
   }

+ 70 - 5
frontend/src/views/Photography/detail.vue

@@ -290,9 +290,12 @@
       <div class="progress-messages" v-if="progressMessages.length">
         <div class="message-header">
           <span>处理进度</span>
-          <el-button type="text" @click="showMessageHistory = !showMessageHistory" v-log="{ describe: { action: '点击查看进度详情' } }">
-            {{ showMessageHistory ? '收起' : '查看详情' }}
-          </el-button>
+          <div class="flex right" style="gap:8px; align-items:center;">
+            <el-button type="text" @click="openOutputDir" v-log="{ describe: { action: '点击打开输出目录' } }">打开目录</el-button>
+            <el-button type="text" @click="showMessageHistory = !showMessageHistory" v-log="{ describe: { action: '点击查看进度详情' } }">
+              {{ showMessageHistory ? '收起' : '查看详情' }}
+            </el-button>
+          </div>
         </div>
         <div class="message-list" v-if="showMessageHistory" ref="messageListRef">
           <div v-for="(msg, index) in progressMessages" :key="index" class="message-item flex left">
@@ -358,6 +361,12 @@ import { Close, Warning } from '@element-plus/icons-vue'
 import LoadingDialog from '@/views/Photography/components/LoadingDialog.vue'
 
 
+import configInfo from "@/stores/modules/config";
+
+const useConfigInfoStore = configInfo();
+
+
+
 import { useCheckInfo } from '@/composables/userCheck';
 useCheckInfo();
 
@@ -452,6 +461,7 @@ onBeforeUnmount(() => {
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_segment_progress');
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_upper_footer_progress');
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_scene_progress');
+  clientStore.ipc.removeAllListeners(icpList.socket.message + '_upload_goods_progress');
   clientStore.ipc.removeAllListeners(icpList.generate.generatePhotoDetail);
   clearInterval(INTERVAL.value);
 })
@@ -627,6 +637,44 @@ const handleSceneProgressMessage = (data: any) => {
   }
 }
 
+// 处理商品上传进度
+const handleUploadGoodsProgressMessage = (data: any) => {
+  console.log("upload_goods_progress", data);
+  if (data.code === 0 && data.msg_type === 'upload_goods_progress') {
+    const messageData = {
+      goods_no: '',
+      temp_name: '',
+      status: data.data?.status || '',
+      goods_art_nos: data.data?.goods_art_nos || [],
+      msg: data.msg,
+      timestamp: Date.now()
+    }
+    progressMessages.value.push(messageData)
+    message.value = `货号${(data.data?.goods_art_nos || []).join(', ')}:${data.msg}`
+    scrollMessageListToBottom()
+  }
+}
+
+// 打开输出目录:appConfig.appPath + '/build/extraResources/py/output'
+const openOutputDir = () => {
+  try {
+    const appPath = useConfigInfoStore?.appConfig?.appPath || ''
+    if (!appPath) {
+      ElMessage.error('未获取到应用目录 appPath')
+      return
+    }
+    const fullPath = `${appPath}/build/extraResources/py/output`
+    clientStore.ipc.removeAllListeners(icpList.utils.shellFun);
+    clientStore.ipc.send(icpList.utils.shellFun, {
+      action: 'openPath',
+      params: fullPath.replaceAll('/', '\\')
+    });
+  } catch (e) {
+    console.error(e)
+    ElMessage.error('打开目录失败')
+  }
+}
+
 // 开始生成操作
 const generate = async function () {
 
@@ -647,7 +695,7 @@ const generate = async function () {
   }, route);
 
   // 必填验证
-  if (form.services.includes('is_upper_footer') && !selectedModels.value) {
+  if (form.services.includes('is_upper_footer') && !( selectedModels.value && selectedModels.value.male?.id  &&  selectedModels.value.female?.id)) {
     openModelDialog();
     setTimeout(()=>{
       ElMessage.error('请选择模特')
@@ -669,6 +717,13 @@ const generate = async function () {
       return
     }
   }
+
+
+
+  const useConfigInfoStore = configInfo();
+  console.log(useConfigInfoStore.appConfig);
+
+
   const tokenInfoStore = tokenInfo();
   const token = tokenInfoStore.getToken; // 使用 getToken() 获取 token
   let temp_list = []
@@ -727,18 +782,27 @@ const generate = async function () {
   // 监听抠图进度消息
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_segment_progress');
   clientStore.ipc.on(icpList.socket.message + '_segment_progress', (event, data) => {
+    console.log('_segment_progress',data);
     handleSegmentProgressMessage(data)
   });
   // 监听上脚图进度消息
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_upper_footer_progress');
   clientStore.ipc.on(icpList.socket.message + '_upper_footer_progress', (event, data) => {
+    console.log('_upper_footer_progress',data);
     handleUpperFooterProgressMessage(data)
   });
   // 监听场景图进度消息
   clientStore.ipc.removeAllListeners(icpList.socket.message + '_scene_progress');
   clientStore.ipc.on(icpList.socket.message + '_scene_progress', (event, data) => {
+    console.log('_scene_progress',data);
     handleSceneProgressMessage(data)
   });
+  // 监听商品上传进度消息
+  clientStore.ipc.removeAllListeners(icpList.socket.message + '_upload_goods_progress');
+  clientStore.ipc.on(icpList.socket.message + '_upload_goods_progress', (event, data) => {
+    console.log('_upload_goods_progress',data);
+    handleUploadGoodsProgressMessage(data)
+  });
   clientStore.ipc.on(icpList.generate.generatePhotoDetail, (event, result) => {
     if(result.code !== 0 ){
      if(result.msg){
@@ -758,7 +822,8 @@ const generate = async function () {
       clientStore.ipc.removeAllListeners(icpList.socket.message + '_segment_progress');
       clientStore.ipc.removeAllListeners(icpList.socket.message + '_upper_footer_progress');
       clientStore.ipc.removeAllListeners(icpList.socket.message + '_scene_progress');
-    }, 500)
+      clientStore.ipc.removeAllListeners(icpList.socket.message + '_upload_goods_progress');
+    }, 10000)
     clearInterval(INTERVAL.value)
     if (result.code === 0) {
       const { output_folder, list } = result.data