Browse Source

Merge branch 'master_saas' of http://git.dayaedu.com/yonge/mec into master_saas

yonge 3 years ago
parent
commit
95f40331d9

+ 15 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java

@@ -204,12 +204,27 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
     StudentPaymentOrderExportDto getFeeByType(@Param("orderId") Long orderId);
 
     /**
+     * 获取订单的各类型费用
+     *
+     * @param orderIdList
+     * @return
+     */
+    List<StudentPaymentOrderExportDto> queryFeeByType(@Param("orderIdList") List<Long> orderIdList);
+
+    /**
      * 获取打包辅件中乐保
      * @param orderId
      * @return
      */
     BigDecimal getChildRepair(@Param("orderId") Long orderId);
 
+    /**
+     * 获取打包辅件中乐保
+     * @param orderIdList
+     * @return
+     */
+    List<Map<Long,BigDecimal>> queryChildRepair(@Param("orderIdList") List<Long> orderIdList);
+
     //统计外部销售收入总金额
     List<Map<Long, String>> sumOutOrderAmount(@Param("outOrderList") List<Long> outOrderList);
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java

@@ -452,4 +452,6 @@ public interface StudentPaymentOrderDao extends BaseDAO<Long, StudentPaymentOrde
 
     StudentPaymentOrderVo queryOrderDetail(@Param("orderNo") String orderNo);
 
+    //获取学员之前的乐团缴费订单数量
+    int getStudentMusicOrderNum(@Param("musicGroupId") String musicGroupId, @Param("userId") Integer userId, @Param("orderId") Long orderId);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ManagerDownload.java

@@ -40,7 +40,7 @@ public class ManagerDownload extends BaseEntity {
     /**
      * 状态
      */
-    @ApiModelProperty(value = "状态")
+    @ApiModelProperty(value = "状态0下载中、1成功、2失败")
     private Integer status=0;
 
     /**

+ 25 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentBasicInfo.java

@@ -3,6 +3,8 @@ package com.ym.mec.biz.dal.entity;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import java.math.BigDecimal;
+
 /**
  * 对应数据库表(student_basic_info):
  */
@@ -55,7 +57,29 @@ public class StudentBasicInfo {
 	/** 声部课老师(学员所在乐团声部班老师) */
 	@ApiModelProperty(value = "声部课老师",required = false)
 	private String subjectTeacherName;
-	
+
+	@ApiModelProperty(value = "课程余额",required = false)
+	private BigDecimal courseBalance = BigDecimal.ZERO;
+
+	@ApiModelProperty(value = "学员状态",required = false)
+	private String studentStatus;
+
+	public String getStudentStatus() {
+		return studentStatus;
+	}
+
+	public void setStudentStatus(String studentStatus) {
+		this.studentStatus = studentStatus;
+	}
+
+	public BigDecimal getCourseBalance() {
+		return courseBalance;
+	}
+
+	public void setCourseBalance(BigDecimal courseBalance) {
+		this.courseBalance = courseBalance;
+	}
+
 	public void setUserId(Integer userId){
 		this.userId = userId;
 	}

+ 4 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentStatisticsQueryInfo.java

@@ -15,7 +15,7 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "声部编号",required = false)
     private Integer subjectId;
 
-    @ApiModelProperty(value = "学员状态,在读(NORMAL)、沉睡(SLEEPY)、流失(LOST)",required = false)
+    @ApiModelProperty(value = "学员状态,在读(NORMAL)、沉睡(SLEEPY)、流失(LOST), PAUSE(暂停)",required = false)
     private String studentStatus;
 
     @ApiModelProperty(value = "回访状态,THINKING(考虑中), PENDING_PAYMENT(确认缴费待缴费),LOST(流失), PAUSE(暂停),OTHER(其他)",required = false)
@@ -40,7 +40,7 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
     private Integer musicDirectorId;
 
     @ApiModelProperty(value = "是否查询课耗异常",required = false)
-    private boolean courseConsumerError = false;
+    private Boolean courseConsumerError;
 
     @ApiModelProperty(value = "第一次课开始时间(年月日)",required = false)
     private String firstCourseStartTime;
@@ -139,11 +139,11 @@ public class StudentStatisticsQueryInfo extends QueryInfo {
         this.musicDirectorId = musicDirectorId;
     }
 
-    public boolean isCourseConsumerError() {
+    public Boolean getCourseConsumerError() {
         return courseConsumerError;
     }
 
-    public void setCourseConsumerError(boolean courseConsumerError) {
+    public void setCourseConsumerError(Boolean courseConsumerError) {
         this.courseConsumerError = courseConsumerError;
     }
 

+ 87 - 35
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -1563,7 +1563,7 @@ public class ExportServiceImpl implements ExportService {
         if (count > 50000) {
             return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
         }
-        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER,sysUser.getId());
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER_LIST_SUM,sysUser.getId());
         ExecutorService executor = Executors.newCachedThreadPool();
         CompletableFuture.runAsync(()->{
             try {
@@ -1647,6 +1647,20 @@ public class ExportServiceImpl implements ExportService {
         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(outOrderList)){
             outOrderAmountMap = MapUtil.convertIntegerMap(sellOrderDao.sumOutOrderAmount(outOrderList));
         }
+        List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
+                && e.getGroupType() != GroupType.REPLACEMENT
+                && e.getGroupType() != GroupType.PRACTICE
+                && e.getGroupType() != GroupType.SPORADIC
+                && e.getGroupType() != GroupType.MEMBER
+                && e.getGroupType() != GroupType.ACTIVITY
+                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
+        Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
+        Map<Long, BigDecimal> childRepairMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(otherOrderIds)){
+            List<StudentPaymentOrderExportDto> feeByType = sellOrderDao.queryFeeByType(otherOrderIds);
+            feeByTypeMap = feeByType.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
+            childRepairMap = MapUtil.convertIntegerMap(sellOrderDao.queryChildRepair(otherOrderIds));
+        }
 
         for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
             if (row.getActualAmount() == null) {
@@ -1890,27 +1904,42 @@ public class ExportServiceImpl implements ExportService {
                     row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.LARGE_MUSICAL);
                 }
             } else {
-                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
-                BigDecimal childRepairFee = sellOrderDao.getChildRepair(row.getId());
-                row.setMusicalFee(feeByType.getMusicalFee());
-                row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
-                row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
-                row.setOtherFee(feeByType.getOtherFee());
-                if (row.getGroupType().equals(GroupType.MUSIC)) {
-                    StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
-                    if (studentRegistration != null) {
-                        row.setSubjectName(studentRegistration.getSubjectName());
-                        row.setSchoolName(studentRegistration.getSchoolName());
-                        row.setCooperationOrganName(studentRegistration.getRemark());
-                        row.setEduTeacher(studentRegistration.getName());
+                List<StudentPaymentOrderExportDto> exportDtoList = feeByTypeMap.get(row.getId());
+                if(!CollectionUtils.isEmpty(exportDtoList)){
+                    StudentPaymentOrderExportDto feeByType = exportDtoList.get(0);
+                    BigDecimal childRepairFee = childRepairMap.get(row.getId()) == null?BigDecimal.ZERO:childRepairMap.get(row.getId());
+//                    StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
+//                    BigDecimal childRepairFee = sellOrderDao.getChildRepair(row.getId());
+                    row.setMusicalFee(feeByType.getMusicalFee());
+                    row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
+                    row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
+                    row.setOtherFee(feeByType.getOtherFee());
+                    if (row.getGroupType().equals(GroupType.MUSIC)) {
+                        if(row.getType() != OrderTypeEnum.APPLY && row.getType() != OrderTypeEnum.ADD_STUDENT){
+                            //判断之前是否有付费订单,如果没有,那么是乐团转化
+                            int orderNum = studentPaymentOrderDao.getStudentMusicOrderNum(row.getMusicGroupId(),row.getUserId(),row.getId());
+                            if(orderNum == 0){
+                                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.MUSIC_CONVERT);
+                            }
+                        }
+                        StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(row.getMusicGroupId(), row.getUserId());
+                        if (studentRegistration != null) {
+                            row.setSubjectName(studentRegistration.getSubjectName());
+                            row.setSchoolName(studentRegistration.getSchoolName());
+                            row.setCooperationOrganName(studentRegistration.getRemark());
+                            row.setEduTeacher(studentRegistration.getName());
+                        }
+                        row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).
+                                subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).
+                                subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()).
+                                subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()));
+                    } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
+                        row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
+                    } else if (row.getType().equals(OUTORDER)) {
+                        row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()));
+                        row.setTransferFee(BigDecimal.ZERO);
+                        row.setPlatformFee(BigDecimal.ZERO);
                     }
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()));
-                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
-                    row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
-                } else if (row.getType().equals(OUTORDER)) {
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()));
-                    row.setTransferFee(BigDecimal.ZERO);
-                    row.setPlatformFee(BigDecimal.ZERO);
                 }
             }
             //如果合作单位不存在取学员的第一个乐团的合作单位,乐团主管
@@ -1994,6 +2023,20 @@ public class ExportServiceImpl implements ExportService {
         if(org.apache.commons.collections.CollectionUtils.isNotEmpty(outOrderList)){
             outOrderAmountMap = MapUtil.convertIntegerMap(sellOrderDao.sumOutOrderAmount(outOrderList));
         }
+        List<Long> otherOrderIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() != GroupType.GOODS_SELL
+                && e.getGroupType() != GroupType.REPLACEMENT
+                && e.getGroupType() != GroupType.PRACTICE
+                && e.getGroupType() != GroupType.SPORADIC
+                && e.getGroupType() != GroupType.MEMBER
+                && e.getGroupType() != GroupType.ACTIVITY
+                && e.getGroupType() != GroupType.VIP).map(e -> e.getId()).collect(Collectors.toList());
+        Map<Long, List<StudentPaymentOrderExportDto>> feeByTypeMap = new HashMap<>();
+        Map<Long, BigDecimal> childRepairMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(otherOrderIds)){
+            List<StudentPaymentOrderExportDto> feeByType = sellOrderDao.queryFeeByType(otherOrderIds);
+            feeByTypeMap = feeByType.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
+            childRepairMap = MapUtil.convertIntegerMap(sellOrderDao.queryChildRepair(otherOrderIds));
+        }
         for (StudentPaymentOrderExportDto row : studentPaymentOrderExportDtos) {
             if (row.getActualAmount() == null) {
                 row.setActualAmount(BigDecimal.ZERO);
@@ -2144,18 +2187,24 @@ public class ExportServiceImpl implements ExportService {
                     row.setLargeMusicalFee(row.getActualAmount());
                 }
             } else {
-                StudentPaymentOrderExportDto feeByType = sellOrderDao.getFeeByType(row.getId());
-                BigDecimal childRepairFee = sellOrderDao.getChildRepair(row.getId());
-                row.setMusicalFee(feeByType.getMusicalFee());
-                row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
-                row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
-                row.setOtherFee(feeByType.getOtherFee());
-                if (row.getGroupType().equals(GroupType.MUSIC)) {
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()));
-                } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
-                    row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
-                } else if (row.getType().equals(OUTORDER)) {
-                    row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()));
+                List<StudentPaymentOrderExportDto> exportDtoList = feeByTypeMap.get(row.getId());
+                if(!CollectionUtils.isEmpty(exportDtoList)){
+                    StudentPaymentOrderExportDto feeByType = exportDtoList.get(0);
+                    BigDecimal childRepairFee = childRepairMap.get(row.getId()) == null?BigDecimal.ZERO:childRepairMap.get(row.getId());
+                    row.setMusicalFee(feeByType.getMusicalFee());
+                    row.setTeachingFee(feeByType.getTeachingFee().subtract(childRepairFee));
+                    row.setMaintenanceProductFee(feeByType.getRepairFee().add(childRepairFee));
+                    row.setOtherFee(feeByType.getOtherFee());
+                    if (row.getGroupType().equals(GroupType.MUSIC)) {
+                        row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).
+                                subtract(row.getTeachingFee()).subtract(row.getMaintenanceFee()).subtract(row.getMaintenanceProductFee()).
+                                subtract(feeByType.getOtherFee()).subtract(row.getLeaseFee()).subtract(row.getCloudTeacherFee()).
+                                subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()));
+                    } else if (row.getType().equals(OrderTypeEnum.REPAIR)) {
+                        row.setRepairFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getOtherFee()));
+                    }else if (row.getType().equals(OUTORDER)) {
+                        row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(row.getTeachingFee()).subtract(row.getMaintenanceProductFee()).subtract(feeByType.getOtherFee()));
+                    }
                 }
             }
             row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
@@ -3007,9 +3056,12 @@ public class ExportServiceImpl implements ExportService {
                     "回访状态","原因","回访日期"},
             new String[]{"studentBasicInfo.organName", "studentBasicInfo.userName", "studentBasicInfo.userId",
                     "studentBasicInfo.phone","studentBasicInfo.subjectName", "studentBasicInfo.cooperationOrganName", "studentBasicInfo.grade",
-                    "overCourseNum > 0 && subCourseNum > 0 && latelyYearCourseConsumer < 1 ? '沉睡' : (noScheduleNum > 0 || subCourseNum > 0) && (latelyYearCourseConsumer > 0 || overCourseNum <= 0) ? '在读':''",
+                    "studentBasicInfo.studentStatus",
                     "noScheduleNum","totalCourseNum", "overCourseNum", "subCourseNum","preCourseFee","firstCourseTime","lastCourseTime","teacherId","teacherName","musicDirectorId","musicDirectorName",
-                    "studentBasicInfo.subjectTeacherId","studentBasicInfo.subjectTeacherName","latelyCourseConsumer","visitNum","lastVisitStatus","visitReason","lastVisitTime"}, rows);
+                    "studentBasicInfo.subjectTeacherId","studentBasicInfo.subjectTeacherName","latelyCourseConsumer","visitNum",
+                    "lastVisitStatus == null?'':lastVisitStatus == 'LOST' ? '流失':lastVisitStatus == 'THINKING' ? '考虑中':" +
+                    "lastVisitStatus == 'PENDING_PAYMENT' ? '确认缴费待缴费':lastVisitStatus == 'PAUSE' ? '暂停':lastVisitStatus == 'OTHER' ? '其他':''"
+                    ,"visitReason","lastVisitTime"}, rows);
 
             workbook.write(fileOutputStream);
             fileOutputStream.getFD().sync();

+ 6 - 6
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -1878,8 +1878,8 @@
 		       COUNT(DISTINCT spo.id_) total_num_,
 		       'STUDENT_VIP_ORDER_NUM' data_type_,spo.user_id_ extend_info_,spo.tenant_id_
 		FROM (SELECT id_,user_id_,organ_id_,activity_id_,music_group_id_,calender_id_,type_,group_type_,
-		             DATE_FORMAT(pay_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
-		WHERE status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
+		             DATE_FORMAT(create_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
+		WHERE status_ = 'SUCCESS' AND DATE_FORMAT(create_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
 		LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
 		LEFT JOIN vip_group_activity vga ON FIND_IN_SET(vga.id_,spo.activity_id_)
 		LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
@@ -1899,8 +1899,8 @@
 			   COUNT(DISTINCT spo.id_) total_num_,
 			   'STUDENT_THEORY_ORDER_NUM' data_type_,spo.user_id_ extend_info_,spo.tenant_id_
 		FROM (SELECT id_,user_id_,organ_id_,activity_id_,music_group_id_,calender_id_,type_,group_type_,
-					 DATE_FORMAT(pay_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
-			  WHERE status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
+					 DATE_FORMAT(create_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
+			  WHERE status_ = 'SUCCESS' AND DATE_FORMAT(create_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
 				 LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
 				 LEFT JOIN vip_group_activity vga ON FIND_IN_SET(vga.id_,spo.activity_id_)
 				 LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
@@ -1919,8 +1919,8 @@
 			   COUNT(DISTINCT spo.id_) total_num_,
 			   'STUDENT_PRACTICE_ORDER_NUM' data_type_,spo.user_id_ extend_info_,spo.tenant_id_
 		FROM (SELECT id_,user_id_,organ_id_,activity_id_,music_group_id_,calender_id_,type_,group_type_,
-					 DATE_FORMAT(pay_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
-			  WHERE status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
+					 DATE_FORMAT(create_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
+			  WHERE status_ = 'SUCCESS' AND DATE_FORMAT(create_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
 				 LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
 		WHERE spo.type_ = 'PRACTICE_GROUP_BUY' OR spo.type_ = 'PRACTICE_GROUP_RENEW' OR (spo.group_type_ = 'MUSIC' AND spod.type_ = 'PRACTICE')
 		GROUP BY spo.user_id_,spo.create_time_,spo.organ_id_;

+ 25 - 0
mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml

@@ -615,9 +615,34 @@
         WHERE spo.id_ = #{orderId}
     </select>
 
+    <select id="queryFeeByType" resultType="com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto">
+        SELECT spo.id_,MAX(spo.actual_amount_)                                actualAmount,
+               SUM(IF(g.type_ = 'INSTRUMENT', so.actual_amount_, 0))  musicalFee,
+               SUM(IF((g.type_ = 'ACCESSORIES' || g.type_ = 'TEACHING' || g.type_ = 'STAFF')  AND g.name_ !='乐器维护',IFNULL(so.actual_amount_,0), 0)) teachingFee,
+               SUM(IF((g.type_ = 'ACCESSORIES' || g.type_ = 'TEACHING' || g.type_ = 'STAFF')  AND g.name_ ='乐器维护',IFNULL(so.actual_amount_,0), 0)) repairFee,
+               SUM(IF((g.type_= 'OTHER' || g.type_ IS NULL) ,IFNULL(so.actual_amount_,0), 0)) otherFee
+        FROM student_payment_order spo
+                 LEFT JOIN sell_order so ON spo.id_ = so.order_id_
+                 LEFT JOIN goods g ON IF(so.parent_goods_id_ IS NOT NULL,g.id_ = so.parent_goods_id_,g.id_ = so.goods_id_)
+        WHERE spo.id_ IN
+        <foreach collection="orderIdList" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+        GROUP BY spo.id_
+    </select>
+
     <select id="getChildRepair" resultType="decimal">
         SELECT IFNULL(SUM(actual_amount_),0) FROM sell_order WHERE order_id_ = #{orderId} AND goods_id_ = 76 AND parent_goods_id_ > 0
     </select>
+
+    <select id="queryChildRepair" resultType="java.util.Map">
+        SELECT order_id_ 'key',IFNULL(SUM(actual_amount_),0) 'value' FROM sell_order
+        WHERE goods_id_ = 76 AND parent_goods_id_ > 0 AND order_id_ IN
+        <foreach collection="orderIdList" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+        GROUP BY order_id_
+    </select>
     <select id="sumOutOrderAmount" resultType="java.util.Map">
         SELECT order_id_ 'key',SUM(actual_amount_) 'value' FROM sell_order
         WHERE order_id_ IN

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -1056,6 +1056,10 @@
              student_payment_order_detail as b on a.id_ = b.payment_order_id_
         where order_no_ = #{orderNo}
     </select>
+    <select id="getStudentMusicOrderNum" resultType="int">
+        SELECT COUNT(0) FROM student_payment_order spo
+        WHERE spo.music_group_id_ = #{musicGroupId} AND spo.user_id_ = #{userId} AND group_type_ = 'MUSIC' AND status_ = 'SUCCESS' AND spo.id_ &lt; #{orderId}
+    </select>
 
 
 </mapper>

+ 23 - 11
mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml

@@ -175,6 +175,8 @@
 			<result column="cooperation_organ_name_" property="cooperationOrganName" />
 			<result column="subject_teacher_id_" property="subjectTeacherId" />
 			<result column="subject_teacher_name_" property="subjectTeacherName" />
+			<result column="course_balance_" property="courseBalance" />
+			<result column="student_status_" property="studentStatus" />
 		</association>
 	</resultMap>
 	<sql id="queryStatisticsSql">
@@ -193,11 +195,14 @@
 					AND ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0
 				</if>
 				<if test="studentStatus == 'LOST'">
-					AND ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0
+					AND ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0
+				</if>
+				<if test="studentStatus == 'PAUSE'">
+					AND suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0
 				</if>
 			</if>
 			<if test="studentStatus == null or studentStatus == ''">
-				AND (ss.over_course_num_ > 0 OR ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0)
+				AND (ss.over_course_num_ > 0 OR ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0)
 			</if>
 			<if test="feedbackType != null and feedbackType != ''">
 				AND ss.last_visit_status_ = #{feedbackType}
@@ -220,9 +225,12 @@
 			<if test="musicDirectorId != null">
 				AND ss.music_director_id_ = #{musicDirectorId}
 			</if>
-			<if test="courseConsumerError != null and courseConsumerError == 'true'">
+			<if test="courseConsumerError != null and courseConsumerError == true">
 				AND ss.lately_course_consumer_ &lt; 4
 			</if>
+			<if test="courseConsumerError != null and courseConsumerError == false">
+				AND ss.lately_course_consumer_ >= 4
+			</if>
 			<if test="firstCourseStartTime != null">
 				AND ss.first_course_time_ >= #{firstCourseStartTime}
 			</if>
@@ -243,11 +251,19 @@
 	<select id="countStatistics" resultType="java.lang.Integer">
 		SELECT COUNT(sbi.id_) FROM student_basic_info sbi
 		LEFT JOIN student_statistics ss ON ss.user_id_ = sbi.user_id_
+		LEFT JOIN sys_user_cash_account suca ON sbi.user_id_ = suca.user_id_
 		<include refid="queryStatisticsSql"/>
 	</select>
 	<select id="queryStatistics" resultMap="StudentStatisticsDto">
-		SELECT *,ss.not_start_course_fee_ + ss.no_course_fee_ preCourseFee FROM student_basic_info sbi
+		SELECT *,ss.not_start_course_fee_ + ss.no_course_fee_ preCourseFee,
+		CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN '在读'
+		WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 THEN '沉睡'
+		WHEN ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0 THEN '流失'
+		WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN '暂停' ELSE '其他' END student_status_
+		,suca.course_balance_
+		FROM student_basic_info sbi
 		LEFT JOIN student_statistics ss ON ss.user_id_ = sbi.user_id_
+		LEFT JOIN sys_user_cash_account suca ON sbi.user_id_ = suca.user_id_
 		<include refid="queryStatisticsSql"/>
 		<include refid="global.limit"/>
 	</select>
@@ -270,12 +286,7 @@
 		COUNT(CASE WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN 1 ELSE NULL END) 'sleepStudentNoNotSchedule',
 		COUNT(CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN 1 ELSE NULL END) 'normalStudentNum',
 		COUNT(CASE WHEN ((ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0)) AND ss.normal_group_num_ > 0 THEN 1 ELSE NULL END) 'normalStudentHasNormalGroupNum',
-		<if test="groupType == 'PRACTICE'">
-			COUNT(CASE WHEN ss.no_schedule_num_ &lt;= 0 AND ss.sub_course_num_ &lt;= 0 AND ss.over_course_num_ > 0 THEN 1 ELSE NULL END) 'hasCourseBalanceAndNotSubCourseNum',
-		</if>
-		<if test="groupType != 'PRACTICE'">
-			COUNT(CASE WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN 1 ELSE NULL END) 'hasCourseBalanceAndNotSubCourseNum',
-		</if>
+		COUNT(CASE WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN 1 ELSE NULL END) 'hasCourseBalanceAndNotSubCourseNum',
 		COUNT(CASE WHEN ((ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0)) AND ss.no_schedule_num_ > 0 THEN 1 ELSE NULL END) 'normalStudentHasNoScheduleNum',
 		COUNT(CASE WHEN (ss.no_schedule_num_ + ss.sub_course_num_) &lt; 4 THEN 1 ELSE NULL END) 'waitRenewNum',
 		SUM(ss.sub_course_num_) 'subCourseNum',
@@ -283,7 +294,8 @@
 		FROM student_statistics ss
 		LEFT JOIN sys_user_cash_account suca ON ss.user_id_ = suca.user_id_
 		LEFT JOIN student_basic_info sbi ON ss.user_id_ = sbi.user_id_
-		WHERE ss.group_type_ = #{groupType} AND (ss.over_course_num_ > 0 OR ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0)
+		WHERE ss.group_type_ = #{groupType}
+		AND (ss.over_course_num_ > 0 OR ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0)
 		<if test="organIdList != null and organIdList.size > 0">
 			AND sbi.organ_id_ IN
 			<foreach collection="organIdList" item="organId" open="(" close=")" separator=",">