hyy 5 hónapja
szülő
commit
ed507fbbf9
10 módosított fájl, 87 hozzáadás és 102 törlés
  1. 1 1
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/photogroup/PhotoGroupController.java
  2. 23 0
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/photos/PhotosController.java
  3. 0 1
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/SpecimenInfoController.java
  4. 8 8
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/vo/SpecimenImportRespVO.java
  5. 1 1
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimenoutbound/SpecimenOutboundController.java
  6. 1 8
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photogroup/PhotoGroupService.java
  7. 2 2
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photogroup/PhotoGroupServiceImpl.java
  8. 13 0
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photos/PhotosService.java
  9. 33 0
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photos/PhotosServiceImpl.java
  10. 5 81
      yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/specimeninfo/SpecimenInfoServiceImpl.java

+ 1 - 1
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/photogroup/PhotoGroupController.java

@@ -102,7 +102,7 @@ public class PhotoGroupController {
                         BeanUtils.toBean(list, PhotoGroupRespVO.class));
     }
 
-    @PostMapping("/createe")
+    @PostMapping("/import-package")
     @Operation(summary = "创建博物馆照片组(压缩包)")
     @PreAuthorize("@ss.hasPermission('museums:photo-group:create')")
     public CommonResult<Integer> createePhotoGroup(

+ 23 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/photos/PhotosController.java

@@ -11,6 +11,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import javax.validation.constraints.*;
 import javax.validation.*;
 import javax.servlet.http.*;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.io.IOException;
 
@@ -18,16 +19,20 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+import static cn.iocoder.yudao.module.museums.enums.ErrorCodeConstants.PHOTO_GROUP_UPLOAD_FAILED;
 
 import cn.iocoder.yudao.module.museums.controller.admin.photos.vo.*;
 import cn.iocoder.yudao.module.museums.dal.dataobject.photos.PhotosDO;
 import cn.iocoder.yudao.module.museums.service.photos.PhotosService;
+import org.springframework.web.multipart.MultipartFile;
 
 @Tag(name = "管理后台 - 博物馆照片")
 @RestController
@@ -100,4 +105,22 @@ public class PhotosController {
         return success(BeanUtils.toBean(photosList, PhotosRespVO.class));
     }
 
+    @PostMapping("/upload-photos")
+    @Operation(summary = "批量上传博物馆照片")
+    @PreAuthorize("@ss.hasPermission('museums:photo-group:upload')")
+    public CommonResult<List<Integer>> uploadPhotos(
+            @NotNull @RequestParam("groupId") Integer groupId,
+            @RequestParam("files") List<MultipartFile> files) {
+
+        try {
+            // 调用服务层批量上传照片
+            List<Integer> photoIds = photosService.uploadPhotos(groupId, files);
+            return CommonResult.success(photoIds);
+        } catch (Exception e) {
+            // 处理异常,返回失败的响应
+            throw exception(PHOTO_GROUP_UPLOAD_FAILED);
+        }
+    }
+
+
 }

+ 0 - 1
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/SpecimenInfoController.java

@@ -86,7 +86,6 @@ public class SpecimenInfoController {
         return success(true);
     }
 
-
     @GetMapping("/get")
     @Operation(summary = "获得标本管理")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")

+ 8 - 8
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimeninfo/vo/SpecimenImportRespVO.java

@@ -21,13 +21,13 @@ public class SpecimenImportRespVO {
     @Schema(description = "导入失败的标本集合,key 为标本编号,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
     private Map<String, String> failureSpecimenNumbers;
 
-    @Schema(description = "创建成功的图片名称数组", requiredMode = Schema.RequiredMode.REQUIRED)
-    private List<String> createSpecimenImages;
-
-    @Schema(description = "更新成功的图片名称数组", requiredMode = Schema.RequiredMode.REQUIRED)
-    private List<String> updateSpecimenImages;
-
-    @Schema(description = "导入失败的图片集合,key 为图片名称,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
-    private Map<String, String> failureSpecimenImages;
+//    @Schema(description = "创建成功的图片名称数组", requiredMode = Schema.RequiredMode.REQUIRED)
+//    private List<String> createSpecimenImages;
+//
+//    @Schema(description = "更新成功的图片名称数组", requiredMode = Schema.RequiredMode.REQUIRED)
+//    private List<String> updateSpecimenImages;
+//
+//    @Schema(description = "导入失败的图片集合,key 为图片名称,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
+//    private Map<String, String> failureSpecimenImages;
 
 }

+ 1 - 1
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/controller/admin/specimenoutbound/SpecimenOutboundController.java

@@ -64,6 +64,7 @@ public class SpecimenOutboundController {
     @PreAuthorize("@ss.hasPermission('museums:specimen-outbound:approveFirst')")
     public CommonResult<Void> approveFirstSpecimenOutbound(@RequestBody SpecimenOutboundApprovalReqVO req) {
         req.setApproveUsers(getLoginUserId()); // 获取操作员ID
+
         req.setApprovalTime(LocalDateTime.now()); // 设置当前时间
         req.setStatus(1); // 设置审批状态为一审通过
         specimenOutboundService.updateStatus(req);
@@ -103,7 +104,6 @@ public class SpecimenOutboundController {
         return success(null);
     }
 
-
 //    @GetMapping("/confirmOutbound")
 //    @Operation(summary = "确认标本出库")
 //    @PreAuthorize("@ss.hasPermission('museums:specimen-outbound:confirm')")

+ 1 - 8
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photogroup/PhotoGroupService.java

@@ -26,14 +26,7 @@ public interface PhotoGroupService {
      */
     Integer createPhotoGroup(@Valid PhotoGroupSaveReqVO createReqVO);
 
-//    /**
-//     * 创建博物馆照片组
-//     *
-//     * @param createReqVO 照片组信息
-//     * @param file 上传的压缩包文件
-//     * @return 照片组编号
-//     */
-//    Integer createePhotoGroup(@Valid PhotoGroupSaveReqVO createReqVO, MultipartFile file) throws Exception;
+
     /**
      * 创建博物馆照片组
      *

+ 2 - 2
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photogroup/PhotoGroupServiceImpl.java

@@ -147,8 +147,8 @@ public class PhotoGroupServiceImpl implements PhotoGroupService {
                     PhotosDO photoRecord = new PhotosDO();
                     photoRecord.setGroupId(groupId); // 设置照片组ID
                     photoRecord.setPhotoUrl(imagePath); // 设置照片URL
-                    photoRecord.setCreateTime(LocalDateTime.now());
-                    photoRecord.setCreator("系统用户"); // 根据实际情况设置创建者
+//                    photoRecord.setCreateTime(LocalDateTime.now());
+//                    photoRecord.setCreator("系统用户"); // 根据实际情况设置创建者
                     photosMapper.insert(photoRecord); // 插入照片记录
                 }
             }

+ 13 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photos/PhotosService.java

@@ -1,7 +1,10 @@
 package cn.iocoder.yudao.module.museums.service.photos;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import javax.validation.*;
+import javax.validation.constraints.NotEmpty;
+
 import cn.iocoder.yudao.module.museums.controller.admin.photos.vo.*;
 import cn.iocoder.yudao.module.museums.dal.dataobject.photos.PhotosDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -61,6 +64,16 @@ public interface PhotosService {
      */
     List<PhotosDO> getPhotosByGroupId(Integer groupId);
 
+    /**
+     * 批量上传博物馆照片
+     *
+     * @param groupId 照片组 ID
+     * @param files 上传的照片文件列表
+     * @return 上传成功的照片 ID 列表
+     */
+    List<Integer> uploadPhotos(Integer groupId, List<MultipartFile> files) throws Exception;
+
+
 
 
 

+ 33 - 0
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/photos/PhotosServiceImpl.java

@@ -1,11 +1,15 @@
 package cn.iocoder.yudao.module.museums.service.photos;
 
 
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
+
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import java.sql.Timestamp;
+import java.time.LocalDateTime;
 import java.util.*;
 
 import cn.iocoder.yudao.module.museums.controller.admin.photos.vo.*;
@@ -14,6 +18,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
 import cn.iocoder.yudao.module.museums.dal.mysql.photos.PhotosMapper;
+import org.springframework.web.multipart.MultipartFile;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.museums.enums.ErrorCodeConstants.*;
@@ -29,6 +34,8 @@ public class PhotosServiceImpl implements PhotosService {
 
     @Resource
     private PhotosMapper photosMapper;
+    @Resource
+    private FileApi fileApi;
 
     @Override
     public Integer createPhotos(PhotosSaveReqVO createReqVO) {
@@ -78,4 +85,30 @@ public class PhotosServiceImpl implements PhotosService {
         return photosMapper.selectByGroupId(groupId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class) // 添加事务
+    public List<Integer> uploadPhotos(Integer groupId, List<MultipartFile> files) throws Exception {
+        List<Integer> photoIds = new ArrayList<>();
+
+        for (MultipartFile file : files) {
+            // 校验文件类型
+            if (!file.getOriginalFilename().endsWith(".jpg") && !file.getOriginalFilename().endsWith(".png")&& !file.getOriginalFilename().endsWith(".gif")) {
+                throw new IllegalArgumentException("上传的文件必须是图片格式 (jpg, png)");
+            }
+            // 上传图片并获取URL
+            String imagePath = fileApi.createFile(file.getBytes());
+            // 创建照片信息记录
+            PhotosDO photoRecord = new PhotosDO();
+            photoRecord.setGroupId(groupId); // 设置照片组ID
+            photoRecord.setPhotoUrl(imagePath); // 设置照片URL
+            photosMapper.insert(photoRecord); // 插入照片记录
+
+            // 获取并存储新插入的照片 ID
+            photoIds.add(photoRecord.getId());
+        }
+
+        return photoIds; // 返回所有上传的照片 ID 列表
+    }
+
+
 }

+ 5 - 81
yudao-module-museums/yudao-module-museums-biz/src/main/java/cn/iocoder/yudao/module/museums/service/specimeninfo/SpecimenInfoServiceImpl.java

@@ -71,12 +71,6 @@ public class SpecimenInfoServiceImpl implements SpecimenInfoService {
         List<String> imagePath = createReqVO.getImagePath();
         ObjectMapper objectMapper = new ObjectMapper();
         SpecimenInfoDO specimenInfo = BeanUtils.toBean(createReqVO, SpecimenInfoDO.class);
-        try {
-            String jsonString = objectMapper.writeValueAsString(imagePath);
-            specimenInfo.setImagePath(jsonString);
-        } catch (JsonProcessingException e) {
-            throw new RuntimeException("图像路径转换为 JSON 失败", e);
-        }
 
         specimenInfoMapper.insert(specimenInfo);
         // 返回新创建的标本ID
@@ -186,11 +180,11 @@ public class SpecimenInfoServiceImpl implements SpecimenInfoService {
                 return;
             }
 
-            // 2.2.2 如果存在,判断是否允许更新
-//            if (!isUpdateSupport) {
-//                respVO.getFailureSpecimenNumbers().put(importSpecimen.getSpecimenNumber(), "标本编号已存在,且不支持更新");
-//                return;
-//            }
+//             2.2.2 如果存在,判断是否允许更新
+            if (!isUpdateSupport) {
+                respVO.getFailureSpecimenNumbers().put(importSpecimen.getSpecimenNumber(), "标本编号已存在,且不支持更新");
+                return;
+            }
 
             // 更新逻辑
             SpecimenInfoDO updateSpecimen = BeanUtils.toBean(importSpecimen, SpecimenInfoDO.class);
@@ -211,73 +205,6 @@ public class SpecimenInfoServiceImpl implements SpecimenInfoService {
         }
         return true;
     }
-    //图片导入
-//    @Override
-//    @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
-//    public String importSpecimenImages(MultipartFile file) throws Exception {
-//        // 校验文件类型
-//        if (!file.getOriginalFilename().endsWith(".zip")) {
-//            throw exception(UPLOADED_FOLDER_CANNOT_EMPTY);
-//        }
-//
-//        // 创建临时目录存放解压后的文件
-//        File tempDir = Files.createTempDirectory("specimen_images").toFile();
-//        try (ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream())) {
-//            ZipEntry entry;
-//            while ((entry = zipInputStream.getNextEntry()) != null) {
-//                if (!entry.isDirectory()) {
-//                    File newFile = new File(tempDir, entry.getName());
-//                    // 进行解压
-//                    try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile))) {
-//                        byte[] buffer = new byte[1024];
-//                        int len;
-//                        while ((len = zipInputStream.read(buffer)) > 0) {
-//                            bos.write(buffer, 0, len);
-//                        }
-//                    }
-//                }
-//            }
-//            // 处理每个图片文件
-//            File[] imageFiles = tempDir.listFiles();
-//            if (imageFiles != null) {
-//                for (File imageFile : imageFiles) {
-//                    String imageName = imageFile.getName();
-//                    if (!isValidImageName(imageName)) {
-//                        System.err.println("无效的图片格式: " + imageName);
-//                        continue;
-//                    }
-//                    // 根据图片名称查找对应的标本
-//                    SpecimenInfoDO specimenInfo = specimenInfoMapper.selectByImageNames(imageName);
-//                    if (specimenInfo != null) {
-//                        // 上传图片并获取URL
-//                        String imagePath = fileApi.createFile(Files.readAllBytes(imageFile.toPath()));
-//                        // 获取当前的图片路径
-//                        Set<String> imagePathsSet = new HashSet<>();
-//                        String existingImagePaths = specimenInfo.getImagePath();
-//
-//                        // 如果 existingImagePaths 为空或仅包含空白字符,则不添加
-//                        if (existingImagePaths != null && !existingImagePaths.trim().isEmpty()) {
-//                            Collections.addAll(imagePathsSet, existingImagePaths.split(","));
-//                        }
-//
-//                        // 检查 imagePath 是否有效
-//                        if (imagePath != null && !imagePath.trim().isEmpty()) {
-//                            imagePathsSet.add(imagePath);
-//                        }
-//
-//                        // 转换回字符串,避免前面出现多余的逗号
-//                        String newImagePaths = String.join(",", imagePathsSet);
-//                        specimenInfo.setImagePath(newImagePaths);
-//
-//                        updateSpecimenInfo(BeanUtils.toBean(specimenInfo, SpecimenInfoSaveReqVO.class));
-//                    }
-//                }
-//            }
-//        }
-//        // 清理临时文件
-//        FileUtils.deleteDirectory(tempDir);
-//        return "标本图片导入成功";
-//    }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -369,9 +296,6 @@ public class SpecimenInfoServiceImpl implements SpecimenInfoService {
         }
     }
 
-
-
-
     //工作台
     //根据入库的登记情况统计本年标本入库信息
     @Override