Explorar o código

Merge remote-tracking branch 'origin/master'

lix hai 2 semanas
pai
achega
6ff81ab31a
Modificáronse 41 ficheiros con 1189 adicións e 241 borrados
  1. 14 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/AppHomeController.java
  2. 65 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppEvaluateController.java
  3. 21 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppFamilyMembersController.java
  4. 6 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppFeedbackController.java
  5. 0 8
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/AddFamilyMembersDTO.java
  6. 3 4
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/AppSubmitFeedbackRequestDTO.java
  7. 28 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/FindFamilyMembersDTO.java
  8. 20 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/PageDTO.java
  9. 55 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/evaluate/AddEvaluateDTO.java
  10. 4 3
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IDetailService.java
  11. 5 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IOrderService.java
  12. 13 14
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/AppHomeServiceImpl.java
  13. 123 17
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/DetailServiceImpl.java
  14. 31 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/CourseInfoVO.java
  15. 5 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/PlaceInfoVO.java
  16. 4 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/PlaceVO.java
  17. 6 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/SearchVO.java
  18. 0 182
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppEvaluateController.java
  19. 218 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/EvaluateController.java
  20. 36 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/AuditRequestDTO.java
  21. 9 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/FindResponseDTO.java
  22. 51 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/evaluate/FindEvaluateRequestDTO.java
  23. 89 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/evaluate/FindEvaluateResponseDTO.java
  24. 0 3
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppFeedback.java
  25. 119 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/Evaluate.java
  26. 43 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/enums/AuditStatusEnum.java
  27. 4 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/enums/FeedbackTypeEnum.java
  28. 10 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppCoursesMapper.java
  29. 20 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/EvaluateMapper.java
  30. 5 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/FamilyMembersMapper.java
  31. 38 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppCoursesMapper.xml
  32. 1 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppGameMapper.xml
  33. 1 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppInstructorMapper.xml
  34. 3 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppSiteMapper.xml
  35. 38 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/EvaluateMapper.xml
  36. 20 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IEvaluateService.java
  37. 5 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IFamilyMembersService.java
  38. 15 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppFeedbackServiceImpl.java
  39. 48 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/EvaluateServiceImpl.java
  40. 10 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/FamilyMembersServiceImpl.java
  41. 3 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/util/PositionUtil.java

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

@@ -106,8 +106,21 @@ public class AppHomeController {
      * @return PlaceInfoVO {@link PlaceInfoVO}
      **/
     @GetMapping("/getPlaceInfo")
-    @Operation(summary = "门店详情信息查询")
+    @Operation(summary = "门店详情信息查询 ")
     public Result<PlaceInfoVO> getPlaceInfo(@RequestParam @Schema(description="门店ID") String id){
         return Result.ok(detailService.getPlaceInfo(id));
     }
+
+    /**
+     * @Author SheepHy
+     * @Description 课程详情
+     * @Date 13:36 2025/7/8
+     * @Param id 课程id
+     * @return CourseInfoVO {@link CourseInfoVO}
+     **/
+    @GetMapping("/getCourseInfo")
+    @Operation(summary = "课程详情")
+    public Result<CourseInfoVO> getCourseInfo(@Schema(description="课程ID")String id, double latitude, double longitude){
+        return Result.ok(detailService.getCourseInfo(id, latitude, longitude));
+    }
 }

+ 65 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppEvaluateController.java

@@ -0,0 +1,65 @@
+package org.jeecg.modules.app.controller.my;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.utils.UuidUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.app.dto.PageDTO;
+import org.jeecg.modules.app.dto.evaluate.AddEvaluateDTO;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateResponseDTO;
+import org.jeecg.modules.system.app.entity.Evaluate;
+import org.jeecg.modules.system.app.service.IEvaluateService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+
+/**
+ * 评价
+ */
+@Slf4j
+@Tag(name = "app评价相关接口")
+@RestController()
+@RequestMapping("/app/my/evaluate")
+public class AppEvaluateController {
+
+    @Autowired
+    private IEvaluateService evaluateService;
+
+
+    /**
+     * 查询评价列表接口
+     *
+     * @param pageDTO
+     * @return
+     */
+    @GetMapping("/findByPage")
+    @Operation(summary = "app评价分页查询")
+    public Result<IPage<FindEvaluateResponseDTO>> findByList(PageDTO pageDTO) {
+        return Result.ok(evaluateService.findPage(pageDTO.getPageNo(), pageDTO.getPageSize(), null));
+    }
+
+
+    @PostMapping("/submitFeedback")
+    @Operation(summary = "提交评价")
+    public Result<String> submitFeedback(@RequestBody AddEvaluateDTO addEvaluateDTO) {
+        Evaluate evaluate = new Evaluate();
+        LoginUser principal = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        BeanUtils.copyProperties(addEvaluateDTO, evaluate);
+        evaluate.setId(UuidUtils.getUUID());
+        evaluate.setUserId(principal.getId());
+        evaluate.setCreateTime(new Date());
+        boolean save = evaluateService.save(evaluate);
+        if (!save) {
+            return Result.error("提交评价失败,请联系管理员");
+        }
+        return Result.ok("提交成功");
+    }
+}

+ 21 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppFamilyMembersController.java

@@ -1,11 +1,16 @@
 package org.jeecg.modules.app.controller.my;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.app.dto.AddFamilyMembersDTO;
+import org.jeecg.modules.app.dto.FindFamilyMembersDTO;
+import org.jeecg.modules.system.app.entity.FamilyMembers;
 import org.jeecg.modules.system.app.service.IFamilyMembersService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -22,12 +27,28 @@ public class AppFamilyMembersController {
     @Autowired
     IFamilyMembersService iFamilyMembersService;
 
+
+    @GetMapping("/findFamilyMembers")
+    @Operation(summary = "分页查询家庭成员")
+    public Result<IPage<FamilyMembers>> findFamilyMembers(FindFamilyMembersDTO findFamilyMembersDTO){
+        return iFamilyMembersService.findFamilyMembers(findFamilyMembersDTO);
+    }
+
+
     @PostMapping("/addFamilyMembers")
     @Operation(summary = "添加家庭成员")
     public Result<String> addFamilyMembers(@RequestBody AddFamilyMembersDTO addFamilyMembersDTO){
+        LoginUser principal = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        addFamilyMembersDTO.setUserId(principal.getId());
         return iFamilyMembersService.addFamilyMembers(addFamilyMembersDTO);
     }
 
+    @GetMapping("/FindByIdFamilyMembers")
+    @Operation(summary = "根据id查询家庭成员")
+    public Result<FamilyMembers> addFamilyMembers(@RequestParam("id") String id){
+        return Result.ok(iFamilyMembersService.getById(id));
+    }
+
     @PostMapping("/editFamilyMembers")
     @Operation(summary = "修改家庭成员")
     public Result<String> editFamilyMembers(@RequestBody AddFamilyMembersDTO addFamilyMembersDTO){

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

@@ -6,7 +6,9 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import me.zhyd.oauth.utils.UuidUtils;
+import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.app.dto.AppFeedbackFindRequestDTO;
 import org.jeecg.modules.app.dto.AppSubmitFeedbackRequestDTO;
 import org.jeecg.modules.system.app.dto.FindPageRequestDTO;
@@ -40,7 +42,8 @@ public class AppFeedbackController {
     @Operation(summary = "app意见反馈分页查询")
     public Result<IPage<FindResponseDTO>> findByList(AppFeedbackFindRequestDTO appFeedbackFindRequestDTO){
         FindPageRequestDTO findPageRequestDTO = new FindPageRequestDTO();
-        findPageRequestDTO.setUserId(appFeedbackFindRequestDTO.getUserId());
+        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        findPageRequestDTO.setUserId(loginUser.getId());
         return Result.ok(iAppFeedbackService.findPage(appFeedbackFindRequestDTO.getPageNo(),appFeedbackFindRequestDTO.getPageSize(),findPageRequestDTO));
     }
 
@@ -48,8 +51,10 @@ public class AppFeedbackController {
     @PostMapping("/submitFeedback")
     @Operation(summary = "提交意见反馈")
     public Result<String> submitFeedback(@RequestBody AppSubmitFeedbackRequestDTO appSubmitFeedbackRequestDTO){
+        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         AppFeedback appFeedback = new AppFeedback();
         BeanUtils.copyProperties(appSubmitFeedbackRequestDTO,appFeedback);
+        appFeedback.setUserId(loginUser.getId());
         appFeedback.setId(UuidUtils.getUUID());
         boolean save = iAppFeedbackService.save(appFeedback);
         if (!save){

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

@@ -3,7 +3,6 @@ package org.jeecg.modules.app.dto;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import lombok.NonNull;
 import lombok.experimental.Accessors;
 
 /**
@@ -19,34 +18,27 @@ public class AddFamilyMembersDTO {
     @Schema(description = "id")
     private String id;
     /**姓名*/
-    @NonNull
     @Schema(description = "姓名")
     private String fullName;
     /**用户编号*/
     @Schema(description = "用户编号")
-    @NonNull
     private String userId;
     /**身份证号*/
     @Schema(description = "身份证号")
-    @NonNull
     private String identityCard;
     /**身份证正面照*/
-    @NonNull
     @Schema(description = "身份证正面照")
     private String idCardFrontImg;
     /**身份证反面照*/
-    @NonNull
     @Schema(description = "身份证反面照")
     private String idCardBackImg;
     /**手机号*/
-    @NonNull
     @Schema(description = "手机号")
     private String phone;
     /**实名状态 0-未实名 ;1-已实名*/
     @Schema(description = "实名状态 0-未实名 ;1-已实名,默认未实名")
     private Integer realNameStatus;
     /**身份证反面照*/
-    @NonNull
     @Schema(description = "实名认证照片")
     private String realNameImg;
 

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

@@ -4,10 +4,10 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import lombok.NonNull;
 import lombok.experimental.Accessors;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 /**
@@ -20,15 +20,14 @@ import java.util.Date;
 public class AppSubmitFeedbackRequestDTO {
 
     /**用户id*/
-    @NonNull
     @Schema(description = "用户id")
     private String userId;
     /**反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他*/
-    @NonNull
+    @NotNull(message = "反馈类型不允许为空")
     @Schema(description = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他")
     private Integer feedbackType;
     /**反馈描述*/
-    @NonNull
+    @NotNull(message = "反馈描述不允许为空")
     @Schema(description = "反馈描述")
     private String feedbackDescribed;
     /**反馈图片地址,使用;进行隔开*/

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

@@ -0,0 +1,28 @@
+package org.jeecg.modules.app.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 家庭成员
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="查询家庭成员请求入参")
+public class FindFamilyMembersDTO {
+
+    @Schema(description = "用户编号")
+    @NotNull(message = "用户编号不允许为空")
+    private String userId;
+
+    @Schema(description = "页码")
+    private Integer pageNo=1;
+
+    @Schema(description = "每页显示条数")
+    private Integer pageSize=10;
+}

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

@@ -0,0 +1,20 @@
+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 PageDTO{
+
+
+    @Schema(description ="页码")
+    private Integer pageNo=1;
+
+    @Schema(description ="每页显示条数")
+    private Integer pageSize=10;
+}

+ 55 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/evaluate/AddEvaluateDTO.java

@@ -0,0 +1,55 @@
+package org.jeecg.modules.app.dto.evaluate;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 评论
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="APP添加评论请求入参")
+public class AddEvaluateDTO {
+    /**部门编码*/
+    @Schema(description = "部门编码")
+    private String orgCode;
+    /**关联部门id*/
+    @Schema(description = "关联部门id")
+    private String deptId;
+    /**场地/地点*/
+    @Schema(description = "场地/地点")
+    private Integer siteId;
+    /**用户*/
+    @Schema(description = "用户")
+    private String userId;
+    /**订单*/
+    @Schema(description = "订单")
+    private String orderId;
+    /**评分 存储整数  1-5*/
+    @Schema(description = "评分 存储整数  1-5")
+    private Integer score;
+    /**评价内容*/
+    @Schema(description = "评价内容")
+    private String evaluateContent;
+    /**图片列表使用;进行隔开*/
+    @Schema(description = "图片列表使用,进行隔开")
+    private String images;
+
+    /**业务类型;0场地 1课程*/
+    @Schema(description = "业务类型;0场地 1课程")
+    private Integer type;
+    /**创建时间;创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间;创建时间")
+    private Date createTime;
+
+
+}

+ 4 - 3
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IDetailService.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.app.service;
 
+import org.jeecg.modules.app.vo.CourseInfoVO;
 import org.jeecg.modules.app.vo.PlaceInfoVO;
 
 public interface IDetailService {
@@ -16,8 +17,8 @@ public interface IDetailService {
      * @Author SheepHy
      * @Description 课程详情
      * @Date 13:36 2025/7/8
-     * @Param 
-     * @return 
+     * @Param id 课程id
+     * @return CourseInfoVO {@link CourseInfoVO}
      **/
-
+    CourseInfoVO getCourseInfo(String id, double latitude, double longitude);
 }

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

@@ -0,0 +1,5 @@
+package org.jeecg.modules.app.service;
+
+public interface IOrderService {
+
+}

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

@@ -6,15 +6,13 @@ 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.vo.*;
-import org.jeecg.modules.system.app.entity.AppBanner;
-import org.jeecg.modules.system.app.entity.AppCourses;
-import org.jeecg.modules.system.app.entity.AppInstructor;
-import org.jeecg.modules.system.app.entity.AppSearchHot;
+import org.jeecg.modules.system.app.entity.*;
 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.jeecg.modules.system.util.PositionUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
@@ -147,8 +145,7 @@ public class AppHomeServiceImpl implements IAppHomeService {
         Page<PlaceVO> page = new Page<>(getPlaceListDTO.getCurrent(), getPlaceListDTO.getSize());
         Page<PlaceVO> placeList = appSiteMapper.getPlaceList(page, getPlaceListDTO.getVenueType());
         placeList.getRecords().forEach(placeVO -> {
-            //todo 待申请第三方地图接口
-            placeVO.setKm(0.0)
+            placeVO.setKm(PositionUtil.calculateDistance(getPlaceListDTO.getLatitude(), getPlaceListDTO.getLongitude(), placeVO.getLatitude().doubleValue(), placeVO.getLongitude().doubleValue()))
                     .setCategory(getCategoryName(placeVO.getCategoryId()));
         });
         if(getPlaceListDTO.getVenueType().equals("0-2")
@@ -208,8 +205,8 @@ public class AppHomeServiceImpl implements IAppHomeService {
         Page<SearchVO.SearchPlaceVO> page = new Page<>(searchDTO.getCurrent(), searchDTO.getSize());
         Page<SearchVO.SearchPlaceVO> searchPlaceVOPage = appSiteMapper.convertSearchPlaceVOPage(page, searchDTO);
         searchPlaceVOPage.getRecords().forEach(placeVO -> {
-            //todo 待申请第三方地图接口
-            placeVO.setKm(0.0)
+            AppSite appSite = appSiteMapper.selectById(placeVO.getId());
+            placeVO.setKm(PositionUtil.calculateDistance(searchDTO.getLatitude(), searchDTO.getLongitude(), appSite.getLatitude().doubleValue(), appSite.getLongitude().doubleValue()))
                     .setCategory(getCategoryName(placeVO.getCategoryId()));
         });
         if(searchDTO.getVenueType().equals("0-2")
@@ -253,8 +250,8 @@ public class AppHomeServiceImpl implements IAppHomeService {
         Page<SearchVO.SearchTrainVO> page = new Page<>(searchDTO.getCurrent(), searchDTO.getSize());
         Page<SearchVO.SearchTrainVO> searchTrainVOPage = appCoursesMapper.convertSearchTrainVOPage(page, searchDTO);
         searchTrainVOPage.getRecords().forEach(trainVO -> {
-            //todo 待申请第三方地图接口
-            trainVO.setKm(0.0);
+            AppSite appSite = appSiteMapper.selectById(trainVO.getSiteId());
+            trainVO.setKm(PositionUtil.calculateDistance(searchDTO.getLatitude(), searchDTO.getLongitude(), appSite.getLatitude().doubleValue(), appSite.getLongitude().doubleValue()));
         });
         return searchTrainVOPage;
     }
@@ -270,15 +267,16 @@ public class AppHomeServiceImpl implements IAppHomeService {
         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);
+            AppSite appSite = appSiteMapper.selectOne(Wrappers.<AppSite>lambdaQuery().eq(AppSite::getOrgCode,competitionVO.getOrgCode()));
+            competitionVO.setKm(PositionUtil.calculateDistance(searchDTO.getLatitude(), searchDTO.getLongitude(), appSite.getLatitude().doubleValue(), appSite.getLongitude().doubleValue()));
+
         });
         return page;
     }
     
     /** 
      * @Author SheepHy
-     * @Description //TODO 
+     * @Description
      * @Date 14:43 2025/7/7
      * @Param searchDTO {@link SearchDTO}
      * @return Page<SearchVO.SearchInstructorVO>
@@ -297,7 +295,8 @@ public class AppHomeServiceImpl implements IAppHomeService {
                         return vo;
                     })
                     .collect(Collectors.toList());
-            instructorVO.setKm(0.0)
+            AppSite appSite = appSiteMapper.selectOne(Wrappers.<AppSite>lambdaQuery().eq(AppSite::getOrgCode, instructorVO.getOrgCode()));
+            instructorVO.setKm(PositionUtil.calculateDistance(searchDTO.getLatitude(), searchDTO.getLongitude(), appSite.getLatitude().doubleValue(), appSite.getLongitude().doubleValue()))
                     .setCourseList(courseInfoVOS);
         });
         return searchInstructorVOPage;

+ 123 - 17
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/DetailServiceImpl.java

@@ -2,18 +2,23 @@ package org.jeecg.modules.app.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.extern.log4j.Log4j2;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.app.service.IDetailService;
+import org.jeecg.modules.app.vo.CourseInfoVO;
 import org.jeecg.modules.app.vo.PlaceInfoVO;
-import org.jeecg.modules.system.app.entity.AppInstructor;
-import org.jeecg.modules.system.app.entity.AppOrderProduct;
-import org.jeecg.modules.system.app.entity.AppSite;
-import org.jeecg.modules.system.app.entity.AppSitePriceRules;
+import org.jeecg.modules.system.app.entity.*;
 import org.jeecg.modules.system.app.mapper.*;
+import org.jeecg.modules.system.util.PositionUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 @Service
 @Log4j2
@@ -23,16 +28,25 @@ public class DetailServiceImpl implements IDetailService {
     @Resource
     private AppCoursesPriceRulesMapper appCoursesPriceRulesMapper;
     @Resource
+    private AppCoursesMapper appCoursesMapper;
+    @Resource
     private AppOrderProductMapper appOrderProductMapper;
     @Resource
     private AppSitePriceRulesMapper appSitePriceRulesMapper;
     @Resource
     private AppInstructorMapper appInstructorMapper;
+    @Resource
+    private AppOrderMapper appOrderMapper;
 
     @Override
     public PlaceInfoVO getPlaceInfo(String id) {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         AppSite appSite = appSiteMapper.selectById(id);
         PlaceInfoVO placeInfo = appSiteMapper.getPlaceInfo(id);
+        AppSitePriceRules appSitePriceRules = appSitePriceRulesMapper.selectOne(Wrappers.<AppSitePriceRules>lambdaQuery()
+                .eq(AppSitePriceRules::getSiteId, id)
+                .eq(AppSitePriceRules::getStatus, 0)
+                .last("limit 1"));
         List<PlaceInfoVO.InstructorVO> instructorVOList = new ArrayList<>();
         List<AppInstructor> appInstructors = appInstructorMapper.selectList(Wrappers.<AppInstructor>lambdaQuery()
                 .eq(AppInstructor::getOrgCode, appSite.getOrgCode()));
@@ -43,19 +57,60 @@ public class DetailServiceImpl implements IDetailService {
                 instructorVOList.add(vo);
             }
         }
-        AppSitePriceRules appSitePriceRules = appSitePriceRulesMapper.selectOne(Wrappers.<AppSitePriceRules>lambdaQuery()
-                .eq(AppSitePriceRules::getSiteId, id)
-                .eq(AppSitePriceRules::getStatus, 0)
-                .last("limit 1"));
-        PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
-        placeInfoMsgVO.setName(appSite.getName())
-                .setSales(getPlaceSales(id))
-                .setOriginalPrice(appSitePriceRules.getOriginalPrice())
-                .setSellingPrice(appSitePriceRules.getSellingPrice());
-        placeInfo.setInstructorVOList(instructorVOList)
-                .setPlaceInfoMsgVO(placeInfoMsgVO);
+        List<PlaceInfoVO.CourseInfoVO> courseInfoVOList = new ArrayList<>();
+        appCoursesMapper.selectList(Wrappers.<AppCourses>lambdaQuery()
+                .eq(AppCourses::getSiteId, id)
+                .eq(AppCourses::getStatus, 0)
+                .eq(AppCourses::getDelFlag, 0)).forEach(appCourses -> {
+                PlaceInfoVO.CourseInfoVO courseInfoVO = new PlaceInfoVO.CourseInfoVO();
+                    BeanUtils.copyProperties(courseInfoVO, appCourses);
+                    courseInfoVO.setSales(getCourseSalesCount(appCourses.getId()));
+                    courseInfoVO.setSalesYear(getCourseSales(appCourses.getId()));
+                    courseInfoVO.setPriceType(isFirstPurchase(user.getId()));
+            courseInfoVOList.add(courseInfoVO);
+        });
+        placeInfo.setInstructorVOList(instructorVOList);
+        placeInfo.setCourseInfoVOList(courseInfoVOList);
+        if(appSite.getType() == 0){
+            //todo 评价查询待添加
+            PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
+            placeInfoMsgVO.setName(appSite.getName())
+                    .setSales(getPlaceSales(id))
+                    .setOriginalPrice(appSitePriceRules.getOriginalPrice())
+                    .setSellingPrice(appSitePriceRules.getSellingPrice());
+            placeInfo.setPlaceInfoMsgVO(placeInfoMsgVO);
+            return placeInfo;
+        }else if(appSite.getType() == 1){
+//            //todo 评价查询待添加
+            PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
+            placeInfoMsgVO.setName(appSite.getName())
+                    .setSales(getPlaceSales(id))
+                    .setOriginalPrice(appSitePriceRules.getOriginalPrice())
+                    .setSellingPrice(appSitePriceRules.getSellingPrice());
+            placeInfo.setPlaceInfoMsgVO(placeInfoMsgVO);
+            return placeInfo;
+        }else {
+            return null;
+        }
+    }
+
+
+    @Override
+    public CourseInfoVO getCourseInfo(String id, double latitude, double longitude) {
+        CourseInfoVO courseInfoVO = appCoursesMapper.getCourseInfo(id);
+        AppSite appSite = appSiteMapper.selectById(courseInfoVO.getSiteId());
+        courseInfoVO.setKm(PositionUtil.calculateDistance(latitude, longitude, appSite.getLatitude().doubleValue(), appSite.getLongitude().doubleValue()));
+        courseInfoVO.setSales(getCourseSales(id));
+        List<CourseInfoVO.CourseDetailVO> courseDetailVOList = new ArrayList<>();
+        appCoursesPriceRulesMapper.selectList(Wrappers.<AppCoursesPriceRules>lambdaQuery()
+                .eq(AppCoursesPriceRules::getCoursesId, courseInfoVO.getId())).forEach(appCourses -> {
+            CourseInfoVO.CourseDetailVO courseDetailVO = new CourseInfoVO.CourseDetailVO();
+            BeanUtils.copyProperties(courseDetailVO, appCourses);
+            courseDetailVOList.add(courseDetailVO);
+        });
+        courseInfoVO.setCourseDetail(courseDetailVOList);
         //todo 评价查询待添加
-        return placeInfo;
+        return courseInfoVO;
     }
 
     /**
@@ -65,7 +120,7 @@ public class DetailServiceImpl implements IDetailService {
      * @Date 20:02 2025/7/7
      * @Param
      **/
-    public int getPlaceSales(String id) {
+    private int getPlaceSales(String id) {
         List<String> ids = appCoursesPriceRulesMapper.selectRuleIdsByCourseId(id);
         int totalOrders = 0;
         if (!ids.isEmpty()) {
@@ -76,4 +131,55 @@ public class DetailServiceImpl implements IDetailService {
         }
         return totalOrders;
     }
+
+    /**
+     * @Author SheepHy
+     * @Description 计算当前课程年销售数
+     * @Date 15:47 2025/7/8
+     * @Param id 课程id
+     * @return int 课程年销售数
+     **/
+    private int getCourseSales(String id) {
+        // 获取当前年份的时间范围(如:2025-01-01 00:00:00 到 2026-01-01 00:00:00)
+        LocalDate now = LocalDate.now();
+        LocalDateTime startOfYear = now.withDayOfYear(1).atStartOfDay(); // 当前年份第一天
+        LocalDateTime endOfYear = startOfYear.plusYears(1); // 下一年第一天
+
+        return Math.toIntExact(appOrderProductMapper.selectCount(
+                Wrappers.<AppOrderProduct>lambdaQuery()
+                        .eq(AppOrderProduct::getProductId, id)
+                        .ge(AppOrderProduct::getCreateTime, Date.from(startOfYear.atZone(ZoneId.systemDefault()).toInstant())) // >= 2025-01-01
+                        .lt(AppOrderProduct::getCreateTime, Date.from(endOfYear.atZone(ZoneId.systemDefault()).toInstant())) // < 2026-01-01
+        ));
+    }
+
+    /**
+     * @Author SheepHy
+     * @Description 计算当前课程销售数
+     * @Date 15:47 2025/7/8
+     * @Param id 课程id
+     * @return int 课程年销售数
+     **/
+    private int getCourseSalesCount(String id) {
+        return Math.toIntExact(appOrderProductMapper.selectCount(
+                Wrappers.<AppOrderProduct>lambdaQuery()
+                        .eq(AppOrderProduct::getProductId, id)
+        ));
+    }
+
+    /**
+     * @Author SheepHy
+     * @Description 查询用户是否为第一次购买
+     * @Date 16:54 2025/7/8
+     * @Param
+     * @return
+     **/
+    private int isFirstPurchase(String userId) {
+        AppOrder appOrder = appOrderMapper.selectOne(Wrappers.<AppOrder>lambdaQuery().eq(AppOrder::getUpdateBy, userId).last("limit 1"));
+        if(null == appOrder){
+            return 1;
+        }else {
+            return 0;
+        }
+    }
 }

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

@@ -7,6 +7,7 @@ import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 @Data
 @Accessors(chain = true)
@@ -15,6 +16,8 @@ import java.util.Date;
 public class CourseInfoVO {
     @Schema(description = "id")
     private String id;
+    @Schema(hidden = true)
+    private String siteId;
     @Schema(description = "产品名称")
     private String name;
     @Schema(description = "费用类型;0 精品 1免费 仅课程")
@@ -28,9 +31,9 @@ public class CourseInfoVO {
     @Schema(description = "视频")
     private String video;
     @Schema(description = "上课场地")
-    private String siteId;
+    private String address;
     @Schema(description = "KM")
-    private String km;
+    private double km;
     @Schema(description = "年销售")
     private Integer sales;
     @Schema(description = "开始时间")
@@ -39,5 +42,31 @@ public class CourseInfoVO {
     private Date endTime;
     @Schema(description = "课时")
     private Integer classHour;
+    @Schema(description = "限购次数")
+    private Integer limitNum;
+    @Schema(description = "服务详情")
+    private Integer details;
+    @Schema(description = "适用人群")
+    private Integer fitPeople;
+    @Schema(description = "提示/须知")
+    private String reminder;
+    @Schema(description = "课程明细")
+    private List<CourseDetailVO> courseDetail;
+
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="课程明细返回参数")
+    public static class CourseDetailVO {
+        @Schema(description = "课程id")
+        private String courseId;
+        @Schema(description = "课程名称")
+        private String courseName;
+        @Schema(description = "开始时间")
+        private Date startTime;
+        @Schema(description = "结束时间")
+        private Date endTime;
+    }
+
 
 }

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

@@ -40,9 +40,11 @@ public class PlaceInfoVO {
     @Schema(description = "视频")
     private String video;
     @Schema(description = "场地简约返回参数")
-    private PlaceInfoMsgVO placeInfoMsgVO;
+    private Object placeInfoMsgVO;
     @Schema(description = "教练简约返回参数")
     private List<InstructorVO> instructorVOList;
+    @Schema(description="课程返回参数")
+    private List<CourseInfoVO> courseInfoVOList;
     @Data
     @Accessors(chain = true)
     @EqualsAndHashCode(callSuper = false)
@@ -68,6 +70,8 @@ public class PlaceInfoVO {
         private String id;
         @Schema(description = "场地名称")
         private String name;
+        @Schema(description = "费用类型;0 精品 1免费 仅课程")
+        private Integer priceType;
         @Schema(description = "课程原价")
         private BigDecimal originalPrice;
         @Schema(description = "课程售价")

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

@@ -32,5 +32,9 @@ public class PlaceVO extends Page<PlaceVO> {
     private List<String> category;
     @Schema(hidden = true)
     private String categoryId;
+    @Schema(description ="经度")
+    private BigDecimal longitude;
+    @Schema(description ="纬度")
+    private BigDecimal latitude;
 
 }

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

@@ -40,6 +40,8 @@ public class SearchVO{
         private String excelMsg;
         @Schema(description = "km")
         private double km;
+        @Schema(hidden = true)
+        private String orgCode;
         @Schema(description = "教学理念")
         private String teachingPhilosophy;
         @Schema(description = "好评率")
@@ -87,6 +89,8 @@ public class SearchVO{
         private BigDecimal sellingPrice;
         @Schema(description = "图片")
         private String cover;
+        @Schema(hidden = true)
+        private String orgCode;
         @Schema(description = "类目")
         private String categoryId;
         @Schema(description = "开始时间")
@@ -128,6 +132,8 @@ public class SearchVO{
         private int refundType;
         @Schema(description = "地址")
         private String address;
+        @Schema(hidden = true)
+        private String siteId;
         @Schema(description = "距离(KM)")
         private double km;
         @Schema(description = "课程开始时间")

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

@@ -1,182 +0,0 @@
-package org.jeecg.modules.system.app.controller;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.jeecg.common.api.vo.Result;
-import org.jeecg.common.system.query.QueryGenerator;
-import org.jeecg.common.system.query.QueryRuleEnum;
-import org.jeecg.common.util.oConvertUtils;
-import org.jeecg.modules.system.app.entity.AppEvaluate;
-import org.jeecg.modules.system.app.service.IAppEvaluateService;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import lombok.extern.slf4j.Slf4j;
-
-import org.jeecgframework.poi.excel.ExcelImportUtil;
-import org.jeecgframework.poi.excel.def.NormalExcelConstants;
-import org.jeecgframework.poi.excel.entity.ExportParams;
-import org.jeecgframework.poi.excel.entity.ImportParams;
-import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
-import org.jeecg.common.system.base.controller.JeecgController;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-import org.springframework.web.servlet.ModelAndView;
-import com.alibaba.fastjson.JSON;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Operation;
-import org.jeecg.common.aspect.annotation.AutoLog;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
- /**
- * @Description: 评价表
- * @Author: jeecg-boot
- * @Date:   2025-07-03
- * @Version: V1.0
- */
-@Tag(name="评价表")
-@RestController
-@RequestMapping("/org/jeecg/modules/app/appEvaluate")
-@Slf4j
-public class AppEvaluateController extends JeecgController<AppEvaluate, IAppEvaluateService> {
-	@Autowired
-	private IAppEvaluateService appEvaluateService;
-	
-	/**
-	 * 分页列表查询
-	 *
-	 * @param appEvaluate
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	//@AutoLog(value = "评价表-分页列表查询")
-	@Operation(summary="评价表-分页列表查询")
-	@GetMapping(value = "/list")
-	public Result<IPage<AppEvaluate>> queryPageList(AppEvaluate appEvaluate,
-								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-								   HttpServletRequest req) {
-
-
-        QueryWrapper<AppEvaluate> queryWrapper = QueryGenerator.initQueryWrapper(appEvaluate, req.getParameterMap());
-		Page<AppEvaluate> page = new Page<AppEvaluate>(pageNo, pageSize);
-		IPage<AppEvaluate> pageList = appEvaluateService.page(page, queryWrapper);
-		return Result.OK(pageList);
-	}
-	
-	/**
-	 *   添加
-	 *
-	 * @param appEvaluate
-	 * @return
-	 */
-	@AutoLog(value = "评价表-添加")
-	@Operation(summary="评价表-添加")
-	@RequiresPermissions("org.jeecg.modules.app:nm_evaluate:add")
-	@PostMapping(value = "/add")
-	public Result<String> add(@RequestBody AppEvaluate appEvaluate) {
-		appEvaluateService.save(appEvaluate);
-
-		return Result.OK("添加成功!");
-	}
-	
-	/**
-	 *  编辑
-	 *
-	 * @param appEvaluate
-	 * @return
-	 */
-	@AutoLog(value = "评价表-编辑")
-	@Operation(summary="评价表-编辑")
-	@RequiresPermissions("org.jeecg.modules.app:nm_evaluate:edit")
-	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
-	public Result<String> edit(@RequestBody AppEvaluate appEvaluate) {
-		appEvaluateService.updateById(appEvaluate);
-		return Result.OK("编辑成功!");
-	}
-	
-	/**
-	 *   通过id删除
-	 *
-	 * @param id
-	 * @return
-	 */
-	@AutoLog(value = "评价表-通过id删除")
-	@Operation(summary="评价表-通过id删除")
-	@RequiresPermissions("org.jeecg.modules.app:nm_evaluate:delete")
-	@DeleteMapping(value = "/delete")
-	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-		appEvaluateService.removeById(id);
-		return Result.OK("删除成功!");
-	}
-	
-	/**
-	 *  批量删除
-	 *
-	 * @param ids
-	 * @return
-	 */
-	@AutoLog(value = "评价表-批量删除")
-	@Operation(summary="评价表-批量删除")
-	@RequiresPermissions("org.jeecg.modules.app:nm_evaluate:deleteBatch")
-	@DeleteMapping(value = "/deleteBatch")
-	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		this.appEvaluateService.removeByIds(Arrays.asList(ids.split(",")));
-		return Result.OK("批量删除成功!");
-	}
-	
-	/**
-	 * 通过id查询
-	 *
-	 * @param id
-	 * @return
-	 */
-	//@AutoLog(value = "评价表-通过id查询")
-	@Operation(summary="评价表-通过id查询")
-	@GetMapping(value = "/queryById")
-	public Result<AppEvaluate> queryById(@RequestParam(name="id",required=true) String id) {
-		AppEvaluate appEvaluate = appEvaluateService.getById(id);
-		if(appEvaluate==null) {
-			return Result.error("未找到对应数据");
-		}
-		return Result.OK(appEvaluate);
-	}
-
-    /**
-    * 导出excel
-    *
-    * @param request
-    * @param appEvaluate
-    */
-    @RequiresPermissions("org.jeecg.modules.app:nm_evaluate:exportXls")
-    @RequestMapping(value = "/exportXls")
-    public ModelAndView exportXls(HttpServletRequest request, AppEvaluate appEvaluate) {
-        return super.exportXls(request, appEvaluate, AppEvaluate.class, "评价表");
-    }
-
-    /**
-      * 通过excel导入数据
-    *
-    * @param request
-    * @param response
-    * @return
-    */
-    @RequiresPermissions("org.jeecg.modules.app:nm_evaluate:importExcel")
-    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
-    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
-        return super.importExcel(request, response, AppEvaluate.class);
-    }
-
-}

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

@@ -0,0 +1,218 @@
+package org.jeecg.modules.system.app.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.subject.Subject;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.system.app.dto.AuditRequestDTO;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateRequestDTO;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateResponseDTO;
+import org.jeecg.modules.system.app.entity.Evaluate;
+import org.jeecg.modules.system.app.enums.ReplyStatusEnum;
+import org.jeecg.modules.system.app.service.IEvaluateService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * @Description: 评价管理
+ * @Author: zx
+ * @Date:   2025-07-08
+ * @Version: V1.0
+ */
+@Tag(name="评价管理")
+@RestController
+@RequestMapping("/evaluate/evaluate")
+@Slf4j
+public class EvaluateController extends JeecgController<Evaluate, IEvaluateService> {
+	@Autowired
+	private IEvaluateService evaluateService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param findEvaluateRequestDTO
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "评价管理-分页列表查询")
+	@Operation(summary="评价管理-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<FindEvaluateResponseDTO>> queryPageList(FindEvaluateRequestDTO findEvaluateRequestDTO,
+																@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																HttpServletRequest req) {
+
+		Subject subject = SecurityUtils.getSubject();
+		LoginUser loginUser =null;
+		if (subject.isAuthenticated()) {
+			// 获取当前登录的用户信息
+			loginUser= (LoginUser) subject.getPrincipal();
+		}
+		if (loginUser==null){
+			return Result.error("当前未登录,请先登录;或者未获取到用户信息,请联系管理员");
+		}
+		findEvaluateRequestDTO.setOrgCode(loginUser.getOrgCode());
+		IPage<FindEvaluateResponseDTO> pageList = evaluateService.findPage(pageNo,pageSize, findEvaluateRequestDTO);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param evaluate
+	 * @return
+	 */
+	@AutoLog(value = "评价管理-添加")
+	@Operation(summary="评价管理-添加")
+	@RequiresPermissions("evaluate:nm_evaluate:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody Evaluate evaluate) {
+		evaluateService.save(evaluate);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param evaluate
+	 * @return
+	 */
+	@AutoLog(value = "评价管理-编辑")
+	@Operation(summary="评价管理-编辑")
+	@RequiresPermissions("evaluate:nm_evaluate:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody Evaluate evaluate) {
+		Subject subject = SecurityUtils.getSubject();
+		LoginUser loginUser =null;
+		if (subject.isAuthenticated()) {
+			// 获取当前登录的用户信息
+			loginUser= (LoginUser) subject.getPrincipal();
+		}
+		if (loginUser==null){
+			return Result.error("当前未登录,请先登录;或者未获取到用户信息,请联系管理员");
+		}
+		evaluate.setReplyUserId(loginUser.getId());
+		evaluate.setReplyStatus(ReplyStatusEnum.REPLIED.getCode());
+		evaluate.setReplyTime(new Date());
+		evaluateService.updateById(evaluate);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "评价管理-通过id删除")
+	@Operation(summary="评价管理-通过id删除")
+	@RequiresPermissions("evaluate:nm_evaluate:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		evaluateService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "评价管理-批量删除")
+	@Operation(summary="评价管理-批量删除")
+	@RequiresPermissions("evaluate:nm_evaluate:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.evaluateService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "评价管理-通过id查询")
+	@Operation(summary="评价管理-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<Evaluate> queryById(@RequestParam(name="id",required=true) String id) {
+		Evaluate evaluate = evaluateService.getById(id);
+		if(evaluate==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(evaluate);
+	}
+
+
+	/**
+	 *审核
+	 * @param auditRequestDTO
+	 * @return
+	 */
+	@Operation(summary="评价管理-审核")
+	@PostMapping(value = "/audit")
+	public Result<String> audit(@RequestBody AuditRequestDTO auditRequestDTO) {
+		Subject subject = SecurityUtils.getSubject();
+		LoginUser loginUser =null;
+		if (subject.isAuthenticated()) {
+			// 获取当前登录的用户信息
+			loginUser= (LoginUser) subject.getPrincipal();
+		}
+		if (loginUser==null){
+			return Result.error("当前未登录,请先登录;或者未获取到用户信息,请联系管理员");
+		}
+		Evaluate evaluate = new Evaluate();
+		BeanUtils.copyProperties(auditRequestDTO,evaluate);
+		evaluate.setUpdateBy(loginUser.getId());
+		evaluate.setUpdateTime(new Date());
+		boolean b = evaluateService.updateById(evaluate);
+		if(!b) {
+			return Result.error("审核失败");
+		}
+		return Result.OK("审核成功");
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param evaluate
+    */
+    @RequiresPermissions("evaluate:nm_evaluate:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, Evaluate evaluate) {
+        return super.exportXls(request, evaluate, Evaluate.class, "评价管理");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("evaluate:nm_evaluate:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, Evaluate.class);
+    }
+
+}

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

@@ -0,0 +1,36 @@
+package org.jeecg.modules.system.app.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 审核
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="审核请求入参")
+public class AuditRequestDTO {
+
+    /**主键id*/
+    @Schema(description = "主键id")
+    @NotNull(message = "未选择需要审核的数据")
+    private String id;
+
+    /**审核状态;0初始 1通过 2拦截*/
+    @Schema(description = "审核状态;0初始 1通过 2拦截")
+    @NotNull(message = "审核状态不能为空")
+    private Integer checkStatus;
+
+
+
+
+}

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

@@ -38,6 +38,9 @@ public class FindResponseDTO {
     @Excel(name = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他", width = 15)
     @Schema(description = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他")
     private Integer feedbackType;
+
+    @Schema(description = "反馈类型描述")
+    private String feedbackName;
     /**反馈描述*/
     @Excel(name = "反馈描述", width = 15)
     @Schema(description = "反馈描述")
@@ -55,12 +58,18 @@ public class FindResponseDTO {
     @Schema(description = "回复内容")
     private String replyContent;
 
+    /**回复内容*/
+    @Schema(description = "头像")
+    private String avatar;
+
     /**创建时间*/
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     @Schema(description = "创建时间")
     private Date createTime;
+
     @Schema(description = "图片集合")
     private List<String> feedbackImgList;
 
+
 }

+ 51 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/evaluate/FindEvaluateRequestDTO.java

@@ -0,0 +1,51 @@
+package org.jeecg.modules.system.app.dto.evaluate;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 评价管理
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="评价请求入参")
+public class FindEvaluateRequestDTO {
+
+    /**评分 存储整数  1-5*/
+    @Schema(description = "评分 存储整数  1-5")
+    private Integer score;
+
+    /**审核状态;0初始 1通过 2拦截*/
+    @Schema(description = "审核状态;0初始 1通过 2拦截")
+    private Integer checkStatus;
+
+    /**回复状态*/
+    @Schema(description = "回复状态 0-未回复 1-已回复")
+    private Integer replyStatus;
+    /**发布单位*/
+    @Excel(name = "发布单位", width = 15)
+    @Schema(description = "发布单位")
+    private String deptId;
+
+    /**部门编码*/
+    @Excel(name = "部门编码", width = 15)
+    @Schema(description = "部门编码")
+    private String orgCode;
+
+    /**创建时间;创建时间*/
+    @Schema(description = "提交开始时间")
+    private String startTime;
+
+    /**创建时间;创建时间*/
+    @Schema(description = "提交结束时间")
+    private String endTime;
+
+}

+ 89 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/evaluate/FindEvaluateResponseDTO.java

@@ -0,0 +1,89 @@
+package org.jeecg.modules.system.app.dto.evaluate;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 评价
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="评价返回参数")
+public class FindEvaluateResponseDTO {
+    /**id*/
+    @Schema(description = "id")
+    private String id;
+    /**部门编码*/
+    @Excel(name = "部门编码", width = 15)
+    @Schema(description = "部门编码")
+    private String orgCode;
+    /**关联部门id*/
+    @Excel(name = "发布单位名称", width = 15)
+    @Schema(description = "发布单位名称")
+    private String departName;
+    /**场地/地点*/
+    @Schema(description = "场地/地点")
+    private String address;
+    /**用户*/
+    @Schema(description = "用户")
+    private String username;
+    /**用户*/
+    @Schema(description = "用户手机号")
+    private String phone;
+    /**用户头像*/
+    @Schema(description = "头像")
+    private String avatar;
+    /**评分 存储整数  1-5*/
+    @Schema(description = "评分 存储整数  1-5")
+    private Integer score;
+    /**评价内容*/
+    @Schema(description = "评价内容")
+    private String evaluateContent;
+    /**图片列表使用;进行隔开*/
+    @Schema(description = "图片列表使用;进行隔开")
+    private String images;
+    /**审核状态;0初始 1通过 2拦截*/
+    @Schema(description = "审核状态;0初始 1通过 2拦截")
+    private Integer checkStatus;
+    /**回复状态*/
+    @Schema(description = "回复状态 0-未回复 1-已回复")
+    private Integer replyStatus;
+    /**回复内容*/
+    @Schema(description = "回复内容")
+    private String replyContent;
+    /**回复时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "回复时间")
+    private Date replyTime;
+    /**业务类型;0场地 1课程*/
+    @Schema(description = "业务类型;0场地 1课程")
+    private Integer type;
+    /**创建时间;创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间;创建时间")
+    private Date createTime;
+    /**更新时间;更新时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "更新时间;更新时间")
+    private Date updateTime;
+
+    @Schema(description = "图片列表集合")
+    private List<String> imageList;
+
+}

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

@@ -61,9 +61,6 @@ public class AppFeedback implements Serializable {
 	@Excel(name = "回复人id", width = 15)
     @Schema(description = "回复人id")
     private String replyUserId;
-	/**创建人*/
-    @Schema(description = "创建人")
-    private String createBy;
 	/**创建时间*/
 	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

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

@@ -0,0 +1,119 @@
+package org.jeecg.modules.system.app.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+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: 评价管理
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+@Data
+@TableName("nm_evaluate")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="评价管理")
+public class Evaluate implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "id")
+    private String id;
+	/**部门编码*/
+	@Excel(name = "部门编码", width = 15)
+    @Schema(description = "部门编码")
+    private String orgCode;
+	/**关联部门id*/
+	@Excel(name = "关联部门id", width = 15)
+    @Schema(description = "关联部门id")
+    private String deptId;
+	/**场地/地点*/
+	@Excel(name = "场地/地点", width = 15)
+    @Schema(description = "场地/地点")
+    private Integer siteId;
+	/**用户*/
+	@Excel(name = "用户", width = 15)
+    @Schema(description = "用户")
+    private String userId;
+	/**订单*/
+	@Excel(name = "订单", width = 15)
+    @Schema(description = "订单")
+    private String orderId;
+	/**评分 存储整数  1-5*/
+	@Excel(name = "评分 存储整数  1-5", width = 15)
+    @Schema(description = "评分 存储整数  1-5")
+    private Integer score;
+	/**评价内容*/
+	@Excel(name = "评价内容", width = 15)
+    @Schema(description = "评价内容")
+    private String evaluateContent;
+	/**图片列表使用;进行隔开*/
+	@Excel(name = "图片列表使用;进行隔开", width = 15)
+    @Schema(description = "图片列表使用;进行隔开")
+    private String images;
+	/**审核状态;0初始 1通过 2拦截*/
+	@Excel(name = "审核状态;0初始 1通过 2拦截", width = 15)
+    @Schema(description = "审核状态;0初始 1通过 2拦截")
+    private Integer checkStatus;
+	/**回复状态*/
+	@Excel(name = "回复状态", width = 15)
+    @Schema(description = "回复状态")
+    private Integer replyStatus;
+	/**回复内容*/
+	@Excel(name = "回复内容", width = 15)
+    @Schema(description = "回复内容")
+    private String replyContent;
+	/**回复人_id*/
+	@Excel(name = "回复人_id", width = 15)
+    @Schema(description = "回复人_id")
+    private String replyUserId;
+	/**回复时间*/
+	@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 replyTime;
+	/**业务类型;0场地 1课程*/
+	@Excel(name = "业务类型;0场地 1课程", width = 15)
+    @Schema(description = "业务类型;0场地 1课程")
+    private Integer type;
+	/**创建人;创建人*/
+    @Schema(description = "创建人;创建人")
+    private String createBy;
+	/**创建时间;创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间;创建时间")
+    private Date createTime;
+	/**更新人;更新人*/
+    @Schema(description = "更新人;更新人")
+    private String updateBy;
+	/**更新时间;更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "更新时间;更新时间")
+    private Date updateTime;
+	/**系统状态;状态(0-正常,1-冻结)*/
+	@Excel(name = "系统状态;状态(0-正常,1-冻结)", width = 15)
+    @Schema(description = "系统状态;状态(0-正常,1-冻结)")
+    private Integer evaluateStatus;
+	/**删除标志;删除状态(0-正常,1-已删除)*/
+	@Excel(name = "删除标志;删除状态(0-正常,1-已删除)", width = 15)
+    @Schema(description = "删除标志;删除状态(0-正常,1-已删除)")
+    @TableLogic
+    private Integer delFlag;
+}

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

@@ -0,0 +1,43 @@
+package org.jeecg.modules.system.app.enums;
+
+import org.jeecg.common.system.annotation.EnumDict;
+
+/**
+ * 回复状态枚举
+ */
+@EnumDict("auditStatusEnum")
+public enum AuditStatusEnum {
+//   0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他
+    SUCCESS(0, "通过"),
+    FAIL(1, "不通过");
+
+    Integer code;
+    String name;
+    AuditStatusEnum(Integer code, String name) {
+        this.code = code;
+        this.name = name;
+    }
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+    public static AuditStatusEnum getByCode(Integer code) {
+        for (AuditStatusEnum value : values()) {
+            if (value.code.equals(code) ) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 4 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/enums/FeedbackTypeEnum.java

@@ -1,5 +1,7 @@
 package org.jeecg.modules.system.app.enums;
 
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
 import org.jeecg.common.system.annotation.EnumDict;
 
 /**
@@ -14,7 +16,9 @@ public enum FeedbackTypeEnum {
     GNJY(3, "功能建议"),
     QT(4, "其他");
 
+    @EnumValue
     Integer code;
+    @JsonValue
     String name;
     FeedbackTypeEnum(Integer code, String name) {
         this.code = code;

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

@@ -4,6 +4,7 @@ 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.CourseInfoVO;
 import org.jeecg.modules.app.vo.SearchVO;
 import org.jeecg.modules.system.app.entity.AppCourses;
 
@@ -22,4 +23,13 @@ public interface AppCoursesMapper extends BaseMapper<AppCourses> {
      * @return
      **/
     Page<SearchVO.SearchTrainVO> convertSearchTrainVOPage(@Param("page")Page<SearchVO.SearchTrainVO> page,@Param("searchDTO")SearchDTO searchDTO);
+
+    /**
+     * @Author SheepHy
+     * @Description 课程详情
+     * @Date 13:36 2025/7/8
+     * @Param id 课程id
+     * @return CourseInfoVO {@link CourseInfoVO}
+     **/
+    CourseInfoVO getCourseInfo(@Param("id")String id);
 }

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.system.app.mapper;
+
+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.system.app.dto.evaluate.FindEvaluateRequestDTO;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateResponseDTO;
+import org.jeecg.modules.system.app.entity.Evaluate;
+
+/**
+ * @Description: 评价管理
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+public interface EvaluateMapper extends BaseMapper<Evaluate> {
+
+    IPage<FindEvaluateResponseDTO> findPage(@Param("page") Page<FindEvaluateResponseDTO> page,@Param("findEvaluateRequestDTO") FindEvaluateRequestDTO findEvaluateRequestDTO);
+}

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

@@ -1,8 +1,11 @@
 package org.jeecg.modules.system.app.mapper;
 
 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.apache.ibatis.annotations.Select;
+import org.jeecg.modules.system.app.dto.FindResponseDTO;
 import org.jeecg.modules.system.app.entity.FamilyMembers;
 
 import java.util.List;
@@ -18,5 +21,6 @@ public interface FamilyMembersMapper extends BaseMapper<FamilyMembers> {
     @Select("select  * from nm_family_members where  user_id = #{userId} order by user_type asc,create_time desc")
     List<FamilyMembers> findByUserId(@Param("userId") String userId);
 
-
+    @Select("select  * from nm_family_members where  user_id = #{userId} order by user_type asc,create_time desc")
+   IPage<FamilyMembers> findByPage(@Param("page") Page<FindResponseDTO> page, @Param("userId") String userId);
 }

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

@@ -12,7 +12,8 @@
             COALESCE(d.sales, 0) AS sales,
             a.good_rate,
             a.start_time,
-            a.end_time
+            a.end_time,
+            b.id AS siteId
         FROM
             nm_courses a
                 LEFT JOIN nm_site b ON a.tenant_id = b.tenant_id
@@ -35,4 +36,40 @@
             ORDER BY sales DESC
         </if>
     </select>
+    <select id="getCourseInfo" resultType="org.jeecg.modules.app.vo.CourseInfoVO">
+        SELECT
+            a.id,
+            a.name,
+            a.original_price,
+            a.selling_price,
+            a.cover,
+            a.video,
+            b.address,
+            a.site_id,
+            a.start_time,
+            a.end_time,
+            COUNT( c.id ) AS classHour,
+            a.limit_num,
+            a.reminder
+        FROM
+            nm_courses a
+                LEFT JOIN nm_site b ON a.site_id = b.id
+                LEFT JOIN nm_courses_price_rules c ON a.id = c.courses_id
+        WHERE
+            a.STATUS = 0
+          AND a.del_flag = 0
+          AND a.id = #{id}
+        GROUP BY
+            a.id,
+            a.name,
+            a.original_price,
+            a.selling_price,
+            a.cover,
+            a.video,
+            b.address,
+            a.start_time,
+            a.end_time,
+            a.limit_num,
+            a.reminder;
+    </select>
 </mapper>

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

@@ -9,6 +9,7 @@
             COALESCE(g.min_original_price, 0) AS original_price,
             COALESCE(g.min_selling_price, 0) AS selling_price,
             a.address,
+            a.org_code AS orgCode
             CASE
                 WHEN a.application_end_time >= NOW() THEN TRUE
                 ELSE FALSE

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

@@ -12,6 +12,7 @@
             a.good_rate,
             a.classes_number,
             b.id AS userId,
+            a.org_code AS orgCode,
             COUNT( DISTINCT d.user_id, c2.id ) AS orderCount
         FROM
             nm_instructor a

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

@@ -8,6 +8,8 @@
             a.good_rate AS goodRate,
             a.address,
             a.category_id,
+            a.latitude,
+            a.longitude,
             CASE
                 WHEN EXISTS (
                     SELECT SUM(inventory)
@@ -18,7 +20,7 @@
                 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-1'">
-            ORDER BY  a.good_rate DESC
+            ORDER BY a.good_rate DESC
         </if>
         <if test="venueType != null and venueType == '1-1'">
             AND b.org_category = 2

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

@@ -0,0 +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.EvaluateMapper">
+
+    <select id="findPage" resultType="org.jeecg.modules.system.app.dto.evaluate.FindEvaluateResponseDTO">
+        select
+            ne.score,ne.evaluate_content,ne.avatar,ne.images,ne.check_status,ne.reply_status,ne.reply_content,ne.reply_time,ne.type,ne.create_time,sd.depart_name,ns.address,su.username,su.phone
+        from nm_evaluate ne
+        left join  sys_depart sd on  ne.dept_id = s.id
+        LEFT JOIN nm_site ns on  ne.site_id =ns.id
+        LEFT JOIN sys_user su on  ne.user_id =su.id
+        where 1=1
+        <if test="findEvaluateRequestDTO!=null and findEvaluateRequestDTO!=''">
+            <if test="findEvaluateRequestDTO.orgCode!=null and findEvaluateRequestDTO.orgCode!=''">
+                and ne.org_code like CONCAT('',#{findEvaluateRequestDTO.orgCode},'%')
+            </if>
+        <if test="findEvaluateRequestDTO.deptId!=null and findEvaluateRequestDTO.deptId!=''">
+            AND ne.score = #{findEvaluateRequestDTO.deptId}
+        </if>
+        <if test="findEvaluateRequestDTO.score!=null">
+            AND ne.score = #{findEvaluateRequestDTO.score}
+        </if>
+        <if test="findEvaluateRequestDTO.checkStatus!=null">
+            AND ne.check_status = #{findEvaluateRequestDTO.checkStatus}
+        </if>
+        <if test="findEvaluateRequestDTO.replyStatus!=null">
+            AND ne.reply_status = #{findEvaluateRequestDTO.replyStatus}
+        </if>
+        <if test="findEvaluateRequestDTO.endTime!=null  and findEvaluateRequestDTO.endTime!=''">
+            <![CDATA[   AND DATE_FORMAT(ne.create_time, '%Y-%m-%d')<=  DATE_FORMAT(#{findEvaluateRequestDTO.endTime}, '%Y-%m-%d') ]]>
+        </if>
+        <if test="findEvaluateRequestDTO.startTime!=null  and findEvaluateRequestDTO.startTime!=''">
+            <![CDATA[   AND DATE_FORMAT(ne.create_time, '%Y-%m-%d')<=  DATE_FORMAT(#{findEvaluateRequestDTO.startTime}, '%Y-%m-%d') ]]>
+        </if>
+        </if>
+        order by ne.create_time desc
+    </select>
+</mapper>

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.system.app.service;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateRequestDTO;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateResponseDTO;
+import org.jeecg.modules.system.app.entity.Evaluate;
+
+/**
+ * @Description: 评价管理
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+public interface IEvaluateService extends IService<Evaluate> {
+
+
+    IPage<FindEvaluateResponseDTO> findPage(Integer pageNo, Integer pageSize, FindEvaluateRequestDTO findEvaluateRequestDTO);
+}

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

@@ -1,9 +1,11 @@
 package org.jeecg.modules.system.app.service;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.app.dto.AddFamilyMembersDTO;
+import org.jeecg.modules.app.dto.FindFamilyMembersDTO;
 import org.jeecg.modules.system.app.dto.FindFamilyMembersResponseDTO;
 import org.jeecg.modules.system.app.entity.FamilyMembers;
 
@@ -22,4 +24,7 @@ public interface IFamilyMembersService extends IService<FamilyMembers> {
     Result<String> editFamilyMembers(AddFamilyMembersDTO addFamilyMembersDTO);
 
     Result<String> deleteFamilyMembers(String id);
+
+
+    Result<IPage<FamilyMembers>> findFamilyMembers(FindFamilyMembersDTO findFamilyMembersDTO);
 }

+ 15 - 2
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppFeedbackServiceImpl.java

@@ -8,6 +8,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.jeecg.modules.system.app.dto.FindPageRequestDTO;
 import org.jeecg.modules.system.app.dto.FindResponseDTO;
 import org.jeecg.modules.system.app.entity.AppFeedback;
+import org.jeecg.modules.system.app.enums.FeedbackTypeEnum;
 import org.jeecg.modules.system.app.mapper.AppFeedbackMapper;
 import org.jeecg.modules.system.app.service.IAppFeedbackService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,6 +39,12 @@ public class AppFeedbackServiceImpl extends ServiceImpl<AppFeedbackMapper, AppFe
                 if (StringUtils.isNotEmpty(record.getFeedbackImg())){
                     imgSplit(record);
                 }
+                String feedbackName =null;
+                FeedbackTypeEnum byCode = FeedbackTypeEnum.getByCode(record.getFeedbackType());
+                if (byCode!=null){
+                    feedbackName =byCode.getName();
+                }
+                record.setFeedbackName(feedbackName);
             }
         }
         return findPage;
@@ -49,14 +56,20 @@ public class AppFeedbackServiceImpl extends ServiceImpl<AppFeedbackMapper, AppFe
         if (findResponseDTO!=null&&StringUtils.isNotEmpty(findResponseDTO.getFeedbackImg())){
             imgSplit(findResponseDTO);
         }
+        String feedbackName =null;
+        FeedbackTypeEnum byCode = FeedbackTypeEnum.getByCode(findResponseDTO.getFeedbackType());
+        if (byCode!=null){
+            feedbackName =byCode.getName();
+        }
+        findResponseDTO.setFeedbackName(feedbackName);
         return findResponseDTO;
     }
 
 
     private static void imgSplit(FindResponseDTO findResponseDTO ){
         List<String> strings = new ArrayList<>();
-        if (findResponseDTO.getFeedbackImg().indexOf(";")>0){
-            strings = Arrays.asList(findResponseDTO.getFeedbackImg().split(";"));
+        if (findResponseDTO.getFeedbackImg().indexOf(",")>0){
+            strings = Arrays.asList(findResponseDTO.getFeedbackImg().split(","));
         }else {
             strings.add(findResponseDTO.getFeedbackImg());
 

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

@@ -0,0 +1,48 @@
+package org.jeecg.modules.system.app.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateRequestDTO;
+import org.jeecg.modules.system.app.dto.evaluate.FindEvaluateResponseDTO;
+import org.jeecg.modules.system.app.entity.Evaluate;
+import org.jeecg.modules.system.app.mapper.EvaluateMapper;
+import org.jeecg.modules.system.app.service.IEvaluateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Description: 评价管理
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+@Service
+public class EvaluateServiceImpl extends ServiceImpl<EvaluateMapper, Evaluate> implements IEvaluateService {
+
+    @Autowired
+    EvaluateMapper evaluateMapper;
+
+    @Override
+    public IPage<FindEvaluateResponseDTO> findPage(Integer pageNo, Integer pageSize, FindEvaluateRequestDTO findEvaluateRequestDTO) {
+        Page<FindEvaluateResponseDTO> page = new Page<FindEvaluateResponseDTO>(pageNo, pageSize);
+        IPage<FindEvaluateResponseDTO> findEvaluateResponseDTOIPage= evaluateMapper.findPage(page, findEvaluateRequestDTO);
+        if (findEvaluateResponseDTOIPage!=null&&findEvaluateResponseDTOIPage.getRecords()!=null){
+            for (FindEvaluateResponseDTO record : findEvaluateResponseDTOIPage.getRecords()) {
+                List<String> strings = new ArrayList<>();
+                if (StringUtils.isNotEmpty(record.getImages())&&record.getImages().indexOf(",")>0){
+                    strings = Arrays.asList(record.getImages().split(","));
+                }else {
+                    strings.add(record.getImages());
+                }
+                record.setImageList(strings);
+            }
+        }
+        return findEvaluateResponseDTOIPage;
+    }
+}

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

@@ -1,12 +1,16 @@
 package org.jeecg.modules.system.app.service.impl;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import me.zhyd.oauth.utils.UuidUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.modules.app.dto.AddFamilyMembersDTO;
+import org.jeecg.modules.app.dto.FindFamilyMembersDTO;
 import org.jeecg.modules.system.app.dto.FindFamilyMembersResponseDTO;
+import org.jeecg.modules.system.app.dto.FindResponseDTO;
 import org.jeecg.modules.system.app.entity.FamilyMembers;
 import org.jeecg.modules.system.app.enums.DelFlagEnum;
 import org.jeecg.modules.system.app.mapper.FamilyMembersMapper;
@@ -97,4 +101,10 @@ public class FamilyMembersServiceImpl extends ServiceImpl<FamilyMembersMapper, F
         }
         return Result.ok("删除成功");
     }
+
+    @Override
+    public Result<IPage<FamilyMembers>> findFamilyMembers(FindFamilyMembersDTO findFamilyMembersDTO) {
+        Page<FindResponseDTO> page = new Page<FindResponseDTO>(findFamilyMembersDTO.getPageNo(), findFamilyMembersDTO.getPageSize());
+        return Result.ok(familyMembersMapper.findByPage(page,findFamilyMembersDTO.getUserId()));
+    }
 }

+ 3 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/util/PositionUtil.java

@@ -11,6 +11,9 @@ public class PositionUtil {
      * @return 两点之间的直线距离(单位:公里)
      */
     public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
+        if (lat1 == lat2 && lon1 == lon2) {
+            return 0; // 两点相同时返回0
+        }
         final int EARTH_RADIUS_KM = 6371; // 地球平均半径,单位:公里
         // 将角度转换为弧度
         double lat1Rad = Math.toRadians(lat1);