Browse Source

refactor(national-motion-system):重构订单相关统计方法

-优化课程销售数统计逻辑,使用新方法 getCourseSalesCount
- 重构教练订单数和授课人数统计方法,提高准确性和效率- 调整场地销售统计逻辑,优化查询性能
SheepHy 1 week ago
parent
commit
37b9e4e0c4

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

@@ -117,7 +117,7 @@ public class AppHomeServiceImpl implements IAppHomeService {
                     .map(course -> {
                         InstructorVO.CourseInfoVO vo = new InstructorVO.CourseInfoVO();
                         BeanUtils.copyProperties(course,vo);
-                        vo.setCount(appCoursesMapper.selectCount(Wrappers.<AppCourses>lambdaQuery().eq(AppCourses::getUserId, userId)));
+                        vo.setCount((long) getCourseSalesCount(course.getId()));
                         vo.setSellingPrice(course.getSellingPrice());
                         return vo;
                     })
@@ -418,6 +418,20 @@ public class AppHomeServiceImpl implements IAppHomeService {
         return searchInstructorVOPage;
     }
 
+    /**
+     * @Author SheepHy
+     * @Description 计算当前课程销售数
+     * @Date 15:47 2025/7/8
+     * @Param id 课程id
+     * @return int 课程年销售数
+     **/
+    private int getCourseSalesCount(String id) {
+        return Math.toIntExact(appOrderProInfoMapper.selectCount(
+                Wrappers.<AppOrderProInfo>lambdaQuery()
+                        .eq(AppOrderProInfo::getProductId, id)
+        ));
+    }
+
     /**
      * @description 根据教练ID获取教练订单数
      * params

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

@@ -14,6 +14,7 @@ import org.jeecg.modules.app.vo.coach.AppCoachVO;
 import org.jeecg.modules.app.vo.course.CourseRequestVo;
 import org.jeecg.modules.app.vo.course.CourseResponseVo;
 import org.jeecg.modules.system.app.entity.AppCategory;
+import org.jeecg.modules.system.app.entity.AppCourses;
 import org.jeecg.modules.system.app.entity.AppOrder;
 import org.jeecg.modules.system.app.entity.AppOrderProInfo;
 import org.jeecg.modules.system.app.mapper.*;
@@ -28,6 +29,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 @Log4j2
@@ -98,21 +100,66 @@ public class CoachServiceImpl implements ICoachService {
 
             }
         }
-        Long  teachingCount=0L;
-        Long  orderNumCount=0L;
-        List<String> byInstructorId = appCoursesMapper.findByInstructorId(appCoachDetailsVO.getUserId());
-        //缺少授课人数和订单数,评价
-        if (byInstructorId!=null&&!byInstructorId.isEmpty()){
-            teachingCount=   appOrderMapper.findByTeachingCount(byInstructorId);
-            orderNumCount=   appOrderMapper.findByOrderNumCount(byInstructorId);
-        }
-
-        appCoachDetailsVO.setClassesNumber(teachingCount);
-        appCoachDetailsVO.setOrderNumber(orderNumCount);
+        appCoachDetailsVO.setClassesNumber((long) getInstructorTeachingNum(userId));
+        appCoachDetailsVO.setOrderNumber((long) getInstructorOrderNum(userId));
         return Result.ok(appCoachDetailsVO);
     }
 
+    /**
+     * @description 根据教练ID获取教练订单数
+     * params
+     * @author SheepHy
+     * @date 2025/9/10
+     * return   {@link }
+     **/
+    private int getInstructorOrderNum(String id) {
+        List<String> courseIds = appCoursesMapper.selectList(
+                        Wrappers.<AppCourses>lambdaQuery()
+                                .select(AppCourses::getId)
+                                .eq(AppCourses::getUserId, id)
+                ).stream()
+                .map(AppCourses::getId)
+                .collect(Collectors.toList());
+        if(courseIds.isEmpty()) return 0;
+        return Math.toIntExact(appOrderProInfoMapper.selectCount(
+                Wrappers.<AppOrderProInfo>lambdaQuery()
+                        .eq(AppOrderProInfo::getStatus,0)
+                        .eq(AppOrderProInfo::getDelFlag,0)
+                        .in(AppOrderProInfo::getProductId, courseIds)
+        ));
+    }
 
+    /**
+     * @description 根据教练ID获取授课人数(基于familyUserId去重统计)
+     * @param id 教练ID
+     * @author SheepHy
+     * @date 2025/9/10
+     * @return 去重后的授课人数
+     **/
+    private int getInstructorTeachingNum(String id) {
+        List<String> courseIds = appCoursesMapper.selectList(
+                        Wrappers.<AppCourses>lambdaQuery()
+                                .select(AppCourses::getId)
+                                .eq(AppCourses::getUserId, id)
+                ).stream()
+                .map(AppCourses::getId)
+                .collect(Collectors.toList());
+        if (courseIds.isEmpty()) return 0;
+        // 查询不重复的familyUserId数量
+        List<String> distinctFamilyUserIds = appOrderProInfoMapper.selectList(
+                        Wrappers.<AppOrderProInfo>lambdaQuery()
+                                .select(AppOrderProInfo::getFamilyUserId)
+                                .in(AppOrderProInfo::getProductId, courseIds)
+                                .eq(AppOrderProInfo::getStatus, 0)
+                                .eq(AppOrderProInfo::getDelFlag, 0)
+                                .isNotNull(AppOrderProInfo::getFamilyUserId)
+                ).stream()
+                .map(AppOrderProInfo::getFamilyUserId)
+                .distinct()
+                .collect(Collectors.toList());
+
+        return distinctFamilyUserIds.size();
+    }
     /**
      * @Author SheepHy
      * @Description 计算当前课程年销售数

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

@@ -170,21 +170,14 @@ public class DetailServiceImpl implements IDetailService {
                         .eq(AppSitePriceRules::getSitePlaceId, appSitePlace.getId())
                         .last("limit 1").orderByDesc(AppSitePriceRules::getSellingPrice));
                 PlaceInfoVO.PlaceInfoMsgVO placeInfoMsgVO = new PlaceInfoVO.PlaceInfoMsgVO();
-                // 1. 先获取所有符合条件的订单ID列表(单次查询)
-                List<String> orderIdList = appOrderMapper.selectList(Wrappers.<AppOrder>lambdaQuery()
-                                .select(AppOrder::getId)
-                                .eq(AppOrder::getOrgCode, appSitePlace.getOrgCode())
-                                .eq(AppOrder::getType, 0)
-                                .eq(AppOrder::getOrderType, 0))
-                        .stream()
-                        .map(order -> order.getId().toString())
-                        .collect(Collectors.toList());
-
-                // 2. 判断空集合
                 int salesCount = 0;
+                List<String> orderIdList = appSitePriceRulesMapper.selectList(Wrappers.<AppSitePriceRules>lambdaQuery()
+                        .eq(AppSitePriceRules::getSitePlaceId, appSitePlace.getId())
+                        .eq(AppSitePriceRules::getStatus, 0))
+                        .stream().map(AppSitePriceRules::getId).collect(Collectors.toList());
                 if (!orderIdList.isEmpty()) {
                     salesCount = Math.toIntExact(appOrderProInfoMapper.selectCount(Wrappers.<AppOrderProInfo>lambdaQuery()
-                            .in(AppOrderProInfo::getOrderId, orderIdList)));
+                            .in(AppOrderProInfo::getProductId, orderIdList)));
                 }
                 placeInfoMsgVO.setName(appSitePlace.getName())
                         .setId(appSitePlace.getId())

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

@@ -30,20 +30,7 @@
                 LEFT JOIN nm_site_price_rules b
                           ON a.id = b.site_place_id
                               AND b.day_of_week = DAYOFWEEK(NOW()) + 1
-                LEFT JOIN (
-                SELECT
-                    org_code,
-                    product_ids,
-                    COUNT(1) AS sales
-                FROM
-                    nm_order
-                WHERE
-                    type = 0
-                GROUP BY
-                    org_code, product_ids
-            ) o
-                          ON a.org_code = o.org_code
-                              AND b.id = o.product_ids
+                LEFT JOIN (SELECT product_id, COUNT(1) AS sales FROM nm_order_pro_info WHERE type = 0 GROUP BY  product_id) o ON b.id = o.product_id
         WHERE
             a.site_id = #{id}
           AND a.type = 2