3
0

4 Коммитууд a4ed374fd9 ... c9f4e3221b

Эзэн SHA1 Мессеж Огноо
  wenkai c9f4e3221b Merge branch 'wk-dev-8-13' into dev 2 өдөр өмнө
  wenkai 4d2c600f02 feat:线上 3 өдөр өмнө
  wenkai b972d4d4c6 perf:生产号码布采用异步 3 өдөр өмнө
  wenkai aa94b66130 fix:banner修改 3 өдөр өмнө
22 өөрчлөгдсөн 480 нэмэгдсэн , 200 устгасан
  1. 6 0
      ruoyi-admin/pom.xml
  2. 1 1
      ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java
  3. 6 8
      ruoyi-admin/src/main/resources/banner.txt
  4. 0 1
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java
  5. 1 4
      ruoyi-modules/ruoyi-game-event/pom.xml
  6. 20 20
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameTeamController.java
  7. 0 1
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/ActivityController.java
  8. 33 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/AppEnrollController.java
  9. 0 1
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/AppMarkdownController.java
  10. 12 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/PdfEntry.java
  11. 35 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/EnrollBo.java
  12. 8 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/GameTeamMapper.java
  13. 3 3
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IEnrollService.java
  14. 5 5
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameAthleteService.java
  15. 8 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameEventGroupService.java
  16. 4 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameTeamService.java
  17. 27 11
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameAthleteServiceImpl.java
  18. 14 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameEventGroupServiceImpl.java
  19. 162 122
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameEventServiceImpl.java
  20. 45 5
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameTeamServiceImpl.java
  21. 90 17
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/IEnrollServiceImpl.java
  22. 0 1
      ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java

+ 6 - 0
ruoyi-admin/pom.xml

@@ -75,6 +75,12 @@
             <artifactId>ruoyi-job</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-caffeine</artifactId>
+            <version>5.4.1</version>
+        </dependency>
+
         <!-- 代码生成-->
         <dependency>
             <groupId>org.dromara</groupId>

+ 1 - 1
ruoyi-admin/src/main/java/org/dromara/DromaraApplication.java

@@ -17,7 +17,7 @@ public class DromaraApplication {
         SpringApplication application = new SpringApplication(DromaraApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  RuoYi-Vue-Plus启动成功   ლ(´ڡ`ლ)゙");
+        System.out.println("(♥◠‿◠)ノ゙  赛事管理系统启动成功   ლ(´ڡ`ლ)゙");
     }
 
 }

+ 6 - 8
ruoyi-admin/src/main/resources/banner.txt

@@ -1,8 +1,6 @@
-Application Version: ${revision}
-Spring Boot Version: ${spring-boot.version}
-__________            _____.___.__         ____   ____                     __________.__
-\______   \__ __  ____\__  |   |__|        \   \ /   /_ __   ____          \______   \  |  __ __  ______
- |       _/  |  \/  _ \/   |   |  |  ______ \   Y   /  |  \_/ __ \   ______ |     ___/  | |  |  \/  ___/
- |    |   \  |  (  <_> )____   |  | /_____/  \     /|  |  /\  ___/  /_____/ |    |   |  |_|  |  /\___ \
- |____|_  /____/ \____// ______|__|           \___/ |____/  \___  >         |____|   |____/____//____  >
-        \/             \/                                       \/                                   \/
+   _____                      ______               _
+  / ____|                    |  ____|             | |
+ | |  __  __ _ _ __ ___   ___| |____   _____ _ __ | |_
+ | | |_ |/ _` | '_ ` _ \ / _ \  __\ \ / / _ \ '_ \| __|
+ | |__| | (_| | | | | | |  __/ |___\ V /  __/ | | | |_
+  \_____|\__,_|_| |_| |_|\___|______\_/ \___|_| |_|\__|

+ 0 - 1
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/CacheUtils.java

@@ -57,5 +57,4 @@ public class CacheUtils {
     public static void clear(String cacheNames) {
         CACHE_MANAGER.getCache(cacheNames).clear();
     }
-
 }

+ 1 - 4
ruoyi-modules/ruoyi-game-event/pom.xml

@@ -98,6 +98,7 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-websocket</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
@@ -112,10 +113,6 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-sse</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.dromara</groupId>
-            <artifactId>ruoyi-common-core</artifactId>
-        </dependency>
         <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-system</artifactId>

+ 20 - 20
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameTeamController.java

@@ -1,34 +1,35 @@
 package org.dromara.system.controller;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.excel.core.ExcelResult;
-import org.dromara.system.domain.GameTeam;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
+import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
-import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.system.domain.vo.GameTeamVo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.GameTeam;
 import org.dromara.system.domain.bo.GameTeamBo;
+import org.dromara.system.domain.request.UpdateTeamAthletesRequest;
+import org.dromara.system.domain.vo.GameTeamVo;
 import org.dromara.system.service.IGameTeamService;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import org.dromara.system.domain.request.UpdateTeamAthletesRequest;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 参赛队伍
@@ -65,7 +66,6 @@ public class GameTeamController extends BaseController {
         try {
             excelResult = ExcelUtil.importExcel(file.getInputStream(), GameTeamVo.class, true);
             List<GameTeam> list = MapstructUtils.convert(excelResult.getList(), GameTeam.class);
-            log.info("转换后的列表:", list);
             gameTeamService.saveBatch(list);
         } catch (IOException e) {
             e.printStackTrace();

+ 0 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/ActivityController.java

@@ -2,7 +2,6 @@ package org.dromara.system.controller.app;
 
 import cn.dev33.satoken.annotation.SaIgnore;
 import lombok.RequiredArgsConstructor;
-import org.dromara.system.domain.bo.ArticleBo;
 import org.dromara.system.domain.constant.GameEventConstant;
 import org.dromara.system.domain.vo.ArticleVo;
 import org.dromara.system.service.IArticleService;

+ 33 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/AppEnrollController.java

@@ -0,0 +1,33 @@
+package org.dromara.system.controller.app;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.system.domain.bo.EnrollBo;
+import org.dromara.system.service.IEnrollService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@SaIgnore
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/app/enroll")
+public class AppEnrollController {
+
+    private final IEnrollService enrollService;
+
+    @RepeatSubmit
+    @PostMapping
+    public R<String> enroll(
+        @Validated
+        @RequestBody
+        EnrollBo enrollBo
+    ) {
+        Boolean result = enrollService.enroll(enrollBo);
+        return R.ok(result ? "报名成功" : "报名失败");
+    }
+}

+ 0 - 1
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/AppMarkdownController.java

@@ -1,7 +1,6 @@
 package org.dromara.system.controller.app;
 
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaIgnore;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;

+ 12 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/PdfEntry.java

@@ -0,0 +1,12 @@
+package org.dromara.system.domain;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Data
+@Getter
+public class PdfEntry {
+    private final String fileName;
+    private final byte[] pdfBytes;
+}

+ 35 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/EnrollBo.java

@@ -0,0 +1,35 @@
+package org.dromara.system.domain.bo;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class EnrollBo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "赛事不能为空")
+    private Long eventId;
+
+    @NotNull(message = "项目不能为空")
+    private Long projectId;
+
+    @NotNull(message = "名称不能为空")
+    private String name;
+
+    @NotNull(message = "队伍名称不能为空")
+    private String teamName;
+
+    @NotNull(message = "性别不能为空")
+    private Integer gender;
+
+    @NotNull(message = "年龄不能为空")
+    private Integer age;
+
+    @NotNull(message = "电话不能为空")
+    private String phone;
+
+    @NotNull(message = "身份证不能为空")
+    private String idCard;
+}

+ 8 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/GameTeamMapper.java

@@ -1,5 +1,6 @@
 package org.dromara.system.mapper;
 
+import org.apache.ibatis.annotations.Select;
 import org.dromara.system.domain.GameTeam;
 import org.dromara.system.domain.vo.GameTeamVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
@@ -12,4 +13,11 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface GameTeamMapper extends BaseMapperPlus<GameTeam, GameTeamVo> {
 
+    @Select("""
+                SELECT * FROM game_team
+        WHERE del_flag='0' AND event_id = #{eventId} AND number_range IS NOT NULL
+        ORDER BY CAST(SUBSTR(number_range, 1, 4) AS SIGNED) DESC
+        LIMIT 1
+        """)
+    GameTeam selectMaxNumber(Long eventId);
 }

+ 3 - 3
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IEnrollService.java

@@ -2,11 +2,9 @@ package org.dromara.system.service;
 
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.http.ResponseEntity;
+import org.dromara.system.domain.bo.EnrollBo;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.Map;
-
 public interface IEnrollService {
 
     /**
@@ -23,4 +21,6 @@ public interface IEnrollService {
      * @return
      */
     Boolean importDataForPoi(MultipartFile file, Long eventId);
+
+    Boolean enroll(EnrollBo enrollBo);
 }

+ 5 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameAthleteService.java

@@ -1,16 +1,14 @@
 package org.dromara.system.service;
 
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.system.domain.GameAthlete;
+import org.dromara.system.domain.bo.GameAthleteBo;
 import org.dromara.system.domain.vo.AthleteScoreVo;
 import org.dromara.system.domain.vo.GameAthleteVo;
-import org.dromara.system.domain.bo.GameAthleteBo;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Optional;
-import java.util.Set;
 
 /**
  * 参赛队员Service接口
@@ -97,4 +95,6 @@ public interface IGameAthleteService {
      * @return 运动员列表
      */
     List<GameAthleteVo> queryListByEventIdAndProjectId(Long eventId, Long projectId, String searchValue);
+
+    String queryMaxNumber(Long teamId);
 }

+ 8 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameEventGroupService.java

@@ -1,5 +1,6 @@
 package org.dromara.system.service;
 
+import org.dromara.system.domain.GameEventGroup;
 import org.dromara.system.domain.vo.GameEventGroupVo;
 import org.dromara.system.domain.bo.GameEventGroupBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -65,4 +66,11 @@ public interface IGameEventGroupService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据赛事id查询
+     * @param defaultEventId
+     * @return
+     */
+    GameEventGroup queryByEventId(Long defaultEventId);
 }

+ 4 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameTeamService.java

@@ -115,4 +115,8 @@ public interface IGameTeamService {
      * @return
      */
     Map<Long, String> queryTeamIdAndName(Set<Long> teamIds);
+
+    GameTeam queryByName(String teamName, Long eventId);
+
+    GameTeam queryMaxNumber(Long eventId);
 }

+ 27 - 11
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameAthleteServiceImpl.java

@@ -3,31 +3,36 @@ package org.dromara.system.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.redis.utils.RedisUtils;
-import org.dromara.system.domain.*;
+import org.dromara.system.domain.GameAthlete;
+import org.dromara.system.domain.GameEventProject;
+import org.dromara.system.domain.GameScore;
+import org.dromara.system.domain.GameTeam;
+import org.dromara.system.domain.bo.GameAthleteBo;
 import org.dromara.system.domain.bo.GameEventBo;
-import org.dromara.system.domain.bo.GameEventGroupBo;
 import org.dromara.system.domain.bo.GameTeamBo;
 import org.dromara.system.domain.constant.GameEventConstant;
 import org.dromara.system.domain.vo.*;
+import org.dromara.system.mapper.GameAthleteMapper;
 import org.dromara.system.mapper.GameEventProjectMapper;
 import org.dromara.system.mapper.GameScoreMapper;
 import org.dromara.system.mapper.GameTeamMapper;
-import org.dromara.system.service.*;
+import org.dromara.system.service.IGameAthleteService;
+import org.dromara.system.service.IGameEventProjectService;
+import org.dromara.system.service.IGameEventService;
+import org.dromara.system.service.IGameTeamService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.dromara.system.domain.bo.GameAthleteBo;
-import org.dromara.system.mapper.GameAthleteMapper;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -477,4 +482,15 @@ public class GameAthleteServiceImpl implements IGameAthleteService {
                 .eq(GameAthlete::getEventId, eventId)
         );
     }
+
+    @Override
+    public String queryMaxNumber(Long teamId) {
+        return baseMapper.selectOne(
+            Wrappers.lambdaQuery(GameAthlete.class)
+                .eq(GameAthlete::getTeamId, teamId)
+                .orderByDesc(GameAthlete::getAthleteCode)
+                .select(GameAthlete::getAthleteCode)
+                .last("limit 1")
+        ).getAthleteCode();
+    }
 }

+ 14 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameEventGroupServiceImpl.java

@@ -202,4 +202,18 @@ public class GameEventGroupServiceImpl implements IGameEventGroupService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 根据赛事id查询
+     *
+     * @param defaultEventId
+     * @return
+     */
+    @Override
+    public GameEventGroup queryByEventId(Long defaultEventId) {
+        return baseMapper.selectList(
+            Wrappers.lambdaQuery(GameEventGroup.class)
+                .eq(GameEventGroup::getEventId, defaultEventId)
+        ).get(0);
+    }
 }

+ 162 - 122
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameEventServiceImpl.java

@@ -1,6 +1,5 @@
 package org.dromara.system.service.impl;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.img.FontUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -77,6 +76,10 @@ public class GameEventServiceImpl implements IGameEventService {
     private IGameAthleteService gameAthleteService;
     @Resource
     private IGameEventProjectService gameEventProjectService;
+    @Resource
+    private IGameEventGroupService gameEventGroupService;
+    private static final ExecutorService PDF_GENERATION_EXECUTOR =
+        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
 
     /**
      * 查询赛事基本信息
@@ -590,9 +593,11 @@ public class GameEventServiceImpl implements IGameEventService {
         //3.查询赛事所有项目缓存
         Map<Long, String> projectMap = gameEventProjectService.queryListByEventId(defaultEventId)
             .stream().collect(Collectors.toMap(GameEventProjectVo::getProjectId, GameEventProjectVo::getProjectName));
-        //4.根据参数生成号码布
+        //4.查询赛事组别
+        GameEventGroup gameEventGroup = gameEventGroupService.queryByEventId(defaultEventId);
+        //5.根据参数生成号码布
         GameEventVo eventVo = baseMapper.selectVoById(defaultEventId);
-        generateBib(response, bgImage, logo, eventVo.getEventName(), athleteVoList, teamNameMap, projectMap, bibParam);
+        generateBib(response, bgImage, logo, eventVo.getEventName(), gameEventGroup.getGroupName(), athleteVoList, teamNameMap, projectMap, bibParam);
     }
 
     /**
@@ -602,6 +607,7 @@ public class GameEventServiceImpl implements IGameEventService {
      * @param backgroundImage 背景图 (MultipartFile)
      * @param logo            Logo 图片(可选)
      * @param eventName       赛事名称
+     * @param groupName       组别名称
      * @param athleteList     运动员列表
      * @param teamNameMap     队伍id名称映射
      * @param projectMap      项目id名称映射
@@ -612,12 +618,31 @@ public class GameEventServiceImpl implements IGameEventService {
                             MultipartFile backgroundImage,
                             MultipartFile logo,
                             String eventName,
+                            String groupName,
                             List<GameAthleteVo> athleteList,
                             Map<Long, String> teamNameMap,
                             Map<Long, String> projectMap,
                             GenerateBibBo bibParam) {
+
+        byte[] backgroundImageBytes;
+        byte[] logoImageBytes = null;
+
+        //1.读取图片文件
+        try {
+            if (backgroundImage == null || backgroundImage.isEmpty()) {
+                throw new IllegalArgumentException("背景图不能为空");
+            }
+            backgroundImageBytes = backgroundImage.getBytes();
+
+            if (logo != null && !logo.isEmpty()) {
+                logoImageBytes = logo.getBytes();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("读取上传文件失败", e);
+        }
+
         try {
-            // 提取布局参数
+            // 2. 提取参数
             Double logoX = bibParam.getLogoX();
             Double logoY = bibParam.getLogoY();
             Double qRCodeX = bibParam.getQRCodeX();
@@ -626,151 +651,166 @@ public class GameEventServiceImpl implements IGameEventService {
             Integer fontSize = bibParam.getFontSize();
             Integer fontColor = bibParam.getFontColor();
 
-            // 设置默认值
+            // 2.1 设置默认值及获取字体及颜色
             if (fontSize == null) fontSize = 14;
             BaseColor textColor = parseColor(fontColor);
             BaseFont baseFont = getChineseFont(fontName);
 
-            // 读取背景图
-            Image bgImage = Image.getInstance(backgroundImage.getBytes());
+            // 3. 读取背景图和 logo
+            Image bgImage = Image.getInstance(backgroundImageBytes);
             float pageWidth = bgImage.getWidth();
             float pageHeight = bgImage.getHeight();
 
-            // 提前读取 logo 字节数组
-            byte[] logoBytes = null;
-            if (logo != null && !logo.isEmpty()) {
-                logoBytes = logo.getBytes();
+            // 3.1 验证背景图片比例是否为3:2横屏
+            float ratio = pageWidth / pageHeight;
+            if (Math.abs(ratio - 1.5f) > 0.1f) { // 允许0.1的误差
+                throw new IllegalArgumentException("背景图片比例不是3:2横屏比例,当前比例: " + String.format("%.2f", ratio));
             }
 
-            try (java.util.zip.ZipOutputStream zos = new java.util.zip.ZipOutputStream(response.getOutputStream())) {
-
-                for (GameAthleteVo athlete : athleteList) {
-                    // 每个运动员生成一个 PDF
-                    ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
-                    Document document = new Document(new Rectangle(pageWidth, pageHeight));
-                    PdfWriter writer = PdfWriter.getInstance(document, pdfStream);
-                    document.open();
-
-                    PdfContentByte cb = writer.getDirectContent();
-
-                    // 添加背景图
-                    bgImage.setAbsolutePosition(0, 0);
-                    document.add(bgImage);
-
-                    // 添加Logo - 更精确的位置调整
-                    if (logoBytes != null) {
-                        try {
-                            Image img = Image.getInstance(logoBytes);
+            Integer finalFontSize = fontSize;
+            // 4. 并行生成所有 PDF
+            byte[] finalLogoImageBytes = logoImageBytes;
+            List<CompletableFuture<PdfEntry>> pdfFutures = athleteList.parallelStream()
+                .map(athlete -> CompletableFuture.supplyAsync(() -> {
+                    try {
+                        ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
+                        Document document = new Document(new Rectangle(pageWidth, pageHeight));
+                        PdfWriter writer = PdfWriter.getInstance(document, pdfStream);
+                        document.open();
+                        PdfContentByte cb = writer.getDirectContent();
+
+                        // 添加背景图
+                        Image bg = Image.getInstance(backgroundImageBytes);
+                        bg.setAbsolutePosition(0, 0);
+                        document.add(bg);
+
+                        // 添加 Logo(如果存在)
+                        if (finalLogoImageBytes != null && logoX != null && logoY != null) {
+                            Image img = Image.getInstance(finalLogoImageBytes);
                             img.scaleToFit(80, 80);
-
-                            // 直接使用前端传递的坐标值,更精确的位置调整
-                            float logoPositionX = logoX != null ? logoX.floatValue() : 50f;
-                            float logoPositionY = logoY != null ? logoY.floatValue() : pageHeight - 130f;
-
-                            // 更精确的位置调整
-                            logoPositionX += 10; // 向右偏移10pt
-                            logoPositionY -= 50; // 向下偏移50pt(与编号重合)
-
+                            float logoPositionX = logoX.floatValue();
+                            float logoPositionY = logoY.floatValue();
                             img.setAbsolutePosition(logoPositionX, logoPositionY);
                             cb.addImage(img);
-                        } catch (Exception e) {
-                            // 忽略或记录日志
                         }
-                    }
 
-                    // 计算文本宽度和高度
-                    float textWidth = baseFont.getWidthPoint(athlete.getAthleteCode(), fontSize);
-                    float textHeight = fontSize;
-
-                    // 确保文本垂直和水平都居中
-                    float textPositionX = (pageWidth - textWidth) / 2; // 水平居中
-                    float textPositionY = (pageHeight / 2) + (textHeight / 2); // 垂直居中
-
-                    addText(cb, baseFont, fontSize, textColor, textPositionX, textPositionY, athlete.getAthleteCode());
-
-                    // 添加赛事名称
-                    if (eventName != null && !eventName.trim().isEmpty()) {
+                        // 添加号码(居中)
+                        float textWidth = baseFont.getWidthPoint(athlete.getAthleteCode(), finalFontSize);
+                        float textHeight = finalFontSize;
+                        float textPositionX = (pageWidth - textWidth) / 2;
+                        float textPositionY = (pageHeight / 2) + (textHeight / 2);
+                        addText(cb, baseFont, finalFontSize, textColor, textPositionX, textPositionY, athlete.getAthleteCode());
+
+                        // 添加赛事名称(在3:2横屏比例下调整位置)
+                        if (eventName != null && !eventName.trim().isEmpty()) {
+                            int eventNameFontSize = Math.min(64, (int) (pageHeight * 0.08)); // 根据页面高度调整字体大小
+                            cb.beginText();
+                            cb.setFontAndSize(baseFont, eventNameFontSize);
+                            cb.setColorFill(BaseColor.BLACK);
+                            float textWidth2 = baseFont.getWidthPoint(eventName, eventNameFontSize);
+                            float textX = (pageWidth - textWidth2) / 2;
+                            float textY = pageHeight - eventNameFontSize - 20; // 增加边距
+                            cb.setTextMatrix(textX, textY);
+                            cb.showText(eventName);
+                            cb.endText();
+                        }
 
-                        // 设置字体大小和颜色
-                        int eventNameFontSize = 64; // 确保与绘制文字时的字体大小一致
-                        cb.beginText();
-                        cb.setFontAndSize(baseFont, eventNameFontSize);
-                        cb.setColorFill(BaseColor.BLACK);
+                        // 生成二维码(在3:2横屏比例下调整尺寸)
+                        if (qRCodeX != null && qRCodeY != null) {
+                            String qrDataStr = getQrDataStr(eventName, groupName, teamNameMap, projectMap, athlete);
+                            int qrSize = Math.min(150, (int) (Math.min(pageWidth, pageHeight) * 0.15)); // 根据页面尺寸调整二维码大小
+                            byte[] qrBytes = generateQRCode(qrDataStr, qrSize, qrSize);
+                            Image qrImage = Image.getInstance(qrBytes);
+                            float qrX = qRCodeX.floatValue();
+                            float qrY = qRCodeY.floatValue();
+                            qrImage.setAbsolutePosition(qrX, qrY);
+                            cb.addImage(qrImage);
+                        }
 
-                        // 计算文本宽度和X坐标以实现水平居中
-                        textWidth = baseFont.getWidthPoint(eventName, eventNameFontSize);
-                        float textX = (pageWidth - textWidth) / 2;
+                        document.close();
+                        byte[] pdfBytes = pdfStream.toByteArray();
 
-                        // 设置文本垂直位置使其位于页面顶部,留出一定间距
-                        float textY = pageHeight - eventNameFontSize - 10; // 调整这个值以改变顶部间距
+                        // 构造安全的文件名(避免特殊字符)
+                        String safeName = athlete.getName().replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", "_");
+                        String fileName = String.format("%s_%s.pdf", athlete.getAthleteCode(), safeName);
+                        return new PdfEntry(fileName, pdfBytes);
 
-                        cb.setTextMatrix(textX, textY);
-                        cb.showText(eventName);
-                        cb.endText();
+                    } catch (Exception e) {
+                        // 建议记录日志
+                        System.err.println("生成 PDF 失败: " + athlete.getName() + " - " + e.getMessage());
+                        throw new RuntimeException("生成 PDF 失败: " + athlete.getName(), e);
                     }
-                    StringBuilder joinProject = new StringBuilder();
-                    StringJoiner joiner = new StringJoiner("、"); // 指定分隔符
-                    athlete.getProjectList().forEach(projectId -> {
-                        String projectName = projectMap.get(Long.valueOf(projectId));
-                        if (projectName != null) {
-                            joiner.add(projectName);
-                        }
-                    });
-
-                    // 生成二维码 - 更精确的位置调整
-                    String qrData = String.format(
-                        """
-                            赛事名称:%s,
-                            运动员序号:%d,
-                            运动员编号:%s,
-                            参与项目:%s,
-                            队伍id:%d,
-                            队伍名称:%s,
-                            运动员姓名:%s,
-                            性别:%s,
-                            年龄:%d
-                        """,
-                        eventName, athlete.getAthleteId(), athlete.getAthleteCode(),
-                        joinProject.toString(),
-                        athlete.getTeamId(), teamNameMap.get(athlete.getTeamId()), athlete.getName(), athlete.getGender(), athlete.getAge()
-                    );
-
-                    byte[] qrBytes = generateQRCode(qrData, 150, 150);
-                    Image qrImage = Image.getInstance(qrBytes);
-
-                    // 直接使用前端传递的坐标值,更精确的位置调整
-                    float qrX = qRCodeX != null ? qRCodeX.floatValue() : pageWidth - 170f;
-                    float qrY = qRCodeY != null ? qRCodeY.floatValue() : 50f;
-
-                    // 更精确的位置调整
-                    qrX += 15; // 向右偏移15pt
-                    qrY -= 55; // 向下偏移55pt(与编号重合)
-
-                    qrImage.setAbsolutePosition(qrX, qrY);
-                    cb.addImage(qrImage);
-
-                    document.close();
-
-                    // 写入 ZIP:文件名为 bib_号码_姓名.pdf
-                    String fileName = String.format("bib_%s_%s.pdf", athlete.getAthleteCode(), athlete.getName());
-                    zos.putNextEntry(new java.util.zip.ZipEntry(fileName));
-                    zos.write(pdfStream.toByteArray());
+                }, PDF_GENERATION_EXECUTOR))
+                .toList();
+
+            // 等待所有任务完成
+            List<PdfEntry> pdfEntries = pdfFutures.stream()
+                .map(CompletableFuture::join)
+                .toList();
+
+            // 4. 设置响应头,开始写 ZIP
+            response.setContentType("application/zip");
+            response.setHeader("Content-Disposition", "attachment; filename=\"athlete_bibs.zip\"");
+
+            // 5. 写入 ZIP 文件
+            try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
+                for (PdfEntry entry : pdfEntries) {
+                    zos.putNextEntry(new ZipEntry(entry.getFileName()));
+                    zos.write(entry.getPdfBytes());
                     zos.closeEntry();
                 }
-
-                // 强制刷新输出流
                 zos.flush();
-                response.flushBuffer();
-
-            } catch (Exception e) {
-                throw new RuntimeException("生成号码布 ZIP 失败", e);
             }
+
         } catch (Exception e) {
-            throw new RuntimeException(e);
-        } finally {
+            throw new RuntimeException("批量生成号码布失败", e);
         }
     }
 
+    /**
+     * 生成二维码数据
+     *
+     * @param eventName
+     * @param groupName
+     * @param teamNameMap
+     * @param projectMap
+     * @param athlete
+     * @return
+     */
+    @NotNull
+    private static String getQrDataStr(String eventName, String groupName, Map<Long, String> teamNameMap, Map<Long, String> projectMap, GameAthleteVo athlete) {
+        //处理参加项目
+        StringBuilder joinProject = new StringBuilder();
+        StringJoiner joiner = new StringJoiner("、"); // 指定分隔符
+        athlete.getProjectList().forEach(projectId -> {
+            String projectName = projectMap.get(Long.valueOf(projectId));
+            if (projectName != null) {
+                joiner.add(projectName);
+            }
+        });
+
+        // 生成二维码
+        String qrData = String.format(
+            """
+                    {
+                        赛事名称:%s,
+                        运动员序号:%d,
+                        运动员编号:%s,
+                        参与项目:%s,
+                        队伍名称:%s,
+                        运动员姓名:%s,
+                        性别:%s,
+                        年龄:%d
+                        组别:%s
+                    }
+                """,
+            eventName, athlete.getAthleteId(), athlete.getAthleteCode(),
+            joinProject, teamNameMap.get(athlete.getTeamId()), athlete.getName(),
+            athlete.getGender(), athlete.getAge(), groupName
+        );
+        return qrData;
+    }
+
     // 工具方法:添加文本
     private static void addText(PdfContentByte cb, BaseFont font, int size, BaseColor color, float x, float y, String text) {
         cb.beginText();

+ 45 - 5
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameTeamServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -54,10 +55,10 @@ public class GameTeamServiceImpl implements IGameTeamService {
     @Override
     public GameTeamVo queryById(Long teamId) {
         GameTeamVo vo = baseMapper.selectVoById(teamId);
-        if(vo==null){
+        if (vo == null) {
             return null;
         }
-        if(vo.getAthleteValue()!=null){
+        if (vo.getAthleteValue() != null) {
             log.info("teamId:{}, athleteValue:{}", teamId, vo.getAthleteValue());
             vo.setAthleteList(JSONUtil.toList(vo.getAthleteValue(), String.class));
         }
@@ -210,11 +211,20 @@ public class GameTeamServiceImpl implements IGameTeamService {
                 bo.setEventId((Long) cacheObject);
             }
         }
-        if(bo.getAthleteList()!=null){
+        if (bo.getAthleteList() != null) {
             bo.setAthleteValue(JSONUtil.toJsonStr(bo.getAthleteList()));
         }
         GameTeam add = MapstructUtils.convert(bo, GameTeam.class);
         validEntityBeforeSave(add);
+        //查询是否重复
+        Long count = baseMapper.selectCount(
+            Wrappers.lambdaQuery(GameTeam.class)
+                .eq(GameTeam::getEventId, add.getEventId())
+                .eq(GameTeam::getTeamName, add.getTeamName())
+        );
+        if (count > 0) {
+            throw new ServiceException("队伍名称重复");
+        }
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setTeamId(add.getTeamId());
@@ -238,7 +248,7 @@ public class GameTeamServiceImpl implements IGameTeamService {
                 bo.setEventId((Long) cacheObject);
             }
         }
-        if(bo.getAthleteList()!=null){
+        if (bo.getAthleteList() != null) {
             bo.setAthleteValue(JSONUtil.toJsonStr(bo.getAthleteList()));
         }
         GameTeam update = MapstructUtils.convert(bo, GameTeam.class);
@@ -275,6 +285,22 @@ public class GameTeamServiceImpl implements IGameTeamService {
      */
     @Override
     public Boolean saveBatch(List<GameTeam> list) {
+        if (CollectionUtils.isEmpty(list)) {
+            throw new ServiceException("导入信息为空");
+        }
+        Long eventId = list.get(0).getEventId();
+        Set<String> names = list.stream()
+            .map(GameTeam::getTeamName)
+            .collect(Collectors.toSet());
+        //查询是否重复
+        Long count = baseMapper.selectCount(
+            Wrappers.lambdaQuery(GameTeam.class)
+                .eq(GameTeam::getEventId, eventId)
+                .in(GameTeam::getTeamName, names)
+        );
+        if (count > 0) {
+            throw new ServiceException("导入失败,有队伍名称重复");
+        }
         return baseMapper.insertBatch(list);
     }
 
@@ -309,7 +335,7 @@ public class GameTeamServiceImpl implements IGameTeamService {
     /**
      * 更新队伍中的运动员列表
      *
-     * @param teamId 队伍ID
+     * @param teamId     队伍ID
      * @param athleteIds 运动员ID列表
      * @return 是否更新成功
      */
@@ -369,4 +395,18 @@ public class GameTeamServiceImpl implements IGameTeamService {
             .collect(Collectors.toMap(GameTeamVo::getTeamId, GameTeamVo::getTeamName));
         return map;
     }
+
+    @Override
+    public GameTeam queryByName(String teamName, Long eventId) {
+        return baseMapper.selectOne(
+            Wrappers.lambdaQuery(GameTeam.class)
+                .eq(GameTeam::getTeamName, teamName)
+                .eq(GameTeam::getEventId, eventId)
+        );
+    }
+
+    @Override
+    public GameTeam queryMaxNumber(Long eventId) {
+        return baseMapper.selectMaxNumber(eventId);
+    }
 }

+ 90 - 17
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/IEnrollServiceImpl.java

@@ -1,43 +1,34 @@
 package org.dromara.system.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.Snowflake;
-import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
-import cn.idev.excel.annotation.ExcelProperty;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import lombok.val;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.ObjectUtils;
-import org.dromara.system.controller.TestPoi;
+import org.dromara.system.domain.GameTeam;
+import org.dromara.system.domain.bo.EnrollBo;
 import org.dromara.system.domain.bo.GameAthleteBo;
-import org.dromara.system.domain.bo.GameEventProjectBo;
 import org.dromara.system.domain.bo.GameTeamBo;
 import org.dromara.system.domain.vo.EnrollProjectVo;
-import org.dromara.system.service.IEnrollService;
-import org.dromara.system.service.IGameAthleteService;
-import org.dromara.system.service.IGameEventProjectService;
-import org.dromara.system.service.IGameTeamService;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.ResourceLoader;
-import org.springframework.http.ResponseEntity;
+import org.dromara.system.service.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.*;
-import java.lang.reflect.Field;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -49,6 +40,7 @@ public class IEnrollServiceImpl implements IEnrollService {
     private final IGameEventProjectService gameEventProjectService;
     private final IGameTeamService gameTeamService;
     private final IGameAthleteService gameAthleteService;
+    private final IGameEventService gameEventService;
 
     /**
      * 使用poi生成报名表模板
@@ -198,6 +190,85 @@ public class IEnrollServiceImpl implements IEnrollService {
         return this.saveEnrollData(enrollList, eventId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean enroll(EnrollBo enrollBo) {
+        Long eventId = enrollBo.getEventId();
+        Long projectId = enrollBo.getProjectId();
+        String name = enrollBo.getName();
+        String teamName = enrollBo.getTeamName();
+        Integer gender = enrollBo.getGender();
+        Integer age = enrollBo.getAge();
+        String phone = enrollBo.getPhone();
+        String idCard = enrollBo.getIdCard();
+        // 1.查询队伍是否存在 如果存在就更新成员
+        GameTeam team = gameTeamService.queryByName(teamName, eventId);
+        Snowflake snowflake = IdUtil.createSnowflake(1, 1);
+        Long teamId = snowflake.nextId();
+        Long athleteId = snowflake.nextId();
+        String athleteCode = "";
+        if (team == null) {
+            // 1.1 如果队伍不存在就创建队伍并且生成号码段
+            //查询当前赛事号码段最大的
+            GameTeam maxNumberTeam = gameTeamService.queryMaxNumber(eventId);
+            // 生成新的队伍号码段 numberRange
+            // start=maxNumberTeam.getNumberRange.endNumber+1
+            String[] maxNumberRange = maxNumberTeam.getNumberRange().split("-");
+            String startNumber = String.valueOf(Integer.parseInt(maxNumberRange[1]) + 1);
+            // end=maxNumberTeam.getNumberRange.endNumber+300
+            String endNumber = String.valueOf(Integer.parseInt(maxNumberRange[1]) + 300);
+            GameTeamBo gameTeamBo = new GameTeamBo();
+            gameTeamBo.setTeamId(teamId);
+            gameTeamBo.setEventId(eventId);
+            gameTeamBo.setTeamName(teamName);
+            gameTeamBo.setLeader(name);
+            gameTeamBo.setAthleteValue(JSONUtil.toJsonStr(Arrays.asList(athleteId)));
+            gameTeamBo.setAthleteNum(1L);
+            gameTeamBo.setNumberRange(startNumber + "-" + endNumber);
+            gameTeamBo.setCreateDept(-1L);
+            gameTeamBo.setCreateBy(-1L);
+            gameTeamBo.setCreateTime(DateTime.now());
+            gameTeamBo.setUpdateBy(null);
+            gameTeamBo.setUpdateTime(null);
+            athleteCode = startNumber;
+            gameTeamService.insertByBo(gameTeamBo);
+        } else {
+            // 1.2 查询当前队伍中号码段最大的 继续号码
+            teamId = team.getTeamId();
+            String maxNumber = gameAthleteService.queryMaxNumber(teamId);
+            athleteCode = String.valueOf(Integer.parseInt(maxNumber) + 1);
+            // 1.3 更新运动员成员
+            List<Long> ids = JSONUtil.toList(team.getAthleteValue(), Long.class);
+            ids.add(athleteId);
+            team.setAthleteValue(JSONUtil.toJsonStr(ids));
+
+            GameTeamBo bo = new GameTeamBo();
+            BeanUtil.copyProperties(team, bo);
+            gameTeamService.updateByBo(bo);
+        }
+        // 2.加入运动员表
+        GameAthleteBo gameAthleteBo = new GameAthleteBo();
+        gameAthleteBo.setAthleteId(athleteId);
+        gameAthleteBo.setEventId(eventId);
+        gameAthleteBo.setTeamId(teamId);
+        gameAthleteBo.setAthleteCode(athleteCode);
+        gameAthleteBo.setName(name);
+        gameAthleteBo.setGender(String.valueOf(gender));
+        gameAthleteBo.setAge(Long.valueOf(age));
+        gameAthleteBo.setUnit(teamName);
+        gameAthleteBo.setIdCard(idCard);
+        gameAthleteBo.setPhone(phone);
+        gameAthleteBo.setProjectValue(JSONUtil.toJsonStr(Arrays.asList(projectId)));
+        gameAthleteBo.setCreateDept(-1L);
+        gameAthleteBo.setCreateBy(-1L);
+        gameAthleteBo.setCreateTime(DateTime.now());
+        gameAthleteBo.setUpdateBy(null);
+        gameAthleteBo.setUpdateTime(null);
+        return gameAthleteService.insertByBo(gameAthleteBo);
+    }
+
+    // region 辅助方法
+
     private List<EnrollProjectVo> parseData(MultipartFile file) {
         try {
             List<EnrollProjectVo> enrolls = new ArrayList<>();
@@ -495,4 +566,6 @@ public class IEnrollServiceImpl implements IEnrollService {
 
         return startStr + "-" + endStr;
     }
+
+    // endregion 辅助方法
 }

+ 0 - 1
ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/AlipayBillTask.java

@@ -38,5 +38,4 @@ public class AlipayBillTask {
         SnailJobLog.REMOTE.info("上下文: {}", jobArgs.getWfContext());
         return ExecuteResult.success(billDto);
     }
-
 }