浏览代码

feat(app): 新增赛事分页查询功能

- 在 AppGameMapper 中添加 convertSearchCompetitionVOPage 方法
- 在 AppHomeServiceImpl 中实现 convertSearchCompetitionVOPage 方法
- 更新相关实体类和 DTO
- 新增 NoSwaggerExpand 注解用于控制 Swagger 参数展示
SheepHy 2 周之前
父节点
当前提交
59753cc533

+ 14 - 0
national-motion-base-core/src/main/java/org/jeecg/config/NoSwaggerExpand.java

@@ -0,0 +1,14 @@
+package org.jeecg.config;
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.PARAMETER})
+public @interface NoSwaggerExpand {
+
+    /**
+     * default swagger expand disable
+     */
+    boolean expand() default false;
+}

+ 4 - 0
national-motion-base-core/src/main/java/org/jeecg/config/SwaggerExpandAspect.java

@@ -0,0 +1,4 @@
+package org.jeecg.config;
+
+public class SwaggerExpandAspect {
+}

+ 2 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/AppHomeController.java

@@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.config.NoSwaggerExpand;
 import org.jeecg.modules.app.dto.GetPlaceListDTO;
 import org.jeecg.modules.app.service.IAppHomeService;
 import org.jeecg.modules.app.service.IUserService;
@@ -67,7 +68,7 @@ public class AppHomeController {
      **/
     @PostMapping("/getPlaceList")
     @Operation(summary = "场地列表查询 词典CODE:venue_type")
-    public Result<Page<PlaceVO>> getPlaceList(@RequestBody GetPlaceListDTO getPlaceListDTO){
+    public Result<Page<PlaceVO>> getPlaceList(@NoSwaggerExpand @RequestBody @Schema(description = "查询参数") GetPlaceListDTO getPlaceListDTO){
         return Result.ok(appHomeService.getPlaceList(getPlaceListDTO));
     }
 }

+ 3 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/GetPlaceListDTO.java

@@ -10,11 +10,11 @@ import lombok.experimental.Accessors;
 @EqualsAndHashCode(callSuper = false)
 @Schema(description="场地分页查询入参DTO")
 public class GetPlaceListDTO {
-    @Schema(description ="页码")
+    @Schema(description ="页码", example = "1")
     private long size;
-    @Schema(description ="当前页")
+    @Schema(description ="当前页", example = "10")
     private long current;
-    @Schema(description ="筛选类型")
+    @Schema(description ="筛选类型", example = "0-1")
     private String venueType;
     @Schema(description ="经度")
     private double longitude;

+ 45 - 14
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/AppHomeServiceImpl.java

@@ -7,7 +7,7 @@ import org.jeecg.modules.app.dto.SearchDTO;
 import org.jeecg.modules.app.service.IAppHomeService;
 import org.jeecg.modules.app.vo.*;
 import org.jeecg.modules.system.app.entity.AppBanner;
-import org.jeecg.modules.system.app.entity.AppCourese;
+import org.jeecg.modules.system.app.entity.AppCourses;
 import org.jeecg.modules.system.app.entity.AppInstructor;
 import org.jeecg.modules.system.app.mapper.*;
 import org.jeecg.modules.system.entity.SysDepart;
@@ -41,6 +41,8 @@ public class AppHomeServiceImpl implements IAppHomeService {
     private AppSiteMapper appSiteMapper;
     @Resource
     private AppCategoryMapper appCategoryMapper;
+    @Resource
+    private AppGameMapper appGameMapper;
 
     @Override
     public HomeVO homeInfo() {
@@ -49,17 +51,17 @@ public class AppHomeServiceImpl implements IAppHomeService {
                 .eq(AppBanner::getDelFlag, 0).eq(AppBanner::getIsEnabled,1));
 
         // 精品课程(最多3个)
-        List<AppCourese> appCoureseFine = appCoursesMapper.selectList(Wrappers.<AppCourese>lambdaQuery()
-                .eq(AppCourese::getPriceType, 0).last("LIMIT 3"));
+        List<AppCourses> appCoursesFine = appCoursesMapper.selectList(Wrappers.<AppCourses>lambdaQuery()
+                .eq(AppCourses::getPriceType, 0).last("LIMIT 3"));
 
         // 免费课程(最多3个)
-        List<AppCourese> appCoureseFree = appCoursesMapper.selectList(Wrappers.<AppCourese>lambdaQuery()
-                .eq(AppCourese::getPriceType, 1).last("LIMIT 3"));
+        List<AppCourses> appCoursesFree = appCoursesMapper.selectList(Wrappers.<AppCourses>lambdaQuery()
+                .eq(AppCourses::getPriceType, 1).last("LIMIT 3"));
 
         // 合并课程信息
         List<CoureseVO> courseVO = new ArrayList<>();
-        courseVO.addAll(convertToCoureseVOList(appCoureseFine));
-        courseVO.addAll(convertToCoureseVOList(appCoureseFree));
+        courseVO.addAll(convertToCoureseVOList(appCoursesFine));
+        courseVO.addAll(convertToCoureseVOList(appCoursesFree));
 
         // 获取好评率最高的两个教练 ID
         List<String> topInstructorUserIds = sysUserMapper.getUserIdListByRoleId(INSTRUCTOR).stream()
@@ -93,8 +95,8 @@ public class AppHomeServiceImpl implements IAppHomeService {
                             .eq(SysDepart::getOrgCode, sysUser.getOrgCode())).getDepartName());
 
             // 获取该教练的课程(最多取2个)
-            List<AppCourese> courses = appCoursesMapper.selectList(
-                    Wrappers.<AppCourese>lambdaQuery().eq(AppCourese::getUserId, userId).last("LIMIT 2"));
+            List<AppCourses> courses = appCoursesMapper.selectList(
+                    Wrappers.<AppCourses>lambdaQuery().eq(AppCourses::getUserId, userId).last("LIMIT 2"));
 
             List<InstructorVO.CourseInfoVO> courseInfoVOS = courses.stream()
                     .map(course -> {
@@ -126,10 +128,10 @@ public class AppHomeServiceImpl implements IAppHomeService {
      * @Author SheepHy
      * @Description 合并课程信息
      * @Date 9:14 2025/7/4
-     * @Param appCoureseList {@link List<AppCourese>}
+     * @Param appCoureseList {@link List<AppCourses>}
      * @return List<CoureseVO> {@link List<CoureseVO>}
      **/
-    private List<CoureseVO> convertToCoureseVOList(List<AppCourese> appCoureseList) {
+    private List<CoureseVO> convertToCoureseVOList(List<AppCourses> appCoureseList) {
         return appCoureseList.stream()
                 .map(courese -> new CoureseVO()
                         .setId(courese.getId()).setCover(courese.getCover())
@@ -168,7 +170,7 @@ public class AppHomeServiceImpl implements IAppHomeService {
             case '1':
                     return convertSearchTrainVOPage(searchDTO);
             case '2':
-                    return new Page<>();
+                    return convertSearchCompetitionVOPage(searchDTO);
             case '3':
                     return new Page<>();
         }
@@ -221,8 +223,8 @@ public class AppHomeServiceImpl implements IAppHomeService {
      * @Author SheepHy
      * @Description 培训课程分页查询
      * @Date 13:37 2025/7/7
-     * @Param
-     * @return
+     * @Param searchDTO {@link SearchDTO}
+     * @return Page<SearchVO.SearchTrainVO>
      **/
     private Page<SearchVO.SearchTrainVO> convertSearchTrainVOPage(SearchDTO searchDTO) {
         Page<SearchVO.SearchTrainVO> page = new Page<>(searchDTO.getCurrent(), searchDTO.getSize());
@@ -234,4 +236,33 @@ public class AppHomeServiceImpl implements IAppHomeService {
         return searchTrainVOPage;
     }
 
+    /**
+     * @Author SheepHy
+     * @Description 赛事分页查询
+     * @Date 14:04 2025/7/7
+     * @Param searchDTO {@link SearchDTO}
+     * @return Page<SearchVO.SearchRaceVO>
+     **/
+    private Page<SearchVO.SearchRaceVO> convertSearchCompetitionVOPage(SearchDTO searchDTO) {
+        Page<SearchVO.SearchRaceVO> page = new Page<>(searchDTO.getCurrent(), searchDTO.getSize());
+        Page<SearchVO.SearchRaceVO> searchCompetitionVOPage = appGameMapper.convertSearchCompetitionVOPage(page, searchDTO);
+        searchCompetitionVOPage.getRecords().forEach(competitionVO -> {
+            //todo 待申请第三方地图接口
+            competitionVO.setKm(0.0);
+        });
+        return page;
+    }
+    
+    /** 
+     * @Author SheepHy
+     * @Description //TODO 
+     * @Date 14:43 2025/7/7
+     * @Param
+     * @return 
+     **/
+    private Page<SearchVO.SearchInstructorVO> convertSearchInstructorVOPage(SearchDTO searchDTO) {
+        Page<SearchVO.SearchInstructorVO> page = new Page<>(searchDTO.getCurrent(), searchDTO.getSize());
+//        Page<SearchVO.SearchInstructorVO> searchInstructorVOPage = appInstructorMapper.convertSearchInstructorVOPage(page, searchDTO);
+        return page;
+    }
 }

+ 5 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/SearchVO.java

@@ -87,6 +87,10 @@ public class SearchVO{
         private java.util.Date startTime;
         @Schema(description = "结束时间")
         private java.util.Date endTime;
+        @Schema(description = "距离(KM)")
+        private double km;
+        @Schema(description = "赛事是否结束")
+        private boolean isRegistrationOpen;
     }
 
     @Data
@@ -152,7 +156,7 @@ public class SearchVO{
     @Accessors(chain = true)
     @EqualsAndHashCode(callSuper = false)
     @Schema(description="全局搜索产品信息返回参数")
-    public static class SearchCoureseVO{
+    public static class SearchCoursesVO{
         @Schema(description = "id")
         private String id;
         @Schema(description = "名称")

+ 13 - 11
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppGame.java

@@ -1,23 +1,19 @@
 package org.jeecg.modules.system.app.entity;
 
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.util.Date;
-import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableLogic;
-import org.jeecg.common.constant.ProvinceCityArea;
-import org.jeecg.common.util.SpringContextUtils;
-import lombok.Data;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.jeecgframework.poi.excel.annotation.Excel;
-import org.jeecg.common.aspect.annotation.Dict;
 import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
 
 /**
  * @Description: 赛事表
@@ -109,6 +105,12 @@ public class AppGame implements Serializable {
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @Schema(description = "结束时间")
     private Date endTime;
+    /**报名截止时间*/
+    @Excel(name = "报名截止时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "报名截止时间")
+    private Date applicationEndTime;
 	/**排序*/
 	@Excel(name = "排序", width = 15)
     @Schema(description = "排序")

+ 12 - 4
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppGameMapper.java

@@ -1,10 +1,11 @@
 package org.jeecg.modules.system.app.mapper;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.app.dto.SearchDTO;
+import org.jeecg.modules.app.vo.SearchVO;
 import org.jeecg.modules.system.app.entity.AppGame;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
  * @Description: 赛事表
@@ -13,5 +14,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @Version: V1.0
  */
 public interface AppGameMapper extends BaseMapper<AppGame> {
-
+    /**
+     * @Author SheepHy
+     * @Description 赛事分页查询
+     * @Date 14:04 2025/7/7
+     * @Param searchDTO {@link SearchDTO}
+     * @return Page<SearchVO.SearchRaceVO>
+     **/
+    Page<SearchVO.SearchRaceVO> convertSearchCompetitionVOPage(@Param("page")Page<SearchVO.SearchRaceVO> page,@Param("searchDTO")SearchDTO searchDTO);
 }

+ 1 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppCoursesMapper.xml

@@ -6,6 +6,7 @@
             a.id,
             a.`name`,
             b.address,
+            a.cover,
             a.original_price,
             a.selling_price,
             COALESCE(d.sales, 0) AS sales,

+ 29 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppGameMapper.xml

@@ -1,5 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.system.app.mapper.AppGameMapper">
-
+    <select id="convertSearchCompetitionVOPage" resultType="org.jeecg.modules.app.vo.SearchVO$SearchRaceVO" parameterType="org.jeecg.modules.app.dto.SearchDTO">
+        SELECT
+            a.id,
+            a.cover,
+            a.type,
+            COALESCE(g.min_original_price, 0) AS original_price,
+            COALESCE(g.min_selling_price, 0) AS selling_price,
+            a.address,
+            CASE
+                WHEN a.application_end_time >= NOW() THEN TRUE
+                ELSE FALSE
+                END AS isRegistrationOpen
+        FROM
+            nm_game a
+                LEFT JOIN (
+                SELECT
+                    game_id,
+                    MIN(original_price) AS min_original_price,
+                    MIN(selling_price) AS min_selling_price
+                FROM nm_game_peice_rules
+                GROUP BY game_id
+            ) g ON a.id = g.game_id
+        WHERE
+            a.end_time > NOW()
+        <if test="searchDTO.keyword != null and searchDTO.keyword == ''">
+            AND (a.name LIKE CONCAT('%',#{searchDTO.keyword},'%') OR a.address LIKE CONCAT('%',#{searchDTO.keyword},'%'))
+        </if>
+        ORDER BY a.end_time ASC;
+    </select>
 </mapper>