Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

lix 2 nedēļas atpakaļ
vecāks
revīzija
4fb29d3bc6
39 mainītis faili ar 1682 papildinājumiem un 15 dzēšanām
  1. 3 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/CommonAppController.java
  2. 44 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppFamilyMembersController.java
  3. 60 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/controller/my/AppFeedbackController.java
  4. 57 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/AddFamilyMembersDTO.java
  5. 24 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/AppFeedbackFindRequestDTO.java
  6. 42 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/dto/AppSubmitFeedbackRequestDTO.java
  7. 14 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IDetailService.java
  8. 4 5
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/AppHomeServiceImpl.java
  9. 60 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/DetailServiceImpl.java
  10. 87 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/vo/PlaceInfoVO.java
  11. 43 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/CUserInfoController.java
  12. 175 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/FamilyMembersController.java
  13. 179 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/FeedbackController.java
  14. 62 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/FindFamilyMembersResponseDTO.java
  15. 29 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/FindPageCUserInfoRequestDTO.java
  16. 42 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/FindPageCUserInfoResponseDTO.java
  17. 30 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/FindPageRequestDTO.java
  18. 66 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/dto/FindResponseDTO.java
  19. 85 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppFeedback.java
  20. 89 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/FamilyMembers.java
  21. 43 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/enums/DelFlagEnum.java
  22. 46 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/enums/FeedbackTypeEnum.java
  23. 43 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/enums/ReplyStatusEnum.java
  24. 4 4
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppCoursesPriceRulesMapper.java
  25. 25 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppFeedbackMapper.java
  26. 10 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppSiteMapper.java
  27. 22 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/FamilyMembersMapper.java
  28. 3 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppCoursesPriceRulesMapper.xml
  29. 20 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppFeedbackMapper.xml
  30. 19 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppSiteMapper.xml
  31. 5 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/FamilyMembersMapper.xml
  32. 22 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppFeedbackService.java
  33. 25 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IFamilyMembersService.java
  34. 66 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppFeedbackServiceImpl.java
  35. 100 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/FamilyMembersServiceImpl.java
  36. 5 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java
  37. 10 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserMapper.xml
  38. 4 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java
  39. 15 2
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java

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

@@ -3,6 +3,7 @@ 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.api.vo.Result;
 import org.jeecg.common.system.vo.DictModel;
 import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -29,7 +30,7 @@ public class CommonAppController {
      */
     @Operation(summary="根据字典code查询字典项")
     @GetMapping("/getDictItems")
-    public List<DictModel> getDictItems(@RequestParam("dictCode") String dictCode) {
-        return sysBaseApi.getDictItems(dictCode);
+    public Result<List<DictModel>> getDictItems(@RequestParam("dictCode") String dictCode) {
+        return Result.OK(sysBaseApi.queryDictItemsByCode(dictCode));
     }
 }

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

@@ -0,0 +1,44 @@
+package org.jeecg.modules.app.controller.my;
+
+
+import io.swagger.v3.oas.annotations.Operation;
+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.AddFamilyMembersDTO;
+import org.jeecg.modules.system.app.service.IFamilyMembersService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 家庭成员
+ */
+@Slf4j
+@Tag(name = "APP家庭成员信息")
+@RestController()
+@RequestMapping("/app/my/familyMembers")
+public class AppFamilyMembersController {
+
+    @Autowired
+    IFamilyMembersService iFamilyMembersService;
+
+    @PostMapping("/addFamilyMembers")
+    @Operation(summary = "添加家庭成员")
+    public Result<String> addFamilyMembers(@RequestBody AddFamilyMembersDTO addFamilyMembersDTO){
+        return iFamilyMembersService.addFamilyMembers(addFamilyMembersDTO);
+    }
+
+    @PostMapping("/editFamilyMembers")
+    @Operation(summary = "修改家庭成员")
+    public Result<String> editFamilyMembers(@RequestBody AddFamilyMembersDTO addFamilyMembersDTO){
+        return iFamilyMembersService.editFamilyMembers(addFamilyMembersDTO);
+    }
+
+
+    @GetMapping("/deleteFamilyMembers")
+    @Operation(summary = "删除家庭成员")
+    public Result<String> deleteFamilyMembers(@RequestParam("id") String id){
+        return iFamilyMembersService.deleteFamilyMembers(id);
+    }
+
+}

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

@@ -0,0 +1,60 @@
+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.jeecg.common.api.vo.Result;
+import org.jeecg.modules.app.dto.AppFeedbackFindRequestDTO;
+import org.jeecg.modules.app.dto.AppSubmitFeedbackRequestDTO;
+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.service.IAppFeedbackService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 意见反馈
+ */
+@Slf4j
+@Tag(name = "app意见反馈相关接口")
+@RestController()
+@RequestMapping("/app/my/feedback")
+public class AppFeedbackController {
+
+    @Autowired
+    IAppFeedbackService iAppFeedbackService;
+
+
+    /**
+     * 查询意见反馈列表接口
+     * @param appFeedbackFindRequestDTO
+     * @return
+     */
+    @GetMapping("/findByPage")
+    @Operation(summary = "app意见反馈分页查询")
+    public Result<IPage<FindResponseDTO>> findByList(AppFeedbackFindRequestDTO appFeedbackFindRequestDTO){
+        FindPageRequestDTO findPageRequestDTO = new FindPageRequestDTO();
+        findPageRequestDTO.setUserId(appFeedbackFindRequestDTO.getUserId());
+        return Result.ok(iAppFeedbackService.findPage(appFeedbackFindRequestDTO.getPageNo(),appFeedbackFindRequestDTO.getPageSize(),findPageRequestDTO));
+    }
+
+
+    @PostMapping("/submitFeedback")
+    @Operation(summary = "提交意见反馈")
+    public Result<String> submitFeedback(@RequestBody AppSubmitFeedbackRequestDTO appSubmitFeedbackRequestDTO){
+        AppFeedback appFeedback = new AppFeedback();
+        BeanUtils.copyProperties(appSubmitFeedbackRequestDTO,appFeedback);
+        appFeedback.setId(UuidUtils.getUUID());
+        boolean save = iAppFeedbackService.save(appFeedback);
+        if (!save){
+            return Result.error("提交反馈意见失败,请联系管理员");
+        }
+        return Result.ok("提交成功");
+    }
+}

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

@@ -0,0 +1,57 @@
+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;
+
+/**
+ * 家庭成员
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="APP添加家庭成员请求入参")
+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;
+
+    /**实名状态 0-未实名 ;1-已实名*/
+    @Schema(description = "用户类型0-本人;1-家人 默认家人")
+    private Integer userType;
+
+}

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

@@ -0,0 +1,24 @@
+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="APP意见反馈请求入参")
+public class AppFeedbackFindRequestDTO  {
+
+    //用户编号
+    private String userId;
+    //当前页
+    private Integer pageNo=1;
+    //每页显示条数
+    private  Integer pageSize=10;
+
+}

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

@@ -0,0 +1,42 @@
+package org.jeecg.modules.app.dto;
+
+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 java.util.Date;
+
+/**
+ * 意见反馈
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="APP意见反馈请求入参")
+public class AppSubmitFeedbackRequestDTO {
+
+    /**用户id*/
+    @NonNull
+    @Schema(description = "用户id")
+    private String userId;
+    /**反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他*/
+    @NonNull
+    @Schema(description = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他")
+    private Integer feedbackType;
+    /**反馈描述*/
+    @NonNull
+    @Schema(description = "反馈描述")
+    private String feedbackDescribed;
+    /**反馈图片地址,使用;进行隔开*/
+    @Schema(description = "反馈图片地址,使用;进行隔开")
+    private String feedbackImg;
+    /**创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime=new Date();
+}

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

@@ -0,0 +1,14 @@
+package org.jeecg.modules.app.service;
+
+import org.jeecg.modules.app.vo.PlaceInfoVO;
+
+public interface IDetailService {
+    /**
+     * @Author SheepHy
+     * @Description 门店详情信息查询
+     * @Date 19:41 2025/7/7
+     * @Param id 门店id
+     * @return PlaceInfoVO {@link PlaceInfoVO}
+     **/
+    PlaceInfoVO getPlaceInfo(String id);
+}

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

@@ -112,7 +112,6 @@ public class AppHomeServiceImpl implements IAppHomeService {
             instructorVO.setCourseList(courseInfoVOS);
             instructorList.add(instructorVO);
         }
-
         // 返回首页数据
         return new HomeVO()
                 .setBannerList(appBanners.stream()
@@ -136,10 +135,10 @@ public class AppHomeServiceImpl implements IAppHomeService {
      **/
     private List<CoureseVO> convertToCoureseVOList(List<AppCourses> appCoureseList) {
         return appCoureseList.stream()
-                .map(courese -> new CoureseVO()
-                        .setId(courese.getId()).setCover(courese.getCover())
-                        .setPriceType(courese.getPriceType())
-                        .setSellingPrice(courese.getSellingPrice()))
+                .map(courses -> new CoureseVO()
+                        .setId(courses.getId()).setCover(courses.getCover())
+                        .setPriceType(courses.getPriceType())
+                        .setSellingPrice(courses.getSellingPrice()))
                 .collect(Collectors.toList());
     }
 

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

@@ -0,0 +1,60 @@
+package org.jeecg.modules.app.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.jeecg.modules.app.service.IDetailService;
+import org.jeecg.modules.app.vo.PlaceInfoVO;
+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.mapper.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+public class DetailServiceImpl implements IDetailService {
+    @Resource
+    private AppSiteMapper appSiteMapper;
+    @Resource
+    private AppCoursesMapper appCoursesMapper;
+    @Resource
+    private AppCoursesPriceRulesMapper appCoursesPriceRulesMapper;
+    @Resource
+    private AppOrderProductMapper appOrderProductMapper;
+    @Resource
+    private AppSitePriceRulesMapper appSitePriceRulesMapper;
+
+    @Override
+    public PlaceInfoVO getPlaceInfo(String id) {
+        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"));
+        PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
+        placeInfoMsgVO.setName(appSite.getName())
+                .setSales(getPlaceSales(id))
+                .setOriginalPrice(appSitePriceRules.getOriginalPrice())
+                .setSellingPrice(appSitePriceRules.getSellingPrice());
+        return placeInfo;
+    }
+
+    /**
+     * @return
+     * @Author SheepHy
+     * @Description 查询门店下场地销售次数
+     * @Date 20:02 2025/7/7
+     * @Param
+     **/
+    public int getPlaceSales(String id) {
+        List<String> ids = appCoursesPriceRulesMapper.selectRuleIdsByCourseId(id);
+        int totalOrders = 0;
+        if (!ids.isEmpty()) {
+            totalOrders = Math.toIntExact(appOrderProductMapper.selectCount(
+                    Wrappers.<AppOrderProduct>lambdaQuery()
+                            .in(AppOrderProduct::getProductId, ids)
+            ));
+        }
+        return totalOrders;
+    }
+}

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

@@ -5,6 +5,9 @@ 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)
@@ -12,5 +15,89 @@ import lombok.experimental.Accessors;
 public class PlaceInfoVO {
     @Schema(description = "场地id")
     private String id;
+    @Schema(description = "单位名称(部门名称)")
+    private String name;
+    @Schema(description = "好评率")
+    private BigDecimal goodRate;
+    @Schema(description = "是否营业")
+    private Boolean isOpen;
+    @Schema(description = "封面")
+    private String cover;
+    @Schema(description = "背景图;可能数组")
+    private String backgroundImage;
+    @Schema(description = "地址")
+    private String address;
+    @Schema(description = "类型;0学校 1包场体育馆 2不固定场体育馆")
+    private Integer type;
+    @Schema(description = "设施/信息")
+    private String facility;
+    @Schema(description = "教学日开放时段")
+    private String teachingDay;
+    @Schema(description = "非教学日开放时段")
+    private String noTeachingDay;
+    @Schema(description = "联系电话")
+    private String phone;
+    @Schema(description = "视频")
+    private String video;
+    @Schema(description = "场地简约返回参数")
+    private PlaceInfoMsgVO placeInfoMsgVO;
+    @Schema(description = "教练简约返回参数")
+    private List<InstructorVO> instructorVOList;
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="场地简约返回参数")
+    public static class PlaceInfoMsgVO{
+        @Schema(description = "场地名称")
+        private String name;
+        @Schema(description = "销售数量")
+        private int sales;
+        @Schema(description = "类目")
+        private List<String> category;
+        @Schema(description = "原价")
+        private BigDecimal originalPrice;
+        @Schema(description = "售价")
+        private BigDecimal sellingPrice;
+    }
+    @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 BigDecimal originalPrice;
+        @Schema(description = "课程售价")
+        private BigDecimal sellingPrice;
+        @Schema(description = "销售数量")
+        private int sales;
+        @Schema(description = "销售(年)")
+        private int salesYear;
+        @Schema(description = "好评率")
+        private BigDecimal goodRate;
+        @Schema(description = "地址")
+        private String address;
+        @Schema(description = "封面")
+        private String cover;
 
+    }
+    @Data
+    @Accessors(chain = true)
+    @EqualsAndHashCode(callSuper = false)
+    @Schema(description="教练简约返回参数")
+    public static class InstructorVO{
+        @Schema(description = "主键id")
+        private String id;
+        @Schema(description = "教练名称")
+        private String name;
+        @Schema(description = "教练头像")
+        private String avatar;
+        @Schema(description = "擅长说明")
+        private String excelMsg;
+        @Schema(description = "教练数量")
+        private int count;
+    }
 }

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

@@ -0,0 +1,43 @@
+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.jeecg.common.api.vo.Result;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoRequestDTO;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoResponseDTO;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+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.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: 家庭成员信息表
+ * @Author: zx
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+@Tag(name="c端用户信息表")
+@RestController
+@RequestMapping("/cUserInfo")
+@Slf4j
+public class CUserInfoController {
+
+    @Autowired
+    ISysUserService iSysUserService;
+
+    @Operation(summary="家庭成员信息表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<FindPageCUserInfoResponseDTO>> queryPageList(FindPageCUserInfoRequestDTO findPageCUserInfoRequestDTO,
+                                                                     @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+                                                                     @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+                                                                     HttpServletRequest req) {
+        return Result.OK(iSysUserService.findByCUserInfo(pageNo,pageSize,findPageCUserInfoRequestDTO));
+    }
+}

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

@@ -0,0 +1,175 @@
+package org.jeecg.modules.system.app.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+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.query.QueryGenerator;
+import org.jeecg.modules.system.app.dto.FindFamilyMembersResponseDTO;
+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.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+/**
+ * @Description: 家庭成员信息表
+ * @Author: zx
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+@Tag(name="家庭成员信息表")
+@RestController
+@RequestMapping("/familyMembers")
+@Slf4j
+public class FamilyMembersController extends JeecgController<FamilyMembers, IFamilyMembersService> {
+	@Autowired
+	private IFamilyMembersService familyMembersService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param familyMembers
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "家庭成员信息表-分页列表查询")
+	@Operation(summary="家庭成员信息表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<FamilyMembers>> queryPageList(FamilyMembers familyMembers,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+        QueryWrapper<FamilyMembers> queryWrapper = QueryGenerator.initQueryWrapper(familyMembers, req.getParameterMap());
+		Page<FamilyMembers> page = new Page<FamilyMembers>(pageNo, pageSize);
+		IPage<FamilyMembers> pageList = familyMembersService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param familyMembers
+	 * @return
+	 */
+	@AutoLog(value = "家庭成员信息表-添加")
+	@Operation(summary="家庭成员信息表-添加")
+	@RequiresPermissions("familyMembers:nm_family_members:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody FamilyMembers familyMembers) {
+		familyMembersService.save(familyMembers);
+
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param familyMembers
+	 * @return
+	 */
+	@AutoLog(value = "家庭成员信息表-编辑")
+	@Operation(summary="家庭成员信息表-编辑")
+	@RequiresPermissions("familyMembers:nm_family_members:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody FamilyMembers familyMembers) {
+		familyMembersService.updateById(familyMembers);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "家庭成员信息表-通过id删除")
+	@Operation(summary="家庭成员信息表-通过id删除")
+	@RequiresPermissions("familyMembers:nm_family_members:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		familyMembersService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "家庭成员信息表-批量删除")
+	@Operation(summary="家庭成员信息表-批量删除")
+	@RequiresPermissions("familyMembers:nm_family_members:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.familyMembersService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "家庭成员信息表-通过id查询")
+	@Operation(summary="家庭成员信息表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<FamilyMembers> queryById(@RequestParam(name="id",required=true) String id) {
+		FamilyMembers familyMembers = familyMembersService.getById(id);
+		if(familyMembers==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(familyMembers);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param familyMembers
+    */
+    @RequiresPermissions("familyMembers:nm_family_members:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, FamilyMembers familyMembers) {
+        return super.exportXls(request, familyMembers, FamilyMembers.class, "家庭成员信息表");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("familyMembers:nm_family_members:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, FamilyMembers.class);
+    }
+
+	 /**
+	  * 根据用户id查询家庭成员列表
+	  * @param userId
+	  * @return
+	  */
+
+	 @Operation(summary="家庭成员信息表-通过用户id查询家庭成员信息")
+	 @GetMapping(value = "/findByUserId")
+	 public Result<FindFamilyMembersResponseDTO> findByUserId(@RequestParam(name="userId",required=true) String userId) {
+		 return familyMembersService.findByUserId(userId);
+	 }
+}

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

@@ -0,0 +1,179 @@
+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.FindPageRequestDTO;
+import org.jeecg.modules.system.app.dto.FindResponseDTO;
+import org.jeecg.modules.system.app.entity.AppFeedback;
+import org.jeecg.modules.system.app.enums.ReplyStatusEnum;
+import org.jeecg.modules.system.app.service.IAppFeedbackService;
+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-07
+ * @Version: V1.0
+ */
+@Tag(name="意见反馈")
+@RestController
+@RequestMapping("/appFeedback")
+@Slf4j
+public class FeedbackController extends JeecgController<AppFeedback, IAppFeedbackService> {
+	@Autowired
+	private IAppFeedbackService appFeedbackService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param findPageRequestDTO
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	@Operation(summary="意见反馈-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<FindResponseDTO>> queryPageList(FindPageRequestDTO findPageRequestDTO,
+														@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+														@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+														HttpServletRequest req) {
+
+
+		IPage<FindResponseDTO> pageList = appFeedbackService.findPage(pageNo,pageSize, findPageRequestDTO);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param appFeedback
+	 * @return
+	 */
+	@AutoLog(value = "意见反馈-添加")
+	@Operation(summary="意见反馈-添加")
+	@RequiresPermissions("feedback:nm_feedback:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody AppFeedback appFeedback) {
+		appFeedbackService.save(appFeedback);
+
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param appFeedback
+	 * @return
+	 */
+	@AutoLog(value = "意见反馈-编辑")
+	@Operation(summary="意见反馈-编辑")
+	@RequiresPermissions("feedback:nm_feedback:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody AppFeedback appFeedback) {
+		Subject subject = SecurityUtils.getSubject();
+		LoginUser loginUser =null;
+		if (subject.isAuthenticated()) {
+			// 获取当前登录的用户信息
+			loginUser= (LoginUser) subject.getPrincipal();
+		}
+		if (loginUser==null){
+			return Result.error("当前未登录,请先登录;或者未获取到用户信息,请联系管理员");
+		}
+		appFeedback.setReplyStatus(ReplyStatusEnum.REPLIED.getCode());
+		appFeedback.setReplyUserId(loginUser.getId());
+		appFeedback.setUpdateTime(new Date());
+		appFeedback.setUpdateBy(loginUser.getId());
+		appFeedbackService.updateById(appFeedback);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "意见反馈-通过id删除")
+	@Operation(summary="意见反馈-通过id删除")
+	@RequiresPermissions("feedback:nm_feedback:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		appFeedbackService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "意见反馈-批量删除")
+	@Operation(summary="意见反馈-批量删除")
+	@RequiresPermissions("feedback:nm_feedback:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.appFeedbackService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "意见反馈-通过id查询")
+	@Operation(summary="意见反馈-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<FindResponseDTO> queryById(@RequestParam(name="id",required=true) String id) {
+		FindResponseDTO findResponseDTO = appFeedbackService.FindById(id);
+		if(findResponseDTO==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(findResponseDTO);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param appFeedback
+    */
+    @RequiresPermissions("feedback:nm_feedback:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, AppFeedback appFeedback) {
+        return super.exportXls(request, appFeedback, AppFeedback.class, "意见反馈");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("feedback:nm_feedback:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, AppFeedback.class);
+    }
+
+}

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

@@ -0,0 +1,62 @@
+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 org.jeecg.modules.system.app.entity.FamilyMembers;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 意见反馈
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="家庭成员返回参数")
+public class FindFamilyMembersResponseDTO {
+
+    @Schema(description = "id")
+    private String id;
+    /**
+     * 登录账号
+     */
+    @Schema(description = "登录账号")
+    private String username;
+
+    /**
+     * 真实姓名
+     */
+    @Schema(description = "真实姓名")
+    private String realname;
+    /**
+     * 头像
+     */
+    @Schema(description = "头像")
+    private String avatar;
+    /**
+     * 电话
+     */
+    @Schema(description = "电话")
+    private String phone;
+    /**
+     * 创建时间
+     */
+    @Schema(description = "创建时间")
+    private Date createTime;
+    /**
+     * 小程序openId
+     */
+    @Schema(description = "微信openId")
+    private String openid;
+
+    @Schema(description = "家庭成员列表")
+    private List<FamilyMembers> familyMembersList;
+
+}

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

@@ -0,0 +1,29 @@
+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;
+
+/**
+ * 意见反馈
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="C端用户请求入参")
+public class FindPageCUserInfoRequestDTO {
+
+    //用户昵称
+    @Schema(description = "用户昵称")
+    private String username;
+    //实名状态 0-未实名 ;1-已实名
+    @Schema(description = "实名状态 0-未实名 ;1-已实名")
+    private Integer realNameStatus;
+
+
+}

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

@@ -0,0 +1,42 @@
+package org.jeecg.modules.system.app.dto;
+
+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.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * c端用户
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="C端用户请求入参")
+public class FindPageCUserInfoResponseDTO {
+
+    //用户昵称
+    @Schema(description = "用户昵称")
+    private String username;
+    //实名状态 0-未实名 ;1-已实名
+    @Schema(description = "实名状态 0-未实名 ;1-已实名")
+    private Integer realNameStatus;
+    @Schema(description = "头像")
+    private String avatar;
+    @Schema(description = "手机号")
+    private String phone;
+    @Schema(description = "家庭成员数(包括自己)")
+    private Integer familyNum;
+    /**创建时间*/
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Schema(description = "创建时间")
+    private Date createTime;
+}

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

@@ -0,0 +1,30 @@
+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;
+/**
+ * 意见反馈
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description="意见反馈请求入参")
+public class FindPageRequestDTO {
+
+    //手机号
+    @Schema(description = "手机号")
+    private String phone;
+    //意见反馈类型
+    @Schema(description = "反馈类型")
+    private Integer feedbackType;
+    //用户id
+    @Schema(description = "用户id")
+    private String userId;
+
+}

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

@@ -0,0 +1,66 @@
+package org.jeecg.modules.system.app.dto;
+
+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 FindResponseDTO {
+
+    @Schema(description = "主键id")
+    private String id;
+    /**用户id*/
+    @Excel(name = "用户名称", width = 15)
+    @Schema(description = "用户名称")
+    private String userName;
+    /**用户手机号*/
+    @Excel(name = "用户手机号", width = 15)
+    @Schema(description = "用户手机号")
+    private String phone;
+    /**反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他*/
+    @Excel(name = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他", width = 15)
+    @Schema(description = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他")
+    private Integer feedbackType;
+    /**反馈描述*/
+    @Excel(name = "反馈描述", width = 15)
+    @Schema(description = "反馈描述")
+    private String feedbackDescribed;
+    /**反馈图片地址,使用;进行隔开*/
+    @Excel(name = "反馈图片地址,使用;进行隔开", width = 15)
+    @Schema(description = "反馈图片地址,使用;进行隔开")
+    private String feedbackImg;
+    /**回复状态0-未回复 1-已回复*/
+    @Excel(name = "回复状态0-未回复 1-已回复", width = 15)
+    @Schema(description = "回复状态0-未回复 1-已回复")
+    private Integer replyStatus;
+    /**回复内容*/
+    @Excel(name = "回复内容", width = 15)
+    @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 createTime;
+    @Schema(description = "图片集合")
+    private List<String> feedbackImgList;
+
+}

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

@@ -0,0 +1,85 @@
+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_feedback")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="意见反馈")
+public class AppFeedback implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键id*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键id")
+    private String id;
+	/**用户id*/
+	@Excel(name = "用户id", width = 15)
+    @Schema(description = "用户id")
+    private String userId;
+	/**反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他*/
+	@Excel(name = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他", width = 15)
+    @Schema(description = "反馈类型0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他")
+    private Integer feedbackType;
+	/**反馈描述*/
+	@Excel(name = "反馈描述", width = 15)
+    @Schema(description = "反馈描述")
+    private String feedbackDescribed;
+	/**反馈图片地址,使用;进行隔开*/
+	@Excel(name = "反馈图片地址,使用;进行隔开", width = 15)
+    @Schema(description = "反馈图片地址,使用;进行隔开")
+    private String feedbackImg;
+	/**回复状态0-未回复 1-已回复*/
+	@Excel(name = "回复状态0-未回复 1-已回复", width = 15)
+    @Schema(description = "回复状态0-未回复 1-已回复")
+    private Integer replyStatus;
+	/**回复内容*/
+	@Excel(name = "回复内容", width = 15)
+    @Schema(description = "回复内容")
+    private String replyContent;
+	/**回复人id*/
+	@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")
+    @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-已删除)")
+    @TableLogic
+    private Integer delFlag;
+}

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

@@ -0,0 +1,89 @@
+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_family_members")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="家庭成员信息表")
+public class FamilyMembers implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键")
+    private String id;
+	/**姓名*/
+	@Excel(name = "姓名", width = 15)
+    @Schema(description = "姓名")
+    private String fullName;
+	/**用户编号*/
+	@Excel(name = "用户编号", width = 15)
+    @Schema(description = "用户编号")
+    private String userId;
+	/**身份证号*/
+	@Excel(name = "身份证号", width = 15)
+    @Schema(description = "身份证号")
+    private String identityCard;
+	/**身份证正面照*/
+	@Excel(name = "身份证正面照", width = 15)
+    @Schema(description = "身份证正面照")
+    private String idCardFrontImg;
+	/**身份证反面照*/
+	@Excel(name = "身份证反面照", width = 15)
+    @Schema(description = "身份证反面照")
+    private String idCardBackImg;
+	/**手机号*/
+	@Excel(name = "手机号", width = 15)
+    @Schema(description = "手机号")
+    private String phone;
+	/**实名状态 0-未实名 ;1-已实名*/
+	@Excel(name = "实名状态 0-未实名 ;1-已实名", width = 15)
+    @Schema(description = "实名状态 0-未实名 ;1-已实名")
+    private Integer realNameStatus;
+    /**身份证反面照*/
+    @Excel(name = "实名认证照片", width = 15)
+    @Schema(description = "实名认证照片")
+    private String realNameImg;
+
+    /**实名状态 0-未实名 ;1-已实名*/
+    @Excel(name = "用户类型0-本人;1-家人", width = 15)
+    @Schema(description = "用户类型0-本人;1-家人")
+    private Integer userType;
+	/**创建时间*/
+	@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;
+
+    /**删除标志;删除状态(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/DelFlagEnum.java

@@ -0,0 +1,43 @@
+package org.jeecg.modules.system.app.enums;
+
+import org.jeecg.common.system.annotation.EnumDict;
+
+/**
+ * 回复状态枚举
+ */
+@EnumDict("delFlagEnum")
+public enum DelFlagEnum {
+//   0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他
+    NO_DELETE(0, "未删除"),
+    YES_DELETE(1, "已删除");
+
+    Integer code;
+    String name;
+    DelFlagEnum(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 DelFlagEnum getByCode(Integer code) {
+        for (DelFlagEnum value : values()) {
+            if (value.code.equals(code) ) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

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

@@ -0,0 +1,46 @@
+package org.jeecg.modules.system.app.enums;
+
+import org.jeecg.common.system.annotation.EnumDict;
+
+/**
+ * 意见反馈类型枚举
+ */
+@EnumDict("feedbackType")
+public enum FeedbackTypeEnum {
+//   0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他
+    TSTC(0, "投诉吐槽"),
+    GNYC(1, "功能异常"),
+    YHTY(2, "用户体验"),
+    GNJY(3, "功能建议"),
+    QT(4, "其他");
+
+    Integer code;
+    String name;
+    FeedbackTypeEnum(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 FeedbackTypeEnum getByCode(Integer code) {
+        for (FeedbackTypeEnum value : values()) {
+            if (value.code.equals(code) ) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

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

@@ -0,0 +1,43 @@
+package org.jeecg.modules.system.app.enums;
+
+import org.jeecg.common.system.annotation.EnumDict;
+
+/**
+ * 回复状态枚举
+ */
+@EnumDict("ReplyStatus")
+public enum ReplyStatusEnum {
+//   0-投诉吐槽;1-功能异常;2-用户体验;3-功能建议;4-其他
+    REPLIED(0, "已回复"),
+    NO_REPLY(1, "未回复");
+
+    Integer code;
+    String name;
+    ReplyStatusEnum(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 ReplyStatusEnum getByCode(Integer code) {
+        for (ReplyStatusEnum value : values()) {
+            if (value.code.equals(code) ) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

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

@@ -1,10 +1,10 @@
 package org.jeecg.modules.system.app.mapper;
 
-import java.util.List;
-
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.system.app.entity.AppCoursesPriceRules;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
 
 /**
  * @Description: 课程价格规则表
@@ -13,5 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @Version: V1.0
  */
 public interface AppCoursesPriceRulesMapper extends BaseMapper<AppCoursesPriceRules> {
-
+    List<String> selectRuleIdsByCourseId(@Param("coursesId") String coursesId);
 }

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

@@ -0,0 +1,25 @@
+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.FindPageRequestDTO;
+import org.jeecg.modules.system.app.dto.FindResponseDTO;
+import org.jeecg.modules.system.app.entity.AppFeedback;
+
+/**
+ * @Description: 意见反馈
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+public interface AppFeedbackMapper extends BaseMapper<AppFeedback> {
+
+    IPage<FindResponseDTO> findPage(@Param("page")Page<FindResponseDTO> page, @Param("findPageRequestDTO") FindPageRequestDTO findPageRequestDTO);
+    @Select(" select  f.id,f.feedback_type,f.feedback_described,f.feedback_img,f.reply_status,f.reply_content,f.create_time,su.username,su.phone from nm_feedback f left join  sys_user su on f.user_id =su.id " +
+            "       where f.del_flag =0 AND f.id = #{id}")
+    FindResponseDTO findById(@Param("id") String id);
+
+}

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

@@ -5,6 +5,7 @@ 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.dto.SearchDTO;
+import org.jeecg.modules.app.vo.PlaceInfoVO;
 import org.jeecg.modules.app.vo.PlaceVO;
 import org.jeecg.modules.app.vo.SearchVO;
 import org.jeecg.modules.system.app.entity.AppSite;
@@ -35,4 +36,13 @@ public interface AppSiteMapper extends BaseMapper<AppSite> {
      **/
     Page<SearchVO.SearchPlaceVO> convertSearchPlaceVOPage(@Param("page")Page<SearchVO.SearchPlaceVO> page,@Param("searchDTO")SearchDTO searchDTO);
 
+    /**
+     * @Author SheepHy
+     * @Description 门店详情信息查询
+     * @Date 19:41 2025/7/7
+     * @Param id 门店id
+     * @return PlaceInfoVO {@link PlaceInfoVO}
+     **/
+    PlaceInfoVO getPlaceInfo(@Param("id")String id);
+
 }

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

@@ -0,0 +1,22 @@
+package org.jeecg.modules.system.app.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.system.app.entity.FamilyMembers;
+
+import java.util.List;
+
+/**
+ * @Description: 家庭成员信息表
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+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);
+
+
+}

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

@@ -1,5 +1,7 @@
 <?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.AppCoursesPriceRulesMapper">
-
+    <select id="selectRuleIdsByCourseId" resultType="string">
+        SELECT id FROM app_courses_price_rules WHERE courses_id = #{coursesId}
+    </select>
 </mapper>

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

@@ -0,0 +1,20 @@
+<?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.AppFeedbackMapper">
+
+
+    <select id="findPage" resultType="org.jeecg.modules.system.app.dto.FindResponseDTO">
+        select  f.id,f.feedback_type,f.feedback_described,f.feedback_img,f.reply_status,f.reply_content,f.create_time,su.username,su.phone from nm_feedback f left join  sys_user su on f.user_id =su.id
+        where f.del_flag =0
+        <if test="findPageRequestDTO.phone != null and findPageRequestDTO.phone != ''">
+            and su.phone=#{findPageRequestDTO.phone}
+        </if>
+        <if test="findPageRequestDTO.feedbackType != null and findPageRequestDTO.feedbackType != ''">
+            and f.feedback_type=#{findPageRequestDTO.feedbackType}
+        </if>
+        <if test="findPageRequestDTO.userId != null and findPageRequestDTO.userId != ''">
+            and f.user_id=#{findPageRequestDTO.userId}
+        </if>
+        order by f.create_time desc
+    </select>
+</mapper>

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

@@ -57,4 +57,23 @@
             ORDER BY  a.good_rate DESC
         </if>
     </select>
+    <select id="getPlaceInfo" resultType="org.jeecg.modules.app.vo.PlaceInfoVO">
+        SELECT
+            a.id,
+            b.depart_name,
+            a.good_rate,
+            a.cover,
+            a.background_image,
+            b.address,
+            a.type,
+            a.facility,
+            a.teaching_day,
+            a.no_teaching_day,
+            b.mobile,
+            a.video
+        FROM
+            nm_site a
+                LEFT JOIN sys_depart b ON a.tenant_id = b.id
+        WHERE a.del_flag = 0 AND a.status = 0 AND a.id = #{id}
+    </select>
 </mapper>

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

@@ -0,0 +1,5 @@
+<?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.FamilyMembersMapper">
+
+</mapper>

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

@@ -0,0 +1,22 @@
+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.FindPageRequestDTO;
+import org.jeecg.modules.system.app.dto.FindResponseDTO;
+import org.jeecg.modules.system.app.entity.AppFeedback;
+
+
+/**
+ * @Description: 意见反馈
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+public interface IAppFeedbackService extends IService<AppFeedback> {
+
+    IPage<FindResponseDTO> findPage(Integer pageNo,Integer pageSize, FindPageRequestDTO findPageRequestDTO);
+
+    FindResponseDTO FindById(String id);
+}

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

@@ -0,0 +1,25 @@
+package org.jeecg.modules.system.app.service;
+
+
+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.system.app.dto.FindFamilyMembersResponseDTO;
+import org.jeecg.modules.system.app.entity.FamilyMembers;
+
+/**
+ * @Description: 家庭成员信息表
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+public interface IFamilyMembersService extends IService<FamilyMembers> {
+
+    Result<FindFamilyMembersResponseDTO> findByUserId(String userId);
+
+    Result<String> addFamilyMembers(AddFamilyMembersDTO addFamilyMembersDTO);
+
+    Result<String> editFamilyMembers(AddFamilyMembersDTO addFamilyMembersDTO);
+
+    Result<String> deleteFamilyMembers(String id);
+}

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

@@ -0,0 +1,66 @@
+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.FindPageRequestDTO;
+import org.jeecg.modules.system.app.dto.FindResponseDTO;
+import org.jeecg.modules.system.app.entity.AppFeedback;
+import org.jeecg.modules.system.app.mapper.AppFeedbackMapper;
+import org.jeecg.modules.system.app.service.IAppFeedbackService;
+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 AppFeedbackServiceImpl extends ServiceImpl<AppFeedbackMapper, AppFeedback> implements IAppFeedbackService {
+
+    @Autowired
+    AppFeedbackMapper appFeedbackMapper;
+
+    @Override
+    public IPage<FindResponseDTO> findPage(Integer pageNo,Integer pageSize, FindPageRequestDTO findPageRequestDTO) {
+        Page<FindResponseDTO> page = new Page<FindResponseDTO>(pageNo, pageSize);
+        IPage<FindResponseDTO> findPage = appFeedbackMapper.findPage(page, findPageRequestDTO);
+        if (findPage!=null){
+            for (FindResponseDTO record : findPage.getRecords()) {
+                if (StringUtils.isNotEmpty(record.getFeedbackImg())){
+                    imgSplit(record);
+                }
+            }
+        }
+        return findPage;
+    }
+
+    @Override
+    public FindResponseDTO FindById(String id) {
+        FindResponseDTO findResponseDTO = appFeedbackMapper.findById(id);
+        if (findResponseDTO!=null&&StringUtils.isNotEmpty(findResponseDTO.getFeedbackImg())){
+            imgSplit(findResponseDTO);
+        }
+        return findResponseDTO;
+    }
+
+
+    private static void imgSplit(FindResponseDTO findResponseDTO ){
+        List<String> strings = new ArrayList<>();
+        if (findResponseDTO.getFeedbackImg().indexOf(";")>0){
+            strings = Arrays.asList(findResponseDTO.getFeedbackImg().split(";"));
+        }else {
+            strings.add(findResponseDTO.getFeedbackImg());
+
+        }
+        findResponseDTO.setFeedbackImgList(strings);
+    }
+}

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

@@ -0,0 +1,100 @@
+package org.jeecg.modules.system.app.service.impl;
+
+
+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.system.app.dto.FindFamilyMembersResponseDTO;
+import org.jeecg.modules.system.app.entity.FamilyMembers;
+import org.jeecg.modules.system.app.enums.DelFlagEnum;
+import org.jeecg.modules.system.app.mapper.FamilyMembersMapper;
+import org.jeecg.modules.system.app.service.IFamilyMembersService;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.mapper.SysUserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 家庭成员信息表
+ * @Author: jeecg-boot
+ * @Date:   2025-07-07
+ * @Version: V1.0
+ */
+@Service
+public class FamilyMembersServiceImpl extends ServiceImpl<FamilyMembersMapper, FamilyMembers> implements IFamilyMembersService {
+
+    @Autowired
+    FamilyMembersMapper familyMembersMapper;
+    @Autowired
+    SysUserMapper sysUserMapper;
+
+
+    @Override
+    public Result<FindFamilyMembersResponseDTO> findByUserId(String userId) {
+        if (StringUtils.isEmpty(userId)){
+            return Result.error("请求参数为空");
+        }
+        FindFamilyMembersResponseDTO findFamilyMembersResponseDTO = new FindFamilyMembersResponseDTO();
+
+        //查询用户信息
+        SysUser sysUser = sysUserMapper.selectById(userId);
+        if (sysUser==null){
+            return Result.error("未查询到用户信息,请核实是否正确");
+        }
+        BeanUtils.copyProperties(sysUser,findFamilyMembersResponseDTO);
+        //查询家庭成员列表信息
+        List<FamilyMembers> familyMembersList = familyMembersMapper.findByUserId(userId);
+        findFamilyMembersResponseDTO.setFamilyMembersList(familyMembersList);
+        return Result.ok(findFamilyMembersResponseDTO);
+    }
+
+    @Override
+    public Result<String> addFamilyMembers(AddFamilyMembersDTO addFamilyMembersDTO) {
+        FamilyMembers familyMembers = new FamilyMembers();
+        BeanUtils.copyProperties(addFamilyMembersDTO,familyMembers);
+        familyMembers.setId(UuidUtils.getUUID());
+        familyMembers.setCreateTime(new Date());
+        if (familyMembersMapper.insert(familyMembers)<1){
+            return Result.error("添加家庭成员失败,请联系管理员");
+        }
+        return Result.ok("添加成功");
+    }
+
+    @Override
+    public Result<String> editFamilyMembers(AddFamilyMembersDTO addFamilyMembersDTO) {
+        FamilyMembers familyMembers = new FamilyMembers();
+        BeanUtils.copyProperties(addFamilyMembersDTO,familyMembers);
+        if (StringUtils.isEmpty(familyMembers.getId())){
+            return Result.error("修改家庭成员失败,请选择家庭成员");
+        }
+        familyMembers.setUpdateTime(new Date());
+        if (familyMembersMapper.updateById(familyMembers)<1){
+            return Result.error("修改家庭成员失败,请联系管理员");
+        }
+        return Result.ok("修改成功");
+    }
+
+    @Override
+    public Result<String> deleteFamilyMembers(String id) {
+
+        if (StringUtils.isEmpty(id)){
+            return Result.error("删除失败,请选择需要删除的家庭成员");
+        }
+        FamilyMembers familyMembers = familyMembersMapper.selectById(id);
+        if (familyMembers==null){
+            return Result.error("删除失败,未查询到家庭成员");
+        }
+        familyMembers.setDelFlag(DelFlagEnum.NO_DELETE.getCode());
+        familyMembers.setUpdateTime(new Date());
+        if (familyMembersMapper.updateById(familyMembers)<1){
+            return Result.error("删除家庭成员失败,请联系管理员");
+        }
+        return Result.ok("删除成功");
+    }
+}

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

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.toolkit.Constants;
 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.FindPageCUserInfoRequestDTO;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoResponseDTO;
 import org.jeecg.modules.system.entity.SysUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.jeecg.modules.system.model.SysUserSysDepartModel;
@@ -231,4 +233,7 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
 	 * @return
 	 **/
 	List<String> getUserIdListByRoleId(@Param("roleCode") String roleCode);
+
+    IPage<FindPageCUserInfoResponseDTO> findPage(Page<FindPageCUserInfoResponseDTO> page, FindPageCUserInfoRequestDTO findPageCUserInfoRequestDTO);
+
 }

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

@@ -303,4 +303,14 @@
 		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>
+    <select id="findPage" resultType="org.jeecg.modules.system.app.dto.FindPageCUserInfoResponseDTO">
+		select * from (
+		select su.id,su.username,su.avatar,su.phone,su.create_time,fm.real_name_status from sys_user su
+		left join  nm_family_members fm on su.id=fm.userId
+		where su.del_flag=0 and su.org_code='A03' and fm.del_flag=0 and fm.user_type=0 ) t
+		left join
+		(select user_id, count(1) from nm_family_members group by  user_id ) t1 on  t.id=t1.user_id
+		order by  t.create_time desc
+
+	</select>
 </mapper>

+ 4 - 1
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/service/ISysUserService.java

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.system.vo.SysUserCacheInfo;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoRequestDTO;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoResponseDTO;
 import org.jeecg.modules.system.entity.SysRoleIndex;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.model.SysUserSysDepartModel;
@@ -19,7 +21,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -482,4 +483,6 @@ public interface ISysUserService extends IService<SysUser> {
      * @param username
      */
     void updatePasswordNotBindPhone(String oldPassword, String password, String username);
+
+    IPage<FindPageCUserInfoResponseDTO> findByCUserInfo(Integer pageNo, Integer pageSize, FindPageCUserInfoRequestDTO findPageCUserInfoRequestDTO);
 }

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

@@ -37,6 +37,8 @@ import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
 import org.jeecg.modules.base.service.BaseCommonService;
 import org.jeecg.modules.jmreport.common.util.OkConvertUtils;
 import org.jeecg.modules.message.handle.impl.SystemSendMsgHandle;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoRequestDTO;
+import org.jeecg.modules.system.app.dto.FindPageCUserInfoResponseDTO;
 import org.jeecg.modules.system.entity.*;
 import org.jeecg.modules.system.mapper.*;
 import org.jeecg.modules.system.model.SysUserSysDepartModel;
@@ -58,11 +60,9 @@ import org.jeecgframework.poi.excel.entity.ImportParams;
 import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
 import org.jetbrains.annotations.Nullable;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -2356,4 +2356,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         String newPassWord = PasswordUtil.encrypt(username, password, user.getSalt());
         this.userMapper.update(new SysUser().setPassword(newPassWord), new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, user.getId()));
     }
+
+	/**
+	 * 查询c端用户信息
+	 * @param pageNo
+	 * @param pageSize
+	 * @param findPageCUserInfoRequestDTO
+	 * @return
+	 */
+	@Override
+	public IPage<FindPageCUserInfoResponseDTO> findByCUserInfo(Integer pageNo, Integer pageSize, FindPageCUserInfoRequestDTO findPageCUserInfoRequestDTO) {
+		Page<FindPageCUserInfoResponseDTO> page = new Page<FindPageCUserInfoResponseDTO>(pageNo, pageSize);
+		return userMapper.findPage(page, findPageCUserInfoRequestDTO);
+	}
 }