From f59df1f1c874246a42610fccab193b7b796b47b9 Mon Sep 17 00:00:00 2001
From: xueqingkun <xueqingkun@126.com>
Date: Wed, 31 Jan 2024 16:32:02 +0800
Subject: [PATCH] =?UTF-8?q?manage=20=EF=BC=9A=E6=B7=BB=E5=8A=A0=20renameIf?=
 =?UTF-8?q?Necessary?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../file/MaterialLibraryManageController.java |  5 +-
 .../service/MaterialLibraryManageService.java |  5 +-
 .../MaterialLibraryManageServiceImpl.java     | 89 +++++++++++++++----
 .../supervision/model/MaterialLibrary.java    | 10 +--
 4 files changed, 82 insertions(+), 27 deletions(-)

diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/MaterialLibraryManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/MaterialLibraryManageController.java
index aa3879f7..4de37bce 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/MaterialLibraryManageController.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/file/MaterialLibraryManageController.java
@@ -21,10 +21,9 @@ public class MaterialLibraryManageController {
     @ApiOperation("上传素材")
     @PostMapping("/uploadMaterial")
     public String uploadMaterial(@ApiParam("文件") @RequestParam("file") MultipartFile multipartFile,
-                                 @ApiParam("素材名,长度小于64") @RequestParam("materialName") String materialName,
-                                 @ApiParam("素材类型 0:图片 1:视频 2:音频") @RequestParam("materialType") String materialType) throws Exception {
+                                  MaterialLibrary materialLibrary) throws Exception {
 
-        return materialLibraryManageService.uploadMaterial(multipartFile, materialName, materialType);
+        return materialLibraryManageService.uploadMaterial(multipartFile,materialLibrary);
     }
 
 
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MaterialLibraryManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MaterialLibraryManageService.java
index 1db12193..96dfef84 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MaterialLibraryManageService.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MaterialLibraryManageService.java
@@ -10,11 +10,10 @@ public interface MaterialLibraryManageService {
     /**
      * 上传素材库文件
      * @param multipartFile 文件内容
-     * @param materialName 素材名
-     * @param materialType 素材类型
+     * @param materialLibrary 素材内容
      * @return 素材id
      */
-    String uploadMaterial(MultipartFile multipartFile, String materialName, String materialType) throws Exception;
+    String uploadMaterial(MultipartFile multipartFile, MaterialLibrary materialLibrary) throws Exception;
 
     IPage<MaterialLibrary> queryMaterialPage(String materialType, String materialName, String directoryId,Integer pageNum, Integer pageSize);
 
diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java
index 15c5c554..72807f6f 100644
--- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java
+++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MaterialLibraryManageServiceImpl.java
@@ -1,5 +1,6 @@
 package com.supervision.manage.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
@@ -15,8 +16,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Service
 @RequiredArgsConstructor
@@ -27,30 +31,85 @@ public class MaterialLibraryManageServiceImpl implements MaterialLibraryManageSe
     private final FileManageService fileManageService;
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String uploadMaterial(MultipartFile multipartFile, String materialName, String materialType) throws Exception {
+    public String uploadMaterial(MultipartFile multipartFile,MaterialLibrary materialLibrary) throws Exception {
         // 校验素材名是否已经存在
-        Assert.notEmpty(materialName, "素材名不能为空");
-        Assert.notEmpty(materialType, "素材类型不能为空");
-        List<String> split = StrUtil.split(materialName, ".");
-        Integer count = materialLibraryService.lambdaQuery().likeRight(MaterialLibrary::getMaterialName, split.get(0)).count();
+        Assert.notEmpty(materialLibrary.getMaterialName(), "素材名不能为空");
+        Assert.notEmpty(materialLibrary.getMaterialType(), "素材类型不能为空");
+
+        materialLibrary.setMaterialName(renameIfNecessary(materialLibrary.getMaterialName()));
+        // 保存素材
+        FileResource fileResource = fileManageService.uploadFile(multipartFile, multipartFile.getContentType());
+        materialLibrary.setFileResourceId(fileResource.getId());
+        materialLibraryService.save(materialLibrary);
+        return materialLibrary.getId();
+    }
+
+
+    /**
+     * 重命名文件名
+     * @param materialName 素材名字
+     * @return 新的文件名
+     */
+    private String renameIfNecessary(String materialName) {
+        int count = countMaterialName(materialName);
         if (count > 0){
             // 重新命名文件
+            String excludeSuffix = stringExcludeSuffix(materialName);
+            List<String> split = StrUtil.split(materialName, ".");
             if (split.size() > 1){
-                materialName = split.get(0) + "(" + count + ")" + "." + split.get(split.size()-1);
+                materialName = excludeSuffix + "(" + count + ")" + "." + split.get(split.size()-1);
             }else{
-                materialName = materialName + "(" + count + ")";
+                materialName = excludeSuffix + "(" + count + ")";
             }
         }
+        return materialName;
+    }
 
-        // 保存素材
-        FileResource fileResource = fileManageService.uploadFile(multipartFile, multipartFile.getContentType());
+    /**
+     * 统计素材库中已有的相同素材名字的数量
+     * @param materialName 素材名字
+     * @return 数量
+     */
+    private int countMaterialName(String materialName) {
+
+        String cleanedName = stringExcludeSuffix(materialName);
+
+        List<MaterialLibrary> materialLibraryList = materialLibraryService.lambdaQuery().likeRight(MaterialLibrary::getMaterialName,cleanedName).list();
+
+        int count = 0;
+        for (MaterialLibrary materialLibrary : materialLibraryList) {
+            String name = materialLibrary.getMaterialName();
+            String regex = "\\(\\d+\\)";
+            Pattern pattern = Pattern.compile(regex);
+            Matcher matcher = pattern.matcher(name);
+            String modifiedText;
+            int previousEnd = 0;
+            int lastEnd = 0;
+
+            while (matcher.find()) {
+                previousEnd = matcher.start();
+                lastEnd = matcher.end();
+            }
 
-        MaterialLibrary materialLibrary = new MaterialLibrary();
-        materialLibrary.setFileResourceId(fileResource.getId());
-        materialLibrary.setMaterialType(materialType);
-        materialLibrary.setMaterialName(materialName);
-        materialLibraryService.save(materialLibrary);
-        return materialLibrary.getId();
+            if (lastEnd > 0) {
+                modifiedText = name.substring(0, previousEnd) + name.substring(lastEnd);
+            } else {
+                modifiedText = name;
+            }
+            if (StrUtil.equals(modifiedText,materialName)){
+                count ++ ;
+            }
+        }
+        return count;
+    }
+
+    private static String stringExcludeSuffix(String materialName) {
+        List<String> split = StrUtil.split(materialName, ".");
+        ArrayList<String> tmpList = CollUtil.newArrayList(split);
+        if(split.size() > 1){
+            tmpList.remove(split.size()-1);
+        }
+        return String.join(".",tmpList);
     }
 
     @Override
diff --git a/virtual-patient-model/src/main/java/com/supervision/model/MaterialLibrary.java b/virtual-patient-model/src/main/java/com/supervision/model/MaterialLibrary.java
index 4e25de82..1e0146c0 100644
--- a/virtual-patient-model/src/main/java/com/supervision/model/MaterialLibrary.java
+++ b/virtual-patient-model/src/main/java/com/supervision/model/MaterialLibrary.java
@@ -24,21 +24,19 @@ public class MaterialLibrary implements Serializable {
     /**
      * 文件资源id 对应vp_file_resource的主键
      */
+    @ApiModelProperty("文件资源id")
     private String fileResourceId;
 
     /**
      * 素材名称;不采用vp_file_resource中的file_name字段
      */
+    @ApiModelProperty("素材名称 必填")
     private String materialName;
 
-    /**
-     * 素材类型 0:图片 1:视频 2:音频
-     */
+    @ApiModelProperty("素材类型 0:图片 1:视频 2:音频 必填")
     private String materialType;
 
-    /**
-     * 目录id
-     */
+    @ApiModelProperty("目录id")
     private String directoryId;
 
     /**