Переглянути джерело

Merge remote-tracking branch 'origin/master'

lix 3 тижнів тому
батько
коміт
66f83761da
24 змінених файлів з 609 додано та 85 видалено
  1. 5 0
      national-motion-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java
  2. 3 1
      national-motion-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
  3. 17 4
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/AppHomeController.java
  4. 35 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/CommonAppController.java
  5. 25 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/GetPlaceListDTO.java
  6. 12 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IAppHomeService.java
  7. 1 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IUserService.java
  8. 139 33
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/AppHomeServiceImpl.java
  9. 22 20
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/UserServiceImpl.java
  10. 4 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/CoureseVO.java
  11. 3 3
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/InstructorVO.java
  12. 36 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/PlaceVO.java
  13. 162 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/SearchVO.java
  14. 11 11
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppCourese.java
  15. 43 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppSearchHot.java
  16. 7 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppSearchHotMapper.java
  17. 13 3
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppSiteMapper.java
  18. 32 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppSiteMapper.xml
  19. 7 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSearchHotService.java
  20. 11 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppSearchHotServiceImpl.java
  21. 5 5
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java
  22. 9 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
  23. 5 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
  24. 2 2
      national-motion-module-system/national-motion-system-start/src/main/resources/application-dev.yml

+ 5 - 0
national-motion-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java

@@ -630,4 +630,9 @@ public interface CommonConstant {
     * 修改手机号验证码请求次数超出
     */
    Integer PHONE_SMS_FAIL_CODE = 40002;
+
+   /**
+    * 教练
+    * */
+   String INSTRUCTOR = "instructor";
 }

+ 3 - 1
national-motion-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java

@@ -101,6 +101,8 @@ public class ShiroConfig {
         filterChainDefinitionMap.put("/sys/common/static/**", "anon");//图片预览 &下载文件不限制token
         filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览
 
+        filterChainDefinitionMap.put("/app/user/**", "anon");//小程序相关
+
         //filterChainDefinitionMap.put("/sys/common/view/**", "anon");//图片预览不限制token
         //filterChainDefinitionMap.put("/sys/common/download/**", "anon");//文件下载不限制token
         filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件
@@ -231,7 +233,7 @@ public class ShiroConfig {
     @Bean("securityManager")
     public DefaultWebSecurityManager securityManager(ShiroRealm myRealm) {
         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
-        securityManager.setRememberMeManager(rememberMeManager());
+        securityManager.setRememberMeManager(null);
         securityManager.setRealm(myRealm);
 
         /*

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

@@ -1,19 +1,19 @@
 package org.jeecg.modules.app.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.v3.oas.annotations.Operation;
 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.modules.app.dto.GetPlaceListDTO;
 import org.jeecg.modules.app.service.IAppHomeService;
 import org.jeecg.modules.app.service.IUserService;
 import org.jeecg.modules.app.vo.HomeVO;
 import org.jeecg.modules.app.vo.MsgInfoVO;
 import org.jeecg.modules.app.vo.MsgVO;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.jeecg.modules.app.vo.PlaceVO;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -57,4 +57,17 @@ public class AppHomeController {
     public Result<MsgInfoVO> getMsgInfo(@RequestParam(required = false) @Schema(description = "消息ID") String id){
         return Result.ok(userService.getMsgInfo(id));
     }
+
+    /**
+     * @Author SheepHy
+     * @Description 场地列表查询
+     * @Date 10:37 2025/7/4
+     * @Param
+     * @return
+     **/
+    @PostMapping("/getPlaceList")
+    @Operation(summary = "场地列表查询")
+    public Result<Page<PlaceVO>> getPlaceList(@RequestBody GetPlaceListDTO getPlaceListDTO){
+        return Result.ok(appHomeService.getPlaceList(getPlaceListDTO));
+    }
 }

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

@@ -0,0 +1,35 @@
+package org.jeecg.modules.app.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Slf4j
+@Tag(name = "App公共相关接口")
+@RestController
+@RequestMapping("/app/common")
+public class CommonAppController {
+    @Resource
+    private SysBaseApiImpl sysBaseApi;
+    /**
+     * 根据字典code查询字典项
+     *
+     * @param dictCode 顺序:tableName,text,code
+     * @param dictCode 要查询的key
+     * @return
+     */
+    @Operation(description="根据字典code查询字典项")
+    @GetMapping("/getDictItems")
+    public List<DictModel> getDictItems(@RequestParam("dictCode") String dictCode) {
+        return sysBaseApi.getDictItems(dictCode);
+    }
+}

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

@@ -0,0 +1,25 @@
+package org.jeecg.modules.app.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="场地分页查询入参DTO")
+public class GetPlaceListDTO {
+    @Schema(description ="页码")
+    private long size;
+    @Schema(description ="当前页")
+    private long current;
+    @Schema(description ="筛选类型")
+    private String venueType;
+    @Schema(description ="经度")
+    private double longitude;
+    @Schema(description ="纬度")
+    private double latitude;
+
+
+}

+ 12 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IAppHomeService.java

@@ -1,7 +1,10 @@
 package org.jeecg.modules.app.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.app.dto.GetPlaceListDTO;
 import org.jeecg.modules.app.vo.AppBannerVO;
 import org.jeecg.modules.app.vo.HomeVO;
+import org.jeecg.modules.app.vo.PlaceVO;
 
 public interface IAppHomeService {
 
@@ -12,4 +15,13 @@ public interface IAppHomeService {
      * @return {@link AppBannerVO}
      **/
     HomeVO homeInfo();
+
+    /**
+     * @Author SheepHy
+     * @Description 场地列表查询
+     * @Date 10:37 2025/7/4
+     * @Param
+     * @return
+     **/
+    Page<PlaceVO> getPlaceList(GetPlaceListDTO getPlaceListDTO);
 }

+ 1 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IUserService.java

@@ -33,4 +33,5 @@ public interface IUserService {
      * @return MsgInfoVO {@link MsgInfoVO}
      **/
     MsgInfoVO getMsgInfo(String id);
+
 }

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

@@ -1,22 +1,29 @@
 package org.jeecg.modules.app.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import org.jeecg.modules.system.app.entity.AppBanner;
-import org.jeecg.modules.system.app.mapper.AppBannerMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.app.dto.GetPlaceListDTO;
 import org.jeecg.modules.app.service.IAppHomeService;
-import org.jeecg.modules.app.vo.AppBannerVO;
-import org.jeecg.modules.app.vo.CoureseVO;
-import org.jeecg.modules.app.vo.HomeVO;
+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.mapper.AppCoureseMapper;
-import org.jeecg.modules.system.app.mapper.AppCoursesPriceRulesMapper;
+import org.jeecg.modules.system.app.entity.AppInstructor;
+import org.jeecg.modules.system.app.mapper.*;
+import org.jeecg.modules.system.entity.SysDepart;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.mapper.SysDepartMapper;
+import org.jeecg.modules.system.mapper.SysUserMapper;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static org.jeecg.common.constant.CommonConstant.INSTRUCTOR;
+
 @Service
 public class AppHomeServiceImpl implements IAppHomeService {
     @Resource
@@ -24,37 +31,136 @@ public class AppHomeServiceImpl implements IAppHomeService {
     @Resource
     private AppCoureseMapper appCoureseMapper;
     @Resource
-    private AppCoursesPriceRulesMapper appCoursesPriceRulesMapper;
+    private AppInstructorMapper appInstructorMapper;
+    @Resource
+    private SysUserMapper sysUserMapper;
+    @Resource
+    private SysDepartMapper sysDepartMapper;
+    @Resource
+    private AppSiteMapper appSiteMapper;
+    @Resource
+    private AppCategoryMapper appCategoryMapper;
+
     @Override
-    public HomeVO homeInfo(){
+    public HomeVO homeInfo() {
+        // 获取 banners
         List<AppBanner> appBanners = appBannerMapper.selectList(Wrappers.<AppBanner>lambdaQuery()
-                .eq(AppBanner::getDelFlag, 0));
-        //精品课程
+                .eq(AppBanner::getDelFlag, 0).eq(AppBanner::getIsEnabled,1));
+
+        // 精品课程(最多3个)
         List<AppCourese> appCoureseFine = appCoureseMapper.selectList(Wrappers.<AppCourese>lambdaQuery()
-                .eq(AppCourese::getPriceType, 0).last("limit 3"));
-        //免费课程
+                .eq(AppCourese::getPriceType, 0).last("LIMIT 3"));
+
+        // 免费课程(最多3个)
         List<AppCourese> appCoureseFree = appCoureseMapper.selectList(Wrappers.<AppCourese>lambdaQuery()
-                .eq(AppCourese::getPriceType, 1).last("limit 3"));
+                .eq(AppCourese::getPriceType, 1).last("LIMIT 3"));
+
+        // 合并课程信息
         List<CoureseVO> courseVO = new ArrayList<>();
-//        courseVO.addAll(convertToCoureseVOList(appCoureseFine));
-//        courseVO.addAll(convertToCoureseVOList(appCoureseFree));
-        return new HomeVO().setBannerList(appBanners.stream()
-                .map(banner -> new AppBannerVO()
-                        .setId(banner.getId())
-                        .setEventType(banner.getEventType())
-                        .setEventValue(banner.getEventValue())
-                        .setSortOrder(banner.getSortOrder())
-                        .setImageUrl(banner.getImageUrl()))
-                .collect(Collectors.toList()))
-                .setCourseList(courseVO);
+        courseVO.addAll(convertToCoureseVOList(appCoureseFine));
+        courseVO.addAll(convertToCoureseVOList(appCoureseFree));
+
+        // 获取好评率最高的两个教练 ID
+        List<String> topInstructorUserIds = sysUserMapper.getUserIdListByRoleId(INSTRUCTOR).stream()
+                .map(userId -> {
+                    AppInstructor instructor = appInstructorMapper.selectOne(
+                            Wrappers.<AppInstructor>lambdaQuery().eq(AppInstructor::getUserId, userId));
+                    return new Object() {
+                        final String id = userId;
+                        final Double goodRate = instructor != null ? Double.parseDouble(String.valueOf(instructor.getGoodRate())) : 0.0;
+                    };
+                })
+                .sorted((a, b) -> Double.compare(b.goodRate, a.goodRate))
+                .limit(2)
+                .map(obj -> obj.id)
+                .collect(Collectors.toList());
+
+        // 构建教练列表
+        List<InstructorVO> instructorList = new ArrayList<>();
+        for (String userId : topInstructorUserIds) {
+            SysUser sysUser = sysUserMapper.selectById(userId);
+            AppInstructor appInstructor = appInstructorMapper.selectOne(
+                    Wrappers.<AppInstructor>lambdaQuery().eq(AppInstructor::getUserId, userId));
+
+            InstructorVO instructorVO = new InstructorVO();
+            BeanUtils.copyProperties(instructorVO, appInstructor);
+
+            instructorVO.setId(sysUser.getId())
+                    .setAvatar(sysUser.getAvatar())
+                    .setName(sysUser.getRealname())
+                    .setOrgName(sysDepartMapper.selectOne(Wrappers.<SysDepart>lambdaQuery()
+                            .eq(SysDepart::getOrgCode, sysUser.getOrgCode())).getDepartName());
+
+            // 获取该教练的课程(最多取2个)
+            List<AppCourese> courses = appCoureseMapper.selectList(
+                    Wrappers.<AppCourese>lambdaQuery().eq(AppCourese::getUserId, userId).last("LIMIT 2"));
+
+            List<InstructorVO.CourseInfoVO> courseInfoVOS = courses.stream()
+                    .map(course -> {
+                        InstructorVO.CourseInfoVO vo = new InstructorVO.CourseInfoVO();
+                        BeanUtils.copyProperties(vo, course);
+                        return vo;
+                    })
+                    .collect(Collectors.toList());
+
+            instructorVO.setCourseList(courseInfoVOS);
+            instructorList.add(instructorVO);
+        }
+
+        // 返回首页数据
+        return new HomeVO()
+                .setBannerList(appBanners.stream()
+                        .map(banner -> new AppBannerVO()
+                                .setId(banner.getId())
+                                .setEventType(banner.getEventType())
+                                .setEventValue(banner.getEventValue())
+                                .setSortOrder(banner.getSortOrder())
+                                .setImageUrl(banner.getImageUrl()))
+                        .collect(Collectors.toList()))
+                .setCourseList(courseVO)
+                .setInstructorList(instructorList);
+    }
+
+    /**
+     * @Author SheepHy
+     * @Description 合并课程信息
+     * @Date 9:14 2025/7/4
+     * @Param appCoureseList {@link List<AppCourese>}
+     * @return List<CoureseVO> {@link List<CoureseVO>}
+     **/
+    private List<CoureseVO> convertToCoureseVOList(List<AppCourese> appCoureseList) {
+        return appCoureseList.stream()
+                .map(courese -> new CoureseVO()
+                        .setId(courese.getId()).setCover(courese.getCover())
+                        .setPriceType(courese.getPriceType())
+                        .setSellingPrice(courese.getSellingPrice()))
+                .collect(Collectors.toList());
     }
 
-//    private List<CoureseVO> convertToCoureseVOList(List<AppCourese> appCoureseList) {
-//        return appCoureseList.stream()
-//                .map(courese -> new CoureseVO()
-//                        .setId(courese.getId()).setCover(courese.getCover())
-//                        .setPriceType(courese.getPriceType())
-//                        .setSellingPrice(appCoursesPriceRulesMapper.selectById(courese.getId()).get))
-//                .collect(Collectors.toList());
-//    }
+    @Override
+    public Page<PlaceVO> getPlaceList(GetPlaceListDTO getPlaceListDTO) {
+        Page<PlaceVO> page = new Page<>(getPlaceListDTO.getCurrent(), getPlaceListDTO.getSize());
+        Page<PlaceVO> placeList = appSiteMapper.getPlaceList(page, getPlaceListDTO.getVenueType());
+        placeList.getRecords().forEach(placeVO -> {
+            List<String> list = new ArrayList<>();
+            String[] split = placeVO.getCategoryId().split(",");
+            Arrays.stream(split).forEach(id -> {
+                list.add(appCategoryMapper.selectById(id).getName());
+            });
+            //todo 待申请第三方地图接口
+            placeVO.setKm(0.0)
+                    .setCategory(list);
+        });
+        if(getPlaceListDTO.getVenueType().equals("1")
+                || getPlaceListDTO.getVenueType().equals("2")
+                || getPlaceListDTO.getVenueType().equals("3")){
+            // 按 km 升序排序(从近到远)
+            placeList.getRecords().sort((p1, p2) -> {
+                Double km1 = p1.getKm();
+                Double km2 = p2.getKm();
+                return km1.compareTo(km2);
+            });
+        }
+        return placeList;
+    }
 }

+ 22 - 20
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/UserServiceImpl.java

@@ -11,23 +11,20 @@ import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.util.JwtUtil;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.app.service.IUserService;
 import org.jeecg.modules.app.vo.LoginUserVO;
 import org.jeecg.modules.app.vo.MsgInfoVO;
 import org.jeecg.modules.app.vo.MsgVO;
-import org.jeecg.modules.system.entity.SysAnnouncement;
-import org.jeecg.modules.system.entity.SysAnnouncementSend;
-import org.jeecg.modules.system.entity.SysUser;
-import org.jeecg.modules.system.mapper.SysAnnouncementMapper;
-import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;
-import org.jeecg.modules.system.mapper.SysUserMapper;
+import org.jeecg.modules.system.entity.*;
+import org.jeecg.modules.system.mapper.*;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 import static org.jeecg.common.constant.CommonConstant.PREFIX_USER_TOKEN;
 import static org.jeecg.common.constant.CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
@@ -43,7 +40,11 @@ public class UserServiceImpl implements IUserService {
     private SysAnnouncementSendMapper sysAnnouncementSendMapper;
     @Resource
     private SysAnnouncementMapper sysAnnouncementMapper;
-    @Autowired
+    @Resource
+    private SysDepartMapper sysDepartMapper;
+    @Resource
+    private SysUserDepartMapper sysUserDepartMapper;
+    @Resource
     private RedisUtil redisUtil;
 
     @Override
@@ -56,13 +57,21 @@ public class UserServiceImpl implements IUserService {
                     .eq(SysUser::getOpenid, openid)
                     .eq(SysUser::getDelFlag, 0));
             if (null == user) {
+
                 // 用户不存在则创建
                     user = new SysUser()
                             .setOpenid(openid)
+                            .setPassword(openid)
+                            .setStatus(1)
+                            .setDelFlag(0)
+                            .setSalt(oConvertUtils.randomGen(8))
+                            .setCreateBy("admin")
                             .setRealname("微信用户")
-                            .setUsername("微信用户")
+                            .setUsername("微信用户_" + UUID.randomUUID())
                             .setOrgCode("A03");
-                    boolean result = sysUserMapper.insert(user) > 0;
+                SysDepart sysDepart = sysDepartMapper.selectOne(Wrappers.<SysDepart>lambdaQuery().eq(SysDepart::getOrgCode, "A03"));
+                sysUserDepartMapper.insert(new SysUserDepart(user.getId(),sysDepart.getId()));
+                boolean result = sysUserMapper.insert(user) > 0;
                     if (!result) {
                         throw new JeecgBootException("登录失败", SC_INTERNAL_SERVER_ERROR_500);
                 }
@@ -101,17 +110,10 @@ public class UserServiceImpl implements IUserService {
         return msgInfoVO;
     }
 
+
     private LoginUserVO generateLoginUserVO(SysUser user) {
-        String orgCode = user.getOrgCode().substring(0, 3);
-        String userAccount = "";
-        String userPassword = "";
-        if(orgCode.equals("A03") || user.getOpenid() != null){
-            userAccount = user.getUsername();
-            userPassword = user.getOpenid();
-        }else if (orgCode.equals("A04")){
-            userAccount = user.getUsername();
-            userPassword = user.getPassword();
-        }
+        String userAccount = user.getUsername();
+        String userPassword = user.getPassword();
         // 1.生成token
         String token = JwtUtil.sign(userAccount, userPassword);
         // 设置token缓存有效时间

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

@@ -5,10 +5,12 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
+import java.math.BigDecimal;
+
 @Data
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = false)
-@Schema(description="首页轮播图管理")
+@Schema(description="产品信息返回VO")
 public class CoureseVO {
     @Schema(description = "主键id")
     private String id;
@@ -17,6 +19,6 @@ public class CoureseVO {
     @Schema(description = "产品类型 1、公益 2、试听")
     private int priceType;
     @Schema(description = "价格")
-    private String sellingPrice;
+    private BigDecimal sellingPrice;
 
 }

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

@@ -31,13 +31,13 @@ public class InstructorVO {
     @Schema(description = "擅长说明")
     private String excelMsg;
     @Schema(description = "课程列表")
-    private List<CourseVO> courseList;
+    private List<CourseInfoVO> courseList;
 
     @Data
     @Accessors(chain = true)
     @EqualsAndHashCode(callSuper = false)
-    @Schema(description="教练信息返回参数")
-    private class CourseVO {
+    @Schema(description="教练课程信息返回参数")
+    public static class CourseInfoVO {
         @Schema(description = "主键id")
         private String id;
         @Schema(description = "课程名称")

+ 36 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/PlaceVO.java

@@ -0,0 +1,36 @@
+package org.jeecg.modules.app.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="场地分页返回参数")
+public class PlaceVO extends Page<PlaceVO> {
+    @Schema(description = "id")
+    private String id;
+    @Schema(description = "场地名称")
+    private String name;
+    @Schema(description = "好评率")
+    private BigDecimal goodRate;
+    @Schema(description = "评论数")
+    private String comments;
+    @Schema(description = "地址")
+    private String address;
+    @Schema(description = "距离(KM)")
+    private double km;
+    @Schema(description = "是否有票")
+    private boolean ticketWhether;
+    @Schema(description = "类目")
+    private List<String> category;
+    @Schema(hidden = true)
+    private String categoryId;
+
+}

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

@@ -0,0 +1,162 @@
+package org.jeecg.modules.app.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="全局搜索信息返回参数")
+public class SearchVO{
+    @Schema(description="全局搜索场地分页返回参数")
+    private List<SearchPlaceVO> searchPlaceList;
+    @Schema(description="全局搜索培训分页返回参数")
+    private List<SearchTrainVO> searchTrainVOList;
+    @Schema(description="全局搜索赛事分页返回参数")
+    private List<SearchRaceVO> searchRaceVOList;
+    @Schema(description="全局搜索教练分页返回参数")
+    private List<SearchInstructorVO> searchInstructorVOList;
+
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="全局搜索教练分页返回参数")
+    public static class SearchInstructorVO {
+        @Schema(description = "主键id")
+        private String id;
+        @Schema(description = "教练名称")
+        private String name;
+        @Schema(description = "教练头像")
+        private String avatar;
+        @Schema(description = "所属部门名称")
+        private String orgName;
+        @Schema(description = "擅长说明")
+        private String excelMsg;
+        @Schema(description = "教学理念")
+        private String teachingPhilosophy;
+        @Schema(description = "好评率")
+        private String goodRate;
+        @Schema(description = "订单数")
+        private String orderCount;
+        @Schema(description = "授课人数")
+        private String teachingCount;
+        @Schema(description = "课程列表")
+        private List<CourseInfoVO> courseList;
+    }
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="教练课程信息返回参数")
+    public static class CourseInfoVO {
+        @Schema(description = "主键id")
+        private String id;
+        @Schema(description = "课程名称")
+        private String name;
+        @Schema(description = "课程价格")
+        private String sellingPrice;
+        @Schema(description = "课程类型")
+        private String type;
+        @Schema(description = "课程简介")
+        private String intro;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="全局搜索赛事分页返回参数")
+    public static class SearchRaceVO{
+        @Schema(description = "主键id")
+        private String id;
+        @Schema(description = "名称")
+        private String name;
+        @Schema(description = "课程原价")
+        private BigDecimal originalPrice;
+        @Schema(description = "课程售价")
+        private BigDecimal sellingPrice;
+        @Schema(description = "图片")
+        private String cover;
+        @Schema(description = "类目")
+        private String categoryId;
+        @Schema(description = "开始时间")
+        private java.util.Date startTime;
+        @Schema(description = "结束时间")
+        private java.util.Date endTime;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="全局搜索培训分页返回参数")
+    public static class SearchTrainVO extends PlaceVO{
+        @Schema(description = "id")
+        private String id;
+        @Schema(description = "名称")
+        private String name;
+        @Schema(description = "课程类型")
+        private int priceType;
+        @Schema(description = "课程介绍")
+        private String reminder;
+        @Schema(description = "课程原价")
+        private BigDecimal originalPrice;
+        @Schema(description = "课程售价")
+        private BigDecimal sellingPrice;
+        @Schema(description = "好评率")
+        private BigDecimal goodRate;
+        @Schema(description = "评论数")
+        private String comments;
+        @Schema(description = "退款类型")
+        private int refundType;
+        @Schema(description = "地址")
+        private String address;
+        @Schema(description = "距离(KM)")
+        private double km;
+    }
+
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="全局搜索场地分页返回参数")
+    public static class SearchPlaceVO{
+        @Schema(description = "id")
+        private String id;
+        @Schema(description = "场地名称")
+        private String name;
+        @Schema(description = "好评率")
+        private BigDecimal goodRate;
+        @Schema(description = "评论数")
+        private String comments;
+        @Schema(description = "地址")
+        private String address;
+        @Schema(description = "距离(KM)")
+        private double km;
+        @Schema(description = "类目")
+        private List<String> category;
+        @Schema(hidden = true)
+        private String categoryId;
+        @Schema(description = "全局搜索产品信息返回参数")
+        private List<SearchCoureseVO> searchCoureseList;
+    }
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="全局搜索产品信息返回参数")
+    public static class SearchCoureseVO{
+        @Schema(description = "id")
+        private String id;
+        @Schema(description = "名称")
+        private String name;
+        @Schema(description = "原价")
+        private BigDecimal originalPrice;
+        @Schema(description = "售价")
+        private BigDecimal sellingPrice;
+        @Schema(description = "销售销量")
+        private int sales;
+
+    }
+
+}

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

@@ -1,23 +1,20 @@
 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.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @Description: 课程/培训表
@@ -41,6 +38,9 @@ public class AppCourese implements Serializable {
 	@Excel(name = "部门id", width = 15)
     @Schema(description = "部门id")
     private String orgCode;
+    @Excel(name = "教练ID", width = 15)
+    @Schema(description = "教练ID")
+    private String userId;
 	/**商户/场地id;场馆/学校等场地*/
 	@Excel(name = "商户/场地id;场馆/学校等场地", width = 15)
     @Schema(description = "商户/场地id;场馆/学校等场地")

+ 43 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppSearchHot.java

@@ -0,0 +1,43 @@
+package org.jeecg.modules.system.app.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 运动类型表
+ * @Author: jeecg-boot
+ * @Date:   2025-07-03
+ * @Version: V1.0
+ */
+@Data
+@TableName("nm_search_hot")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="关键词搜索表")
+public class AppSearchHot implements Serializable {
+    private static final long serialVersionUID = 1L;
+	/**id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "id")
+    private String id;
+    @Schema(description = "搜索次数")
+    private String searchCount;
+    @Schema(description = "搜索内容")
+    private String searchContent;
+    @Schema(description = "是否启用")
+    private String isActive;
+    @Schema(description = "是否推荐")
+    private String isRecommend;
+    @Schema(description = "关联分类ID")
+    private String categoryId;
+    @Schema(description = "最后一次搜索用户ID")
+    private String lastUser;
+
+}

+ 7 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppSearchHotMapper.java

@@ -0,0 +1,7 @@
+package org.jeecg.modules.system.app.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.system.app.entity.AppSearchHot;
+
+public interface AppSearchHotMapper extends BaseMapper<AppSearchHot> {
+}

+ 13 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppSiteMapper.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.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.app.vo.PlaceVO;
 import org.jeecg.modules.system.app.entity.AppSite;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
  * @Description: 场地表
@@ -14,4 +15,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface AppSiteMapper extends BaseMapper<AppSite> {
 
+    /**
+     * @Author SheepHy
+     * @Description 场地列表查询
+     * @Date 10:37 2025/7/4
+     * @Param
+     * @return
+     **/
+    Page<PlaceVO> getPlaceList(@Param("page")IPage<PlaceVO> page, @Param("venueType")String venueType);
+
 }

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

@@ -1,5 +1,36 @@
 <?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.AppSiteMapper">
-
+    <select id="getPlaceList" resultType="org.jeecg.modules.app.vo.PlaceVO">
+        SELECT
+            a.id,
+            a.name,
+            a.good_rate AS goodRate,
+            a.address,
+            a.category_id,
+            CASE
+                WHEN EXISTS (
+                    SELECT SUM(inventory)
+                    FROM nm_site_peice_rules
+                    WHERE site_id = a.id
+                ) THEN 1
+                ELSE 0
+                END AS ticketWhether
+        FROM nm_site a LEFT JOIN sys_depart b ON a.tenant_id = b.id WHERE 1=1
+        <if test="venueType != null and venueType == 0">
+            ORDER BY  a.good_rate DESC
+        </if>
+        <if test="venueType != null and venueType == 1">
+            AND b.org_category = 2
+        </if>
+        <if test="venueType != null and venueType == 2">
+            AND b.org_category = 2 ORDER BY  a.good_rate DESC
+        </if>
+        <if test="venueType != null and venueType == 3">
+            AND b.org_category = 3
+        </if>
+        <if test="venueType != null and venueType == 4">
+            AND b.org_category = 3 ORDER BY  a.good_rate DESC
+        </if>
+    </select>
 </mapper>

+ 7 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppSearchHotService.java

@@ -0,0 +1,7 @@
+package org.jeecg.modules.system.app.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.entity.AppSearchHot;
+
+public interface IAppSearchHotService extends IService<AppSearchHot> {
+}

+ 11 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppSearchHotServiceImpl.java

@@ -0,0 +1,11 @@
+package org.jeecg.modules.system.app.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.system.app.entity.AppSearchHot;
+import org.jeecg.modules.system.app.mapper.AppSearchHotMapper;
+import org.jeecg.modules.system.app.service.IAppSearchHotService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AppSearchHotServiceImpl extends ServiceImpl<AppSearchHotMapper, AppSearchHot> implements IAppSearchHotService {
+}

+ 5 - 5
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/controller/SysUserController.java

@@ -13,10 +13,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
-import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.PermissionData;
-import org.jeecg.common.base.BaseMap;
 import org.jeecg.common.config.TenantContext;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.constant.SymbolConstant;
@@ -156,7 +154,8 @@ public class SysUserController {
 		Result<SysUser> result = new Result<SysUser>();
 		String selectedRoles = jsonObject.getString("selectedroles");
 		String selectedDeparts = jsonObject.getString("selecteddeparts");
-		try {
+        SysDepart departById = sysDepartService.getDepartById(selectedDeparts);
+        try {
 			SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class);
 			user.setCreateTime(new Date());//设置创建时间
 			String salt = oConvertUtils.randomGen(8);
@@ -166,7 +165,7 @@ public class SysUserController {
 			user.setStatus(1);
 			user.setDelFlag(CommonConstant.DEL_FLAG_0);
 			//用户表字段org_code不能在这里设置他的值
-            user.setOrgCode(null);
+            user.setOrgCode(departById.getOrgCode());
 			// 保存用户走一个service 保证事务
             //获取租户ids
             String relTenantIds = jsonObject.getString("relTenantIds");
@@ -196,12 +195,13 @@ public class SysUserController {
 				user.setPassword(sysUser.getPassword());
 				String roles = jsonObject.getString("selectedroles");
                 String departs = jsonObject.getString("selecteddeparts");
+                SysDepart departById = sysDepartService.getDepartById(departs);
                 if(oConvertUtils.isEmpty(departs)){
                     //vue3.0前端只传递了departIds
                     departs=user.getDepartIds();
                 }
                 //用户表字段org_code不能在这里设置他的值
-                user.setOrgCode(null);
+                user.setOrgCode(departById.getOrgCode());
                 // 修改用户走一个service 保证事务
                 //获取租户ids
                 String relTenantIds = jsonObject.getString("relTenantIds");

+ 9 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java

@@ -222,4 +222,13 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
 	 */
 	@Select("select id,phone from sys_user where phone = #{phone} and username = #{username}")
     SysUser getUserByNameAndPhone(@Param("phone") String phone, @Param("username") String username);
+
+	/**
+	 * @Author SheepHy
+	 * @Description 根据角色编号获取到用户ID列表,可根据ORG_CODE进行过滤
+	 * @Date 9:33 2025/7/4
+	 * @Param
+	 * @return
+	 **/
+	List<String> getUserIdListByRoleId(@Param("roleCode") String roleCode);
 }

+ 5 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml

@@ -298,4 +298,9 @@
 		and sut.tenant_id=#{tenantId}
         and sut.status = '1'
 	</select>
+
+	<select id="getUserIdListByRoleId" resultType="string" parameterType="string">
+		SELECT b.id FROM `sys_role` a LEFT JOIN sys_user_role b ON a.id = b.role_id
+		WHERE a.role_code = #{roleCode}
+	</select>
 </mapper>

+ 2 - 2
national-motion-module-system/national-motion-system-start/src/main/resources/application-dev.yml

@@ -329,8 +329,8 @@ wx:
   # 微信小程序
   miniapp:
     configs:
-      - appid:
-        secret:
+      - appid: wx62ba790ae7983d34
+        secret: 8df754e6d36a7f0ac26f108f1607beff
         token: #微信小程序消息服务器配置的token
         aesKey: #微信小程序消息服务器配置的EncodingAESKey
         msgDataFormat: JSON