Forráskód Böngészése

feat(app): 添加全局搜索功能并优化教练列表展示

- 新增全局搜索接口和相关逻辑
- 优化教练列表展示,增加课程信息和距离字段
- 移除未使用的 NoSwaggerExpand 注解
- 调整部分代码结构以适应新功能
SheepHy 2 hete
szülő
commit
d3b2ae5950

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

@@ -1,14 +0,0 @@
-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;
-}

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

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

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

@@ -6,8 +6,8 @@ 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.dto.SearchDTO;
 import org.jeecg.modules.app.service.IAppHomeService;
 import org.jeecg.modules.app.service.IUserService;
 import org.jeecg.modules.app.vo.HomeVO;
@@ -68,7 +68,20 @@ public class AppHomeController {
      **/
     @PostMapping("/getPlaceList")
     @Operation(summary = "场地列表查询 词典CODE:venue_type")
-    public Result<Page<PlaceVO>> getPlaceList(@NoSwaggerExpand @RequestBody @Schema(description = "查询参数") GetPlaceListDTO getPlaceListDTO){
+    public Result<Page<PlaceVO>> getPlaceList(@RequestBody(required = true) GetPlaceListDTO getPlaceListDTO){
         return Result.ok(appHomeService.getPlaceList(getPlaceListDTO));
     }
+
+    /**
+     * @Author SheepHy
+     * @Description 全局搜索
+     * @Date 10:37 2025/7/4
+     * @Param
+     * @return
+     **/
+    @PostMapping("/search")
+    @Operation(summary = "全局搜索 词典CODE:search_type")
+    public Result<Object> search(@RequestBody SearchDTO searchDTO){
+        return Result.ok(appHomeService.search(searchDTO));
+    }
 }

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

@@ -27,7 +27,7 @@ public class CommonAppController {
      * @param dictCode 要查询的key
      * @return
      */
-    @Operation(description="根据字典code查询字典项")
+    @Operation(summary="根据字典code查询字典项")
     @GetMapping("/getDictItems")
     public List<DictModel> getDictItems(@RequestParam("dictCode") String dictCode) {
         return sysBaseApi.getDictItems(dictCode);

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

@@ -172,7 +172,7 @@ public class AppHomeServiceImpl implements IAppHomeService {
             case '2':
                     return convertSearchCompetitionVOPage(searchDTO);
             case '3':
-                    return new Page<>();
+                    return convertSearchInstructorVOPage(searchDTO);
         }
         return new Page<>();
     }
@@ -257,12 +257,26 @@ public class AppHomeServiceImpl implements IAppHomeService {
      * @Author SheepHy
      * @Description //TODO 
      * @Date 14:43 2025/7/7
-     * @Param
-     * @return 
+     * @Param searchDTO {@link SearchDTO}
+     * @return Page<SearchVO.SearchInstructorVO>
      **/
     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;
+        Page<SearchVO.SearchInstructorVO> searchInstructorVOPage = appInstructorMapper.convertSearchInstructorVOPage(page, searchDTO);
+        searchInstructorVOPage.getRecords().forEach(instructorVO -> {
+            // 获取该教练的课程(最多取2个)
+            List<AppCourses> courses = appCoursesMapper.selectList(
+                    Wrappers.<AppCourses>lambdaQuery().eq(AppCourses::getUserId, instructorVO.getUserId()).last("LIMIT 2"));
+            List<SearchVO.SearchCoursesVO> courseInfoVOS = courses.stream()
+                    .map(course -> {
+                        SearchVO.SearchCoursesVO vo = new SearchVO.SearchCoursesVO();
+                        BeanUtils.copyProperties(vo, course);
+                        return vo;
+                    })
+                    .collect(Collectors.toList());
+            instructorVO.setKm(0.0)
+                    .setCourseList(courseInfoVOS);
+        });
+        return searchInstructorVOPage;
     }
 }

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

@@ -38,6 +38,8 @@ public class SearchVO{
         private String orgName;
         @Schema(description = "擅长说明")
         private String excelMsg;
+        @Schema(description = "km")
+        private double km;
         @Schema(description = "教学理念")
         private String teachingPhilosophy;
         @Schema(description = "好评率")
@@ -45,9 +47,13 @@ public class SearchVO{
         @Schema(description = "订单数")
         private String orderCount;
         @Schema(description = "授课人数")
-        private String teachingCount;
+        private String classesNumber;
+        @Schema(description = "课程列表ID")
+        private String categoryId;
+        @Schema(hidden = true)
+        private String userId;
         @Schema(description = "课程列表")
-        private List<CourseInfoVO> courseList;
+        private List<SearchCoursesVO> courseList;
     }
     @Data
     @Accessors(chain = true)

+ 12 - 4
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppInstructorMapper.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.AppInstructor;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
  * @Description: 教练表
@@ -13,5 +14,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @Version: V1.0
  */
 public interface AppInstructorMapper extends BaseMapper<AppInstructor> {
-
+    /**
+     * @Author SheepHy
+     * @Description //TODO
+     * @Date 14:43 2025/7/7
+     * @Param searchDTO {@link SearchDTO}
+     * @return Page<SearchVO.SearchInstructorVO>
+     **/
+    Page<SearchVO.SearchInstructorVO> convertSearchInstructorVOPage(@Param("page")Page<SearchVO.SearchInstructorVO> page,@Param("searchDTO")SearchDTO searchDTO);
 }

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

@@ -1,5 +1,38 @@
 <?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.AppInstructorMapper">
-
+    <select id="convertSearchInstructorVOPage" resultType="org.jeecg.modules.app.vo.SearchVO$SearchInstructorVO">
+        SELECT
+            a.id,
+            b.realname AS name,
+            b.avatar,
+            c.depart_name AS orgName,
+            a.excel_msg,
+            a.teaching_philosophy,
+            a.good_rate,
+            a.classes_number,
+            b.user_id,
+            COUNT( DISTINCT d.user_id, c2.id ) AS orderCount
+        FROM
+            nm_instructor a
+                LEFT JOIN sys_user b ON a.user_id = b.id
+                LEFT JOIN sys_depart c ON b.org_code = c.org_code
+                LEFT JOIN nm_courses d ON a.user_id = d.user_id
+                LEFT JOIN nm_order_product c2 ON d.user_id = c2.product_id
+        WHERE 1=1
+        <if test="searchDTO.keyword != null and searchDTO.keyword == ''">
+            AND (b.realname LIKE CONCAT('%',#{searchDTO.keyword},'%') OR c.depart_name LIKE CONCAT('%',#{searchDTO.keyword},'%'))
+        </if>
+        GROUP BY
+            a.id,
+            b.realname,
+            b.avatar,
+            b.user_id,
+            c.depart_name,
+            a.excel_msg,
+            a.teaching_philosophy,
+            a.good_rate,
+            a.classes_number
+        ORDER BY orderCount DESC
+    </select>
 </mapper>