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

feat(app): 添加App版本管理文件上传和异步更新功能

- 在AppVersionManagement实体和传输对象中添加ossId字段
- 添加SysOssVo导入支持OSS文件操作
- 实现文件上传接口uploadAppFileAsync支持多部分表单上传
- 添加generateAppDownLoadFile接口用于生成App下载文件
- 实现uploadAppFileSync方法同步上传文件到OSS
- 添加triggerAsyncUpdate方法触发异步版本信息更新
- 实现generateAppDownLoadFile方法根据ID生成下载文件
- 添加updateAppVersionAsync异步方法自动更新版本信息
- 实现determinePlatformFromFileName方法根据文件扩展名识别平台
- 创建createUpdateBo方法构建版本更新对象
- 更新Mapper XML文件添加oss_id字段映射和条件判断
fugui001 1 день назад
Родитель
Сommit
bffa0e5271

+ 23 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/AppVersionManagementController.java

@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.dromara.business.domain.bo.AppVersionManagementBo;
 import org.dromara.business.domain.bo.AppVersionManagementBo;
 import org.dromara.business.domain.vo.AppVersionManagementVo;
 import org.dromara.business.domain.vo.AppVersionManagementVo;
 import org.dromara.business.service.IAppVersionManagementService;
 import org.dromara.business.service.IAppVersionManagementService;
+import org.dromara.system.domain.vo.SysOssVo;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.Resource;
@@ -31,6 +32,7 @@ import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 
 /**
 /**
  * App版本管理
  * App版本管理
@@ -167,5 +169,26 @@ public class AppVersionManagementController extends BaseController {
         return ResponseEntity.notFound().build();
         return ResponseEntity.notFound().build();
     }
     }
 
 
+    @GetMapping("/generateAppDownLoadFile/{id}")
+    public R<Void> generateAppDownLoadFile(@NotNull(message = "ID不能为空")
+                                           @PathVariable Long id) {
+        return toAjax(appVersionManagementService.generateAppDownLoadFile(id));
+    }
+
+    @PostMapping(value = "/uploadAppFileAsync", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<SysOssVo> uploadAppFileAsync(@RequestPart("file") MultipartFile file) {
+        try {
+            // 同步执行文件上传,获取上传结果
+            SysOssVo sysOssVo = appVersionManagementService.uploadAppFileSync(file);
+
+            // 启动异步更新任务,不等待其完成
+            appVersionManagementService.triggerAsyncUpdate(sysOssVo, file);
 
 
+            // 立即返回上传结果给前端
+            return R.ok(sysOssVo);
+        } catch (Exception e) {
+            log.error("上传文件失败", e);
+            return R.fail("文件上传失败: " + e.getMessage());
+        }
+    }
 }
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/AppVersionManagement.java

@@ -88,5 +88,5 @@ public class AppVersionManagement{
      */
      */
     private Date updatedAt;
     private Date updatedAt;
 
 
-
+    private String ossId;
 }
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/AppVersionManagementBo.java

@@ -95,6 +95,6 @@ public class AppVersionManagementBo extends BaseEntity {
      * 更新时间
      * 更新时间
      */
      */
     private Date updatedAt;
     private Date updatedAt;
-
+    private String ossId;
 
 
 }
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/AppVersionManagementVo.java

@@ -117,5 +117,5 @@ public class AppVersionManagementVo implements Serializable {
     @ExcelProperty(value = "更新时间")
     @ExcelProperty(value = "更新时间")
     private Date updatedAt;
     private Date updatedAt;
 
 
-
+    private String ossId;
 }
 }

+ 19 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IAppVersionManagementService.java

@@ -4,6 +4,8 @@ import org.dromara.business.domain.bo.AppVersionManagementBo;
 import org.dromara.business.domain.vo.AppVersionManagementVo;
 import org.dromara.business.domain.vo.AppVersionManagementVo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.system.domain.vo.SysOssVo;
+import org.springframework.web.multipart.MultipartFile;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashMap;
@@ -74,4 +76,21 @@ public interface IAppVersionManagementService {
      */
      */
     HashMap<String, String> getMaxNewAppVersion();
     HashMap<String, String> getMaxNewAppVersion();
 
 
+
+
+    /**
+     * 同步上传App文件
+     */
+    SysOssVo uploadAppFileSync(MultipartFile file);
+
+    /**
+     * 触发异步更新版本信息
+     */
+    void triggerAsyncUpdate(SysOssVo sysOssVo, MultipartFile file);
+
+    /**
+     * 生成App下载文件
+     */
+    Boolean generateAppDownLoadFile(Long id);
+
 }
 }

+ 132 - 4
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/AppVersionManagementServiceImpl.java

@@ -15,17 +15,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.domain.vo.SysOssVo;
 import org.dromara.system.service.ISysOssService;
 import org.dromara.system.service.ISysOssService;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 import org.w3c.dom.Document;
 import org.w3c.dom.Document;
 
 
 import java.net.URLEncoder;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
 
 
 /**
 /**
  * App版本管理Service业务层处理
  * App版本管理Service业务层处理
@@ -203,4 +204,131 @@ public class AppVersionManagementServiceImpl implements IAppVersionManagementSer
         return urlDownload;
         return urlDownload;
     }
     }
 
 
+
+    @Override
+    public SysOssVo uploadAppFileSync(MultipartFile file) {
+        try {
+            // 上传文件到 OSS
+            return ossService.uploadInputstream(file);
+        } catch (Exception e) {
+            log.error("文件上传失败", e);
+            throw new RuntimeException("文件上传失败", e);
+        }
+    }
+
+
+    @Override
+    public void triggerAsyncUpdate(SysOssVo sysOssVo, MultipartFile file) {
+        // 启动异步任务更新版本信息
+        updateAppVersionAsync(sysOssVo, file);
+    }
+
+    @Override
+    public Boolean generateAppDownLoadFile(Long id) {
+        AppVersionManagementVo appVersionManagementVo = baseMapper.selectAllAppVersionsById(id);
+        if(appVersionManagementVo!=null){
+            SysOssVo sysOssVo = ossService.getById(Long.valueOf(appVersionManagementVo.getOssId()));
+            AppVersionManagementBo bo = createUpdateBo(appVersionManagementVo,sysOssVo.getFileName(),appVersionManagementVo.getUpdatePackageSize(),sysOssVo);
+            // 执行更新
+            boolean success = updateByBo(bo);
+            if (success) {
+                log.info("{} 版本信息更新成功", bo.getOsType());
+                return true;
+            } else {
+                log.error("{} 版本信息更新失败", bo.getOsType());
+                return false;
+            }
+        }
+        return false;
+    }
+
+
+    @Async
+    public CompletableFuture<Void> updateAppVersionAsync(SysOssVo sysOssVo, MultipartFile file) {
+        try {
+            // 根据文件扩展名确定平台类型
+            String platform = determinePlatformFromFileName(file.getOriginalFilename());
+            if (platform == null) {
+                log.warn("无法识别文件类型: " + file.getOriginalFilename());
+                return CompletableFuture.completedFuture(null);
+            }
+            // 获取对应平台的版本信息
+            AppVersionManagementVo version = baseMapper.selAppVersionInfoMaxNew(platform);
+            if (version != null) {
+                // 创建更新对象
+                AppVersionManagementBo bo = createUpdateBo(version, sysOssVo.getFileName(), file.getSize(), sysOssVo);
+
+                if(platform.equals("Android")){
+                    // 执行更新
+                    boolean success = updateByBo(bo);
+                    if (success) {
+                        log.info("{} 版本信息更新成功", platform);
+                    } else {
+                        log.error("{} 版本信息更新失败", platform);
+                    }
+                }else if(platform.equals("iOS")){
+                    // 执行更新
+                    boolean success = updateByBo(bo);
+                    if (success) {
+                        log.info("{} 版本信息更新成功", platform);
+                    } else {
+                        log.error("{} 版本信息更新失败", platform);
+                    }
+                }
+            } else {
+                log.warn("未找到 {} 平台的版本信息", platform);
+            }
+            log.info("App版本信息异步更新完成");
+            return CompletableFuture.completedFuture(null);
+        } catch (Exception e) {
+            log.error("updateAppVersionAsync 异步更新失败", e);
+            return CompletableFuture.completedFuture(null);
+        }
+    }
+
+
+    /**
+     * 根据文件名确定平台类型
+     */
+    private String determinePlatformFromFileName(String fileName) {
+        if (fileName == null || fileName.isEmpty()) {
+            return null;
+        }
+
+        String lowerCaseName = fileName.toLowerCase();
+
+        // 检查 Android APK 文件
+        if (lowerCaseName.endsWith(".apk") || lowerCaseName.endsWith(".aab")) {
+            return "Android";
+        }
+        // 检查 iOS IPA 文件
+        else if (lowerCaseName.endsWith(".ipa")) {
+            return "iOS";
+        }
+
+        // 如果无法确定,返回 null
+        return null;
+    }
+    private AppVersionManagementBo createUpdateBo(AppVersionManagementVo source, String fileName,
+                                                  long fileSize, SysOssVo sysOssVo) {
+        AppVersionManagementBo bo = new AppVersionManagementBo();
+        bo.setId(source.getId());
+        bo.setDownloadLink("https://oss.hunanpt.cn/"+fileName);
+        bo.setUpdatePackageSize(fileSize);
+        bo.setUpdateTime(new Date());
+        bo.setStatus(source.getStatus());
+        bo.setVersionCode(source.getVersionCode());
+        bo.setVersionName(source.getVersionName());
+        bo.setOsType(source.getOsType());
+        bo.setOsSupport(source.getOsSupport());
+        bo.setForceUpdate(source.getForceUpdate());
+        bo.setUpdateContent(source.getUpdateContent());
+        bo.setKnownIssues(source.getKnownIssues());
+        bo.setCreatedAt(source.getCreatedAt());
+        bo.setUpdatedAt(new Date());
+        bo.setOssId(String.valueOf(sysOssVo.getOssId()));
+        return bo;
+    }
+
+
 }
 }

+ 43 - 31
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/AppVersionManagementMapper.xml

@@ -1,46 +1,48 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper
 <!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.business.mapper.AppVersionManagementMapper">
 <mapper namespace="org.dromara.business.mapper.AppVersionManagementMapper">
 
 
 
 
     <select id="selectAllAppVersions"  resultType="org.dromara.business.domain.vo.AppVersionManagementVo">
     <select id="selectAllAppVersions"  resultType="org.dromara.business.domain.vo.AppVersionManagementVo">
         SELECT
         SELECT
-        id,
-        version_code,
-        version_name,
-        release_date,
-        update_content,
-        known_issues,
-        os_type,
-        os_support,
-        force_update,
-        download_link,
-        update_package_size,
-        status,
-        created_at,
-        updated_at
+            id,
+            version_code,
+            version_name,
+            release_date,
+            update_content,
+            known_issues,
+            os_type,
+            os_support,
+            force_update,
+            download_link,
+            update_package_size,
+            status,
+            created_at,
+            updated_at,
+            oss_id
         FROM app_version_management  ${ew.customSqlSegment}
         FROM app_version_management  ${ew.customSqlSegment}
     </select>
     </select>
 
 
 
 
     <select id="selectAllAppVersionsById" resultType="org.dromara.business.domain.vo.AppVersionManagementVo">
     <select id="selectAllAppVersionsById" resultType="org.dromara.business.domain.vo.AppVersionManagementVo">
         SELECT
         SELECT
-        id,
-        version_code,
-        version_name,
-        release_date,
-        update_content,
-        known_issues,
-        os_type,
-        os_support,
-        force_update,
-        download_link,
-        update_package_size,
-        status,
-        created_at,
-        updated_at
+            id,
+            version_code,
+            version_name,
+            release_date,
+            update_content,
+            known_issues,
+            os_type,
+            os_support,
+            force_update,
+            download_link,
+            update_package_size,
+            status,
+            created_at,
+            updated_at,
+            oss_id
         FROM app_version_management
         FROM app_version_management
         WHERE  id=#{id}
         WHERE  id=#{id}
     </select>
     </select>
@@ -60,7 +62,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             update_package_size,
             update_package_size,
             status,
             status,
             created_at,
             created_at,
-            updated_at
+            updated_at,
+            oss_id
         FROM app_version_management ${ew.customSqlSegment}
         FROM app_version_management ${ew.customSqlSegment}
     </select>
     </select>
 
 
@@ -101,6 +104,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null">
             <if test="status != null">
                 status,
                 status,
             </if>
             </if>
+            <if test="ossId != null">
+                ossId,
+            </if>
         </trim>
         </trim>
         <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
         <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
             <if test="versionCode != null">
             <if test="versionCode != null">
@@ -136,6 +142,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null">
             <if test="status != null">
                 #{status},
                 #{status},
             </if>
             </if>
+            <if test="ossId != null">
+                #{ossId},
+            </if>
         </trim>
         </trim>
     </insert>
     </insert>
 
 
@@ -187,6 +196,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="status != null">
             <if test="status != null">
                 status = #{status},
                 status = #{status},
             </if>
             </if>
+            <if test="ossId != null">
+                oss_id = #{ossId},
+            </if>
             updated_at = CURRENT_TIMESTAMP
             updated_at = CURRENT_TIMESTAMP
         </set>
         </set>
         WHERE id = #{id}
         WHERE id = #{id}