浏览代码

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

zouxuan 3 年之前
父节点
当前提交
ebe53f676e
共有 40 个文件被更改,包括 1363 次插入254 次删除
  1. 19 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SellOrderDao.java
  2. 1 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentBasicInfoDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentPaymentOrderDao.java
  4. 14 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentStatisticsDao.java
  5. 111 37
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  6. 173 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderSumExportDto.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentRouteOrder.java
  8. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java
  9. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  10. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  11. 4 5
      mec-biz/src/main/java/com/ym/mec/biz/event/CourseStatusChangeEvent.java
  12. 15 61
      mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java
  13. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/event/source/CourseEventSource.java
  14. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java
  15. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java
  16. 5 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  17. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreCategoriesService.java
  18. 7 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java
  19. 16 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java
  20. 462 50
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  21. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  22. 9 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java
  23. 23 8
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java
  24. 8 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  25. 34 4
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreCategoriesServiceImpl.java
  26. 16 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java
  27. 33 0
      mec-biz/src/main/resources/config/mybatis/SellOrderMapper.xml
  28. 13 3
      mec-biz/src/main/resources/config/mybatis/StudentBasicInfoMapper.xml
  29. 4 0
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  30. 13 8
      mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml
  31. 288 19
      mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml
  32. 2 1
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml
  33. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/SysMusicScoreCategoriesController.java
  34. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreCategoriesController.java
  35. 43 10
      mec-web/src/main/java/com/ym/mec/web/controller/SysMusicScoreController.java
  36. 4 3
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  37. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java
  38. 1 0
      mec-web/src/main/resources/columnMapper.ini
  39. 二进制
      mec-web/src/main/resources/excelTemplate/财务管理导入模板.xls
  40. 8 4
      mec-web/src/main/resources/exportColumnMapper.ini

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

@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Param;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
@@ -203,9 +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);
 }

+ 1 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentBasicInfoDao.java

@@ -1,14 +1,12 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.StudentBasicInfo;
-import org.apache.ibatis.annotations.Param;
+import com.ym.mec.common.dal.BaseDAO;
 
 public interface StudentBasicInfoDao extends BaseDAO<Integer, StudentBasicInfo> {
 
 
     Integer getMaxId();
 
-    //更新声部班老师
     void updateSubjectTeacher();
 }

+ 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);
 }

+ 14 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentStatisticsDao.java

@@ -12,29 +12,32 @@ import java.util.Map;
 public interface StudentStatisticsDao extends BaseDAO<Integer, StudentStatistics> {
 
     //更新乐团主管、指导老师
-    void updateTeacherAndEdu();
+    List<StudentStatistics> queryStatisticsTeacherAndEdu();
+
+    //更新乐团主管、指导老师
+    List<StudentStatistics> queryStatisticsTeacherAndEdu2();
 
     //更新总课时数、已完成、剩余课时数、最近30天课耗
-    void updateCourseNum();
+    List<StudentStatistics> queryStatisticsCourseNum();
 
     //更新未排课总数
-    void updateNoCourseNum();
+    List<StudentStatistics> queryStatisticsNoCourseNum();
 
     //更新未开始价值
-    void updateNotStartCourseFee();
+    List<StudentStatistics> queryStatisticsNotStartCourseFee();
 
     //更新未排课课程价值
-    void updateNoCourseFee();
+    List<StudentStatistics> queryStatisticsNoCourseFee();
 
     //更新第一次课的时间\最近一次课时间
-    void updateFirstAndLastCourseTime();
+    List<StudentStatistics> queryStatisticsFirstAndLastCourseTime();
 
     int countStatistics(Map<String, Object> params);
 
     List<StudentStatisticsDto> queryStatistics(Map<String, Object> params);
 
     //更新进行中课程组数量
-    void updateNormalGroupNum();
+    List<StudentStatistics> queryStatisticsNormalGroupNum();
 
     //汇总小课数据
     StudentStatisticsSumDto studentSmallClassStatisticsSum(@Param("groupType") String groupType, @Param("organIdList") List<Integer> organIdList);
@@ -56,4 +59,8 @@ public interface StudentStatisticsDao extends BaseDAO<Integer, StudentStatistics
 
     //获取乐团主管
     List<Integer> queryDirectorList(@Param("groupType") String groupType);
+
+    void clean();
+
+    void batchUpdate(@Param("statisticsList") List<StudentStatistics> statisticsList);
 }

+ 111 - 37
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -1,6 +1,5 @@
 package com.ym.mec.biz.dal.dto;
 
-import com.ym.mec.biz.dal.entity.CourseSchedule;
 import com.ym.mec.biz.dal.entity.Goods;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -11,96 +10,148 @@ import java.math.BigDecimal;
 import java.util.List;
 
 public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
-    //零星费用
+    @ApiModelProperty(value = "分部",required = true)
+    private String organName;
+
+    @ApiModelProperty(value = "零星费用",required = true)
     private BigDecimal sporadicAmount;
 
     //零星费用类型
+    @ApiModelProperty(value = "零星费用类型",required = true)
     private String sporadicType;
 
-    //课程费用(废弃)
-    private BigDecimal courseFee = BigDecimal.ZERO;
-
-    //新生专享(废弃)
-    private BigDecimal highOnlineCourseFee = BigDecimal.ZERO;
-
     //乐器费用
+    @ApiModelProperty(value = "乐器费用",required = true)
     private BigDecimal musicalFee = BigDecimal.ZERO;
 
     //押金费用
+    @ApiModelProperty(value = "押金费用",required = true)
     private BigDecimal leaseFee = BigDecimal.ZERO;
 
     //教辅费用
+    @ApiModelProperty(value = "教辅费用",required = true)
     private BigDecimal teachingFee = BigDecimal.ZERO;
 
     //维修费用
+    @ApiModelProperty(value = "维修费用",required = true)
     private BigDecimal repairFee = BigDecimal.ZERO;
 
     //汇付手续费
+    @ApiModelProperty(value = "汇付手续费",required = true)
     private BigDecimal transferFee = BigDecimal.ZERO;
     
     //平台手续费
+    @ApiModelProperty(value = "平台手续费",required = true)
     private BigDecimal platformFee = BigDecimal.ZERO;
 
-    //乐团课程费用
+    //乐团家长采买课程费用
+    @ApiModelProperty(value = "乐团课程费用",required = true)
     private BigDecimal musicGroupCourseFee = BigDecimal.ZERO;
+
+    //乐团课程费用
+    @ApiModelProperty(value = "乐团学校采买课程费用",required = true)
+    private BigDecimal courseSchoolBuyAmount = BigDecimal.ZERO;
+
     //网络基础训练课程费用
+    @ApiModelProperty(value = "网络基础训练课程费用",required = true)
     private BigDecimal highCourseFee = BigDecimal.ZERO;
+
     //VIP课程费用
+    @ApiModelProperty(value = "VIP课程费用",required = true)
     private BigDecimal vipCourseFee = BigDecimal.ZERO;
+
     //网管课程费用
+    @ApiModelProperty(value = "网管课程费用",required = true)
     private BigDecimal practiceCourseFee = BigDecimal.ZERO;
+
     //乐理课程费用
+    @ApiModelProperty(value = "乐理课程费用",required = true)
     private BigDecimal theoryCourseFee = BigDecimal.ZERO;
+
     //考级费用
+    @ApiModelProperty(value = "考级费用",required = true)
     private BigDecimal degreeFee = BigDecimal.ZERO;
+
     //其它费用
+    @ApiModelProperty(value = "其它费用",required = true)
     private BigDecimal otherFee = BigDecimal.ZERO;
+
     //乐保费用
+    @ApiModelProperty(value = "乐保费用",required = true)
     private BigDecimal maintenanceFee = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "零售乐器费用",required = true)
+    private BigDecimal retailGoodsFee = BigDecimal.ZERO;
+
+    @ApiModelProperty(value = "大件乐器费用",required = true)
+    private BigDecimal largeMusicalFee = BigDecimal.ZERO;
+
     //商品乐保
+    @ApiModelProperty(value = "商品乐保",required = true)
     private BigDecimal maintenanceProductFee = BigDecimal.ZERO;
+
     //云教练费用
+    @ApiModelProperty(value = "云教练费用",required = true)
     private BigDecimal cloudTeacherFee = BigDecimal.ZERO;
+
     //上门费费用
+    @ApiModelProperty(value = "上门费费用",required = true)
     private BigDecimal visitFee = BigDecimal.ZERO;
+
     //账户充值
+    @ApiModelProperty(value = "账户充值",required = true)
     private BigDecimal rechargeFee = BigDecimal.ZERO;
 
-    private String organName;
-    private String schoolName;
+    @ApiModelProperty(value = "专业",required = true)
     private String subjectName;
+
+    @ApiModelProperty(value = "合作单位",required = true)
     private String cooperationOrganName;
+
     //乐团主管
+    @ApiModelProperty(value = "乐团主管",required = true)
     private String eduTeacher;
 
+    @ApiModelProperty(value = "收费类型",required = true)
     private Integer chargeType;
 
+    @ApiModelProperty(value = "订单详情",required = true)
     private List<StudentPaymentOrderDetail> orderDetailList;
 
+    @ApiModelProperty(value = "商品列表",required = true)
     private List<Goods> goodsList;
 
     //收款账户
+    @ApiModelProperty(value = "收款账户",required = true)
     private String routeMerNo;
 
     //分润金额
+    @ApiModelProperty(value = "分润金额",required = true)
     private BigDecimal routeAmount;
 
     //分润余额
+    @ApiModelProperty(value = "分润余额",required = true)
     private BigDecimal routeBalance;
 
     //分润中的销售费用
+    @ApiModelProperty(value = "分润中的销售费用",required = true)
     private BigDecimal saleAmount = BigDecimal.ZERO;
 
     //分润中的服务费用
+    @ApiModelProperty(value = "分润中的服务费用",required = true)
     private BigDecimal serviceAmount = BigDecimal.ZERO;
-    
+
+    @ApiModelProperty(value = "服务费",required = true)
     private BigDecimal serviceFee = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "分部",required = true)
     private String feeFlag;
 
+    @ApiModelProperty(value = "支付状态",required = true)
     private Integer payingStatus;
 
     //订单金额
+    @ApiModelProperty(value = "订单金额",required = true)
     private BigDecimal orderAmount = BigDecimal.ZERO;
 
     public enum TypeDesc implements BaseEnum<String, StudentPaymentOrderExportDto.TypeDesc> {
@@ -109,7 +160,16 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
         RENEW_VIP("RENEW_VIP", "VIP课续费"),
         NEW_MUSIC("NEW_MUSIC", "乐团新开"),
         ADD_MUSIC("ADD_MUSIC", "乐团扩招"),
-        RENEW_MUSIC("RENEW_MUSIC", "乐团续费");
+        RENEW_MUSIC("RENEW_MUSIC", "乐团续费"),
+        MUSIC_CONVERT("MUSIC_CONVERT", "乐团转化"),
+        NEW_PRACTICE("NEW_PRACTICE", "网管课新增"),
+        RENEW_PRACTICE("RENEW_PRACTICE", "网管课续费"),
+        DEGREE_REGISTRATION("DEGREE_REGISTRATION", "考级费用"),
+        REPAIR("REPAIR", "乐器维修"),
+        RETAIL_GOODS("RETAIL_GOODS", "零售乐器/辅件/乐保"),
+        COURSE_SCHOOL_BUY("COURSE_SCHOOL_BUY", "课程学校采买"),
+        COURSE_STUDENT_BUY("COURSE_STUDENT_BUY", "课程家长采买"),
+        LARGE_MUSICAL("LARGE_MUSICAL", "大件乐器");
 
         private String code;
 
@@ -133,14 +193,52 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
     //课程形态描述
     //学员没有历史VIP课程则导出为【VIP课新增】
     //学员有历史VIP课程到导出为【VIP课续费】……
+    @ApiModelProperty(value = "课程形态描述",required = true)
     private TypeDesc typeDesc;
 
     //该笔订单为乐团订单则导出该乐团的【乐团名称】
     //该笔订单非乐团订单时,查询学员是否有在读乐团,无则导出为空,有则导出该学员【进行中】【暂停】乐团名称,进行中>暂停,多个进行中则导出加入乐团时间最近的乐团名称
+    @ApiModelProperty(value = "所在乐团",required = true)
     private String feeMusicGroupId;
 
+    @ApiModelProperty(value = "所在乐团",required = true)
     private String feeMusicGroupName;
 
+    @ApiModelProperty(value = "教学点",required = true)
+    private String schoolName;
+
+    public BigDecimal getCourseSchoolBuyAmount() {
+        return courseSchoolBuyAmount;
+    }
+
+    public void setCourseSchoolBuyAmount(BigDecimal courseSchoolBuyAmount) {
+        this.courseSchoolBuyAmount = courseSchoolBuyAmount;
+    }
+
+    public BigDecimal getRetailGoodsFee() {
+        return retailGoodsFee;
+    }
+
+    public void setRetailGoodsFee(BigDecimal retailGoodsFee) {
+        this.retailGoodsFee = retailGoodsFee;
+    }
+
+    public BigDecimal getLargeMusicalFee() {
+        return largeMusicalFee;
+    }
+
+    public void setLargeMusicalFee(BigDecimal largeMusicalFee) {
+        this.largeMusicalFee = largeMusicalFee;
+    }
+
+    public String getSchoolName() {
+        return schoolName;
+    }
+
+    public void setSchoolName(String schoolName) {
+        this.schoolName = schoolName;
+    }
+
     public String getFeeMusicGroupName() {
         return feeMusicGroupName;
     }
@@ -221,14 +319,6 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
         this.organName = organName;
     }
 
-    public String getSchoolName() {
-        return schoolName;
-    }
-
-    public void setSchoolName(String schoolName) {
-        this.schoolName = schoolName;
-    }
-
     public String getSubjectName() {
         return subjectName;
     }
@@ -269,14 +359,6 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
         this.chargeType = chargeType;
     }
 
-    public BigDecimal getCourseFee() {
-        return courseFee;
-    }
-
-    public void setCourseFee(BigDecimal courseFee) {
-        this.courseFee = courseFee;
-    }
-
     public List<Goods> getGoodsList() {
         return goodsList;
     }
@@ -317,14 +399,6 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrder {
         this.routeBalance = routeBalance;
     }
 
-    public BigDecimal getHighOnlineCourseFee() {
-        return highOnlineCourseFee;
-    }
-
-    public void setHighOnlineCourseFee(BigDecimal highOnlineCourseFee) {
-        this.highOnlineCourseFee = highOnlineCourseFee;
-    }
-
     public BigDecimal getRepairFee() {
         return repairFee;
     }

+ 173 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderSumExportDto.java

@@ -0,0 +1,173 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+
+public class StudentPaymentOrderSumExportDto {
+
+    @ApiModelProperty(value = "分部",required = true)
+    private String organName;
+
+    @ApiModelProperty(value = "vip新增金额",required = true)
+    private BigDecimal newVipAmount;
+
+    @ApiModelProperty(value = "vip续费金额",required = true)
+    private BigDecimal renewVipAmount;
+
+    @ApiModelProperty(value = "乐团新开",required = true)
+    private BigDecimal newMusicAmount;
+
+    @ApiModelProperty(value = "乐团扩招",required = true)
+    private BigDecimal addMusicAmount;
+
+    @ApiModelProperty(value = "乐团续费",required = true)
+    private BigDecimal renewMusicAmount;
+
+    @ApiModelProperty(value = "乐团转化",required = true)
+    private BigDecimal musicConvertAmount;
+
+    @ApiModelProperty(value = "网管课新增",required = true)
+    private BigDecimal newPracticeAmount;
+
+    @ApiModelProperty(value = "网管课续费",required = true)
+    private BigDecimal renewPracticeAmount;
+
+    @ApiModelProperty(value = "考级费用",required = true)
+    private BigDecimal degreeRegistrationAmount;
+
+    @ApiModelProperty(value = "乐器维修",required = true)
+    private BigDecimal repairAmount;
+
+    @ApiModelProperty(value = "零售乐器/辅件/乐保",required = true)
+    private BigDecimal retailGoodsAmount;
+
+    @ApiModelProperty(value = "大件乐器",required = true)
+    private BigDecimal largeMusialAmount;
+
+    @ApiModelProperty(value = "课程家长采买金额",required = true)
+    private BigDecimal courseStudentBuyAmount;
+
+    @ApiModelProperty(value = "课程学校采买金额",required = true)
+    private BigDecimal courseSchoolBuyAmount;
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public BigDecimal getNewVipAmount() {
+        return newVipAmount;
+    }
+
+    public void setNewVipAmount(BigDecimal newVipAmount) {
+        this.newVipAmount = newVipAmount;
+    }
+
+    public BigDecimal getRenewVipAmount() {
+        return renewVipAmount;
+    }
+
+    public void setRenewVipAmount(BigDecimal renewVipAmount) {
+        this.renewVipAmount = renewVipAmount;
+    }
+
+    public BigDecimal getNewMusicAmount() {
+        return newMusicAmount;
+    }
+
+    public void setNewMusicAmount(BigDecimal newMusicAmount) {
+        this.newMusicAmount = newMusicAmount;
+    }
+
+    public BigDecimal getAddMusicAmount() {
+        return addMusicAmount;
+    }
+
+    public void setAddMusicAmount(BigDecimal addMusicAmount) {
+        this.addMusicAmount = addMusicAmount;
+    }
+
+    public BigDecimal getRenewMusicAmount() {
+        return renewMusicAmount;
+    }
+
+    public void setRenewMusicAmount(BigDecimal renewMusicAmount) {
+        this.renewMusicAmount = renewMusicAmount;
+    }
+
+    public BigDecimal getMusicConvertAmount() {
+        return musicConvertAmount;
+    }
+
+    public void setMusicConvertAmount(BigDecimal musicConvertAmount) {
+        this.musicConvertAmount = musicConvertAmount;
+    }
+
+    public BigDecimal getNewPracticeAmount() {
+        return newPracticeAmount;
+    }
+
+    public void setNewPracticeAmount(BigDecimal newPracticeAmount) {
+        this.newPracticeAmount = newPracticeAmount;
+    }
+
+    public BigDecimal getRenewPracticeAmount() {
+        return renewPracticeAmount;
+    }
+
+    public void setRenewPracticeAmount(BigDecimal renewPracticeAmount) {
+        this.renewPracticeAmount = renewPracticeAmount;
+    }
+
+    public BigDecimal getDegreeRegistrationAmount() {
+        return degreeRegistrationAmount;
+    }
+
+    public void setDegreeRegistrationAmount(BigDecimal degreeRegistrationAmount) {
+        this.degreeRegistrationAmount = degreeRegistrationAmount;
+    }
+
+    public BigDecimal getRepairAmount() {
+        return repairAmount;
+    }
+
+    public void setRepairAmount(BigDecimal repairAmount) {
+        this.repairAmount = repairAmount;
+    }
+
+    public BigDecimal getRetailGoodsAmount() {
+        return retailGoodsAmount;
+    }
+
+    public void setRetailGoodsAmount(BigDecimal retailGoodsAmount) {
+        this.retailGoodsAmount = retailGoodsAmount;
+    }
+
+    public BigDecimal getLargeMusialAmount() {
+        return largeMusialAmount;
+    }
+
+    public void setLargeMusialAmount(BigDecimal largeMusialAmount) {
+        this.largeMusialAmount = largeMusialAmount;
+    }
+
+    public BigDecimal getCourseStudentBuyAmount() {
+        return courseStudentBuyAmount;
+    }
+
+    public void setCourseStudentBuyAmount(BigDecimal courseStudentBuyAmount) {
+        this.courseStudentBuyAmount = courseStudentBuyAmount;
+    }
+
+    public BigDecimal getCourseSchoolBuyAmount() {
+        return courseSchoolBuyAmount;
+    }
+
+    public void setCourseSchoolBuyAmount(BigDecimal courseSchoolBuyAmount) {
+        this.courseSchoolBuyAmount = courseSchoolBuyAmount;
+    }
+}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentRouteOrder.java

@@ -6,6 +6,7 @@ import java.util.Date;
 import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.enums.AuditStatusEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 import com.ym.mec.common.entity.BaseEntity;
 
 import static com.ym.mec.biz.dal.enums.AuditStatusEnum.ING;
@@ -92,6 +93,16 @@ public class StudentPaymentRouteOrder extends BaseEntity {
     
     private Organization organ = new Organization();
 
+    private OrderTypeEnum type;
+
+	public OrderTypeEnum getType() {
+		return type;
+	}
+
+	public void setType(OrderTypeEnum type) {
+		this.type = type;
+	}
+
 	public String getIncomeType() {
 		return incomeType;
 	}

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportEnum.java

@@ -33,6 +33,7 @@ public enum ExportEnum implements BaseEnum<String, ExportEnum> {
     COURSE_SCHEDULE_TEACHER_SALARY("COURSE_SCHEDULE_TEACHER_SALARY", "分页导出教师薪酬列表"),
     ORDER_LIST1("ORDER_LIST1", "订单列表导出1"),
     ORDER_LIST2("ORDER_LIST2", "订单列表导出2"),
+    ORDER_LIST_SUM("ORDER_LIST_SUM", "订单列表汇总导出"),
     STUDENT_VIP_PRACTICE("STUDENT_VIP_PRACTICE", "学员小课记录导出"),
     MUSIC_GROUP_STUDENT("MUSIC_GROUP_STUDENT", "乐团导出学员列表"),
     COURSE_REVIEWS("COURSE_REVIEWS", "评论列表导出"),

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -10,7 +10,8 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	STUDENT_MUSIC_THEORY_COURSE_INFO(4, "网管课学员课程信息导出"),
 	STUDENT_VIP_COURSE_INFO(5, "VIP课学员课程信息导出"),
 	VIP_STUDENT_COURSE_MANAGE(6, "vip学员课程管理"),
-	STUDENT_SMALL_CLASS_STATISTICS(7, "学员小课数据统计");
+	STUDENT_SMALL_CLASS_STATISTICS(7, "学员小课数据统计"),
+	ORDER_LIST_SUM(8, "订单汇总");
 
 	private Integer code;
 

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -22,6 +22,9 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     TENANT_RECHARGE("TENANT_RECHARGE", "账户充值"),
     GOODS_SELL("GOODS_SELL", "商品购买"),
     OUTORDER("OUTORDER", "导入订单"),
+    //细分对外订单
+    SCHOOL("SCHOOL", "学校订单"),
+    PERSONAL("PERSONAL", "个人订单"),
     REPAIR("REPAIR", "乐器维修"),
     SUBJECT_CHANGE("SUBJECT_CHANGE", "声部更换"),
     //包含考级费用和乐理课费用,乐理课的费用在detail里面,对于的订单类型是 DEGREE_REGISTRATION

+ 4 - 5
mec-biz/src/main/java/com/ym/mec/biz/event/CourseStatusChangeEvent.java

@@ -3,7 +3,6 @@ package com.ym.mec.biz.event;
 import org.springframework.context.ApplicationEvent;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * @Author qnc99
@@ -11,18 +10,18 @@ import java.util.Set;
  */
 public class CourseStatusChangeEvent extends ApplicationEvent {
 
-    private Set<Long> courseIds;
+    private List<Long> courseIds;
 
-    public CourseStatusChangeEvent(Object source, Set<Long> courseIds) {
+    public CourseStatusChangeEvent(Object source, List<Long> courseIds) {
         super(source);
         this.courseIds = courseIds;
     }
 
-    public Set<Long> getCourseIds() {
+    public List<Long> getCourseIds() {
         return courseIds;
     }
 
-    public void setCourseIds(Set<Long> courseIds) {
+    public void setCourseIds(List<Long> courseIds) {
         this.courseIds = courseIds;
     }
 }

+ 15 - 61
mec-biz/src/main/java/com/ym/mec/biz/event/listener/CourseEventListener.java

@@ -1,23 +1,16 @@
 package com.ym.mec.biz.event.listener;
 
-import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
-import com.ym.mec.biz.dal.entity.CourseScheduleStudentPayment;
 import com.ym.mec.biz.event.CourseStatusChangeEvent;
 import com.ym.mec.biz.service.CourseScheduleStudentPaymentService;
-import com.ym.mec.biz.service.StudentServeService;
-import com.ym.mec.common.redis.service.RedisCache;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * @Author qnc99
@@ -26,61 +19,22 @@ import java.util.stream.Collectors;
 @Component
 public class CourseEventListener {
 
-    private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
-    private final static String KEY = "updateCourseActualPrice";
-
     @Autowired
     private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
-    @Autowired
-    private RedisCache<String, Object> redisCache;
 
-    @Async
     @EventListener
     public void courseStatusChangeMonitor(CourseStatusChangeEvent courseStatusChangeEvent){
-//        if(redisCache.getRedisTemplate().opsForValue().size(KEY)>0){
-//            logger.info("课程状态变更(未执行,任务执行中):{}", courseStatusChangeEvent.getCourseIds());
-//            return;
-//        }
-//
-//        Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent(KEY, Thread.currentThread().getId(), 1, TimeUnit.HOURS);
-//        if(!success){
-//            logger.info("课程状态变更(未执行,任务执行中):{}", courseStatusChangeEvent.getCourseIds());
-//            return;
-//        }
-//
-//        logger.info("课程状态变更(执行开始):{}", courseStatusChangeEvent.getCourseIds());
-
-
-        try{
-            courseScheduleStudentPaymentService.updateCourseActualPrice(null, null, null);
-        } finally {
-            redisCache.delete(KEY);
-        }
-    }
-
-    @Async
-    @EventListener
-    public void courseStatusChangeMonitor2(CourseStatusChangeEvent courseStatusChangeEvent){
-        if(redisCache.getRedisTemplate().opsForValue().size("exercisesSituationStatistics2")>0){
-            return;
-        }
-
-        Boolean success = redisCache.getRedisTemplate().opsForValue().setIfAbsent("exercisesSituationStatistics2", Thread.currentThread().getId(), 1, TimeUnit.HOURS);
-        if(!success){
-            return;
-        }
-
-
-        try{
-//            List<CourseScheduleStudentPayment> cssps = courseScheduleStudentPaymentDao.findByCourseScheduleIds(new ArrayList<>(courseStatusChangeEvent.getCourseIds()));
-//            if(CollectionUtils.isEmpty(cssps)){
-//                return;
-//            }
-//            List<Integer> studentIds = cssps.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
-//            studentServeService.exercisesSituationStatistics2(null,studentIds);
-        } finally {
-            redisCache.delete("exercisesSituationStatistics2");
+        List<Long> courseIds = courseStatusChangeEvent.getCourseIds();
+        if(CollectionUtils.isNotEmpty(courseIds)){
+            ExecutorService executor = Executors.newCachedThreadPool();
+            CompletableFuture.runAsync(()->{
+                try {
+                    //更新课程营收
+                    courseScheduleStudentPaymentService.updateCourseActualPrice(courseIds);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            },executor);
         }
     }
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/event/source/CourseEventSource.java

@@ -5,6 +5,7 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -23,7 +24,7 @@ public class CourseEventSource {
      * @date 2020/12/2 0002
      * @return void
      */
-    public void courseStatusChange(Set<Long> courseIds){
+    public void courseStatusChange(List<Long> courseIds){
         applicationContext.publishEvent(new CourseStatusChangeEvent(this, courseIds));
     }
 

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleService.java

@@ -365,13 +365,13 @@ public interface CourseScheduleService extends BaseService<Long, CourseSchedule>
 	 * 更新课程至结束状态
 	 * @return
 	 */
-	boolean updateCourseScheduleToOverStatus();
+	List<Long> updateCourseScheduleToOverStatus();
 
 	/**
 	 * 更新课程至进行中状态
 	 * @return
 	 */
-	boolean updateCourseScheduleToUnderway();
+	List<Long> updateCourseScheduleToUnderway();
 
 	/**
 	 * @describe 获取老师指定班级的排课

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleStudentPaymentService.java

@@ -122,4 +122,12 @@ public interface CourseScheduleStudentPaymentService extends BaseService<Long, C
 	 */
 	void updateCourseActualPrice(List<String> groupIds, List<Integer> userIds, GroupType groupType);
 
+	/**
+	 * @describe 更新课程营收
+	 * @author qnc99
+	 * @date 2020/12/2 0002
+	 * @return void
+	 */
+	void updateCourseActualPrice(List<Long> courseIds);
+
 }

+ 5 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -268,11 +268,16 @@ public interface ExportService {
     //订单列表导出
     HttpResponseResult orderList(Map<String, Object> info,List<String> headColumns);
 
+    //订单列表汇总导出
+    HttpResponseResult orderListSum(Map<String, Object> info,List<String> headColumns);
+
     //保存下载记录
     ManagerDownload saveManagerDownload(ExportTypeEnum exportTypeEnum, Integer userId);
 
     void orderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
 
+    void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
+
     void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException;
 
     void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload) throws FileNotFoundException;

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicScoreCategoriesService.java

@@ -11,7 +11,7 @@ public interface SysMusicScoreCategoriesService extends BaseService<Integer, Sys
 
     List<SysMusicScoreCategories> queryTree(MusicScoreQueryInfo menuQueryInfo);
     
-    List<SysMusicScoreCategories> queryCategoriesTreeList(String categoryIdList);
+    List<SysMusicScoreCategories> queryCategoriesTreeList(String categoryIdList, Boolean isQueryEnable);
 
     void save(SysMusicScoreCategories musicScoreCategories);
 

+ 7 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -3693,7 +3693,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		//保存日志调整信息
 		saveModifyLog(modifyLogs,courseScheduleIds);
 
-		courseEventSource.courseStatusChange(new HashSet<>(courseScheduleIds));
+		courseEventSource.courseStatusChange(courseScheduleIds);
 
 		imUserFriendService.refreshCourseImUserFriend(courseScheduleId);
 		// 推送
@@ -4195,7 +4195,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean updateCourseScheduleToOverStatus() {
+    public List<Long> updateCourseScheduleToOverStatus() {
 
         Date date = new Date();
         //自动更新课程状态至“已结束”
@@ -4204,6 +4204,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         List<CourseSchedule> updateList = new ArrayList<CourseSchedule>();
         List<Integer> classGroupIds = new ArrayList<Integer>();
         List<Long> courseScheduleIdList = new ArrayList<Long>();
+        List<Long> courseIds = new ArrayList<Long>();
 
         for (CourseSchedule courseSchedule : list) {
             courseSchedule.setStatus(CourseStatusEnum.OVER);
@@ -4226,7 +4227,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 			}catch (Exception e){
 				LOGGER.error("deductAmount  >>>>>>>>>",e.getCause());
 			}
-			List<Long> courseIds = updateList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
+			courseIds = updateList.stream().map(CourseSchedule::getId).collect(Collectors.toList());
 			List<CourseSchedule> beMergeCourses = courseScheduleDao.getBeMergeCourseWithMainCourseIds(courseIds);
 			if(!CollectionUtils.isEmpty(beMergeCourses)){
 				beMergeCourses.forEach(c->c.setStatus(CourseStatusEnum.OVER));
@@ -4242,12 +4243,12 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-		return true;
+		return courseIds;
     }
 
     @Override
 	@Transactional(rollbackFor = Exception.class)
-	public boolean updateCourseScheduleToUnderway() {
+	public List<Long> updateCourseScheduleToUnderway() {
     	Date date = new Date();
     	List<CourseSchedule> list = courseScheduleDao.queryUnderwayWithNoUpdateStatus();
 
@@ -4262,7 +4263,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
         if (updateList.size() > 0) {
             courseScheduleDao.batchUpdate(updateList);
 		}
-		return true;
+		return updateList.stream().map(e->e.getId()).collect(Collectors.toList());
 	}
 
 	@Override

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleStudentPaymentServiceImpl.java

@@ -685,6 +685,22 @@ public class CourseScheduleStudentPaymentServiceImpl extends BaseServiceImpl<Lon
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
+	public void updateCourseActualPrice(List<Long> courseIds) {
+		List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentDao.findByCourseScheduleIds(courseIds);
+		Map<GroupType, List<CourseScheduleStudentPayment>> groupTypeListMap = studentPayments.stream().collect(Collectors.groupingBy(CourseScheduleStudentPayment::getGroupType));
+		for (GroupType groupType : groupTypeListMap.keySet()) {
+			List<CourseScheduleStudentPayment> groupTypePayments = groupTypeListMap.get(groupType);
+			if(CollectionUtils.isEmpty(groupTypePayments)){
+				continue;
+			}
+			List<String> groupIds = groupTypePayments.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toList());
+			List<Integer> userIds = groupTypePayments.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+			this.updateCourseActualPrice(groupIds,userIds,groupType);
+		}
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
 	public void updateCourseActualPrice(List<String> groupIds, List<Integer> userIds, GroupType groupType) {
 		studentDao.lockUser(1);
 		List<CourseScheduleStudentPaymentDto> courseScheduleStudentPayments = courseScheduleStudentPaymentDao.findNeedUpdateActualPriceStudentCourses(groupIds, userIds, groupType);

+ 462 - 50
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -47,6 +47,9 @@ import java.util.concurrent.Executors;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.ym.mec.biz.dal.enums.OrderTypeEnum.OUTORDER;
 
 @Service
 public class ExportServiceImpl implements ExportService {
@@ -339,6 +342,7 @@ public class ExportServiceImpl implements ExportService {
         exportManageFuncMap.put(ExportEnum.ROUTE_ORDER_LIST2, (info,headColumns) -> routeOrderList(info,headColumns));
         exportManageFuncMap.put(ExportEnum.ORDER_LIST1, (info,headColumns) -> orderList(info,headColumns));
         exportManageFuncMap.put(ExportEnum.ORDER_LIST2, (info,headColumns) -> orderList(info,headColumns));
+        exportManageFuncMap.put(ExportEnum.ORDER_LIST_SUM, (info,headColumns) -> orderListSum(info,headColumns));
         exportManageFuncMap.put(ExportEnum.STUDENT_VIP_PRACTICE, (info,headColumns) -> exportStudentVipPractice(info,headColumns));
         exportManageFuncMap.put(ExportEnum.STUDENT_VIP_COURSE_INFO, (info,headColumns) -> exportStudentVipCourseInfo(info,headColumns));
         exportManageFuncMap.put(ExportEnum.STUDENT_MUSIC_THEORY_COURSE_INFO, (info,headColumns) -> exportStudentMusicTheoryCourseInfo(info,headColumns));
@@ -1533,6 +1537,46 @@ public class ExportServiceImpl implements ExportService {
         return succeed;
     }
 
+    //订单列表导出
+    @Override
+    public HttpResponseResult orderListSum(Map<String, Object> info,List<String> headColumns){
+        StudentPaymentOrderQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info),StudentPaymentOrderQueryInfo.class);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null || sysUser.getId() == null){
+            return BaseController.failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(),queryInfo.getOrganId(),sysUser.getIsSuperAdmin()));
+        if (StringUtils.isNotBlank(queryInfo.getSearch())) {
+            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
+            if (userIds.size() <= 0) {
+                userIds.add(0);
+            }
+            queryInfo.setUserIds(userIds);
+        }
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        int count = studentPaymentOrderDao.queryCount(params);
+        if (count <= 0) {
+            return BaseController.failed("没有可导出的数据");
+        }
+        if (count > 50000) {
+            return BaseController.failed("数据集太大,不能导出.最大数据集不能超过50000");
+        }
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ORDER_LIST_SUM,sysUser.getId());
+        ExecutorService executor = Executors.newCachedThreadPool();
+        CompletableFuture.runAsync(()->{
+            try {
+                this.orderListSum(params, managerDownload, headColumns);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        },executor);
+        HttpResponseResult<Object> succeed = BaseController.succeed();
+        succeed.setMsg(managerDownload.getName() + "导出申请已提交,请到【报表中心-下载列表查看】");
+        return succeed;
+    }
+
     //保存下载记录
     @Override
     public ManagerDownload saveManagerDownload(ExportTypeEnum exportTypeEnum, Integer userId){
@@ -1561,7 +1605,7 @@ public class ExportServiceImpl implements ExportService {
         long i = 1;
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
         List<Integer> cooperationOrganIds = studentPaymentOrderExportDtos.stream()
-                .filter(e -> OrderTypeEnum.OUTORDER.equals(e.getType()))
+                .filter(e -> OUTORDER.equals(e.getType()))
                 .filter(e -> e.getMusicGroupId() != null)
                 .map(e -> Integer.valueOf(e.getMusicGroupId()))
                 .distinct()
@@ -1587,6 +1631,8 @@ public class ExportServiceImpl implements ExportService {
         List<Integer> studentIds = studentPaymentOrderExportDtos.stream().map(e -> e.getUserId()).distinct().collect(Collectors.toList());
         //获取学员第一个课程组编号
         Map<Integer, String> userFirstVipMap = MapUtil.convertMybatisMap(courseScheduleStudentPaymentDao.findUserFirstVipMap("VIP",studentIds));
+        //获取学员第一个网管课课程组编号
+        Map<Integer, String> userFirstPracticeMap = MapUtil.convertMybatisMap(courseScheduleStudentPaymentDao.findUserFirstVipMap("PRACTICE",studentIds));
         //获取学员最近加入的一个乐团编号
         Map<Integer, String> userLastMusicIdMap = MapUtil.convertMybatisMap(studentRegistrationDao.getLastMusicGroupId(studentIds));
         Map<Integer, String> userLastMusicNameMap = MapUtil.convertMybatisMap(studentRegistrationDao.getLastMusicGroupName(studentIds));
@@ -1595,6 +1641,26 @@ public class ExportServiceImpl implements ExportService {
         if(musicGroupIds != null && musicGroupIds.size() > 0){
             musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
         }
+        //获取外部订单的商品销售金额
+        List<Long> outOrderList = studentPaymentOrderExportDtos.stream().filter(e -> e.getType() == OUTORDER).map(e -> e.getId()).collect(Collectors.toList());
+        Map<Long,BigDecimal> outOrderAmountMap = new HashMap<>();
+        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) {
@@ -1697,6 +1763,13 @@ public class ExportServiceImpl implements ExportService {
                             }
                             row.setDegreeFee(degreeFee);
                             break;
+                        case PRACTICE:
+                            BigDecimal practiceCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                practiceCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setPracticeCourseFee(practiceCourseFee);
+                            break;
                         case VIP:
                             BigDecimal vipCourseFee = BigDecimal.ZERO;
                             if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
@@ -1807,6 +1880,13 @@ public class ExportServiceImpl implements ExportService {
                     row.setSubjectName(practiceGroup.getSubjectName());
                     row.setEduTeacher(practiceGroup.getEduTeacherName());
                 }
+                if(row.getTypeDesc() == null){
+                    if(Objects.equals(userFirstPracticeMap.get(row.getUserId()),row.getMusicGroupId())){
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_PRACTICE);
+                    }else {
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_PRACTICE);
+                    }
+                }
             } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
                 row.setMusicalFee(row.getActualAmount());
                 ReplacementInstrumentActivityStatDto info = replacementInstrumentActivityDao.getInfo(Integer.parseInt(row.getMusicGroupId()));
@@ -1819,28 +1899,92 @@ public class ExportServiceImpl implements ExportService {
                         row.setEduTeacher(cooperationOrganEduTeacher.getLinkman());
                     }
                 }
+            } else if (row.getGroupType().equals(GroupType.GOODS_SELL)) {
+                row.setRetailGoodsFee(row.getActualAmount());
+                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
             } 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.getGroupType() == GroupType.OUTORDER) {
+                        //销售收入
+                        BigDecimal add = feeByType.getMusicalFee().add(row.getTeachingFee()).add(row.getMaintenanceProductFee()).add(feeByType.getOtherFee());
+                        //服务收入
+                        BigDecimal subtract = feeByType.getActualAmount().subtract(add);
+                        //如果是淘器微信那么就是零售
+                        if(Objects.equals("淘器微信",row.getMerNos()) && add.compareTo(BigDecimal.ZERO) > 0){
+                            //如果有服务收入那么是课程学校采买
+                            row.setMusicalFee(BigDecimal.ZERO);
+                            row.setTeachingFee(BigDecimal.ZERO);
+                            row.setMaintenanceProductFee(BigDecimal.ZERO);
+                            row.setOtherFee(subtract);
+                            row.setRetailGoodsFee(add);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                        }else {
+                            //拆分导入订单
+                            if(row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL){
+                                if(row.getType() == OrderTypeEnum.SCHOOL){
+                                    row.setMusicalFee(BigDecimal.ZERO);
+                                    row.setTeachingFee(BigDecimal.ZERO);
+                                    row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                    row.setOtherFee(BigDecimal.ZERO);
+                                    row.setLargeMusicalFee(add);
+                                }
+                                //如果有服务收入那么是课程学校采买
+                                if(subtract.compareTo(BigDecimal.ZERO) == 0){
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.LARGE_MUSICAL);
+                                }else {
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_SCHOOL_BUY);
+                                }
+                                row.setCourseSchoolBuyAmount(subtract);
+                            }else if(row.getType() == OrderTypeEnum.OTHER){
+                                row.setOtherFee(row.getOtherFee().add(subtract));
+                            }else {
+                                row.setMusicalFee(BigDecimal.ZERO);
+                                row.setTeachingFee(BigDecimal.ZERO);
+                                row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                row.setOtherFee(BigDecimal.ZERO);
+                                row.setRetailGoodsFee(add);
+                                row.setMusicGroupCourseFee(subtract);
+                                //如果有服务收入那么是课程学校采买
+                                if(subtract.compareTo(BigDecimal.ZERO) == 0){
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                                }else {
+                                    row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.COURSE_STUDENT_BUY);
+                                }
+                            }
+                        }
+                        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(OrderTypeEnum.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);
                 }
             }
             //如果合作单位不存在取学员的第一个乐团的合作单位,乐团主管
@@ -1851,7 +1995,7 @@ public class ExportServiceImpl implements ExportService {
                     row.setEduTeacher(cooperationOrgan.getLinkman() != null ? cooperationOrgan.getLinkman() : row.getEduTeacher());
                 }
             }
-            if (row.getType().equals(OrderTypeEnum.OUTORDER) && row.getMusicGroupId() != null) {
+            if (row.getType().equals(OUTORDER) && row.getMusicGroupId() != null) {
                 if (cooperationOrganMap.containsKey(Integer.valueOf(row.getMusicGroupId()))) {
                     row.setCooperationOrganName(cooperationOrganMap.get(Integer.valueOf(row.getMusicGroupId())));
                     CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(Integer.valueOf(row.getMusicGroupId()));
@@ -1888,30 +2032,6 @@ public class ExportServiceImpl implements ExportService {
             Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.ORDER_LIST1, headColumns));
             String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
             String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
-            /*if(isPlatformUser){
-                String[] header = {"序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额",
-                        "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费",
-                        "账户充值", "其它", "汇付手续费","平台手续费", "到账时间",
-                        "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"};
-                
-                String[] body = {"id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",
-                        "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",
-                        "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId",
-                        "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"};
-                workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
-            }else{
-                String[] header = {"序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额",
-                        "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费",
-                        "账户充值", "其它","平台手续费", "到账时间",
-                        "关联乐团ID/VIP课ID", "课程形态", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"};
-                
-                String[] body = {"id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",
-                        "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",
-                        "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId",
-                        "groupType.desc", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"};
-                workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
-            }*/
-
             workbook = POIUtil.exportExcel(header, body, studentPaymentOrderExportDtos);
             workbook.write(fileOutputStream);
             fileOutputStream.getFD().sync();
@@ -1937,12 +2057,304 @@ public class ExportServiceImpl implements ExportService {
     }
 
     @Override
+    public void orderListSum(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.ExportQueryPage(params);
+        //获取机构费率
+        Integer tenantId = (Integer) params.get("tenantId");
+        TenantConfig tenantConfig = tenantConfigService.queryByTenantId(tenantId);
+        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);
+            }
+            if (row.getBalancePaymentAmount() == null) {
+                row.setBalancePaymentAmount(BigDecimal.ZERO);
+            }
+            BigDecimal transferFee = BigDecimal.ZERO;
+            if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
+                transferFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+            }
+            row.setTransferFee(transferFee);
+            row.setPlatformFee(row.getActualAmount().multiply(tenantConfig.getChargeRate()).divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP));
+            if (row.getOrderDetailList() != null) {
+                for (StudentPaymentOrderDetail orderDetail : row.getOrderDetailList()) {
+                    switch (orderDetail.getType()) {
+                        case COURSE:
+                        case CLASSROOM:
+                        case SINGLE:
+                        case MIX:
+                        case COMPREHENSIVE:
+                        case ENLIGHTENMENT:
+                        case TRAINING_SINGLE:
+                        case TRAINING_MIX:
+                        case MUSIC_NETWORK:
+                        case HIGH:
+                        case HIGH_ONLINE:
+                        case HIGH_ONLINE_COURSE:
+                            row.setMusicGroupCourseFee(row.getMusicGroupCourseFee().add(orderDetail.getPrice()));
+                            break;
+                        case MUSICAL:
+                            if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                                BigDecimal leaseFee = BigDecimal.ZERO;
+                                if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                    leaseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                                }
+                                row.setLeaseFee(leaseFee);
+                            } else {
+                                row.setMusicalFee(orderDetail.getPrice());
+                            }
+                            break;
+                        case ACCESSORIES:
+                        case TEACHING:
+                            row.setTeachingFee(row.getTeachingFee().add(orderDetail.getPrice()));
+                            break;
+                        case OTHER:
+                            row.setOtherFee(row.getOtherFee().add(orderDetail.getPrice()));
+                            break;
+                        case MAINTENANCE:
+                            BigDecimal repairFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                repairFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setMaintenanceFee(repairFee);
+                            break;
+                        case CLOUD_TEACHER:
+                        case CLOUD_TEACHER_PLUS:
+                            BigDecimal cloudTeacherFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                cloudTeacherFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setCloudTeacherFee(cloudTeacherFee);
+                            break;
+                        case DEGREE_REGISTRATION:
+                            BigDecimal degreeFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                degreeFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setDegreeFee(degreeFee);
+                            break;
+                        case PRACTICE:
+                            BigDecimal practiceCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                practiceCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setPracticeCourseFee(practiceCourseFee);
+                            break;
+                        case VIP:
+                            BigDecimal vipCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                vipCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setVipCourseFee(vipCourseFee);
+                            break;
+                        case THEORY_COURSE:
+                            BigDecimal theoryCourseFee = BigDecimal.ZERO;
+                            if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                theoryCourseFee = orderDetail.getPrice().multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                            }
+                            row.setTheoryCourseFee(theoryCourseFee);
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            }
+            //专业
+            if (row.getGroupType().equals(GroupType.VIP)) {
+                row.setVipCourseFee(row.getActualAmount());
+            }else if(row.getGroupType() == GroupType.ACTIVITY){
+                row.setVipCourseFee(row.getActualAmount());
+            }else if(row.getGroupType() == GroupType.MEMBER){
+                row.setCloudTeacherFee(row.getActualAmount());
+            } else if (row.getGroupType().equals(GroupType.SPORADIC)) {
+                //考级报名
+                if (row.getType().equals(OrderTypeEnum.DEGREE_REGISTRATION)) {
+                    String[] feeTypes = row.getMemo().split(";");
+                    List<String> feeTypeList = Arrays.asList(feeTypes);
+                    for (String feeTypeStr : feeTypeList) {
+                        int index = feeTypeStr.lastIndexOf(":");
+                        if (index < 0) {
+                            continue;
+                        }
+                        BigDecimal typeFee = new BigDecimal(feeTypeStr.substring(index + 1));
+                        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+                            typeFee = typeFee.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+                        }
+                        if (feeTypeStr.contains("VIP")) {
+                            row.setVipCourseFee(typeFee);
+                        } else if (feeTypeStr.contains("网管课")) {
+                            row.setPracticeCourseFee(typeFee);
+                        } else if (feeTypeStr.contains("乐理课")) {
+                            row.setTheoryCourseFee(typeFee);
+                        }
+                    }
+                    row.setDegreeFee(row.getActualAmount().subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).subtract(row.getTheoryCourseFee()));
+                } else {
+                    if (row.getChargeType() != null && SporadicChargeTypeEnum.LEVEL.getCode().equals(row.getChargeType())) {
+                        row.setDegreeFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode().equals(row.getChargeType())) {
+                        row.setPracticeCourseFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.MUSIC_UPKEEP.getCode().equals(row.getChargeType())) {
+                        row.setMaintenanceFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.VISITING_FEE.getCode().equals(row.getChargeType())) {
+                        row.setVisitFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && (SporadicChargeTypeEnum.RECHARGE.getCode().equals(row.getChargeType()) ||
+                            SporadicChargeTypeEnum.HIGH_ONLINE_ACTIVITY.getCode().equals(row.getChargeType()))) {
+                        row.setRechargeFee(row.getActualAmount());
+                    } else if (row.getChargeType() != null && SporadicChargeTypeEnum.CLOUD_TEACHER_BUY.getCode().equals(row.getChargeType())) {
+                        row.setCloudTeacherFee(row.getActualAmount());
+                    } else {
+                        row.setOtherFee(row.getActualAmount());
+                    }
+                }
+            } else if (row.getGroupType().equals(GroupType.PRACTICE)) {
+                row.setPracticeCourseFee(row.getActualAmount());
+            } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
+                row.setMusicalFee(row.getActualAmount());
+            } else if (row.getGroupType().equals(GroupType.GOODS_SELL)) {
+                row.setRetailGoodsFee(row.getActualAmount());
+            } else {
+                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.getGroupType() == GroupType.OUTORDER) {
+                        //销售收入
+                        BigDecimal add = feeByType.getMusicalFee().add(row.getTeachingFee()).add(row.getMaintenanceProductFee()).add(feeByType.getOtherFee());
+                        //服务收入
+                        BigDecimal subtract = feeByType.getActualAmount().subtract(add);
+                        //如果是淘器微信那么就是零售
+                        if(Objects.equals("淘器微信",row.getMerNos()) && add.compareTo(BigDecimal.ZERO) > 0){
+                            //如果有服务收入那么是课程学校采买
+                            row.setMusicalFee(BigDecimal.ZERO);
+                            row.setTeachingFee(BigDecimal.ZERO);
+                            row.setMaintenanceProductFee(BigDecimal.ZERO);
+                            row.setOtherFee(subtract);
+                            row.setRetailGoodsFee(add);
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RETAIL_GOODS);
+                        }else {
+                            //拆分导入订单
+                            if (row.getType() == OrderTypeEnum.OUTORDER || row.getType() == OrderTypeEnum.SCHOOL) {
+                                if (row.getType() == OrderTypeEnum.SCHOOL) {
+                                    row.setMusicalFee(BigDecimal.ZERO);
+                                    row.setTeachingFee(BigDecimal.ZERO);
+                                    row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                    row.setOtherFee(BigDecimal.ZERO);
+                                    row.setLargeMusicalFee(add);
+                                }
+                                row.setCourseSchoolBuyAmount(subtract);
+                            } else if (row.getType() == OrderTypeEnum.OTHER) {
+                                row.setOtherFee(row.getOtherFee().add(subtract));
+                            } else {
+                                row.setMusicalFee(BigDecimal.ZERO);
+                                row.setTeachingFee(BigDecimal.ZERO);
+                                row.setMaintenanceProductFee(BigDecimal.ZERO);
+                                row.setOtherFee(BigDecimal.ZERO);
+                                row.setRetailGoodsFee(add);
+                                row.setMusicGroupCourseFee(subtract);
+                            }
+                        }
+                    }
+                }
+            }
+            row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
+            row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
+        }
+        List<StudentPaymentOrderExportDto> exportDtoList = new ArrayList<>();
+        Map<Integer, List<StudentPaymentOrderExportDto>> collect = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getOrganId));
+        for (Integer organId : collect.keySet()) {
+            StudentPaymentOrderExportDto exportDto = new StudentPaymentOrderExportDto();
+            List<StudentPaymentOrderExportDto> orderExportDtos = collect.get(organId);
+            exportDto.setOrganName(orderExportDtos.stream().map(e->e.getOrganName()).findAny().get());
+            exportDto.setOrderAmount(orderExportDtos.stream().map(e -> e.getOrderAmount()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setExpectAmount(orderExportDtos.stream().map(e -> e.getExpectAmount()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setActualAmount(orderExportDtos.stream().map(e -> e.getActualAmount()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setBalancePaymentAmount(orderExportDtos.stream().map(e -> e.getBalancePaymentAmount()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setCouponRemitFee(orderExportDtos.stream().map(e -> e.getCouponRemitFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setMusicGroupCourseFee(orderExportDtos.stream().map(e -> e.getMusicGroupCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setCourseSchoolBuyAmount(orderExportDtos.stream().map(e -> e.getCourseSchoolBuyAmount()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setVipCourseFee(orderExportDtos.stream().map(e -> e.getVipCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setPracticeCourseFee(orderExportDtos.stream().map(e -> e.getPracticeCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setTheoryCourseFee(orderExportDtos.stream().map(e -> e.getTheoryCourseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setDegreeFee(orderExportDtos.stream().map(e -> e.getDegreeFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setRepairFee(orderExportDtos.stream().map(e -> e.getRepairFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setMaintenanceFee(orderExportDtos.stream().map(e -> e.getMaintenanceFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setCloudTeacherFee(orderExportDtos.stream().map(e -> e.getCloudTeacherFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setLeaseFee(orderExportDtos.stream().map(e -> e.getLeaseFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setMusicalFee(orderExportDtos.stream().map(e -> e.getMusicalFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setTeachingFee(orderExportDtos.stream().map(e -> e.getTeachingFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setVisitFee(orderExportDtos.stream().map(e -> e.getVisitFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setRechargeFee(orderExportDtos.stream().map(e -> e.getRechargeFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setRetailGoodsFee(orderExportDtos.stream().map(e -> e.getRetailGoodsFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setLargeMusicalFee(orderExportDtos.stream().map(e -> e.getLargeMusicalFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDto.setOtherFee(orderExportDtos.stream().map(e -> e.getOtherFee()).reduce(BigDecimal.ZERO, BigDecimal::add));
+            exportDtoList.add(exportDto);
+        }
+
+        String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath();
+        File file = new File(basePath + "/" + managerDownload.getName());
+        FileOutputStream fileOutputStream = new FileOutputStream(file);
+
+        HSSFWorkbook workbook = null;
+        try {
+            Map<String, String> headMap = getExportMap(new ExportDto(ExportEnum.ORDER_LIST_SUM, headColumns));
+            String[] header = headMap.keySet().toArray(new String[headMap.keySet().size()]);
+            String[] body = headMap.values().toArray(new String[headMap.keySet().size()]);
+            workbook = POIUtil.exportExcel(header, body, exportDtoList);
+            workbook.write(fileOutputStream);
+            fileOutputStream.getFD().sync();
+            fileOutputStream.close();
+
+            String folder = "download/" + UploadUtil.getFileFloder();
+            String url = storagePluginContext.uploadFile(KS3StoragePlugin.PLUGIN_NAME, folder, file);
+            //把记录插入下载表
+            managerDownload.setFileUrl(url);
+            managerDownload.setStatus(1);
+            managerDownloadDao.update(managerDownload);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                fileOutputStream.close();
+                workbook.close();
+                file.delete();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
     public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns) throws FileNotFoundException {
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
 
         Map<Integer, String> cooperationOrganMap = new HashMap<>();
         List<Integer> cooperationOrganIds = studentPaymentOrderExportDtos.stream()
-                .filter(e -> OrderTypeEnum.OUTORDER.equals(e.getType()))
+                .filter(e -> OUTORDER.equals(e.getType()))
                 .filter(e -> e.getMusicGroupId() != null)
                 .map(e -> Integer.valueOf(e.getMusicGroupId()))
                 .distinct()
@@ -2263,7 +2675,7 @@ public class ExportServiceImpl implements ExportService {
                     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(OrderTypeEnum.OUTORDER)) {
+                } else if (row.getType().equals(OUTORDER)) {
                     row.setMusicGroupCourseFee(feeByType.getActualAmount().subtract(feeByType.getMusicalFee()).subtract(feeByType.getTeachingFee()).subtract(feeByType.getRepairFee()).subtract(feeByType.getOtherFee()));
                     row.setTransferFee(BigDecimal.ZERO);
                     row.setPlatformFee(BigDecimal.ZERO);
@@ -2277,7 +2689,7 @@ public class ExportServiceImpl implements ExportService {
                     row.setEduTeacher(cooperationOrgan.getLinkman() != null ? cooperationOrgan.getLinkman() : row.getEduTeacher());
                 }
             }
-            if (row.getType().equals(OrderTypeEnum.OUTORDER) && row.getMusicGroupId() != null) {
+            if (row.getType().equals(OUTORDER) && row.getMusicGroupId() != null) {
                 if (cooperationOrganMap.containsKey(Integer.valueOf(row.getMusicGroupId()))) {
                     row.setCooperationOrganName(cooperationOrganMap.get(Integer.valueOf(row.getMusicGroupId())));
                     CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(Integer.valueOf(row.getMusicGroupId()));
@@ -2399,7 +2811,7 @@ public class ExportServiceImpl implements ExportService {
                         musicGroupCourseFee = order.getRouteAmount().subtract(musicalFee).subtract(teachingFee).subtract(maintenanceFee).subtract(maintenanceProductFee).subtract(otherFee).subtract(leaseFee).subtract(cloudTeacherFee);
                     } else if (order.getType().equals(OrderTypeEnum.REPAIR)) {
                         repairFee = order.getRouteAmount().subtract(musicalFee).subtract(teachingFee).subtract(otherFee);
-                    } else if (order.getType().equals(OrderTypeEnum.OUTORDER)) {
+                    } else if (order.getType().equals(OUTORDER)) {
                         musicGroupCourseFee = order.getRouteAmount().subtract(musicalFee).subtract(teachingFee).subtract(maintenanceProductFee).subtract(otherFee);
                     }
                 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -490,6 +490,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 	        studentRegistration.setIsAllowAdjust(YesOrNoEnum.YES);
 	        studentRegistration.setSubjectId(subjectMap.get(si.getSubjectName()));
 	        studentRegistration.setUserId(userId);
+	        studentRegistration.setParentsPhone(si.getMobileNo());
 	        studentRegistration.setName(si.getName());
 	        studentRegistration.setGender(sysUser.getGender());
 	        studentRegistration.setPaymentStatus(PaymentStatusEnum.YES);

+ 9 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -204,7 +204,7 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
             if(studentPaymentRouteOrder.getSchoolId() != null) {
                 studentPaymentOrder.setMusicGroupId(studentPaymentRouteOrder.getSchoolId() + "");
             }
-            studentPaymentOrder.setType(OrderTypeEnum.OUTORDER);
+            studentPaymentOrder.setType(studentPaymentRouteOrder.getType());
             studentPaymentOrder.setMerNos(studentPaymentRouteOrder.getMerNo());
             studentPaymentOrder.setOrderNo(studentPaymentRouteOrder.getOrderNo());
             studentPaymentOrder.setGroupType(GroupType.OUTORDER);
@@ -412,6 +412,14 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
                             objectMap.put("incomeType", row.get(s));
                         }
                     }
+                    if (columnValue.equals("type")) {
+                        if (StringUtils.isEmpty(row.get(s).toString())) {
+                            sb.append("第" + rowNum).append("行数据导入失败:订单类型不可为空;");
+                            continue valueIsNull;
+                        } else {
+                            objectMap.put("type", row.get(s));
+                        }
+                    }
                     if (columnValue.equals("transNo")) {
                         if (StringUtils.isEmpty(row.get(s).toString())) {
                             sb.append("第" + rowNum).append("行数据导入失败:交易流水号不可为空;");

+ 23 - 8
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.google.common.collect.Lists;
 import com.ym.mec.biz.dal.dao.StudentBasicInfoDao;
 import com.ym.mec.biz.dal.dao.StudentStatisticsDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
@@ -17,8 +18,12 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 @Service
@@ -38,22 +43,32 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 
 	@Override
 	public void updateStudentStatistics() {
-		//更新声部班老师
+		//获取声部班老师
 		studentBasicInfoDao.updateSubjectTeacher();
+		List<StudentStatistics> statisticsList = new ArrayList<>();
 		//更新乐团主管、指导老师
-		studentStatisticsDao.updateTeacherAndEdu();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsTeacherAndEdu());
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsTeacherAndEdu2());
 		//更新总课时数、已完成、剩余课时数、最近30天课耗、最近1年课耗
-		studentStatisticsDao.updateCourseNum();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsCourseNum());
 		//更新未排课总数
-		studentStatisticsDao.updateNoCourseNum();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsNoCourseNum());
 		//更新未开始价值总和
-		studentStatisticsDao.updateNotStartCourseFee();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsNotStartCourseFee());
 		//更新未排课价值
-		studentStatisticsDao.updateNoCourseFee();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsNoCourseFee());
 		//更新第一次课的时间\最近一次课时间
-		studentStatisticsDao.updateFirstAndLastCourseTime();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsFirstAndLastCourseTime());
 		//更新进行中课程组数量
-		studentStatisticsDao.updateNormalGroupNum();
+		statisticsList.addAll(studentStatisticsDao.queryStatisticsNormalGroupNum());
+		statisticsList.removeAll(Collections.singleton(null));
+		if(CollectionUtils.isNotEmpty(statisticsList)){
+//			studentStatisticsDao.clean();
+			List<List<StudentStatistics>> partition = Lists.partition(statisticsList, 1000);
+			for (List<StudentStatistics> studentStatistics : partition) {
+				studentStatisticsDao.batchUpdate(studentStatistics);
+			}
+		}
 	}
 
 	@Override

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -194,18 +194,22 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 			studentSubjectMap = MapUtil.convertIntegerMap(studentSubjectMapList);
 		}
 
+		int rankNum = 0;
 		for (int i = 0; i < userTrainStat.size(); i++) {
-			userTrainStat.get(i).setRankNum(i+1);
+			if(userTrainStat.get(i).getUserId().equals(queryInfo.getUserId())){
+				head = userTrainStat.get(i);
+			}
 			userTrainStat.get(i).setTrainTime(userTrainStat.get(i).getTrainTime()/60);
+			if(userTrainStat.get(i).getVipUser() <= 0){
+				continue;
+			}
+			userTrainStat.get(i).setRankNum(++rankNum);
 			if(studentSubjectMap.containsKey(userTrainStat.get(i).getUserId())){
 				userTrainStat.get(i).setSubjectName(studentSubjectMap.get(userTrainStat.get(i).getUserId()));
 			}
 			if(detail.size()<10){
 				detail.add(userTrainStat.get(i));
 			}
-			if(userTrainStat.get(i).getUserId().equals(queryInfo.getUserId())){
-				head = userTrainStat.get(i);
-			}
 		}
 		Map<String,Object> params = new HashMap<String, Object>();
 		params.put("tenantId", queryInfo.getTenantId());

+ 34 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreCategoriesServiceImpl.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service.impl;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
@@ -45,7 +46,7 @@ public class SysMusicScoreCategoriesServiceImpl extends BaseServiceImpl<Integer,
 	}
 
 	@Override
-	public List<SysMusicScoreCategories> queryCategoriesTreeList(String categoryIds) {
+	public List<SysMusicScoreCategories> queryCategoriesTreeList(String categoryIds, Boolean isQueryEnable) {
 		
 		categoryIds = categoryIds.endsWith(",") ? categoryIds.substring(0, categoryIds.length() - 1) : categoryIds;
 
@@ -57,7 +58,13 @@ public class SysMusicScoreCategoriesServiceImpl extends BaseServiceImpl<Integer,
 		SysMusicScoreCategories subCategory = null;
 		for(SysMusicScoreCategories smsc : categoryList){
 			
-			if(smsc == null || smsc.getEnable() != true){
+			if(smsc == null){
+				continue;
+			}
+			if(isQueryEnable == null){
+				isQueryEnable = true;
+			}
+			if(isQueryEnable == true && smsc.getEnable() != true){
 				continue;
 			}
 			parentCategory = getParentTree(smsc);
@@ -193,8 +200,20 @@ public class SysMusicScoreCategoriesServiceImpl extends BaseServiceImpl<Integer,
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void del(Integer id) {
-		String byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(id.toString());
-		byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(byCategoriesIds);
+		
+		List<Integer> categoriesIdList = new ArrayList<>();
+		Integer categoriesId = id;
+		
+		SysMusicScoreCategories sysMusicScoreCategories = get(categoriesId);
+		
+		if(sysMusicScoreCategories == null){
+			throw new BizException("分类找不到");
+		}
+		categoriesIdList.add(categoriesId);
+		sysMusicScoreCategories = getChildTree(sysMusicScoreCategories);
+		getAllCategoryIdList(categoriesIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+		
+		String byCategoriesIds = categoriesIdList.stream().map(Objects :: toString).collect(Collectors.joining(","));
 		//是否有在使用的分类
 		int count = sysMusicScoreDao.countBuyCategoriesIds(byCategoriesIds);
 		if(count > 0){
@@ -280,4 +299,15 @@ public class SysMusicScoreCategoriesServiceImpl extends BaseServiceImpl<Integer,
 		}
 		parentTree.add(targetCategory);
 	}
+    
+    private void getAllCategoryIdList(List<Integer> categoryIdList, List<SysMusicScoreCategories> sysMusicScoreCategoriesList){
+    	
+    	if(sysMusicScoreCategoriesList != null && sysMusicScoreCategoriesList.size() > 0){
+    		for(SysMusicScoreCategories sysMusicScoreCategories : sysMusicScoreCategoriesList){
+    			categoryIdList.add(sysMusicScoreCategories.getId());
+    			getAllCategoryIdList(categoryIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+    		}
+    	}
+    	
+    }
 }

+ 16 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicScoreServiceImpl.java

@@ -1,8 +1,23 @@
 package com.ym.mec.biz.service.impl;
 
 
+import static com.ym.mec.biz.dal.enums.ClientTypeEnum.SMART_PRACTICE;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.dto.MusicScoreQueryInfo;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.SubjectDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
@@ -21,16 +36,6 @@ import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static com.ym.mec.biz.dal.enums.ClientTypeEnum.SMART_PRACTICE;
-
 @Service
 public class SysMusicScoreServiceImpl extends BaseServiceImpl<Integer, SysMusicScore> implements SysMusicScoreService {
 	

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

@@ -615,8 +615,41 @@
         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
+        <foreach collection="outOrderList" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+        GROUP BY order_id_
+    </select>
+
 </mapper>

+ 13 - 3
mec-biz/src/main/resources/config/mybatis/StudentBasicInfoMapper.xml

@@ -82,9 +82,6 @@
 			</if>
 		</set> WHERE user_id_ = #{userId}
 	</update>
-	<update id="updateSubjectTeacher">
-		SELECT updateSubjectTeacher()
-	</update>
 
 	<!-- 根据主键删除一条记录 -->
 	<delete id="delete" >
@@ -103,4 +100,17 @@
     <select id="getMaxId" resultType="java.lang.Integer">
 		SELECT MAX(id_) FROM student_basic_info
 	</select>
+	<select id="updateSubjectTeacher" resultType="int">
+		UPDATE (
+		SELECT cm.user_id_,cgtm.user_id_ teacher_id_ FROM class_group_teacher_mapper cgtm
+		LEFT JOIN (SELECT cgsm.user_id_,MAX(cgtm.id_) id_ FROM class_group cg
+		LEFT JOIN class_group_student_mapper cgsm ON cgsm.class_group_id_ = cg.id_
+		LEFT JOIN class_group_teacher_mapper cgtm ON cgtm.class_group_id_ = cg.id_
+		WHERE cg.type_ = 'NORMAL' AND cgsm.status_ = 'NORMAL' AND cg.del_flag_ = 0 AND cgtm.teacher_role_ = 'BISHOP'
+		GROUP BY cgsm.user_id_) cm ON cm.id_ = cgtm.id_
+		) st
+		LEFT JOIN student_basic_info sbi ON st.user_id_ = sbi.user_id_
+			LEFT JOIN sys_user su ON su.id_ = st.teacher_id_
+			SET sbi.subject_teacher_id_ = st.teacher_id_,sbi.subject_teacher_name_ = su.real_name_;
+	</select>
 </mapper>

+ 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>

+ 13 - 8
mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml

@@ -28,6 +28,7 @@
         <result column="update_time_" property="updateTime"/>
         <result column="update_by_" property="updateBy"/>
         <result column="tenant_id_" property="tenantId"/>
+        <result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
 
     <resultMap id="StudentPaymentRouteOrderDto" type="com.ym.mec.biz.dal.dto.StudentPaymentRouteOrderDto"
@@ -53,7 +54,9 @@
 
     <sql id="Base_Column_List">
         <!--@mbg.generated-->
-        id_, route_organ_id_, route_amount_,route_balance_amount_, mer_no_, order_no_, fee_flag_,user_id_,school_id_,trans_no_,pay_time_,sale_amount_,service_amount_,service_fee_,memo_,goods_json_,audit_status_,audit_comment_,calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_
+        id_, route_organ_id_, route_amount_,route_balance_amount_, mer_no_, order_no_, fee_flag_,user_id_,
+school_id_,trans_no_,pay_time_,sale_amount_,service_amount_,service_fee_,memo_,goods_json_,audit_status_,audit_comment_,
+calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
     </sql>
     <select id="get" parameterType="java.lang.Long" resultMap="StudentPaymentRouteOrderMap">
         <!--@mbg.generated-->
@@ -73,8 +76,12 @@
             parameterType="com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder" useGeneratedKeys="true">
         <!--@mbg.generated-->
         insert into student_payment_route_order (route_organ_id_, route_amount_,route_balance_amount_, mer_no_,
-        order_no_, fee_flag_,user_id_,school_id_,trans_no_,pay_time_,sale_amount_,service_amount_,service_fee_,memo_,goods_json_,audit_status_,audit_comment_,calender_id_,create_time_,update_time_,create_by_,update_by_,tenant_id_)
-        values (#{routeOrganId}, #{routeAmount},#{routeBalanceAmount}, #{merNo}, #{orderNo}, #{feeFlag},#{userId},#{schoolId},#{transNo},#{payTime},#{saleAmount},#{serviceAmount},#{serviceFee},#{memo},#{goodsJson},#{auditStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{auditComment},#{calenderId},#{createTime},#{updateTime},#{createBy},#{updateBy},#{tenantId})
+        order_no_, fee_flag_,user_id_,school_id_,trans_no_,pay_time_,sale_amount_,service_amount_,service_fee_,
+        memo_,goods_json_,audit_status_,audit_comment_,calender_id_,create_time_,update_time_,create_by_,update_by_,tenant_id_,type_)
+        values (#{routeOrganId}, #{routeAmount},#{routeBalanceAmount}, #{merNo}, #{orderNo}, #{feeFlag},#{userId},
+                #{schoolId},#{transNo},#{payTime},#{saleAmount},#{serviceAmount},#{serviceFee},#{memo},#{goodsJson},
+                #{auditStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{auditComment},#{calenderId},
+                #{createTime},#{updateTime},#{createBy},#{updateBy},#{tenantId},#{type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder">
         <!--@mbg.generated-->
@@ -130,9 +137,6 @@
             <if test="updateTime != null">
                 update_time_ = #{updateTime},
             </if>
-            <if test="createBy != null">
-                create_by_ = #{createBy},
-            </if>
             <if test="updateBy != null">
                 update_by_ = #{updateBy},
             </if>
@@ -145,7 +149,7 @@
         INSERT INTO student_payment_route_order
         (order_no_,route_organ_id_, route_amount_,route_balance_amount_, mer_no_,fee_flag_,user_id_,
         school_id_,trans_no_,pay_time_,sale_amount_,service_amount_,service_fee_,memo_,goods_json_,audit_status_,
-        audit_comment_,calender_id_,create_time_,update_time_,create_by_,update_by_,tenant_id_)
+        audit_comment_,calender_id_,create_time_,update_time_,create_by_,update_by_,tenant_id_,type_)
         VALUE
         <foreach collection="routeOrders" item="routeOrder" separator=",">
             (#{routeOrder.orderNo},#{routeOrder.routeOrganId},#{routeOrder.routeAmount},
@@ -153,7 +157,8 @@
             #{routeOrder.userId},#{routeOrder.schoolId},#{routeOrder.transNo},#{routeOrder.payTime},
             #{routeOrder.saleAmount},#{routeOrder.serviceAmount},#{routeOrder.serviceFee},#{routeOrder.memo},#{routeOrder.goodsJson},
             #{routeOrder.auditStatus,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{routeOrder.auditComment},
-            #{routeOrder.calenderId},NOW(),NOW(),#{routeOrder.createBy},#{routeOrder.updateBy},#{routeOrder.tenantId})
+            #{routeOrder.calenderId},NOW(),NOW(),#{routeOrder.createBy},#{routeOrder.updateBy},#{routeOrder.tenantId},
+            #{routeOrder.type,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler})
         </foreach>
     </insert>
 

+ 288 - 19
mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml

@@ -125,26 +125,58 @@
 		</if>
 		</set> WHERE id_ = #{id}
 	</update>
-	<update id="updateTeacherAndEdu">
-		SELECT updateTeacherAndEdu()
+	<update id="clean">
+		UPDATE student_statistics ss SET ss.total_course_num_ = 0,ss.sub_course_num_ = 0,
+		ss.over_course_num_ = 0,ss.lately_course_consumer_ = 0,ss.lately_year_course_consumer_ = 0,
+		ss.no_course_fee_ = 0,ss.no_schedule_num_ = 0,ss.normal_group_num_ = 0,ss.not_start_course_fee_ = 0,
+		ss.teacher_id_ = NULL,ss.teacher_name_ = NULL,ss.music_director_id_ = NULL,ss.music_director_name_ = NULL
 	</update>
-	<update id="updateCourseNum">
-		SELECT updateCourseNum()
-	</update>
-	<update id="updateNoCourseNum">
-		SELECT updateNoCourseNum()
-	</update>
-	<update id="updateNotStartCourseFee">
-		SELECT updateNotStartCourseFee()
-	</update>
-	<update id="updateNoCourseFee">
-		SELECT updateNoCourseFee()
-	</update>
-	<update id="updateFirstAndLastCourseTime">
-		SELECT updateFirstAndLastCourseTime()
-	</update>
-	<update id="updateNormalGroupNum">
-		SELECT updateNormalGroupNum()
+	<update id="batchUpdate">
+		<foreach collection="statisticsList" item="bean" index="index" open="" close="" separator=";">
+			UPDATE student_statistics
+			<set>
+				<if test="bean.overCourseNum != null">
+					over_course_num_ = #{bean.overCourseNum},
+				</if>
+				<if test="bean.latelyCourseConsumer != null">
+					lately_course_consumer_ = #{bean.latelyCourseConsumer},
+				</if>
+				<if test="bean.lastCourseTime != null">
+					last_course_time_ = #{bean.lastCourseTime},
+				</if>
+				<if test="bean.totalCourseNum != null">
+					total_course_num_ = #{bean.totalCourseNum},
+				</if>
+				<if test="bean.musicDirectorName != null and bean.musicDirectorName != ''">
+					music_director_name_ = #{bean.musicDirectorName},
+				</if>
+				<if test="bean.teacherName != null and bean.teacherName != ''">
+					teacher_name_ = #{bean.teacherName},
+				</if>
+				<if test="bean.subCourseNum != null">
+					sub_course_num_ = #{bean.subCourseNum},
+				</if>
+				<if test="bean.teacherId != null">
+					teacher_id_ = #{bean.teacherId},
+				</if>
+				<if test="bean.musicDirectorId != null">
+					music_director_id_ = #{bean.musicDirectorId},
+				</if>
+				<if test="bean.notStartCourseFee != null">
+					not_start_course_fee_ = #{bean.notStartCourseFee},
+				</if>
+				<if test="bean.noCourseFee != null">
+					no_course_fee_ = #{bean.noCourseFee},
+				</if>
+				<if test="bean.noScheduleNum != null">
+					no_schedule_num_ = #{bean.noScheduleNum},
+				</if>
+				<if test="bean.firstCourseTime != null">
+					first_course_time_ = #{bean.firstCourseTime},
+				</if>
+				id_ = id_
+			</set> WHERE user_id_ = #{bean.userId} AND group_type_ = #{bean.groupType}
+		</foreach>
 	</update>
 
 	<!-- 根据主键删除一条记录 -->
@@ -395,6 +427,243 @@
 	<select id="queryDirectorList" resultType="java.lang.Integer">
 		SELECT DISTINCT music_director_id_ FROM student_statistics WHERE group_type_ = #{groupType} AND music_director_id_ IS NOT NULL
 	</select>
+	<select id="queryStatisticsTeacherAndEdu" resultMap="com.ym.mec.biz.dal.dao.StudentStatisticsDao.StudentStatistics">
+		SELECT et.user_id_,et.actual_teacher_id_ teacher_id_,su.real_name_ teacher_name_,et.educational_teacher_id_ music_director_id_,su1.real_name_ music_director_name_,'PRACTICE' group_type_
+		FROM ( SELECT cs.actual_teacher_id_,ct.user_id_,pg.educational_teacher_id_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		LEFT JOIN (SELECT cssp.user_id_,MAX(cs.class_date_) class_date_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		WHERE cs.status_ = 'OVER' AND cssp.group_type_ = 'PRACTICE'
+		GROUP BY cssp.user_id_) ct ON ct.user_id_ = cssp.user_id_
+		LEFT JOIN practice_group pg ON pg.id_ = cssp.music_group_id_
+		WHERE cs.class_date_ = ct.class_date_ AND cs.status_ = 'OVER' AND cssp.group_type_ = 'PRACTICE'
+		GROUP BY ct.user_id_) et
+		LEFT JOIN sys_user su ON su.id_ = et.actual_teacher_id_
+		LEFT JOIN sys_user su1 ON su1.id_ = et.educational_teacher_id_
+		GROUP BY et.user_id_
+		UNION ALL
+		SELECT et.user_id_,et.actual_teacher_id_ teacher_id_,su.real_name_ teacher_name_,et.educational_teacher_id_ music_director_id_,su1.real_name_ music_director_name_,'THEORY' group_type_
+		FROM (SELECT cs.actual_teacher_id_,ct.user_id_,vg.educational_teacher_id_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		LEFT JOIN (SELECT cssp.user_id_,MAX(cs.class_date_) class_date_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ = '乐理课' AND cs.status_ = 'OVER' AND cssp.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_) ct ON ct.user_id_ = cssp.user_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ = '乐理课' AND cs.class_date_ = ct.class_date_ AND cs.status_ = 'OVER' AND cssp.group_type_ = 'VIP'
+		GROUP BY ct.user_id_) et
+		LEFT JOIN sys_user su ON su.id_ = et.actual_teacher_id_
+		LEFT JOIN sys_user su1 ON su1.id_ = et.educational_teacher_id_
+		GROUP BY et.user_id_
+		UNION ALL
+		SELECT et.user_id_,et.actual_teacher_id_ teacher_id_,su.real_name_ teacher_name_,et.educational_teacher_id_ music_director_id_,su1.real_name_ music_director_name_,'VIP' group_type_
+		FROM (SELECT cs.actual_teacher_id_,ct.user_id_,vg.educational_teacher_id_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		LEFT JOIN (SELECT cssp.user_id_,MAX(cs.class_date_) class_date_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ != '乐理课' AND cs.status_ = 'OVER' AND cssp.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_) ct ON ct.user_id_ = cssp.user_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ != '乐理课' AND cs.class_date_ = ct.class_date_ AND cs.status_ = 'OVER' AND cssp.group_type_ = 'VIP'
+		GROUP BY ct.user_id_) et
+		LEFT JOIN sys_user su ON su.id_ = et.actual_teacher_id_
+		LEFT JOIN sys_user su1 ON su1.id_ = et.educational_teacher_id_
+		GROUP BY et.user_id_
+	</select>
+	<select id="queryStatisticsTeacherAndEdu2" resultMap="StudentStatistics">
+		SELECT ss.user_id_,pg.user_id_ teacher_id_,su.real_name_ teacher_name_,'' music_director_id_,'' music_director_name_,'PRACTICE' group_type_ FROM student_statistics ss
+		LEFT JOIN course_schedule_student_payment cssp ON ss.user_id_ = cssp.user_id_
+		LEFT JOIN practice_group pg ON pg.id_ = cssp.music_group_id_
+		LEFT JOIN sys_user su ON su.id_ = pg.user_id_
+		WHERE cssp.group_type_ = 'PRACTICE' AND pg.group_status_ = 'NORMAL' AND ss.teacher_id_ IS NULL
+		UNION ALL
+		SELECT ss.user_id_,'' teacher_id_,'' teacher_name_,pg.educational_teacher_id_ music_director_id_,su.real_name_ music_director_name_,'PRACTICE' group_type_ FROM student_statistics ss
+		LEFT JOIN course_schedule_student_payment cssp ON ss.user_id_ = cssp.user_id_
+		LEFT JOIN practice_group pg ON pg.id_ = cssp.music_group_id_
+		LEFT JOIN sys_user su ON su.id_ = pg.educational_teacher_id_
+		WHERE cssp.group_type_ = 'PRACTICE' AND pg.group_status_ = 'NORMAL' AND ss.music_director_id_ IS NULL
+		UNION ALL
+		SELECT ss.user_id_,vg.user_id_ teacher_id_,su.real_name_ teacher_name_,'' music_director_id_,'' music_director_name_,'THEORY' group_type_ FROM student_statistics ss
+		LEFT JOIN course_schedule_student_payment cssp ON ss.user_id_ = cssp.user_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		LEFT JOIN sys_user su ON su.id_ = vg.user_id_
+		WHERE vgc.name_ = '乐理课' AND cssp.group_type_ = 'THEORY' AND vg.group_status_ = 2 AND ss.teacher_id_ IS NULL
+		UNION ALL
+		SELECT ss.user_id_,'' teacher_id_,'' teacher_name_,vg.educational_teacher_id_ music_director_id_,su.real_name_ music_director_name_,'THEORY' group_type_ FROM student_statistics ss
+		LEFT JOIN course_schedule_student_payment cssp ON ss.user_id_ = cssp.user_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		LEFT JOIN sys_user su ON su.id_ = vg.educational_teacher_id_
+		WHERE vgc.name_ = '乐理课' AND cssp.group_type_ = 'THEORY' AND vg.group_status_ = 2 AND ss.music_director_id_ IS NULL
+		UNION ALL
+		SELECT ss.user_id_,vg.user_id_ teacher_id_,su.real_name_ teacher_name_,'' music_director_id_,'' music_director_name_,'VIP' group_type_ FROM student_statistics ss
+		LEFT JOIN course_schedule_student_payment cssp ON ss.user_id_ = cssp.user_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		LEFT JOIN sys_user su ON su.id_ = vg.user_id_
+		WHERE vgc.name_ != '乐理课' AND cssp.group_type_ = 'VIP' AND vg.group_status_ = 2 AND ss.teacher_id_ IS NULL
+		UNION ALL
+		SELECT ss.user_id_,'' teacher_id_,'' teacher_name_,vg.educational_teacher_id_ music_director_id_,su.real_name_ music_director_name_,'VIP' group_type_ FROM student_statistics ss
+		LEFT JOIN course_schedule_student_payment cssp ON ss.user_id_ = cssp.user_id_
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		LEFT JOIN sys_user su ON su.id_ = vg.educational_teacher_id_
+		WHERE vgc.name_ != '乐理课' AND cssp.group_type_ = 'VIP' AND vg.group_status_ = 2 AND ss.music_director_id_ IS NULL
+	</select>
+	<select id="queryStatisticsCourseNum" resultMap="StudentStatistics">
+		SELECT cssp.user_id_,COUNT(cssp.course_schedule_id_) total_course_num_,COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) sub_course_num_,
+		COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN NULL ELSE 1 END) over_course_num_,
+		COUNT(CASE WHEN cs.status_ != 'NOT_START' AND cs.class_date_ >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 30 DAY),'%Y-%m-%d') THEN 1 ELSE NULL END) lately_course_consumer_,
+		COUNT(CASE WHEN cs.status_ != 'NOT_START' AND cs.class_date_ >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y-%m-%d') THEN 1 ELSE NULL END) lately_year_course_consumer_,'PRACTICE' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		WHERE cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cssp.group_type_ = 'PRACTICE'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,COUNT(cssp.course_schedule_id_) total_course_num_,COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) sub_course_num_,
+		COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN NULL ELSE 1 END) over_course_num_,
+		COUNT(CASE WHEN cs.status_ != 'NOT_START' AND cs.class_date_ >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 30 DAY),'%Y-%m-%d') THEN 1 ELSE NULL END) lately_course_consumer_,
+		COUNT(CASE WHEN cs.status_ != 'NOT_START' AND cs.class_date_ >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y-%m-%d') THEN 1 ELSE NULL END) lately_year_course_consumer_,'THEORY' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ = '乐理课' AND cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cs.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,COUNT(cssp.course_schedule_id_) total_course_num_,COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN 1 ELSE NULL END) sub_course_num_,
+		COUNT(CASE WHEN cs.status_ = 'NOT_START' THEN NULL ELSE 1 END) over_course_num_,
+		COUNT(CASE WHEN cs.status_ != 'NOT_START' AND cs.class_date_ >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 30 DAY),'%Y-%m-%d') THEN 1 ELSE NULL END) lately_course_consumer_,
+		COUNT(CASE WHEN cs.status_ != 'NOT_START' AND cs.class_date_ >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y-%m-%d') THEN 1 ELSE NULL END) lately_year_course_consumer_,'VIP' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ != '乐理课' AND cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cs.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_
+	</select>
+	<select id="queryStatisticsNoCourseNum" resultMap="StudentStatistics">
+		SELECT aum.user_id_,SUM(CASE WHEN aum.practice_flag_ = 1 THEN vga.min_course_num_ ELSE 0 END +
+		CASE WHEN aum.give_practice_flag_ = 1 THEN vga.give_course_num_ ELSE 0 END) no_schedule_num_,'PRACTICE' group_type_ FROM activity_user_mapper aum
+		LEFT JOIN vip_group_activity vga ON vga.id_ = aum.activity_id_
+		WHERE aum.return_fee_ = 0 AND (aum.practice_flag_ = 1 OR aum.give_practice_flag_ = 1)
+		GROUP BY aum.user_id_
+		UNION ALL
+		SELECT a.user_id_,SUM(a.no_schedule_num_) no_schedule_num_,'THEORY' group_type_ FROM (
+		SELECT aum.user_id_,SUM(CASE WHEN aum.vip_flag_ = 1 AND vgc.name_ = '乐理课' THEN vga.min_course_num_ ELSE 0 END +
+		CASE WHEN aum.give_vip_flag_ = 1 AND vgc1.name_ = '乐理课' THEN vga.give_course_num_ ELSE 0 END) no_schedule_num_ FROM activity_user_mapper aum
+		LEFT JOIN vip_group_activity vga ON vga.id_ = aum.activity_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
+		LEFT JOIN vip_group_category vgc1 ON vgc1.id_ = vga.give_category_id_
+		WHERE aum.return_fee_ = 0 AND ((aum.vip_flag_ = 1 AND vgc.name_ = '乐理课') OR (aum.give_vip_flag_ = 1 AND vgc1.name_ = '乐理课'))
+		GROUP BY aum.user_id_
+		UNION ALL
+		SELECT user_id_,10 no_schedule_num_ FROM student WHERE activity_course_detail_ LIKE CONCAT('%','"music_theory": 1','%')) a
+		GROUP BY a.user_id_
+		UNION ALL
+		SELECT a.user_id_,SUM(a.no_schedule_num_) no_schedule_num_,'VIP' group_type_ FROM (
+		SELECT aum.user_id_,SUM(CASE WHEN aum.vip_flag_ = 1 AND vgc.name_ != '乐理课' THEN vga.min_course_num_ ELSE 0 END +
+		CASE WHEN aum.give_vip_flag_ = 1  AND vgc1.name_ != '乐理课' THEN vga.give_course_num_ ELSE 0 END) no_schedule_num_ FROM activity_user_mapper aum
+		LEFT JOIN vip_group_activity vga ON vga.id_ = aum.activity_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
+		LEFT JOIN vip_group_category vgc1 ON vgc1.id_ = vga.give_category_id_
+		WHERE aum.return_fee_ = 0 AND ((aum.vip_flag_ = 1 AND vgc.name_ != '乐理课') OR (aum.give_vip_flag_ = 1 AND vgc1.name_ != '乐理课'))
+		GROUP BY aum.user_id_
+		UNION ALL
+		SELECT user_id_,12 no_schedule_num_ FROM student WHERE activity_course_detail_ LIKE CONCAT('%','"vip1": 1','%')
+		UNION ALL
+		SELECT user_id_,12 no_schedule_num_ FROM student WHERE activity_course_detail_ LIKE CONCAT('%','"vip2": 1','%')) a
+		GROUP BY a.user_id_
+	</select>
+	<select id="queryStatisticsNotStartCourseFee" resultMap="StudentStatistics">
+		SELECT cssp.user_id_,SUM(cssp.expect_price_) not_start_course_fee_,'PRACTICE' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		WHERE cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cs.group_type_ = 'PRACTICE' AND cs.status_ = 'NOT_START'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,SUM(cssp.expect_price_) not_start_course_fee_,'THEORY' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cs.group_type_ = 'VIP' AND cs.status_ = 'NOT_START' AND vgc.name_ = '乐理课'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,SUM(cssp.expect_price_) not_start_course_fee_,'VIP' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND cs.group_type_ = 'VIP' AND cs.status_ = 'NOT_START' AND vgc.name_ != '乐理课'
+		GROUP BY cssp.user_id_
+	</select>
+	<select id="queryStatisticsNoCourseFee" resultMap="StudentStatistics">
+		SELECT aum.user_id_,SUM(aum.actual_price_) no_course_fee_,'PRACTICE' group_type_ FROM activity_user_mapper aum
+		WHERE aum.practice_flag_ = 1 AND return_fee_ = 0
+		GROUP BY aum.user_id_
+		UNION ALL
+		SELECT aum.user_id_,SUM(aum.actual_price_) no_course_fee_,'THEORY' group_type_ FROM activity_user_mapper aum
+		LEFT JOIN vip_group_activity vga ON vga.id_ = aum.activity_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
+		WHERE aum.vip_flag_ = 1 AND return_fee_ = 0 AND vgc.name_ = '乐理课'
+		GROUP BY aum.user_id_
+		UNION ALL
+		SELECT aum.user_id_,SUM(aum.actual_price_) no_course_fee_,'VIP' group_type_ FROM activity_user_mapper aum
+		LEFT JOIN vip_group_activity vga ON vga.id_ = aum.activity_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
+		WHERE aum.vip_flag_ = 1 AND return_fee_ = 0 AND vgc.name_ != '乐理课'
+		GROUP BY aum.user_id_
+	</select>
+	<select id="queryStatisticsFirstAndLastCourseTime"
+			resultMap="StudentStatistics">
+		SELECT cssp.user_id_,MIN(cs.class_date_) first_course_time_,MAX(cs.class_date_) last_course_time_,'PRACTICE' group_type_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		WHERE cs.status_ = 'OVER' AND cssp.group_type_ = 'PRACTICE'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,MIN(cs.class_date_) first_course_time_,MAX(cs.class_date_) last_course_time_,'THEORY' group_type_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ = '乐理课' AND cs.status_ = 'OVER' AND cs.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,MIN(cs.class_date_) first_course_time_,MAX(cs.class_date_) last_course_time_,'VIP' group_type_ FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND cs.group_type_ = cssp.group_type_
+		LEFT JOIN vip_group vg ON vg.id_ = cs.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ != '乐理课' AND cs.status_ = 'OVER' AND cs.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_
+	</select>
+	<select id="queryStatisticsNormalGroupNum" resultMap="StudentStatistics">
+		SELECT cssp.user_id_,COUNT(DISTINCT pg.id_) normal_group_num_,'PRACTICE' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN practice_group pg ON pg.id_ = cssp.music_group_id_
+		WHERE pg.group_status_ = 'NORMAL' AND cssp.group_type_ = 'PRACTICE'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,COUNT(DISTINCT vg.id_) normal_group_num_,'THEORY' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ = '乐理课' AND vg.group_status_ = 2 AND cssp.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_
+		UNION ALL
+		SELECT cssp.user_id_,COUNT(DISTINCT vg.id_) normal_group_num_,'VIP' group_type_
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN vip_group vg ON vg.id_ = cssp.music_group_id_
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vg.vip_group_category_id_
+		WHERE vgc.name_ != '乐理课' AND vg.group_status_ = 2 AND cssp.group_type_ = 'VIP'
+		GROUP BY cssp.user_id_
+	</select>
 	<sql id="dateTypeSql">
 		WHERE data_type_ =
 		<if test="groupType == 'VIP'">

+ 2 - 1
mec-biz/src/main/resources/config/mybatis/SysMusicCompareWeekDataMapper.xml

@@ -110,7 +110,8 @@
 			</if>
 			smcwd.train_num_ trainNum,
 			smcwd.train_days_ trainDays,
-			smcwd.train_time_ trainTime
+			smcwd.train_time_ trainTime,
+			case when stu.membership_end_time_ &gt; now() then 1 else 0 end vipUser
 		FROM sys_music_compare_week_data smcwd
 		LEFT JOIN sys_user su ON smcwd.user_id_=su.id_
 		LEFT JOIN student stu ON smcwd.user_id_ = stu.user_id_

+ 2 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SysMusicScoreCategoriesController.java

@@ -41,7 +41,7 @@ public class SysMusicScoreCategoriesController extends BaseController {
 
     @ApiOperation(value = "树状列表")
     @GetMapping("/queryTree")
-    public Object queryTree() {
+    public Object queryTree(MusicScoreQueryInfo queryInfo) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null || sysUser.getId() == null){
         	return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -49,7 +49,7 @@ public class SysMusicScoreCategoriesController extends BaseController {
         
         TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>().eq("tenant_id_", sysUser.getTenantId()));
         
-        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId()));
+        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId(), queryInfo.getEnable()));
     }
 
     @ApiOperation(value = "获取分类详情")

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMusicScoreCategoriesController.java

@@ -52,7 +52,7 @@ public class SysMusicScoreCategoriesController extends BaseController {
         
         TenantConfig tenantConfig = tenantConfigService.getOne(new QueryWrapper<TenantConfig>().eq("tenant_id_", sysUser.getTenantId()));
         
-        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId()));
+        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId(), queryInfo.getEnable()));
     }
 
     @ApiOperation(value = "获取分类详情")

+ 43 - 10
mec-web/src/main/java/com/ym/mec/web/controller/SysMusicScoreController.java

@@ -1,22 +1,31 @@
 package com.ym.mec.web.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.ym.mec.biz.dal.dao.SysMusicScoreCategoriesDao;
 import com.ym.mec.biz.dal.dto.MusicScoreDto;
 import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.entity.SysMusicScoreCategories;
 import com.ym.mec.biz.dal.enums.ClientTypeEnum;
 import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
 import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.SysMusicScoreCategoriesService;
 import com.ym.mec.biz.service.SysMusicScoreService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.exception.BizException;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
 @RequestMapping("sysMusicScore")
 @Api(tags = "曲库")
 @RestController
@@ -28,6 +37,8 @@ public class SysMusicScoreController extends BaseController {
     private SysMusicScoreCategoriesDao sysMusicScoreCategoriesDao;
     @Autowired
     private OrganizationService organizationService;
+    @Autowired
+    private SysMusicScoreCategoriesService sysMusicScoreCategoriesService;
 
     @ApiOperation(value = "修改")
     @PostMapping("/update")
@@ -72,9 +83,20 @@ public class SysMusicScoreController extends BaseController {
     public Object queryPage(SysExamSongQueryInfo queryInfo) {
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         if(queryInfo.getCategoriesId() != null){
-            String byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(queryInfo.getCategoriesId());
-            byCategoriesIds = sysMusicScoreCategoriesDao.findByCategoriesIds(byCategoriesIds);
-            queryInfo.setCategoriesId(byCategoriesIds);
+        	
+        	List<Integer> categoriesIdList = new ArrayList<>();
+			Integer categoriesId = Integer.parseInt(queryInfo.getCategoriesId());
+			
+			SysMusicScoreCategories sysMusicScoreCategories = sysMusicScoreCategoriesService.get(categoriesId);
+			
+			if(sysMusicScoreCategories == null){
+				throw new BizException("分类找不到");
+			}
+			categoriesIdList.add(categoriesId);
+			sysMusicScoreCategories = sysMusicScoreCategoriesService.getChildTree(sysMusicScoreCategories);
+			getAllCategoryIdList(categoriesIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+			
+			queryInfo.setCategoriesIdList(categoriesIdList);
         }
         return succeed(sysMusicScoreService.queryMusicScorePage(queryInfo));
     }
@@ -87,4 +109,15 @@ public class SysMusicScoreController extends BaseController {
         queryInfo.setClientType(ClientTypeEnum.SMART_PRACTICE);
         return succeed(sysMusicScoreService.queryMusicScorePageInfo(queryInfo));
     }
+    
+    private void getAllCategoryIdList(List<Integer> categoryIdList, List<SysMusicScoreCategories> sysMusicScoreCategoriesList){
+    	
+    	if(sysMusicScoreCategoriesList != null && sysMusicScoreCategoriesList.size() > 0){
+    		for(SysMusicScoreCategories sysMusicScoreCategories : sysMusicScoreCategoriesList){
+    			categoryIdList.add(sysMusicScoreCategories.getId());
+    			getAllCategoryIdList(categoryIdList, sysMusicScoreCategories.getSysMusicScoreCategoriesList());
+    		}
+    	}
+    	
+    }
 }

+ 4 - 3
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -232,9 +232,10 @@ public class TaskController extends BaseController {
 	@GetMapping("/updateCourseScheduleToOverStatus")
 	// 更新课程状态至已结束
 	public void updateCourseScheduleToOverStatus() {
-		courseScheduleService.updateCourseScheduleToOverStatus();
-		courseScheduleService.updateCourseScheduleToUnderway();
-		courseEventSource.courseStatusChange(null);
+		List<Long> courseIds = courseScheduleService.updateCourseScheduleToOverStatus();
+		courseEventSource.courseStatusChange(courseIds);
+		courseIds = courseScheduleService.updateCourseScheduleToUnderway();
+		courseEventSource.courseStatusChange(courseIds);
 	}
 
 	@GetMapping("/updateVipGroupToFinishedStatus")

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/education/EduMusicScoreController.java

@@ -56,7 +56,7 @@ public class EduMusicScoreController extends BaseController {
         	return failed("当前用户所在机构信息查询失败");
         }
         
-        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId()));
+        return succeed(sysMusicScoreCategoriesService.queryCategoriesTreeList(tenantConfig.getTeachingMaterialId(), queryInfo.getEnable()));
     }
 
     @ApiOperation(value = "分页查询")

+ 1 - 0
mec-web/src/main/resources/columnMapper.ini

@@ -30,6 +30,7 @@
 
 
 [财务管理导入模板]
+订单类型 = type
 收入类型 = incomeType
 所属分部 = organName
 所属学校 = cooperationOrganName

二进制
mec-web/src/main/resources/excelTemplate/财务管理导入模板.xls


+ 8 - 4
mec-web/src/main/resources/exportColumnMapper.ini

@@ -111,12 +111,16 @@ headColumns = ["用户编号", "用户名", "手机号", "课程类型", "实际
 fieldColumns = ["userId", "username", "phone", "type.msg", "name", "actualSalary", "subsidy", "settlementTime", "teacherRole.msg"]
 
 [订单列表导出1]
-headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额", "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费","账户充值", "其它", "汇付手续费","平台手续费", "到账时间","关联乐团ID/VIP课ID","课程形态","课程形态描述","收费乐团编号","收费乐团","零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee","musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId","groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额", "课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它", "汇付手续费","平台手续费", "到账时间","关联乐团ID/VIP课ID","课程形态","课程形态描述","收费乐团编号","收费乐团","零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount","balancePaymentAmount","couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "transferFee", "platformFee", "payTime", "musicGroupId","groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [订单列表导出2]
-headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额",    "乐团课", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费",    "账户充值", "其它","平台手续费", "到账时间",    "关联乐团ID/VIP课ID", "课程形态","课程形态描述","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
-fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+headColumns = ["序号", "学生编号", "学生姓名", "交易流水号", "订单编号", "收款渠道", "收款账户", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它","平台手续费", "到账时间",    "关联乐团ID/VIP课ID", "课程形态","课程形态描述","收费乐团编号","收费乐团", "零星收款类别", "专业", "分部", "教学点", "合作单位", "乐团主管", "备注"]
+fieldColumns = ["id", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee",     "musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee",     "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc.msg","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
+
+[订单列表汇总导出]
+headColumns = ["分部", "订单金额", "应付金额", "现金支付", "余额支付", "优惠金额","课程家长采买","课程学校采买", "VIP课", "网管课", "乐理课", "考级", "维修费用", "乐保费用", "团练宝", "押金", "乐器", "教辅费用", "上门费","账户充值", "零售乐器","大件乐器", "其它"]
+fieldColumns = ["organName", "orderAmount", "expectAmount", "actualAmount", "balancePaymentAmount",  "couponRemitFee","musicGroupCourseFee","courseSchoolBuyAmount", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee","leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee","retailGoodsFee","largeMusicalFee", "otherFee"]
 
 [学员小课记录导出]
 headColumns = ["分部", "学员编号", "学生姓名", "年级", "课程余额", "声部" ,"声部班老师编号" ,"声部班老师", "上次课时间", "VIP总课时数", "VIP已结束课时数", "VIP未开始课时数", "已结束VIP课程组老师编号", "已结束VIP课程组老师", "未开始VIP课程组老师编号", "未开始VIP课程组老师","网管课已结束课时数", "网管课未开始课时数", "已结束网管课课程组老师编号", "已结束网管课课程组老师", "未开始网管课课程组老师编号", "未开始网管课课程组老师", "指导老师编号", "指导老师"]