Просмотр исходного кода

Merge remote-tracking branch 'origin/feature-frontend_lining' into feature-frontend

# Conflicts:
#	package.json
panqiuyao 3 недель назад
Родитель
Сommit
e962df1129

+ 1 - 0
frontend/src/components/check/index.vue

@@ -3,6 +3,7 @@
     v-model="visible"
     :title="title"
     :close-on-click-modal="false"
+    :close-on-press-escape="false"
     :show-close="false"
     width="500px"
     class="hardware-check-dialog"

+ 40 - 1
frontend/src/components/header-bar/index.vue

@@ -189,7 +189,24 @@ const submenuOpen = reactive<{ [key: number]: boolean }>({})
 const thirdLevelOpen = reactive<{ [key: string]: boolean }>({})
 
 const toggleSubmenu = (index: number) => {
-  submenuOpen[index] = !submenuOpen[index]
+  // 如果当前菜单已经打开,则关闭它
+  if (submenuOpen[index]) {
+    submenuOpen[index] = false
+    return
+  }
+  // 关闭所有其他已打开的一级菜单
+  for (const key in submenuOpen) {
+    const numKey = Number(key)
+    if (numKey !== index) {
+      submenuOpen[numKey] = false
+    }
+  }
+  // 关闭所有三级菜单
+  for (const key in thirdLevelOpen) {
+    thirdLevelOpen[key] = false
+  }
+  // 打开当前菜单
+  submenuOpen[index] = true
 }
 
 const toggleThirdLevel = (parentIndex: number, childIndex: number) => {
@@ -212,6 +229,10 @@ const menuType = reactive({
     name: '一键释放',
     click: OneClickRelease
   },
+  OneKeyDown: {
+    name: '一键回落',
+    click: OneKeyDown
+  },
   developer: {
     name: '初始设备调频设置',
     icon: iconsz,
@@ -368,6 +389,24 @@ async function  OneClickRelease(){
   })
 }
 
+//一键回落
+async function OneKeyDown(){
+
+  await ElMessageBox.confirm(
+      `确定要一键回落设备吗?`,
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      },
+  )
+  socketStore.sendMessage({
+    type: 'one_key_down',
+    data: 'one_key_down'
+  })
+}
+
 onMounted(() => {
   document.addEventListener('click', handleOutsideClick);
 })

+ 79 - 21
frontend/src/views/Photography/check.vue

@@ -85,7 +85,7 @@
   />
 </template>
 <script setup lang="ts">
-import {watchEffect, ref, reactive, defineEmits, defineProps, computed, onBeforeUnmount, onMounted} from 'vue'
+import {watchEffect, ref, defineEmits, defineProps, computed, onBeforeUnmount, onMounted} from 'vue'
 import client from "@/stores/modules/client";
 import socket from "@/stores/modules/socket";
 import icpList from '@/utils/ipc'
@@ -100,6 +100,7 @@ const emit = defineEmits([ 'confirm','onClose']);
 
 import  configInfo  from '@/stores/modules/config';
 const configInfoStore = configInfo();
+const useUserInfoStore = useUserInfo();
 
 const confirm = async () => {
   console.log('confirm');
@@ -128,19 +129,19 @@ const props = defineProps({
     }
   }
 })
-const menu = reactive([])
+
 const show = ref(true)
 
+const previewKey = ref(0)
+
 const isSetting = computed(()=>{
   return props.id || props.addRowData.mode_type
 })
 
-const useUserInfoStore = useUserInfo()
 import HardwareCheck from '@/components/check/index.vue'
 import { digiCamControlWEB } from  '@/utils/appconfig'
 import { getFilePath } from '@/utils/appfun'
 import {ElMessage} from "element-plus";
-const previewKey = ref(0)
 
 const preview = ref(digiCamControlWEB+'liveview.jpg')
 
@@ -153,29 +154,86 @@ const previewSrc = computed(()=>{
 const step = ref(1)
 async function checkConfirm(init){
   step.value =1
-  if(menu.length === 0){
-    menu.push({
-      type:'developer'
-    })
-/*    menu.push({
-      type:'toggleModel'
-    })*/
+  if(!init) previewKey.value++;
 
-    menu.push({
-      type:'setting'
-    })
+  showrEditRow.value = true
+  loading.value = false;
+}
 
-    menu.push({
-      type:'OneClickRelease'
-    })
+// 打开输出目录:appConfig.appPath + '/build/extraResources/py/output'
+const openOutputDir = () => {
+  try {
+    const appPath = configInfoStore?.appConfig?.appPath || ''
+    if (!appPath) {
+      ElMessage.error('未获取到应用目录 appPath')
+      return
+    }
+    const fullPath = `${appPath}\\output`
+    clientStore.ipc.removeAllListeners(icpList.utils.shellFun);
+    clientStore.ipc.send(icpList.utils.shellFun, {
+      action: 'openMkPath',
+      params: fullPath.replace(/\//g, '\\')
+    });
+  } catch (e) {
+    console.error(e)
+    ElMessage.error('打开目录失败')
+  }
+}
 
+// 快捷操作菜单子项(不含生成图目录)
+const quickActionsChildren = [
+  {
+    type: 'OneClickRelease'
+  },
+  {
+    type: 'OneKeyDown'
+  }
+]
+
+// 重构 menu 为带快捷操作和开发工具的下拉菜单结构
+const menu = computed(() => {
+  // 生成图目录(独立菜单项,点击直接打开目录)
+  const outputDirMenu = {
+    name: '生成图目录',
+    click() {
+      openOutputDir()
+    }
+  }
 
+  // 开发者模式:设置 + 快捷操作 + 开发工具 + 生成图目录
+  if (useUserInfoStore.userInfo.brand_company_code === '1300' || configInfoStore.appConfig.debug) {
+    return [
+      {
+        type: 'setting'
+      },
+      {
+        name: '快捷操作',
+        children: quickActionsChildren
+      },
+      {
+        name: '开发工具',
+        children: [
+          {
+            type: 'developer'
+          }
+        ]
+      },
+      outputDirMenu
+    ]
   }
-  if(!init) previewKey.value++;
 
-  showrEditRow.value = true
-  loading.value = false;
-}
+  // 普通模式:设置 + 快捷操作 + 生成图目录
+  return [
+    {
+      type: 'setting'
+    },
+    {
+      name: '快捷操作',
+      children: quickActionsChildren
+    },
+    outputDirMenu
+  ]
+})
 
 // editRow 数据加载完成后调用,仅记录点位,首次不打开预览
 function onEditRowReady(point_name) {

+ 72 - 37
frontend/src/views/Photography/mixin/usePhotography.ts

@@ -586,29 +586,51 @@ export default function usePhotography() {
     }
 
     const menu = computed(() => {
+      // 生成图目录(独立菜单项,点击直接打开目录)
+      const outputDirMenu = {
+        name: '生成图目录',
+        click() {
+          openOutputDir()
+        }
+      }
+
+      // 快捷操作菜单子项(不含生成图目录)
+      const quickActionsChildren = [
+        {
+          type: 'OneClickRelease'
+        },
+        {
+          type: 'OneKeyDown'
+        }
+      ]
+
+      // 一级导航:高级生成下拉
+      const generateMenu = {
+        ...generate
+      }
+
       if (configInfoStore.appModel === 2) {
         return [
           {
             type: 'setting'
           },
           {
-            name: '切换模式',
-            click() {
-              configInfoStore.updateAppModel(1)
-              Router.push({
-                name: 'PhotographyCheck'
-              })
-            }
-          },
-          {
-            name: '生成图目录',
-            click() {
-              openOutputDir()
-            }
+            name: '快捷操作',
+            children: [
+              ...quickActionsChildren,
+              {
+                name: '切换模式',
+                click() {
+                  configInfoStore.updateAppModel(1)
+                  Router.push({
+                    name: 'PhotographyCheck'
+                  })
+                }
+              }
+            ]
           },
-          {
-            ...generate
-          }
+          generateMenu,
+          outputDirMenu
         ]
       }
       if (useUserInfoStore.userInfo.brand_company_code === '1300' || configInfoStore.appConfig.debug) {
@@ -617,20 +639,19 @@ export default function usePhotography() {
             type: 'setting'
           },
           {
-            type: 'developer'
-          },
-          {
-            name: '生成图目录',
-            click() {
-              openOutputDir()
-            }
+            name: '快捷操作',
+            children: quickActionsChildren
           },
           {
-            ...generate,
+            name: '开发工具',
+            children: [
+              {
+                type: 'developer'
+              }
+            ]
           },
-          {
-            type: 'OneClickRelease'
-          }
+          generateMenu,
+          outputDirMenu
         ]
       }
 
@@ -640,17 +661,11 @@ export default function usePhotography() {
           type: 'setting'
         },
         {
-          name: '生成图目录',
-          click() {
-            openOutputDir()
-          }
-        },
-        {
-          ...generate
+          name: '快捷操作',
+          children: quickActionsChildren
         },
-        {
-          type: 'OneClickRelease'
-        }
+        generateMenu,
+        outputDirMenu
       ]
 
 
@@ -806,6 +821,26 @@ const onRemoteControl = async (type) => {
         console.log('_handler_take_picture')
         console.log(result)
         if (result.code === 0) {
+
+          if(result.msg  === '处理单拍消息'){
+            const pointName = await getPhotoPointName()
+            clickLog({ describe: { action: '实体遥控器拍照按钮', point_name: pointName } }, route);
+
+            if (runLoading.value || takePictureLoading.value) {
+              ElMessage.error('拍摄程序正在运行,请稍候')
+              return
+            }
+
+            ElMessage.success('正在拍摄中,请稍候')
+            takePictureLoading.value = true;
+            socketStore.sendMessage({
+              type: 'handler_take_picture',
+              data: {
+                point_name: pointName
+              }
+            })
+            return;
+          }
   /*        if (runLoading.value || takePictureLoading.value) {
             ElMessage.error('拍摄程序正在运行,请稍候')
             return

+ 18 - 5
frontend/src/views/Setting/index.vue

@@ -91,14 +91,22 @@
                       <el-select v-model.number="formData.basic_configs.image_mask_config.mode" placeholder="请选择">
                         <el-option label="默认模式" :value="0"></el-option>
                         <el-option label="自定义模式" :value="1"></el-option>
+                        <el-option label="AI模式" :value="2"></el-option>
                       </el-select>
                     </div>
                 </div>
 
-                <template v-if="formData.basic_configs.image_mask_config.mode === 1">
+                <template v-if="formData.basic_configs.image_mask_config.mode !== 0">
                   <div class="form-item">
                       <label>透明度:</label>
                       <div class="select-wrapper">
+
+
+<!--                        <el-select v-model.number="formData.basic_configs.image_mask_config.opacity" placeholder="请选择">
+                          <el-option label="默认模式" :value="0"></el-option>
+                          <el-option label="自定义模式" :value="1"></el-option>
+                          <el-option label="AI模式" :value="2"></el-option>
+                        </el-select>-->
                         <el-input-number
                           v-model="formData.basic_configs.image_mask_config.opacity"
                           :min="0.5"
@@ -308,7 +316,7 @@ const formData = reactive({
     "is_flip_800image": 1, //800图是否翻转
     "color_800image": '#ffffff', //800图颜色配置
     "image_mask_config": { //阴影处理配置
-      "mode": 0, //阴影处理模式:0默认模式,1自定义模式
+      "mode": 0, //阴影处理模式:0默认模式,1自定义模式,2 AI模式
       "opacity": 0.5, //透明度,默认0.5,范围0.5-1
       "grenerate_main_pic_brightness": 254 //亮度范围,默认254,范围200-255
     }
@@ -395,6 +403,8 @@ const productTypeList = ref([
 const defaultCutoutModeList = ref([
   { label: '普通抠图', value: '普通抠图' },
   { label: '精细化抠图', value: '精细化抠图' },
+  { label: '旗舰AI抠图', value: '旗舰AI抠图' },
+  { label: '旗舰AI抠图-精细', value: '旗舰AI抠图-精细' },
 ]);
 const deviceSpeedList = ref([
   { label: '快', value: '一档' },
@@ -685,14 +695,17 @@ const saveSetting = async (index) => {
     submitData.basic_configs.image_sharpening = sharpeningValue;
 
     // 验证阴影处理配置
+    // 阴影处理模式:0默认模式,1自定义模式,2 AI模式
     const maskConfig = formData.basic_configs.image_mask_config;
-    if (!maskConfig || typeof maskConfig.mode !== 'number' || (maskConfig.mode !== 0 && maskConfig.mode !== 1)) {
+    const maskMode = maskConfig != null ? Number(maskConfig.mode) : NaN;
+    if (!maskConfig || isNaN(maskMode) || ![0, 1, 2].includes(maskMode)) {
       ElMessage.error('请选择有效的阴影处理模式');
       return false;
     }
+    submitData.basic_configs.image_mask_config.mode = maskMode;
 
-    // 如果是自定义模式,验证透明度和亮度
-    if (maskConfig.mode === 1) {
+    // 自定义模式 / AI 模式需要验证透明度和亮度(与界面 mode !== 0 一致)
+    if (maskMode !== 0) {
       const opacity = parseFloat(maskConfig.opacity);
       const brightness = parseInt(maskConfig.grenerate_main_pic_brightness);
 

+ 3 - 3
package.json

@@ -1,8 +1,8 @@
 {
   "name": "ZhiHuiYin",
-  "version": "1.5.2",
-  "description": "智慧拍照机是一种结合人工智能技术与传统摄影设备的创新产品,版本号为1.5.2",
-  "releaseNotes": "1.5.1 更新版本",
+  "version": "1.5.3",
+  "description": "智慧拍照机是一种结合人工智能技术与传统摄影设备的创新产品,版本号为1.5.3",
+  "releaseNotes": "1.5.3 更新版本",
   "main": "main.js",
   "scripts": {
     "dev": "ee-bin dev",