Browse Source

feat(app): 新增分班管理功能模块

- 新增分班实体类 AppClassGrouping 及相关字段定义
- 新增分班用户关联实体类 AppClassUser- 新增分班管理控制器 AppClassGroupingController,包含分页查询、创建、修改、删除接口
- 新增分班 Mapper 接口及 XML 映射文件,支持分班与分班情况分页查询
- 新增分班服务实现类 AppClassGroupingServiceImpl,处理分班逻辑与数据组装- 新增分班用户服务实现类 AppClassUserServiceImpl
- 新增分班相关 VO、Form 数据传输对象
- 修改订单控制器 AppOrderController,优化代码结构并新增事务注解
- 修改订单子项 Mapper,增加更新操作支持
- 新增子订单 VO 对象 AppOrderProInfoVO,扩展班级与教练信息展示
wzq 1 day ago
parent
commit
22ade3cd02
24 changed files with 1222 additions and 212 deletions
  1. 105 0
      national-motion-base-core/src/main/java/org/jeecg/common/util/IdCardUtil.java
  2. 1 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/IOrderService.java
  3. 54 29
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java
  4. 177 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppClassGroupingController.java
  5. 149 181
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppOrderController.java
  6. 78 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppClassGrouping.java
  7. 80 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/entity/AppClassUser.java
  8. 29 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/form/ClassGroupingCasePageForm.java
  9. 57 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/form/ClassGroupingForm.java
  10. 38 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/form/ClassGroupingPageForm.java
  11. 1 1
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/form/PriceChangeForm.java
  12. 19 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppClassGroupingMapper.java
  13. 9 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppClassUserMapper.java
  14. 2 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/AppOrderProInfoMapper.java
  15. 55 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/mapper/xml/AppClassGroupingMapper.xml
  16. 20 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppClassGroupingService.java
  17. 7 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppClassUserService.java
  18. 101 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppClassGroupingServiceImpl.java
  19. 11 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/impl/AppClassUserServiceImpl.java
  20. 29 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/AppOrderProInfoVO.java
  21. 49 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/ClassGroupingCaseVO.java
  22. 68 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/ClassGroupingVO.java
  23. 32 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/CoachInfoVO.java
  24. 51 0
      national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/vo/StudentInfoVO.java

+ 105 - 0
national-motion-base-core/src/main/java/org/jeecg/common/util/IdCardUtil.java

@@ -0,0 +1,105 @@
+package org.jeecg.common.util;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.format.DateTimeFormatter;
+import java.util.regex.Pattern;
+
+/**
+ * 身份证信息工具类
+ * 用于从身份证号码中提取性别、年龄、出生日期等信息
+ *
+ * @author Assistant
+ * @version 1.0
+ */
+public class IdCardUtil {
+
+    /**
+     * 18位身份证号码正则表达式
+     */
+    private static final Pattern ID_CARD_PATTERN = Pattern.compile("\\d{17}[0-9X]");
+
+    /**
+     * 根据身份证号码获取性别
+     *
+     * @param idCard 身份证号码(18位)
+     * @return 性别:"男" 或 "女"
+     * @throws IllegalArgumentException 当身份证号码格式不正确时
+     */
+    public static String getGender(String idCard) {
+        if (!isValidIdCard(idCard)) {
+            throw new IllegalArgumentException("身份证号码格式不正确");
+        }
+
+        // 提取第17位数字(身份证索引位置16)
+        char genderChar = idCard.charAt(16);
+        int genderDigit = Character.getNumericValue(genderChar);
+
+        // 奇数代表男性,偶数代表女性[7,8](@ref)
+        return genderDigit % 2 == 0 ? "女" : "男";
+    }
+
+    /**
+     * 根据身份证号码获取年龄
+     *
+     * @param idCard 身份证号码(18位)
+     * @return 年龄(周岁)
+     * @throws IllegalArgumentException 当身份证号码格式不正确时
+     */
+    public static int getAge(String idCard) {
+        if (!isValidIdCard(idCard)) {
+            throw new IllegalArgumentException("身份证号码格式不正确");
+        }
+
+        // 提取出生日期字符串
+        String birthDateStr = idCard.substring(6, 14);
+        LocalDate birthDate = LocalDate.parse(birthDateStr, DateTimeFormatter.ofPattern("yyyyMMdd"));
+        LocalDate currentDate = LocalDate.now();
+
+        // 计算周岁[10](@ref)
+        return Period.between(birthDate, currentDate).getYears();
+    }
+
+    /**
+     * 根据身份证号码获取出生日期
+     *
+     * @param idCard 身份证号码(18位)
+     * @return 出生日期字符串(格式:yyyy-MM-dd)
+     * @throws IllegalArgumentException 当身份证号码格式不正确时
+     */
+    public static String getBirthDate(String idCard) {
+        if (!isValidIdCard(idCard)) {
+            throw new IllegalArgumentException("身份证号码格式不正确");
+        }
+
+        String birthDateStr = idCard.substring(6, 14);
+        LocalDate birthDate = LocalDate.parse(birthDateStr, DateTimeFormatter.ofPattern("yyyyMMdd"));
+        return birthDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+    }
+
+    /**
+     * 验证身份证号码格式
+     *
+     * @param idCard 身份证号码
+     * @return 格式是否有效
+     */
+    public static boolean isValidIdCard(String idCard) {
+        if (idCard == null || idCard.length() != 18) {
+            return false;
+        }
+        return ID_CARD_PATTERN.matcher(idCard).matches();
+    }
+
+    /**
+     * 测试示例
+     */
+    public static void main(String[] args) {
+        String testIdCard = "522528199405284418";
+
+        System.out.println("身份证号码: " + testIdCard);
+        System.out.println("性别: " + getGender(testIdCard));
+        System.out.println("年龄: " + getAge(testIdCard));
+        System.out.println("出生日期: " + getBirthDate(testIdCard));
+        System.out.println("格式验证: " + isValidIdCard(testIdCard));
+    }
+}

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

@@ -80,7 +80,7 @@ public interface IOrderService extends IService<AppOrder>{
 
 
     UserPayForm createOrder(CreateOrderForm createOrderForm) throws IOException;
     UserPayForm createOrder(CreateOrderForm createOrderForm) throws IOException;
 
 
-    UserPayForm orderChangePrice(SysUser sysUser, PriceChangeForm priceChangeForm);
+    UserPayForm orderChangePrice( PriceChangeForm priceChangeForm);
 
 
     /**
     /**
      * @Author SheepHy
      * @Author SheepHy

+ 54 - 29
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/app/service/impl/OrderServiceImpl.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.app.service.impl;
 package org.jeecg.modules.app.service.impl;
 
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
@@ -42,6 +43,7 @@ import org.jeecg.modules.system.app.dto.receiptPaymentDetails.ReceiptPaymentDeta
 import org.jeecg.modules.system.app.entity.*;
 import org.jeecg.modules.system.app.entity.*;
 import org.jeecg.modules.system.app.form.PriceChangeForm;
 import org.jeecg.modules.system.app.form.PriceChangeForm;
 import org.jeecg.modules.system.app.mapper.*;
 import org.jeecg.modules.system.app.mapper.*;
+import org.jeecg.modules.system.app.vo.AppOrderProInfoVO;
 import org.jeecg.modules.system.entity.SysDepart;
 import org.jeecg.modules.system.entity.SysDepart;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.entity.SysUser;
 import org.jeecg.modules.system.mapper.SysDepartMapper;
 import org.jeecg.modules.system.mapper.SysDepartMapper;
@@ -484,6 +486,8 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 
 
         SysUser sysUser = sysUserMapper.selectById(user.getId());
         SysUser sysUser = sysUserMapper.selectById(user.getId());
 
 
+        String userOpenId = sysUser.getOpenid();
+
         String orderCode = generateOrderNumber(0);
         String orderCode = generateOrderNumber(0);
 
 
         //创建订单
         //创建订单
@@ -1293,7 +1297,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
                 }
                 }
             }
             }
 
 
-            Map<String, String> result = payment(appOrder.getId());
+            Map<String, String> result = payment(appOrder.getId(),userOpenId);
             payForm.setParams(result);
             payForm.setParams(result);
 
 
             //发布任务到redission延迟队列(16分钟)
             //发布任务到redission延迟队列(16分钟)
@@ -1312,12 +1316,28 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
      * @return 支付订单对象
      * @return 支付订单对象
      */
      */
     @Transactional(rollbackFor = Exception.class)
     @Transactional(rollbackFor = Exception.class)
-    public UserPayForm orderChangePrice(SysUser sysUser,PriceChangeForm priceChangeForm){
+    public UserPayForm orderChangePrice(PriceChangeForm priceChangeForm){
 
 
         AppOrder order = appOrderMapper.selectById(priceChangeForm.getOrderId());
         AppOrder order = appOrderMapper.selectById(priceChangeForm.getOrderId());
+        String userOpenId = order.getUserOpenId();
         if (ObjectUtil.isEmpty(order)) {
         if (ObjectUtil.isEmpty(order)) {
             throw new JeecgBootException("订单不存在!");
             throw new JeecgBootException("订单不存在!");
         }
         }
+        if (Objects.equals(order.getStatus(), CommonConstant.ORDER_STATUS_4)) {
+            throw new JeecgBootException("订单已超时取消!");
+        }
+
+        //订单取消
+        if (Objects.equals(order.getOrderStatus(), CommonConstant.ORDER_STATUS_0)) {
+            order.setOrderStatus(CommonConstant.ORDER_STATUS_4);
+            appOrderMapper.updateById(order);
+            appOrderProInfoMapper.update(null,Wrappers.lambdaUpdate(AppOrderProInfo.class)
+                    .eq(AppOrderProInfo::getOrderId, order.getId())
+                    .set(AppOrderProInfo::getOrderStatus, CommonConstant.ORDER_PRO_INFO_TYPE_4));
+        }
+
+        String userId = order.getUserId();
+        SysUser sysUser = sysUserMapper.selectById(userId);
         //根据订单构建改价后的订单信息(总金额 = 子订单金额 + 保险)
         //根据订单构建改价后的订单信息(总金额 = 子订单金额 + 保险)
         CreateOrderForm createOrderForm = new CreateOrderForm();
         CreateOrderForm createOrderForm = new CreateOrderForm();
         createOrderForm.setType(order.getType());
         createOrderForm.setType(order.getType());
@@ -1328,28 +1348,32 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
         createOrderForm.setGameCertificationForm(order.getGameCertification());
         createOrderForm.setGameCertificationForm(order.getGameCertification());
         //构建商品IDs
         //构建商品IDs
         List<PriceChangeForm.OrderItemForm> orderItemList = priceChangeForm.getOrderItemList();
         List<PriceChangeForm.OrderItemForm> orderItemList = priceChangeForm.getOrderItemList();
-        String productIds = orderItemList.stream().map(PriceChangeForm.OrderItemForm::getProductId)
-                .collect(Collectors.joining(","));
+        String productIds = orderItemList.get(0).getProductId();
+
+        if (order.getOrderType() == 1){
+            productIds = orderItemList.stream().map(PriceChangeForm.OrderItemForm::getProductId)
+                    .collect(Collectors.joining(","));
+        }
         createOrderForm.setProductIds(productIds);
         createOrderForm.setProductIds(productIds);
         //构建保险表单
         //构建保险表单
         List<InsureOrderInfo> insureOrderInfos =
         List<InsureOrderInfo> insureOrderInfos =
                 insureOrderInfoMapper.selectList(Wrappers.<InsureOrderInfo>lambdaQuery().eq(InsureOrderInfo::getOrderId,
                 insureOrderInfoMapper.selectList(Wrappers.<InsureOrderInfo>lambdaQuery().eq(InsureOrderInfo::getOrderId,
                 order.getId()));
                 order.getId()));
 
 
-        String familyMembersIds = insureOrderInfos.stream().map(InsureOrderInfo::getFamilyMembersId).collect(Collectors.joining(","));
-
-        InsurePrice insurePrices = insurePriceMapper.selectOne(Wrappers.lambdaQuery(InsurePrice.class).eq(InsurePrice::getInsureId,
-                insureOrderInfos.get(0).getInsureId()));
-
+        if (CollUtil.isNotEmpty(insureOrderInfos)){
+            String familyMembersIds = insureOrderInfos.stream().map(InsureOrderInfo::getFamilyMembersId).collect(Collectors.joining(","));
 
 
-        InsureOrderInfoForm insureOrderInfoForms = new InsureOrderInfoForm();
-        insureOrderInfoForms.setInsureId(insureOrderInfos.get(0).getInsureId());
-        insureOrderInfoForms.setAssertStartTime(insureOrderInfos.get(0).getAssertStartTime());
-        insureOrderInfoForms.setAssertEndTime(insureOrderInfos.get(0).getAssertEndTime());
-        insureOrderInfoForms.setInsurePriceId(insurePrices.getId());
-        insureOrderInfoForms.setFamilyMembersIds(familyMembersIds);
+            InsurePrice insurePrices = insurePriceMapper.selectOne(Wrappers.lambdaQuery(InsurePrice.class).eq(InsurePrice::getInsureId,
+                    insureOrderInfos.get(0).getInsureId()));
+            InsureOrderInfoForm insureOrderInfoForms = new InsureOrderInfoForm();
+            insureOrderInfoForms.setInsureId(insureOrderInfos.get(0).getInsureId());
+            insureOrderInfoForms.setAssertStartTime(insureOrderInfos.get(0).getAssertStartTime());
+            insureOrderInfoForms.setAssertEndTime(insureOrderInfos.get(0).getAssertEndTime());
+            insureOrderInfoForms.setInsurePriceId(insurePrices.getId());
+            insureOrderInfoForms.setFamilyMembersIds(familyMembersIds);
 
 
-        createOrderForm.setInsureOrderInfoForm(insureOrderInfoForms);
+            createOrderForm.setInsureOrderInfoForm(insureOrderInfoForms);
+        }
 
 
         String orderCode = generateOrderNumber(0);
         String orderCode = generateOrderNumber(0);
 
 
@@ -1578,7 +1602,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 
 
                     //改价
                     //改价
                     for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
                     for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
-                        if (orderItemForm.getProductId().equals(priceRule.getSellingPrice())){
+                        if (orderItemForm.getProductId().equals(priceRule.getId())){
                             priceRule.setSellingPrice(orderItemForm.getOriginalPrice());
                             priceRule.setSellingPrice(orderItemForm.getOriginalPrice());
                         }
                         }
                     }
                     }
@@ -1652,7 +1676,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 
 
                     //改价
                     //改价
                     for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
                     for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
-                        if (orderItemForm.getProductId().equals(appGamePriceRules.getSellingPrice())){
+                        if (orderItemForm.getProductId().equals(appGamePriceRules.getId())){
                             appGamePriceRules.setSellingPrice(orderItemForm.getOriginalPrice());
                             appGamePriceRules.setSellingPrice(orderItemForm.getOriginalPrice());
                         }
                         }
                     }
                     }
@@ -1722,7 +1746,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 
 
                     //改价
                     //改价
                     for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
                     for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
-                        if (orderItemForm.getProductId().equals(appGamePriceRules.getSellingPrice())){
+                        if (orderItemForm.getProductId().equals(appGamePriceRules.getId())){
                             appGamePriceRules.setSellingPrice(orderItemForm.getOriginalPrice());
                             appGamePriceRules.setSellingPrice(orderItemForm.getOriginalPrice());
                         }
                         }
                     }
                     }
@@ -1796,7 +1820,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 
 
                 //改价
                 //改价
                 for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
                 for (PriceChangeForm.OrderItemForm orderItemForm : orderItemList) {
-                    if (orderItemForm.getProductId().equals(appCourse.getSellingPrice())){
+                    if (orderItemForm.getProductId().equals(appCourse.getId())){
                         appCourse.setSellingPrice(orderItemForm.getOriginalPrice());
                         appCourse.setSellingPrice(orderItemForm.getOriginalPrice());
                     }
                     }
                 }
                 }
@@ -2196,7 +2220,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
                 }
                 }
             }
             }
 
 
-            Map<String, String> result = payment(appOrder.getId());
+            Map<String, String> result = payment(appOrder.getId(),userOpenId);
             payForm.setParams(result);
             payForm.setParams(result);
 
 
             //发布任务到redission延迟队列(16分钟)
             //发布任务到redission延迟队列(16分钟)
@@ -2236,7 +2260,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
                 : product.setScale(2, RoundingMode.DOWN);
                 : product.setScale(2, RoundingMode.DOWN);
     }
     }
 
 
-    public Map<String, String> payment(String appOrderId) {
+    public Map<String, String> payment(String appOrderId,String userOpenId) {
         AppOrder appOrder = appOrderMapper.selectById(appOrderId);
         AppOrder appOrder = appOrderMapper.selectById(appOrderId);
         //查询商户信息
         //查询商户信息
         String orgCode = appOrder.getOrgCode();
         String orgCode = appOrder.getOrgCode();
@@ -2245,11 +2269,6 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
             throw new JeecgBootException("当前订单已过期,请重新下单!");
             throw new JeecgBootException("当前订单已过期,请重新下单!");
         }
         }
 
 
-        //获取登录用户
-        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-
-        SysUser sysUser = sysUserMapper.selectById(user.getId());
-
         Calendar calendar = Calendar.getInstance();
         Calendar calendar = Calendar.getInstance();
         calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 15);
         calendar.set(Calendar.MINUTE, calendar.get(Calendar.MINUTE) + 15);
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
@@ -2287,7 +2306,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
         //支付者信息
         //支付者信息
         JSONObject payer = new JSONObject();
         JSONObject payer = new JSONObject();
         //用户在小程序侧的openid
         //用户在小程序侧的openid
-        payer.put("sub_openid", sysUser.getOpenid());
+        payer.put("sub_openid", userOpenId);
         params.put("payer", payer);
         params.put("payer", payer);
 
 
         //拉起支付-返回JSAPI参数
         //拉起支付-返回JSAPI参数
@@ -2447,6 +2466,12 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
 
 
         //子订单
         //子订单
         List<AppOrderProInfo> proInfoList = appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, orderId));
         List<AppOrderProInfo> proInfoList = appOrderProInfoMapper.selectList(Wrappers.<AppOrderProInfo>lambdaQuery().eq(AppOrderProInfo::getOrderId, orderId));
+        for (AppOrderProInfo appOrderProInfo : proInfoList) {
+            AppOrderProInfoVO appOrderProInfoVO = new AppOrderProInfoVO();
+            BeanUtil.copyProperties(appOrderProInfo, appOrderProInfoVO);
+            //班级、教练名称
+//            appOrderProInfoVO.setClassGroupingName().setCoachName();
+        }
         appOrderInfoDTO.setProInfoList(proInfoList);
         appOrderInfoDTO.setProInfoList(proInfoList);
 
 
         //学校
         //学校
@@ -3043,7 +3068,7 @@ public class OrderServiceImpl extends ServiceImpl<AppOrderMapper, AppOrder> impl
                 throw new JeecgBootException("当前订单已过期取消,请重新下单!");
                 throw new JeecgBootException("当前订单已过期取消,请重新下单!");
             }
             }
         }
         }
-        Map<String, String> payment = payment(appOrderId);
+        Map<String, String> payment = payment(appOrderId,appOrder.getUserOpenId());
         payForm.setOrderId(appOrderId)
         payForm.setOrderId(appOrderId)
                 .setOrderCode(appOrder.getOrderCode())
                 .setOrderCode(appOrder.getOrderCode())
                 .setParams(payment)
                 .setParams(payment)

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

@@ -0,0 +1,177 @@
+package org.jeecg.modules.system.app.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alipay.api.domain.StudentInfo;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.system.app.entity.*;
+import org.jeecg.modules.system.app.form.ClassGroupingCasePageForm;
+import org.jeecg.modules.system.app.form.ClassGroupingForm;
+import org.jeecg.modules.system.app.form.ClassGroupingPageForm;
+import org.jeecg.modules.system.app.service.*;
+import org.jeecg.modules.system.app.vo.*;
+import org.jeecg.modules.system.entity.SysUser;
+import org.jeecg.modules.system.service.ISysUserService;
+import org.simpleframework.xml.core.Validate;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Tag(name="分班管理")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/app/classGrouping")
+public class AppClassGroupingController {
+
+    private final IAppClassGroupingService appClassGroupingService;
+    private final IAppClassUserService appClassUserService;
+    private final ISysUserService sysUserService;
+    private final IAppCoureseService appCoureseService;
+
+    /**
+     * 分班管理分页
+     *
+     * @param classGroupingPageForm
+     * @return
+     */
+    @PostMapping(value = "/queryPage")
+    public Result<IPage<ClassGroupingVO>> queryPage(ClassGroupingPageForm classGroupingPageForm) {
+        LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        String orgCode = loginUser.getOrgCode();
+        classGroupingPageForm.setOrgCode(orgCode);
+        IPage<ClassGroupingVO> classGroupingVOIPage = appClassGroupingService.queryPage(classGroupingPageForm);
+        return Result.OK(classGroupingVOIPage);
+    }
+
+    /**
+     * 分班情况分页
+     *
+     * @param classGroupingCasePageForm
+     * @return
+     */
+    @PostMapping(value = "/queryCasePage")
+    public Result<IPage<ClassGroupingCaseVO>> queryCasePage(ClassGroupingCasePageForm classGroupingCasePageForm) {
+        IPage<ClassGroupingCaseVO> classGroupingCaseVOIPage = appClassGroupingService.queryCasePage(classGroupingCasePageForm);
+        return Result.OK(classGroupingCaseVOIPage);
+    }
+
+    /**
+     * 根据课程ID查询未分班的学员
+     *
+     * @param
+     * @return
+     */
+    @GetMapping(value = "/getStudentInfoList")
+    public Result<List<StudentInfoVO>> getStudentInfoList(@RequestParam(value = "coursesId") String coursesId) {
+        List<StudentInfoVO> studentInfoList = appClassGroupingService.getStudentInfoList(coursesId);
+        return Result.OK(studentInfoList);
+    }
+
+    /**
+     * 根据课程查询教练列表
+     *
+     * @param
+     * @return
+     */
+    @GetMapping(value = "/getCoachInfoVOList")
+    public Result<List<CoachInfoVO>> getCoachInfoVOList(@RequestParam(value = "coursesId") String coursesId) {
+
+        List<CoachInfoVO> coachInfoVOList = new ArrayList<>();
+
+        AppCourses course = appCoureseService.getById(coursesId);
+        if (ObjectUtil.isNotEmpty(course.getUserId())){
+            List<String> ids = Arrays.stream(course.getUserId().split(",")).collect(Collectors.toList());
+            for (String id : ids) {
+                SysUser sysUser = sysUserService.getById(id);
+                if (ObjectUtil.isNotEmpty(sysUser)){
+                    CoachInfoVO coachInfoVO = new CoachInfoVO();
+                    coachInfoVO.setCoachUserId(sysUser.getId()).setName(sysUser.getRealname());
+                    coachInfoVOList.add(coachInfoVO);
+                }
+            }
+        }
+        return Result.OK(coachInfoVOList);
+    }
+
+    /**
+     * 分班创建
+     *
+     * @param classGroupingCaseForm
+     * @return
+     */
+    @AutoLog(value = "分班创建")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody @Validate ClassGroupingForm classGroupingCaseForm) {
+
+        AppClassGrouping appClassGrouping = new AppClassGrouping();
+        appClassGrouping.setClassName(classGroupingCaseForm.getClassName());
+        appClassGrouping.setCourseId(classGroupingCaseForm.getCourseId());
+        appClassGrouping.setCoachUserId(classGroupingCaseForm.getCoachUserId());
+        appClassGroupingService.save(appClassGrouping);
+
+        for (String familyMemberId : classGroupingCaseForm.getFamilyMemberIds()) {
+            AppClassUser appClassUser = new AppClassUser();
+            appClassUser.setClassGroupingId(appClassGrouping.getId());
+            appClassUser.setCourseId(appClassGrouping.getCourseId());
+            appClassUser.setFamilyMemberId(familyMemberId);
+            appClassUserService.save(appClassUser);
+        }
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 分班修改
+     *
+     * @param classGroupingCaseForm
+     * @return
+     */
+    @AutoLog(value = "分班修改")
+    @PostMapping(value = "/edit")
+    public Result<String> edit(@RequestBody @Validate ClassGroupingForm classGroupingCaseForm) {
+
+        AppClassGrouping appClassGrouping = new AppClassGrouping();
+        appClassGrouping.setClassName(classGroupingCaseForm.getClassName());
+        appClassGrouping.setCourseId(classGroupingCaseForm.getCourseId());
+        appClassGrouping.setCoachUserId(classGroupingCaseForm.getCoachUserId());
+        appClassGroupingService.updateById(appClassGrouping);
+
+        // 删除原来的
+        appClassUserService.remove(Wrappers.<AppClassUser>lambdaQuery().eq(AppClassUser::getClassGroupingId, appClassGrouping.getId()));
+        for (String familyMemberId : classGroupingCaseForm.getFamilyMemberIds()) {
+            AppClassUser appClassUser = new AppClassUser();
+            appClassUser.setClassGroupingId(appClassGrouping.getId());
+            appClassUser.setCourseId(appClassGrouping.getCourseId());
+            appClassUser.setFamilyMemberId(familyMemberId);
+            appClassUserService.save(appClassUser);
+        }
+        return Result.OK("修改成功!");
+    }
+
+    /**
+     * 分班删除
+     *
+     * @param classGroupingId 分班ID
+     * @return
+     */
+    @AutoLog(value = "分班删除")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "classGroupingId", required = true) String classGroupingId) {
+        appClassGroupingService.removeById(classGroupingId);
+        // 删除原来的
+        appClassUserService.remove(Wrappers.<AppClassUser>lambdaQuery().eq(AppClassUser::getClassGroupingId, classGroupingId));
+        return Result.OK("删除成功!");
+    }
+}

+ 149 - 181
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/controller/AppOrderController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.system.app.controller;
 package org.jeecg.modules.system.app.controller;
 
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -44,6 +45,7 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.http.ResponseEntity;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ModelAndView;
 
 
@@ -60,113 +62,114 @@ import java.util.stream.Collectors;
 /**
 /**
  * @Description: 订单表
  * @Description: 订单表
  * @Author: jeecg-boot
  * @Author: jeecg-boot
- * @Date:   2025-07-03
+ * @Date: 2025-07-03
  * @Version: V1.0
  * @Version: V1.0
  */
  */
-@Tag(name="订单表")
+@Tag(name = "订单表")
 @RestController
 @RestController
 @RequestMapping("/app/appOrder")
 @RequestMapping("/app/appOrder")
 @Slf4j
 @Slf4j
 public class AppOrderController extends JeecgController<AppOrder, IAppOrderService> {
 public class AppOrderController extends JeecgController<AppOrder, IAppOrderService> {
-	@Autowired
-	private IAppOrderService appOrderService;
+    @Autowired
+    private IAppOrderService appOrderService;
     @Autowired
     @Autowired
     private WeChatProfitSharingService weChatProfitSharingService;
     private WeChatProfitSharingService weChatProfitSharingService;
     @Autowired
     @Autowired
     private IOrderService orderService;
     private IOrderService orderService;
-	
-	/**
-	 * 分页列表查询
-	 *
-	 * @param appOrder
-	 * @param pageNo
-	 * @param pageSize
-	 * @param req
-	 * @return
-	 */
-	//@AutoLog(value = "订单表-分页列表查询")
-	@Operation(summary="订单表-分页列表查询")
-	@GetMapping(value = "/list")
-	public Result<IPage<AppOrder>> queryPageList(AppOrder appOrder,
-								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
-								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
-								   HttpServletRequest req) {
+
+    /**
+     * 分页列表查询
+     *
+     * @param appOrder
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "订单表-分页列表查询")
+    @Operation(summary = "订单表-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<AppOrder>> queryPageList(AppOrder appOrder,
+                                                 @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                 @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                 HttpServletRequest req) {
 
 
 
 
         QueryWrapper<AppOrder> queryWrapper = QueryGenerator.initQueryWrapper(appOrder, req.getParameterMap());
         QueryWrapper<AppOrder> queryWrapper = QueryGenerator.initQueryWrapper(appOrder, req.getParameterMap());
-		Page<AppOrder> page = new Page<AppOrder>(pageNo, pageSize);
-		IPage<AppOrder> pageList = appOrderService.page(page, queryWrapper);
-		return Result.OK(pageList);
-	}
+        Page<AppOrder> page = new Page<AppOrder>(pageNo, pageSize);
+        IPage<AppOrder> pageList = appOrderService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 订单分页
+     *
+     * @param appOrderPageForm
+     * @return
+     */
+    @Operation(summary = "订单-分页列表查询")
+    @PostMapping(value = "/queryPage")
+    public Result<Page<OrderPageVO>> queryPage(@RequestBody AppOrderPageForm appOrderPageForm) {
+        return Result.OK(appOrderService.queryPage(appOrderPageForm));
+    }
+
+    /**
+     * 查询详情
+     *
+     * @param orderId
+     * @return
+     */
+    @Operation(summary = "订单-查询详情")
+    @GetMapping(value = "/queryInfoById/{orderId}")
+    public Result<AppOrderInfoVO> queryInfoById(@PathVariable(name = "orderId") String orderId) {
+        return Result.OK(appOrderService.queryInfoById(orderId));
+    }
 
 
-	 /**
-	  * 订单分页
-	  * @param appOrderPageForm
-	  * @return
-	  */
-	 @Operation(summary="订单-分页列表查询")
-	 @PostMapping(value = "/queryPage")
-	 public Result<Page<OrderPageVO>> queryPage(@RequestBody AppOrderPageForm appOrderPageForm) {
-		 return Result.OK(appOrderService.queryPage(appOrderPageForm));
-	 }
+    /**
+     * 添加
+     *
+     * @param appOrder
+     * @return
+     */
+    @AutoLog(value = "订单表-添加")
+    @Operation(summary = "订单表-添加")
+    @RequiresPermissions("org.jeecg.modules.app:nm_order:add")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody AppOrder appOrder) {
+        appOrderService.save(appOrder);
 
 
-	 /**
-	  * 查询详情
-	  *
-	  * @param orderId
-	  * @return
-	  */
-	 @Operation(summary = "订单-查询详情")
-	 @GetMapping(value = "/queryInfoById/{orderId}")
-	 public Result<AppOrderInfoVO> queryInfoById(@PathVariable(name = "orderId") String orderId) {
-		 return Result.OK(appOrderService.queryInfoById(orderId));
-	 }
-	
-	/**
-	 *   添加
-	 *
-	 * @param appOrder
-	 * @return
-	 */
-	@AutoLog(value = "订单表-添加")
-	@Operation(summary="订单表-添加")
-	@RequiresPermissions("org.jeecg.modules.app:nm_order:add")
-	@PostMapping(value = "/add")
-	public Result<String> add(@RequestBody AppOrder appOrder) {
-		appOrderService.save(appOrder);
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param appOrder
+     * @return
+     */
+    @AutoLog(value = "订单表-编辑")
+    @Operation(summary = "订单表-编辑")
+    @RequiresPermissions("org.jeecg.modules.app:nm_order:edit")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<String> edit(@RequestBody AppOrder appOrder) {
+        appOrderService.updateById(appOrder);
+        return Result.OK("编辑成功!");
+    }
 
 
-		return Result.OK("添加成功!");
-	}
-	
-	/**
-	 *  编辑
-	 *
-	 * @param appOrder
-	 * @return
-	 */
-	@AutoLog(value = "订单表-编辑")
-	@Operation(summary="订单表-编辑")
-	@RequiresPermissions("org.jeecg.modules.app:nm_order:edit")
-	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
-	public Result<String> edit(@RequestBody AppOrder appOrder) {
-		appOrderService.updateById(appOrder);
-		return Result.OK("编辑成功!");
-	}
-	
-	/**
-	 *   通过id删除
-	 *
-	 * @param id
-	 * @return
-	 */
-	@AutoLog(value = "订单表-通过id删除")
-	@Operation(summary="订单表-通过id删除")
-	@RequiresPermissions("org.jeecg.modules.app:nm_order:delete")
-	@DeleteMapping(value = "/delete")
-	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
-		appOrderService.removeById(id);
-		return Result.OK("删除成功!");
-	}
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "订单表-通过id删除")
+    @Operation(summary = "订单表-通过id删除")
+    @RequiresPermissions("org.jeecg.modules.app:nm_order:delete")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        appOrderService.removeById(id);
+        return Result.OK("删除成功!");
+    }
 
 
     /**
     /**
      * 分账
      * 分账
@@ -198,45 +201,45 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
         JSONObject jsonObject = weChatProfitSharingService.getProfitSharingResult(orderCode);
         JSONObject jsonObject = weChatProfitSharingService.getProfitSharingResult(orderCode);
         return Result.OK(jsonObject);
         return Result.OK(jsonObject);
     }
     }
-	
-	/**
-	 *  批量删除
-	 *
-	 * @param ids
-	 * @return
-	 */
-	@AutoLog(value = "订单表-批量删除")
-	@Operation(summary="订单表-批量删除")
-	@RequiresPermissions("org.jeecg.modules.app:nm_order:deleteBatch")
-	@DeleteMapping(value = "/deleteBatch")
-	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
-		this.appOrderService.removeByIds(Arrays.asList(ids.split(",")));
-		return Result.OK("批量删除成功!");
-	}
-	
-	/**
-	 * 通过id查询
-	 *
-	 * @param id
-	 * @return
-	 */
-	//@AutoLog(value = "订单表-通过id查询")
-	@Operation(summary="订单表-通过id查询")
-	@GetMapping(value = "/queryById")
-	public Result<AppOrder> queryById(@RequestParam(name="id",required=true) String id) {
-		AppOrder appOrder = appOrderService.getById(id);
-		if(appOrder==null) {
-			return Result.error("未找到对应数据");
-		}
-		return Result.OK(appOrder);
-	}
 
 
     /**
     /**
-    * 导出excel
-    *
-    * @param request
-    * @param appOrder
-    */
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "订单表-批量删除")
+    @Operation(summary = "订单表-批量删除")
+    @RequiresPermissions("org.jeecg.modules.app:nm_order:deleteBatch")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.appOrderService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "订单表-通过id查询")
+    @Operation(summary = "订单表-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<AppOrder> queryById(@RequestParam(name = "id", required = true) String id) {
+        AppOrder appOrder = appOrderService.getById(id);
+        if (appOrder == null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(appOrder);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param appOrder
+     */
     @RequiresPermissions("org.jeecg.modules.app:nm_order:exportXls")
     @RequiresPermissions("org.jeecg.modules.app:nm_order:exportXls")
     @RequestMapping(value = "/exportXls")
     @RequestMapping(value = "/exportXls")
     public ModelAndView exportXls(HttpServletRequest request, AppOrder appOrder) {
     public ModelAndView exportXls(HttpServletRequest request, AppOrder appOrder) {
@@ -244,12 +247,12 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
     }
     }
 
 
     /**
     /**
-      * 通过excel导入数据
-    *
-    * @param request
-    * @param response
-    * @return
-    */
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
     @RequiresPermissions("org.jeecg.modules.app:nm_order:importExcel")
     @RequiresPermissions("org.jeecg.modules.app:nm_order:importExcel")
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
     public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
@@ -264,9 +267,9 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
      * @date 2025/9/17
      * @date 2025/9/17
      * return   {@link }
      * return   {@link }
      **/
      **/
-    @Operation(summary="赛事条件导出-查询赛事")
+    @Operation(summary = "赛事条件导出-查询赛事")
     @GetMapping(value = "/exportConditionByName")
     @GetMapping(value = "/exportConditionByName")
-    public Result<List<ExportConditionVO>> exportConditionByName(@RequestParam(value = "name", required = false) String name){
+    public Result<List<ExportConditionVO>> exportConditionByName(@RequestParam(value = "name", required = false) String name) {
         return Result.OK(appOrderService.exportConditionByName(name));
         return Result.OK(appOrderService.exportConditionByName(name));
     }
     }
 
 
@@ -277,10 +280,10 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
      * @date 2025/9/17
      * @date 2025/9/17
      * return   {@link }
      * return   {@link }
      **/
      **/
-    @Operation(summary="赛事条件导出-查询项目")
+    @Operation(summary = "赛事条件导出-查询项目")
     @GetMapping(value = "/exportConditionByProjectName")
     @GetMapping(value = "/exportConditionByProjectName")
-    public Result<List<ExportConditionVO>> exportConditionByProjectName(@RequestParam(value = "projectName", required = false)String projectName,
-                                                                        @RequestParam(value = "gameId", required = false)String gameId){
+    public Result<List<ExportConditionVO>> exportConditionByProjectName(@RequestParam(value = "projectName", required = false) String projectName,
+                                                                        @RequestParam(value = "gameId", required = false) String gameId) {
         return Result.OK(appOrderService.exportConditionByProjectName(projectName, gameId));
         return Result.OK(appOrderService.exportConditionByProjectName(projectName, gameId));
     }
     }
 
 
@@ -291,7 +294,7 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
      * @date 2025/9/17
      * @date 2025/9/17
      * return   {@link }
      * return   {@link }
      **/
      **/
-    @Operation(summary="赛事条件导出")
+    @Operation(summary = "赛事条件导出")
     @PostMapping(value = "/exportCondition")
     @PostMapping(value = "/exportCondition")
     public ResponseEntity<byte[]> exportCondition(@RequestBody ExportConditionDTO exportConditionDTO) throws IOException {
     public ResponseEntity<byte[]> exportCondition(@RequestBody ExportConditionDTO exportConditionDTO) throws IOException {
         try {
         try {
@@ -309,12 +312,12 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
         }
         }
     }
     }
 
 
-    @Operation(summary="退款管理-分页列表查询")
+    @Operation(summary = "退款管理-分页列表查询")
     @PostMapping(value = "/refundOrderPageList")
     @PostMapping(value = "/refundOrderPageList")
     public Result<IPage<RefundOrderPageVO>> refundOrderPageList(@RequestBody RefundOrderPageForm refundOrderPageForm) {
     public Result<IPage<RefundOrderPageVO>> refundOrderPageList(@RequestBody RefundOrderPageForm refundOrderPageForm) {
-        LoginUser user = (LoginUser)SecurityUtils.getSubject().getPrincipal();
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
         String orgCode = user.getOrgCode();
         String orgCode = user.getOrgCode();
-        if (!ObjectUtil.equals("A01",orgCode)){
+        if (!ObjectUtil.equals("A01", orgCode)) {
             refundOrderPageForm.setOrderCode(orgCode);
             refundOrderPageForm.setOrderCode(orgCode);
         }
         }
         IPage<RefundOrderPageVO> page = appOrderService.refundOrderPageList(refundOrderPageForm);
         IPage<RefundOrderPageVO> page = appOrderService.refundOrderPageList(refundOrderPageForm);
@@ -327,47 +330,12 @@ public class AppOrderController extends JeecgController<AppOrder, IAppOrderServi
     private IInsurePriceService insurePriceService;
     private IInsurePriceService insurePriceService;
     @Resource
     @Resource
     private ISysUserService sysUserService;
     private ISysUserService sysUserService;
+
+    @Transactional(rollbackFor = Exception.class)
     @Operation(summary = "订单管理-订单改价")
     @Operation(summary = "订单管理-订单改价")
     @PostMapping(value = "/priceChange")
     @PostMapping(value = "/priceChange")
     public Result<UserPayForm> priceChange(@RequestBody PriceChangeForm priceChangeForm) {
     public Result<UserPayForm> priceChange(@RequestBody PriceChangeForm priceChangeForm) {
 
 
-        AppOrder appOrder = orderService.getById(priceChangeForm.getOrderId());
-        if (ObjectUtil.isEmpty(appOrder)) {
-            throw new JeecgBootException("订单不存在!");
-        }
-        String userId = appOrder.getUserId();
-        SysUser sysUser = sysUserService.getById(userId);
-        //根据订单构建改价后的订单信息(总金额 = 子订单金额 + 保险)
-        CreateOrderForm createOrderForm = new CreateOrderForm();
-        createOrderForm.setType(appOrder.getType());
-        createOrderForm.setOrderType(appOrder.getOrderType());
-        createOrderForm.setOrFreeOrder(appOrder.getOrderOrFree());
-        createOrderForm.setAmount(appOrder.getAmount());
-        createOrderForm.setFamilyIds(appOrder.getFamilyIds());
-        createOrderForm.setGameCertificationForm(appOrder.getGameCertification());
-        //构建商品IDs
-        List<PriceChangeForm.OrderItemForm> orderItemList = priceChangeForm.getOrderItemList();
-        String productIds = orderItemList.stream().map(PriceChangeForm.OrderItemForm::getProductId)
-                .collect(Collectors.joining(","));
-        createOrderForm.setProductIds(productIds);
-        //构建保险表单
-        List<InsureOrderInfo> insureOrderInfoList = insureOrderInfoService.list(Wrappers.<InsureOrderInfo>lambdaQuery().eq(InsureOrderInfo::getOrderId,
-                appOrder.getId()));
-
-        String familyMembersIds = insureOrderInfoList.stream().map(InsureOrderInfo::getFamilyMembersId).collect(Collectors.joining(","));
-
-        InsurePrice insurePrice = insurePriceService.getOne(Wrappers.lambdaQuery(InsurePrice.class).eq(InsurePrice::getInsureId,
-                insureOrderInfoList.get(0).getInsureId()).last("limit 1"));
-
-
-        InsureOrderInfoForm insureOrderInfoForm = new InsureOrderInfoForm();
-        insureOrderInfoForm.setInsureId(insureOrderInfoList.get(0).getInsureId());
-        insureOrderInfoForm.setAssertStartTime(insureOrderInfoList.get(0).getAssertStartTime());
-        insureOrderInfoForm.setAssertEndTime(insureOrderInfoList.get(0).getAssertEndTime());
-        insureOrderInfoForm.setInsurePriceId(insurePrice.getId());
-        insureOrderInfoForm.setFamilyMembersIds(familyMembersIds);
-
-        createOrderForm.setInsureOrderInfoForm(insureOrderInfoForm);
-        return Result.OK(orderService.orderChangePrice(sysUser,priceChangeForm));
+        return Result.OK(orderService.orderChangePrice(priceChangeForm));
     }
     }
 }
 }

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

@@ -0,0 +1,78 @@
+package org.jeecg.modules.system.app.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+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.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("nm_class_grouping")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class AppClassGrouping implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    /**
+     * 班级名称
+     */
+    private String className;
+
+    /**
+     * 课程id
+     */
+    private String courseId;
+
+    /**
+     * 教练ID
+     **/
+    private String coachUserId;
+
+    /**
+     * 系统状态;状态(0-正常,1-冻结)
+     */
+    private Integer status;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private Integer delFlag;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+}

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

@@ -0,0 +1,80 @@
+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 lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("nm_class_user")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+public class AppClassUser implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    /**
+     * 分班ID
+     */
+    private String classGroupingId;
+
+    /**
+     * 课程id
+     */
+    private String courseId;
+
+    /**
+     * 家庭成员ID
+     **/
+    private String familyMemberId;
+
+    /**
+     * 系统状态;状态(0-正常,1-冻结)
+     */
+    private Integer status;
+
+    /**
+     * 删除标志
+     */
+    @TableLogic
+    private Integer delFlag;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新人
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+}

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

@@ -0,0 +1,29 @@
+package org.jeecg.modules.system.app.form;
+
+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.app.dto.PageDTO;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "分班管理分页表单对象")
+public class ClassGroupingCasePageForm extends PageDTO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 班级名称
+     */
+    private String classGroupingName;
+
+}

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

@@ -0,0 +1,57 @@
+package org.jeecg.modules.system.app.form;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+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.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "分班表单对象")
+public class ClassGroupingForm implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * 班级名称
+     */
+    @NotBlank(message = "班级名称不能为空")
+    private String className;
+
+
+    /**
+     * 课程id
+     */
+    @NotNull(message = "课程ID不能为空")
+    private String courseId;
+
+    /**
+     * 教练ID
+     **/
+    @NotNull(message = "教练ID不能为空")
+    private String coachUserId;
+
+    /**
+     * 家庭成员IDs
+     **/
+    @NotNull(message = "学员不能为空")
+    private List<String> familyMemberIds;
+}

+ 38 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/form/ClassGroupingPageForm.java

@@ -0,0 +1,38 @@
+package org.jeecg.modules.system.app.form;
+
+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.app.dto.PageDTO;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "分班管理分页表单对象")
+public class ClassGroupingPageForm extends PageDTO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 课程名称
+     */
+    private String courseName;
+
+    /**
+     * 上课地点ID
+     */
+    private String addressSiteId;
+
+    /**
+     * orgCode
+     */
+    private String orgCode;
+}

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

@@ -30,7 +30,7 @@ public class PriceChangeForm implements Serializable {
 
 
 
 
     @Data
     @Data
-    public class OrderItemForm implements Serializable {
+    public static class OrderItemForm implements Serializable {
         @Serial
         @Serial
         private static final long serialVersionUID = 1L;
         private static final long serialVersionUID = 1L;
 
 

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

@@ -0,0 +1,19 @@
+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.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.system.app.entity.AppClassGrouping;
+import org.jeecg.modules.system.app.form.ClassGroupingCasePageForm;
+import org.jeecg.modules.system.app.form.ClassGroupingPageForm;
+import org.jeecg.modules.system.app.vo.ClassGroupingCaseVO;
+import org.jeecg.modules.system.app.vo.ClassGroupingVO;
+
+@Mapper
+public interface AppClassGroupingMapper extends BaseMapper<AppClassGrouping> {
+    IPage<ClassGroupingVO> queryPage(Page<ClassGroupingVO> page, @Param("classGroupingPageForm") ClassGroupingPageForm classGroupingPageForm);
+
+    IPage<ClassGroupingCaseVO> queryCasePage(Page<ClassGroupingCaseVO> page, @Param("classGroupingCasePageForm") ClassGroupingCasePageForm classGroupingCasePageForm);
+}

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

@@ -0,0 +1,9 @@
+package org.jeecg.modules.system.app.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.system.app.entity.AppClassUser;
+
+@Mapper
+public interface AppClassUserMapper extends BaseMapper<AppClassUser> {
+}

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

@@ -1,5 +1,6 @@
 package org.jeecg.modules.system.app.mapper;
 package org.jeecg.modules.system.app.mapper;
 
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
@@ -10,4 +11,5 @@ import java.math.BigDecimal;
 @Mapper
 @Mapper
 public interface AppOrderProInfoMapper extends BaseMapper<AppOrderProInfo> {
 public interface AppOrderProInfoMapper extends BaseMapper<AppOrderProInfo> {
     BigDecimal findByOrderId(@Param("orderId") String orderId);
     BigDecimal findByOrderId(@Param("orderId") String orderId);
+
 }
 }

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

@@ -0,0 +1,55 @@
+<?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.AppClassGroupingMapper">
+    <select id="queryPage" resultType="org.jeecg.modules.system.app.vo.ClassGroupingVO">
+        SELECT
+        c.id,
+        c.`name`,
+        c.class_num,
+        c.address_site_id,
+        s.NAME AS address,
+        c.start_time,
+        c.end_time,
+        COUNT(op.product_id) AS applyNum
+        FROM
+        nm_courses c
+        LEFT JOIN nm_site s ON c.address_site_id = s.id
+        LEFT JOIN nm_order_pro_info op ON op.product_id = c.id
+        <where>
+            c.del_flag = 0
+            <if test="classGroupingPageForm.orgCode != null and classGroupingPageForm.orgCode != ''">
+                AND c.`name` = #{classGroupingPageForm.orgCode}
+            </if>
+            <if test="classGroupingPageForm.courseName != null and classGroupingPageForm.courseName != ''">
+                AND c.`name` LIKE CONCAT('%',#{classGroupingPageForm.courseName},'%')
+            </if>
+            <if test="classGroupingPageForm.addressSiteId != null and classGroupingPageForm.addressSiteId != ''">
+                AND c.address_site_id = #{classGroupingPageForm.addressSiteId}
+            </if>
+        </where>
+
+        GROUP BY c.id,c.`name`
+        ORDER BY c.start_time DESC
+    </select>
+    <select id="queryCasePage" resultType="org.jeecg.modules.system.app.vo.ClassGroupingCaseVO">
+        SELECT
+        cg.id,
+        cg.class_name,
+        u.realname,
+        COUNT( cu.id ) AS applyNum
+        FROM
+        nm_class_grouping cg
+        LEFT JOIN sys_user u ON u.id = cg.coach_user_id
+        LEFT JOIN nm_class_user cu ON cu.class_grouping_id = cg.id
+        <where>
+            cg.del_flag = 0
+            <if test="classGroupingCasePageForm.classGroupingName != null and classGroupingCasePageForm.classGroupingName != ''">
+                AND cg.class_name = #{classGroupingCasePageForm.classGroupingName}
+            </if>
+        </where>
+        GROUP BY
+        cg.id,
+        cg.class_name
+        ORDER BY cg.create_time DESC
+    </select>
+</mapper>

+ 20 - 0
national-motion-module-system/national-motion-system-biz/src/main/java/org/jeecg/modules/system/app/service/IAppClassGroupingService.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.entity.AppClassGrouping;
+import org.jeecg.modules.system.app.form.ClassGroupingCasePageForm;
+import org.jeecg.modules.system.app.form.ClassGroupingPageForm;
+import org.jeecg.modules.system.app.vo.ClassGroupingCaseVO;
+import org.jeecg.modules.system.app.vo.ClassGroupingVO;
+import org.jeecg.modules.system.app.vo.StudentInfoVO;
+
+import java.util.List;
+
+public interface IAppClassGroupingService extends IService<AppClassGrouping> {
+    IPage<ClassGroupingVO> queryPage(ClassGroupingPageForm classGroupingPageForm);
+
+    IPage<ClassGroupingCaseVO> queryCasePage(ClassGroupingCasePageForm classGroupingCasePageForm);
+
+    List<StudentInfoVO> getStudentInfoList(String coursesId);
+}

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

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

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

@@ -0,0 +1,101 @@
+package org.jeecg.modules.system.app.service.impl;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.common.util.IdCardUtil;
+import org.jeecg.modules.system.app.entity.*;
+import org.jeecg.modules.system.app.form.ClassGroupingCasePageForm;
+import org.jeecg.modules.system.app.form.ClassGroupingPageForm;
+import org.jeecg.modules.system.app.mapper.*;
+import org.jeecg.modules.system.app.service.IAppClassGroupingService;
+import org.jeecg.modules.system.app.vo.ClassGroupingCaseVO;
+import org.jeecg.modules.system.app.vo.ClassGroupingVO;
+import org.jeecg.modules.system.app.vo.StudentInfoVO;
+import org.jeecg.modules.system.app.vo.staff.StaffResponseVO;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class AppClassGroupingServiceImpl extends ServiceImpl<AppClassGroupingMapper, AppClassGrouping> implements IAppClassGroupingService {
+
+    @Resource
+    private AppClassUserMapper appClassUserMapper;
+    @Resource
+    private AppOrderProInfoMapper appOrderProInfoMapper;
+    @Resource
+    private FamilyMembersMapper familyMembersMapper;
+    @Resource
+    private AppCoursesMapper appCoursesMapper;
+    @Resource
+    private AppSiteMapper appSiteMapper;
+
+    @Override
+    public IPage<ClassGroupingVO> queryPage(ClassGroupingPageForm classGroupingPageForm) {
+        Page<ClassGroupingVO> page = new Page<ClassGroupingVO>(classGroupingPageForm.getPageNo(), classGroupingPageForm.getPageSize());
+        page.getRecords().forEach(record -> {
+
+            long AlreadyClassGroupingNum =
+                    appClassUserMapper.selectCount(Wrappers.lambdaQuery(AppClassUser.class).eq(AppClassUser::getClassGroupingId, record.getId()));
+
+            long UnClassGroupingNum = record.getApplyNum() - AlreadyClassGroupingNum;
+
+            record.setAlreadyClassGroupingNum((int) AlreadyClassGroupingNum).setUnClassGroupingNum((int) UnClassGroupingNum);
+        });
+        return baseMapper.queryPage(page, classGroupingPageForm);
+    }
+
+    @Override
+    public IPage<ClassGroupingCaseVO> queryCasePage(ClassGroupingCasePageForm classGroupingCasePageForm) {
+
+        Page<ClassGroupingCaseVO> page = new Page<ClassGroupingCaseVO>(classGroupingCasePageForm.getPageNo(), classGroupingCasePageForm.getPageSize());
+        return baseMapper.queryCasePage(page, classGroupingCasePageForm);
+    }
+
+    @Override
+    public List<StudentInfoVO> getStudentInfoList(String coursesId) {
+        List<StudentInfoVO> studentInfoList = new ArrayList<>();
+        AppCourses appCourses = appCoursesMapper.selectById(coursesId);
+        if (ObjectUtil.isNotEmpty(appCourses)) {
+
+            String siteId = appCourses.getAddressSiteId();
+            AppSite appSite = appSiteMapper.selectById(siteId);
+
+            //查询当前课程下已分班的学员
+            List<AppClassUser> appClassUserList =
+                    appClassUserMapper.selectList(Wrappers.lambdaQuery(AppClassUser.class).eq(AppClassUser::getCourseId, coursesId));
+
+            //根据当前课程查询订单
+            List<AppOrderProInfo> orderProInfoList =
+                    appOrderProInfoMapper.selectList(Wrappers.lambdaQuery(AppOrderProInfo.class).between(AppOrderProInfo::getOrderStatus, 1, 4).eq(AppOrderProInfo::getProductId, coursesId));
+            for (AppOrderProInfo appOrderProInfo : orderProInfoList) {
+                StudentInfoVO studentInfoVO = new StudentInfoVO();
+                FamilyMembers familyMembers = familyMembersMapper.selectById(appOrderProInfo.getFamilyUserId());
+
+                long count = appClassUserList.stream().filter(appClassUser -> appClassUser.getFamilyMemberId().equals(appOrderProInfo.getFamilyUserId())).count();
+                if (count == 0) {
+                    studentInfoVO.setId(familyMembers.getId());
+                    studentInfoVO.setName(familyMembers.getFullName());
+                    studentInfoVO.setGender(IdCardUtil.getGender(familyMembers.getIdentityCard()));
+                    studentInfoVO.setAge(IdCardUtil.getAge(familyMembers.getIdentityCard()));
+                    studentInfoVO.setSchoolName("无");
+                    studentInfoVO.setLevelInfo("无");
+                    if (appSite.getType() == 0) {
+                        if (appOrderProInfo.getLevelInfo() != null) {
+                            studentInfoVO.setSchoolName(appSite.getName());
+                            studentInfoVO.setLevelInfo(appOrderProInfo.getLevelInfo());
+                        }
+                    }
+                    studentInfoList.add(studentInfoVO);
+                }
+            }
+        }
+        return studentInfoList;
+    }
+}

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

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

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

@@ -0,0 +1,29 @@
+package org.jeecg.modules.system.app.vo;
+
+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.AppOrderProInfo;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "子订单响应对象")
+public class AppOrderProInfoVO extends AppOrderProInfo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "班级名称")
+    private String classGroupingName;
+
+    @Schema(description = "教练名称")
+    private String coachName;
+}

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

@@ -0,0 +1,49 @@
+package org.jeecg.modules.system.app.vo;
+
+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 java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "分班情况分页响应对象")
+public class ClassGroupingCaseVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 班级名称
+     */
+    private String classGroupingName;
+
+    /**
+     * 教练名称
+     */
+    private Integer coachName;
+
+    /**
+     * 报名人数
+     */
+    private Integer applyNum;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+}

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

@@ -0,0 +1,68 @@
+package org.jeecg.modules.system.app.vo;
+
+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 java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "分班管理分页响应对象")
+public class ClassGroupingVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 课程名称
+     */
+    private String name;
+
+    /**
+     * 课时数量
+     */
+    private Integer classNum;
+
+    /**
+     * 上课地点
+     */
+    private String address;
+
+    /**
+     * 开课时间
+     */
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 报名人数
+     */
+    private Integer applyNum;
+
+    /**
+     * 已分班人数
+     */
+    private Integer alreadyClassGroupingNum;
+
+    /**
+     * 未分班人数
+     */
+    private Integer unClassGroupingNum;
+}

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

@@ -0,0 +1,32 @@
+package org.jeecg.modules.system.app.vo;
+
+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 java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "教练列表响应对象")
+public class CoachInfoVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 教练ID
+     */
+    private String coachUserId;
+
+    /**
+     * 教练名称
+     */
+    private String name;
+}

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

@@ -0,0 +1,51 @@
+package org.jeecg.modules.system.app.vo;
+
+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 java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@AllArgsConstructor
+@NoArgsConstructor
+@Schema(description = "学员信息响应对象")
+public class StudentInfoVO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private String id;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 性别
+     */
+    private String gender;
+    /**
+     * 年龄
+     */
+    private Integer age;
+    /**
+     * 学校名称
+     */
+    private String schoolName;
+    /**
+     * 年级+班级
+     */
+    private String levelInfo;
+    /**
+     * 是否选择
+     */
+    private Boolean orChoose;
+}