소스 검색

feat(tournaments): 添加异步上传比赛文件功能

- 在 ITournamentsService 接口中新增 uploadTournamentAsync 方法
- 实现类 TournamentsServiceImpl 中添加异步上传逻辑
- 使用 @Async 注解支持异步执行
- 添加日志记录上传文件信息
- 控制器中保留原有同步上传接口
- 修复 PlayersItemsLogServiceImpl 中时间范围查询逻辑
- 增强时间范围验证,支持自定义时间与预设范围结合使用
- 添加必要的导入语句和类型声明
fugui001 2 달 전
부모
커밋
29ce23f6e9

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/TournamentsController.java

@@ -142,7 +142,7 @@ public class TournamentsController extends BaseController {
      */
     @PostMapping(value = "/uploadTournament", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
     public R<SysOssVo> uploadTournament(@RequestPart("file") MultipartFile file) throws Exception {
-        return R.ok(tournamentsService.uploadTournament(file));
+       return R.ok(tournamentsService.uploadTournament(file));
     }
 
     @SaCheckPermission("business:tournaments:deleteCheckTournament")

+ 7 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/ITournamentsService.java

@@ -12,6 +12,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * 【请填写功能名称】Service接口
@@ -122,6 +123,11 @@ public interface ITournamentsService {
     TableDataInfo<TournamentsVo> queryStatisticsPageList(TournamentsBo bo, PageQuery pageQuery);
 
 
-
+    /**
+     * 异步上传比赛文件
+     * @param file 文件
+     * @return CompletableFuture<SysOssVo>
+     */
+    CompletableFuture<SysOssVo> uploadTournamentAsync(MultipartFile file);
 
 }

+ 28 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PlayersItemsLogServiceImpl.java

@@ -21,6 +21,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -123,6 +126,9 @@ public class PlayersItemsLogServiceImpl implements IPlayersItemsLogService {
             lqw.le(PlayersItemsLog::getCreatedAt, bo.getEndTime());
         }
 
+        if(StringUtils.isNotBlank(bo.getFlagType())){
+            lqw.eq(PlayersItemsLog::getType, 1);
+        }
         return lqw;
     }
 
@@ -186,6 +192,28 @@ public class PlayersItemsLogServiceImpl implements IPlayersItemsLogService {
         if(StringUtils.isNotBlank(flagType) && (flagType.equals("day") || flagType.equals("week") || flagType.equals("month") || flagType.equals("three"))){
             startDate = DateTimeRangeUtils.getStartString(flagType);
             endDate = DateTimeRangeUtils.getEndString(flagType);
+
+            // 如果同时传入了自定义时间,则检查是否在flagType范围内
+            String customStartDate = bo.getStartTime();
+            String customEndDate = bo.getEndTime();
+
+            // 如果自定义时间在flagType范围内,则使用自定义时间
+            if (StringUtils.isNotBlank(customStartDate) && StringUtils.isNotBlank(customEndDate)) {
+                // 解析时间字符串
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                LocalDateTime customStart = LocalDateTime.parse(customStartDate, formatter);
+                LocalDateTime customEnd = LocalDateTime.parse(customEndDate, formatter);
+                LocalDateTime flagStart = LocalDateTime.parse(startDate, formatter);
+                LocalDateTime flagEnd = LocalDateTime.parse(endDate, formatter);
+
+                // 验证自定义时间是否在flagType范围内
+                if (!customStart.isBefore(flagStart) && !customEnd.isAfter(flagEnd) && !customStart.isAfter(customEnd)) {
+                    // 自定义时间在有效范围内,使用自定义时间
+                    startDate = customStartDate;
+                    endDate = customEndDate;
+                }
+            }
+
         } else {
             startDate = bo.getStartTime();
             endDate = bo.getEndTime();

+ 16 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/TournamentsServiceImpl.java

@@ -29,6 +29,7 @@ import org.dromara.system.domain.vo.SysOssVo;
 import org.dromara.system.service.ISysOssService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.dromara.business.domain.bo.TournamentsBo;
 import org.dromara.business.service.ITournamentsService;
@@ -41,6 +42,7 @@ import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
 import java.time.temporal.ChronoField;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**
@@ -611,6 +613,8 @@ public class TournamentsServiceImpl implements ITournamentsService {
 
     @Override
     public SysOssVo uploadTournament(MultipartFile file) {
+        log.info("uploadTournament开始上传文件: {}, 大小: {} bytes",
+            file.getOriginalFilename(), file.getSize());
         // 1. 上传文件到 OSS
         SysOssVo sysOssVo = ossService.uploadInputstream(file);
         return sysOssVo;
@@ -753,7 +757,18 @@ public class TournamentsServiceImpl implements ITournamentsService {
         return TableDataInfo.build(result);
     }
 
-
+    @Override
+    @Async
+    public CompletableFuture<SysOssVo> uploadTournamentAsync(MultipartFile file) {
+        try {
+            // 上传文件到 OSS
+            SysOssVo sysOssVo = ossService.uploadInputstream(file);
+            return CompletableFuture.completedFuture(sysOssVo);
+        } catch (Exception e) {
+            log.error("文件上传失败", e);
+            return CompletableFuture.completedFuture(null);
+        }
+    }
 
     private Date parseDateTime(String dateTimeStr) throws ParseException {
         if (dateTimeStr == null || dateTimeStr.isBlank()) {