Browse Source

feat(photography): 添加导入图片和删除所有货号功能

- 在IPC工具类中新增import_dirs和delete_all_goods_arts接口定义
- 为processImage.vue组件添加导入图片按钮和删除所有货号按钮
- 在shot.vue组件中添加删除所有货号按钮功能
- 实现handleImportImage方法用于打开目录选择器并导入图片
- 实现handleDeleteAll方法用于确认删除所有货号数据
- 在electron/api/takephoto.js中添加import_dirs和delete_all_goods_arts API调用
- 在electron/controller/takephoto.js中实现导入目录和删除所有货号的控制器逻辑
- 在usePhotography.ts中添加importDirs和deleteAllGoods业务逻辑方法
panqiuyao 2 tuần trước cách đây
mục cha
commit
394ab9014f

+ 11 - 0
electron/api/takephoto.js

@@ -31,7 +31,18 @@ module.exports = {
     })
   },
 
+  import_dirs(data){
+    return post({
+      url: '/import_dirs',
+      data: data
+    })
+  },
 
+  delete_all_goods_arts(){
+    return post({
+      url: '/delete_all_goods_arts',
+    })
+  },
 
 
 }

+ 27 - 1
electron/controller/takephoto.js

@@ -2,7 +2,7 @@
 const fs = require('fs');
 const Log = require('ee-core/log');
 const { Controller } = require('ee-core');
-const  { getPhotoRecords,delectGoodsArts,createMainImage,getLastPhotoRecord } =  require('../api/takephoto');
+const  { getPhotoRecords,delectGoodsArts,createMainImage,getLastPhotoRecord,import_dirs,delete_all_goods_arts } =  require('../api/takephoto');
 const errData = {
   msg :'请求失败,请联系管理员',
   code:999
@@ -128,6 +128,32 @@ class takePhotoController extends Controller {
     }
   }
 
+  async import_dirs (params) {
+    console.log('import_dirs')
+    try {
+      const result = await import_dirs(params);
+      console.log('result')
+      console.log(result)
+      if(result.data) return result.data
+      return { code: 0 };
+    } catch (error) {
+      Log.error('导入图片目录失败:', error);
+      return errData;
+    }
+  }
+
+  async delete_all_goods_arts () {
+    console.log('delete_all_goods_arts')
+    try {
+      const result = await delete_all_goods_arts();
+      if(result.data) return result.data
+      return { code: 0 };
+    } catch (error) {
+      Log.error('删除所有货号失败:', error);
+      return errData;
+    }
+  }
+
 
 }
 

+ 3 - 1
frontend/src/utils/ipc.ts

@@ -48,7 +48,9 @@ const icpList = {
         getPhotoRecords: 'controller.takephoto.getPhotoRecords',
         delectGoodsArts: 'controller.takephoto.delectGoodsArts',
         createMainImage: 'controller.takephoto.createMainImage',
-        getLastPhotoRecord: 'controller.takephoto.getLastPhotoRecord'
+        getLastPhotoRecord: 'controller.takephoto.getLastPhotoRecord',
+        import_dirs: 'controller.takephoto.import_dirs',
+        delete_all_goods_arts: 'controller.takephoto.delete_all_goods_arts'
     },
     generate:{
         generatePhotoDetail: 'controller.generate.generatePhotoDetail',

+ 36 - 0
frontend/src/views/Photography/mixin/usePhotography.ts

@@ -862,6 +862,40 @@ export default function usePhotography() {
       }
     })
 
+    /**
+     * 导入图片目录。
+     * @param dirPath - 需要导入的目录路径。
+     */
+    const importDirs = function (dirPath: string) {
+      clientStore.ipc.removeAllListeners(icpList.takePhoto.import_dirs);
+      clientStore.ipc.send(icpList.takePhoto.import_dirs, { dir_path: dirPath });
+      clientStore.ipc.on(icpList.takePhoto.import_dirs, (event, result) => {
+        clientStore.ipc.removeAllListeners(icpList.takePhoto.import_dirs);
+        if (result.code === 0) {
+          getPhotoRecords()
+        } else {
+          ElMessage.error(result.msg || '导入图片失败')
+        }
+      });
+    }
+
+    /**
+     * 删除所有货号。
+     */
+    const deleteAllGoods = function () {
+      clientStore.ipc.removeAllListeners(icpList.takePhoto.delete_all_goods_arts);
+      clientStore.ipc.send(icpList.takePhoto.delete_all_goods_arts);
+      clientStore.ipc.on(icpList.takePhoto.delete_all_goods_arts, (event, result) => {
+        clientStore.ipc.removeAllListeners(icpList.takePhoto.delete_all_goods_arts);
+        if (result.code === 0) {
+          ElMessage.success('删除所有货号成功')
+          getPhotoRecords()
+        } else {
+          ElMessage.error(result.msg || '删除所有货号失败')
+        }
+      });
+    }
+
     return {
       loading,
       runLoading,
@@ -884,6 +918,8 @@ export default function usePhotography() {
       delAll,
       delGoods,
       del,
+      importDirs,
+      deleteAllGoods,
       reTakePicture,
       reTakePictureNos,
       oneClickStop,

+ 50 - 0
frontend/src/views/Photography/processImage.vue

@@ -110,6 +110,13 @@
                 :page-size="pageSize"
               />
               <el-button
+                :disabled="runLoading || takePictureLoading"
+                @click="handleImportImage"
+                v-log="{ describe: { action: '导入图片' } }"
+              >
+                导入图片
+              </el-button>
+              <el-button
                 :disabled="selectedGoods.size === 0 || runLoading || takePictureLoading"
                 @click="deleteSelected"
                 v-log="{ describe: { action: '删除选中货号' } }"
@@ -117,6 +124,14 @@
                 删除
               </el-button>
               <el-button
+                :disabled="!goodsList.length || runLoading || takePictureLoading"
+                @click="handleDeleteAll"
+                style="color: #FF4C00"
+                v-log="{ describe: { action: '删除所有货号' } }"
+              >
+                删除所有
+              </el-button>
+              <el-button
                 type="primary"
                 :disabled="!goodsList.length || runLoading || takePictureLoading"
                 @click="openPhotographyDetail()"
@@ -141,8 +156,12 @@ import usePhotography from './mixin/usePhotography'
 import { useThumbnails } from './composables/useThumbnails'
 import generate from '@/utils/menus/generate'
 import { ElMessageBox } from 'element-plus'
+import client from "@/stores/modules/client";
+import icpList from '@/utils/ipc'
 // logging helpers not needed here
 
+const clientStore = client();
+
 const {
   loading,
   runLoading,
@@ -162,6 +181,8 @@ const {
   pageSize,
   currentPage,
   totalPages,
+  importDirs,
+  deleteAllGoods,
 } = usePhotography()
 
 // thumbnails
@@ -301,6 +322,35 @@ const getPreviewIndex = (item: any, currentIndex: number) => {
   return previewIndex
 }
 
+// 打开目录选择器并导入图片
+const handleImportImage = () => {
+  clientStore.ipc.removeAllListeners(icpList.utils.openDirectory);
+  clientStore.ipc.send(icpList.utils.openDirectory);
+  clientStore.ipc.on(icpList.utils.openDirectory, async (event, result) => {
+    clientStore.ipc.removeAllListeners(icpList.utils.openDirectory);
+    if (result) {
+      importDirs(result);
+    }
+  });
+}
+
+// 删除所有货号
+const handleDeleteAll = async () => {
+  try {
+    await ElMessageBox.confirm(
+      '确定要删除所有货号的拍摄数据吗?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+      }
+    )
+    deleteAllGoods()
+  } catch (e) {
+    // 用户取消
+  }
+}
+
 onMounted(async () => {
   await getPhotoRecords()
   initEventListeners()

+ 26 - 0
frontend/src/views/Photography/shot.vue

@@ -175,6 +175,14 @@
                 删除
               </el-button>
               <el-button
+                :disabled="!goodsList.length || runLoading || takePictureLoading"
+                @click="handleDeleteAll"
+                style="color: #FF4C00"
+                v-log="{ describe: { action: '删除所有货号' } }"
+              >
+                删除所有
+              </el-button>
+              <el-button
                 type="primary"
                 :disabled="!goodsList.length || runLoading || takePictureLoading"
                 @click="openPhotographyDetail()"
@@ -217,6 +225,7 @@ const {
   getPhotoRecords,
   delGoods,
   del,
+  deleteAllGoods,
   reTakePicture,
   reTakePictureNos,
   onRemoteControl,
@@ -316,6 +325,23 @@ const deleteSelected = async () => {
   }
 }
 
+// 删除所有货号
+const handleDeleteAll = async () => {
+  try {
+    await ElMessageBox.confirm(
+      '确定要删除所有货号的拍摄数据吗?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+      }
+    )
+    deleteAllGoods()
+  } catch (e) {
+    // 用户取消
+  }
+}
+
 // 获取预览图片列表(只包含有图片路径的,保持原始顺序)
 const getPreviewImageList = (item: any) => {
   if (!item || !item.items) return []