From 380da75880edf6746682fe79d330b618b1ca69b8 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期六, 25 四月 2026 14:22:53 +0800
Subject: [PATCH] 增加文件相关接口

---
 src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java         |   52 ++++------
 src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java                  |   27 ++++
 src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java            |   58 +++++++++++
 src/main/java/com/ruoyi/basic/utils/FileUtil.java                                    |   43 ++++++++
 src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java |   29 +++--
 src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java                         |   15 +++
 src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java                              |   18 +++
 7 files changed, 193 insertions(+), 49 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java b/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java
new file mode 100644
index 0000000..730201d
--- /dev/null
+++ b/src/main/java/com/ruoyi/basic/controller/StorageAttachmentController.java
@@ -0,0 +1,58 @@
+package com.ruoyi.basic.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.StorageAttachmentDTO;
+import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.basic.dto.SupplierManageDto;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
+import com.ruoyi.basic.pojo.StorageAttachment;
+import com.ruoyi.basic.service.StorageAttachmentService;
+import com.ruoyi.common.constant.StorageAttachmentConstants;
+import com.ruoyi.common.enums.StorageAttachmentRecordType;
+import com.ruoyi.framework.web.domain.R;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/basic/storage_attachment")
+public class StorageAttachmentController {
+    private StorageAttachmentService storageAttachmentService;
+
+    /**
+     * 鍒嗛〉鏌ヨ閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
+     * @param page 鍒嗛〉鍙傛暟
+     * @param storageAttachmentDTO 鍏宠仈璁板綍淇℃伅
+     * @return 鍒嗛〉缁撴灉
+     */
+    @GetMapping("/listPage")
+    public R listPage(Page page, StorageAttachmentDTO storageAttachmentDTO) {
+        return R.ok(storageAttachmentService.listPage(page, storageAttachmentDTO));
+    }
+
+    /**
+     * 鍒犻櫎閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
+     * @param ids 鏂囦欢id鍒楄〃
+     * @return 鍒犻櫎缁撴灉
+     */
+    @DeleteMapping("/delete")
+    public R batchDelete(@RequestBody List<Long> ids) {
+        return R.ok(storageAttachmentService.batchDeleteStorageAttachment(ids));
+    }
+
+    /**
+     * 淇濆瓨閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
+     * @param storageBlobs 鏂囦欢淇℃伅鍒楄〃
+     * @param recordId 绠$悊璁板綍id
+     * @param recordType 鍏宠仈璁板綍绫诲瀷
+     * @param fileType 鏂囦欢绫诲瀷
+     */
+    @PostMapping("/add")
+    public R add(@RequestBody List<StorageBlobDTO> storageBlobs, Long recordId, String recordType, String fileType) {
+        storageAttachmentService.saveStorageAttachment(storageBlobs, recordId, recordType, fileType);
+        return R.ok();
+    }
+}
diff --git a/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java b/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
index b0298ff..8cdf321 100644
--- a/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
+++ b/src/main/java/com/ruoyi/basic/enums/ApplicationTypeEnum.java
@@ -11,4 +11,19 @@
     private final String type;
     ApplicationTypeEnum(String type) { this.type = type; }
     public String getType() { return type; }
+
+    /**
+     * 鏍规嵁 type 鍊艰幏鍙栧搴旂殑鏋氫妇瀹炰緥
+     * @param type 搴旂敤绫诲瀷瀛楃涓�
+     * @return 瀵瑰簲鐨� ApplicationTypeEnum 鏋氫妇瀹炰緥
+     * @throws RuntimeException 濡傛灉 type 鏃犳晥
+     */
+    public static ApplicationTypeEnum getByType(String type) {
+        for (ApplicationTypeEnum enumValue : ApplicationTypeEnum.values()) {
+            if (enumValue.getType().equals(type)) {
+                return enumValue;
+            }
+        }
+        throw new RuntimeException("鏃犳晥鐨勫簲鐢ㄧ被鍨�: " + type);
+    }
 }
diff --git a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
index cca8977..fd8d8c0 100644
--- a/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -6,9 +6,25 @@
     PDA_VERSION("pda_version"),
     SALES_LEDGER("sales_ledger"),
     SUPPLIER_MANAGE("supplier_manage"),
-    APPROVAL_PROCESS("approval_process");
+    APPROVAL_PROCESS("approval_process"),
+    QR_CODE_SCAN_RECORDS("qr_code_scan_records");
 
     private final String type;
     RecordTypeEnum(String type) { this.type = type; }
     public String getType() { return type; }
+
+    /**
+     * 鏍规嵁 type 鍊艰幏鍙栧搴旂殑鏋氫妇瀹炰緥
+     * @param type 璁板綍绫诲瀷瀛楃涓�
+     * @return 瀵瑰簲鐨� RecordTypeEnum 鏋氫妇瀹炰緥
+     * @throws RuntimeException 濡傛灉 type 鏃犳晥
+     */
+    public static RecordTypeEnum getByType(String type) {
+        for (RecordTypeEnum enumValue : RecordTypeEnum.values()) {
+            if (enumValue.getType().equals(type)) {
+                return enumValue;
+            }
+        }
+        throw new RuntimeException("鏃犳晥鐨勮褰曠被鍨�: " + type);
+    }
 }
diff --git a/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java b/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
index 7fbaf64..ef095f4 100644
--- a/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
+++ b/src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
@@ -1,6 +1,13 @@
 package com.ruoyi.basic.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.basic.dto.StorageAttachmentDTO;
+import com.ruoyi.basic.dto.StorageAttachmentVO;
+import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.pojo.StorageAttachment;
 import com.ruoyi.common.constant.StorageAttachmentConstants;
 import com.ruoyi.common.enums.StorageAttachmentRecordType;
@@ -19,15 +26,20 @@
 
     /**
      * 淇濆瓨閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
-     * @param attachments 鏂囦欢淇℃伅鍒楄〃
+     * @param storageBlobDTOS 鏂囦欢淇℃伅鍒楄〃
      * @param recordId 绠$悊璁板綍id
      * @param recordType 鍏宠仈璁板綍绫诲瀷
      * @param fileType 鏂囦欢绫诲瀷
      */
-    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType);
+    public void saveStorageAttachment(List<StorageBlobDTO> storageBlobDTOS, Long recordId, String recordType, String fileType);
 
-    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType);
-
+    /**
+     * 鍒嗛〉鏌ヨ閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
+     * @param page 鍒嗛〉鍙傛暟
+     * @param storageAttachmentDTO 鍏宠仈璁板綍淇℃伅
+     * @return 鍒嗛〉缁撴灉
+     */
+    public IPage<StorageAttachmentVO> listPage(Page page, StorageAttachmentDTO storageAttachmentDTO);
 
     /**
      * 鍒犻櫎閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
@@ -35,4 +47,11 @@
      * @return 鍒犻櫎缁撴灉
      */
     public int deleteStorageAttachment(StorageAttachment storageAttachment);
+
+    /**
+     * 鎵归噺鍒犻櫎閫氱敤鏂囦欢涓婁紶鐨勯檮浠朵俊鎭�
+     * @param ids 鏂囦欢id鍒楄〃
+     * @return 鍒犻櫎缁撴灉
+     */
+    public int batchDeleteStorageAttachment(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
index f3f3ae3..db38d7a 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
@@ -1,15 +1,22 @@
 package com.ruoyi.basic.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.StorageAttachmentDTO;
+import com.ruoyi.basic.dto.StorageAttachmentVO;
+import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.mapper.StorageAttachmentMapper;
 import com.ruoyi.basic.mapper.StorageBlobMapper;
 import com.ruoyi.basic.pojo.StorageAttachment;
 import com.ruoyi.basic.service.StorageAttachmentService;
 import com.ruoyi.basic.service.StorageBlobService;
-import com.ruoyi.common.constant.StorageAttachmentConstants;
-import com.ruoyi.common.enums.StorageAttachmentRecordType;
+import com.ruoyi.basic.utils.FileUtil;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -29,40 +36,17 @@
     private final StorageAttachmentMapper storageAttachmentMapper;
 
     private final StorageBlobService storageBlobService;
-
+    private final FileUtil fileUtil;
 
     @Override
-    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType) {
-        // 鍒犻櫎鏃у浘
-        // todo fileChange
-//        deleteStorageAttachment(new StorageAttachment(fileType.toString(), (long) recordType.ordinal(), recordId));
-//        for (StorageAttachment attachment : attachments) {
-//            // 鑾峰彇鍏宠仈璁板綍
-//            StorageBlob storageBlob = attachment.getStorageBlobDTO();
-//            attachment.setName(fileType.toString());
-//            attachment.setRecordType((long) recordType.ordinal());
-//            attachment.setRecordId(recordId);
-//            attachment.setStorageBlobId(storageBlob.getId());
-//            storageAttachmentMapper.insert(attachment);
-//        }
-
+    @Transactional(rollbackFor = Exception.class)
+    public void saveStorageAttachment(List<StorageBlobDTO> storageBlobDTOS, Long recordId, String recordType, String fileType) {
+      fileUtil.saveStorageAttachment(ApplicationTypeEnum.getByType(fileType), RecordTypeEnum.getByType(recordType), recordId, storageBlobDTOS);
     }
 
     @Override
-    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType) {
-        // 鍒犻櫎鏃у浘
-//        deleteStorageAttachment(new StorageAttachment(fileType, (long) recordType.ordinal(), recordId));
-        // todo fileChange
-//        for (StorageAttachment attachment : attachments) {
-//            // 鑾峰彇鍏宠仈璁板綍
-//            StorageBlob storageBlob = attachment.getStorageBlobDTO();
-//            attachment.setName(fileType);
-//            attachment.setRecordType((long) recordType.ordinal());
-//            attachment.setRecordId(recordId);
-//            attachment.setStorageBlobId(storageBlob.getId());
-//            storageAttachmentMapper.insert(attachment);
-//        }
-
+    public IPage<StorageAttachmentVO> listPage(Page page, StorageAttachmentDTO storageAttachmentDTO) {
+        return fileUtil.getStorageAttachmentVosPageListByApplicationAndRecordTypeAndRecordId(page, storageAttachmentDTO);
     }
 
     @Override
@@ -79,4 +63,10 @@
 //    }
         return 0;
     }
+
+    @Override
+    public int batchDeleteStorageAttachment(List<Long> ids) {
+        fileUtil.deleteStorageAttachmentsByStorageAttachmentIds(ids);
+        return 1;
+    }
 }
diff --git a/src/main/java/com/ruoyi/basic/utils/FileUtil.java b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
index d964efc..9d202f1 100644
--- a/src/main/java/com/ruoyi/basic/utils/FileUtil.java
+++ b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
@@ -1,7 +1,10 @@
 package com.ruoyi.basic.utils;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.StorageAttachmentDTO;
 import com.ruoyi.basic.dto.StorageAttachmentVO;
 import com.ruoyi.basic.dto.StorageBlobDTO;
 import com.ruoyi.basic.dto.StorageBlobVO;
@@ -198,6 +201,46 @@
     }
 
     /**
+     * 閫氳繃璁板綍绫诲瀷鑾峰彇鏂囦欢淇℃伅 attachment锛堝垎椤碉級
+     *
+     * @param page       鍒嗛〉鍙傛暟
+     * @param storageAttachmentDTO 鍏宠仈璁板綍淇℃伅
+     */
+    public IPage<StorageAttachmentVO> getStorageAttachmentVosPageListByApplicationAndRecordTypeAndRecordId(Page page, StorageAttachmentDTO storageAttachmentDTO) {
+        // 鍒嗛〉鏌ヨ绗﹀悎鏉′欢鐨� StorageAttachment 璁板綍
+        LambdaQueryWrapper<StorageAttachment> queryWrapper = new LambdaQueryWrapper<StorageAttachment>()
+                .eq(StorageAttachment::getRecordType, storageAttachmentDTO.getRecordType())
+                .eq(StorageAttachment::getRecordId, storageAttachmentDTO.getRecordId());
+        if (storageAttachmentDTO.getApplication() != null) {
+            queryWrapper.eq(StorageAttachment::getApplication, storageAttachmentDTO.getApplication());
+        }
+        IPage<StorageAttachmentVO> storageAttachmentIPage = storageAttachmentMapper.selectPage(page, queryWrapper);
+
+        // 杞崲涓� StorageAttachmentVO 骞惰幏鍙栧搴旂殑 StorageBlobVO
+        List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(storageAttachmentIPage.getRecords())) {
+            for (StorageAttachment storageAttachment : storageAttachmentIPage.getRecords()) {
+                StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO();
+                BeanUtils.copyProperties(storageAttachment, storageAttachmentVO);
+                List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()));
+                if (CollectionUtils.isEmpty(storageBlobVOS)) {
+                    storageAttachmentVO.setStorageBlobVOS(new ArrayList<>());
+                } else {
+                    storageAttachmentVO.setStorageBlobVOS(storageBlobVOS);
+                }
+                storageAttachmentVOS.add(storageAttachmentVO);
+            }
+        }
+
+        // 鏋勫缓鍒嗛〉缁撴灉
+        IPage<StorageAttachmentVO> resultPage = new Page<>();
+        BeanUtils.copyProperties(storageAttachmentIPage, resultPage);
+        resultPage.setRecords(storageAttachmentVOS);
+
+        return resultPage;
+    }
+
+    /**
      * 閫氳繃鏂囦欢鐢ㄩ�斻�佸叧鑱旇褰曠被鍨嬨�佸叧鑱旇褰昳d鑾峰彇鏂囦欢鍏宠仈淇℃伅 attachment
      *
      * @param application 鏂囦欢鐢ㄩ��
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
index 85831e9..acc30a7 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
@@ -5,11 +5,16 @@
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.StorageBlobDTO;
+import com.ruoyi.basic.dto.StorageBlobVO;
+import com.ruoyi.basic.enums.ApplicationTypeEnum;
+import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.mapper.StorageAttachmentMapper;
 import com.ruoyi.basic.mapper.StorageBlobMapper;
 import com.ruoyi.basic.pojo.StorageAttachment;
 import com.ruoyi.basic.pojo.StorageBlob;
 import com.ruoyi.basic.service.StorageAttachmentService;
+import com.ruoyi.basic.utils.FileUtil;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto;
 import com.ruoyi.inspectiontask.mapper.QrCodeMapper;
@@ -51,6 +56,8 @@
 
 
     private final SysUserMapper sysUserMapper;
+
+    private final FileUtil fileUtil;
 
     @Override
     public IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) {
@@ -159,19 +166,15 @@
         }
 
         if (qrCodeScanRecordDto.getStorageBlobVO() != null && !qrCodeScanRecordDto.getStorageBlobVO().isEmpty()) {
-            List<StorageAttachment> attachments = new ArrayList<>();
+            // vo 杞� dto
+            List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>();
+            for (StorageBlobVO storageBlobVO : qrCodeScanRecordDto.getStorageBlobVO()) {
+                StorageBlobDTO storageBlobDTO = new StorageBlobDTO();
+                BeanUtils.copyProperties(storageBlobVO, storageBlobDTO);
+                storageBlobDTOs.add(storageBlobDTO);
+            }
 
-            // todo fileChange
-//            for (StorageBlobDTO storageBlobDTO : qrCodeScanRecordDto.getStorageBlobDTO()) {
-//                StorageAttachment storageAttachment = new StorageAttachment(
-//                        StorageAttachmentFile,
-//                        (long) QrCodeScanRecords.ordinal(),
-//                        qrCodeScanRecord.getId()
-//                );
-//                storageAttachment.setStorageBlobDTO(storageBlobDTO);
-//                attachments.add(storageAttachment);
-//            }
-            storageAttachmentService.saveStorageAttachment(attachments, qrCodeScanRecord.getId(), QrCodeScanRecords, StorageAttachmentFile);
+            fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.QR_CODE_SCAN_RECORDS, qrCodeScanRecord.getId(), storageBlobDTOs);
         }
         return i;
     }
@@ -181,4 +184,4 @@
         return qrCodeScanRecordMapper.deleteBatchIds(Arrays.asList(ids));
     }
 
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3