浏览代码

经营报表数据统计

zouxuan 2 年之前
父节点
当前提交
d1b4734cbb

+ 2 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/OperatingTotalIncomeDto.java

@@ -9,12 +9,11 @@ public class OperatingTotalIncomeDto {
     // 城市
     private String organName;
 
+    private Integer organId;
+
     // 学生指导费课耗收入
     private BigDecimal studentGuidanceIncome = BigDecimal.ZERO;
 
-    // 云教练团课耗收入
-//    private BigDecimal cloudCoachGroupClassIncome;
-
     // 学校课程采买课耗收入
     private BigDecimal coursePurchaseIncome = BigDecimal.ZERO;
 

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dto.CloudTeacherOrderDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.CloudTeacherAddQueryInfo;
@@ -17,6 +18,8 @@ import java.util.Set;
 
 public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacherOrder> {
 
+    CloudTeacherOrderDao getDao();
+
     /**
      * 查询未激活用户
      */

+ 5 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -5,13 +5,10 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
+import com.ym.mec.biz.dal.dto.*;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dto.PageInfoOrder;
-import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
 import com.ym.mec.biz.dal.entity.ActivityUserMapper;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentOrderDetail;
@@ -116,6 +113,8 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     List<StudentPaymentOrderExportDto> ExportQueryPage(Map<String, Object> params);
 
+
+
     /**
      * 获取零星收费订单列表
      *
@@ -270,4 +269,6 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     // 查询余额
     BigDecimal balance(Long userId);
+
+    List<OperatingTotalIncomeDto> queryOperatingSummaryIncome(Map<String, Object> params);
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentStatisticsDao;
 import com.ym.mec.biz.dal.dto.StudentStatisticsDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumForDateDto;
@@ -13,6 +14,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface StudentStatisticsService extends BaseService<Integer, StudentStatistics> {
+    StudentStatisticsDao getDao();
 
     //定时任务
     void updateStudentStatistics();

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

@@ -90,6 +90,11 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
     }
 
     @Override
+    public CloudTeacherOrderDao getDao() {
+        return cloudTeacherOrderDao;
+    }
+
+    @Override
     public PageInfo<CloudTeacherStudent> queryInactive(CloudTeacherOrderQueryInfo queryInfo) throws Exception {
         PageInfo<CloudTeacherStudent> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<>();

+ 25 - 329
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -113,8 +113,6 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private TenantPaymentOrderService tenantPaymentOrderService;
     @Autowired
-    private CourseScheduleDao courseScheduleDao;
-    @Autowired
     private ExtracurricularExercisesReplyService extracurricularExercisesReplyService;
     @Autowired
     private StudentExtracurricularExercisesSituationService studentExtracurricularExercisesSituationService;
@@ -131,8 +129,6 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private CooperationOrganService cooperationOrganService;
     @Autowired
-    private StudentPaymentOrderDao studentPaymentOrderDao;
-    @Autowired
     private MusicGroupPaymentCalenderDetailService musicGroupPaymentCalenderDetailService;
     @Autowired
     private TeacherService teacherService;
@@ -185,13 +181,9 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private StudentCourseConsumerService studentCourseConsumerService;
     @Autowired
-    private StudentStatisticsDao studentStatisticsDao;
-    @Autowired
     private StudentTeacherMapperDao studentTeacherMapperDao;
     @Autowired
     private TeacherCloudCourseReportService teacherCloudCourseReportService;
-    @Autowired
-    private CloudTeacherOrderDao cloudTeacherOrderDao;
 
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
     @Autowired
@@ -412,7 +404,7 @@ public class ExportServiceImpl implements ExportService {
         String month = getParam(info, "month", String.class);
         Map<String, Object> params = new HashMap<>(1);
         params.put("month",month);
-        int count = studentPaymentOrderDao.queryCount1(params);
+        int count = studentPaymentOrderService.getDao().queryCount1(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -661,7 +653,9 @@ public class ExportServiceImpl implements ExportService {
                 }
             }
             for (MusicalListDetailDto musicalListDetail : musicalListDetails) {
-                if (!musicalListDetail.getUserId().equals(studentApplyDetailDto.getStudentId())) continue;
+                if (!musicalListDetail.getUserId().equals(studentApplyDetailDto.getStudentId())) {
+                    continue;
+                }
                 studentApplyDetailDto.setKitGroupPurchaseTypeEnum(musicalListDetail.getKitGroupPurchaseTypeEnum());
             }
             if (PaymentStatusEnum.YES.equals(studentApplyDetailDto.getPaymentStatus()) && studentApplyDetailDto.getKitGroupPurchaseTypeEnum() == null) {
@@ -784,10 +778,10 @@ public class ExportServiceImpl implements ExportService {
             throw new BizException("没有可导出的记录");
         }
         Set<Integer> studentIds = practiceGroupExports.stream().map(CourseGroupExportDto::getStudentId).collect(Collectors.toSet());
-        List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentCourseInfo(studentIds, GroupType.PRACTICE);
+        List<CourseGroupExportDto> studentCourseInfos = courseScheduleService.getDao().getStudentCourseInfo(studentIds, GroupType.PRACTICE);
 
-        List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, null);
-        List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, CourseStatusEnum.NOT_START);
+        List<CourseGroupExportDto> totalClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, null);
+        List<CourseGroupExportDto> noStartClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.PRACTICE, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto practiceGroupExport : practiceGroupExports) {
             for (CourseGroupExportDto studentCourseInfo : studentCourseInfos) {
                 if (studentCourseInfo.getStudentId().equals(practiceGroupExport.getStudentId())) {
@@ -817,7 +811,7 @@ public class ExportServiceImpl implements ExportService {
     //vip管理导出
     @Override
     public List vipGroup() {
-        List<CourseGroupExportDto> vipGroupExports = courseScheduleDao.getVipGroupExport(organizationService.getEmployeeOrgan(""));
+        List<CourseGroupExportDto> vipGroupExports = courseScheduleService.getDao().getVipGroupExport(organizationService.getEmployeeOrgan(""));
         if (vipGroupExports == null || vipGroupExports.size() == 0) {
             throw new BizException("没有可导出的记录");
         }
@@ -827,9 +821,9 @@ public class ExportServiceImpl implements ExportService {
         if (!CollectionUtils.isEmpty(studentLastCourseSchedule)) {
             studentLastCourseMap = MapUtil.convertMybatisMap(studentLastCourseSchedule);
         }
-        List<CourseGroupExportDto> studentCourseInfos = courseScheduleDao.getStudentVipCourseInfo(studentIds);
-        List<CourseGroupExportDto> totalClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
-        List<CourseGroupExportDto> noStartClassTimes = courseScheduleDao.getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
+        List<CourseGroupExportDto> studentCourseInfos = courseScheduleService.getDao().getStudentVipCourseInfo(studentIds);
+        List<CourseGroupExportDto> totalClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.VIP, null);
+        List<CourseGroupExportDto> noStartClassTimes = courseScheduleService.getDao().getStudentCourseScheduleNum(studentIds, GroupType.VIP, CourseStatusEnum.NOT_START);
         for (CourseGroupExportDto vipGroupExport : vipGroupExports) {
 
             String lastClassDateStr = studentLastCourseMap.get(vipGroupExport.getStudentId());
@@ -999,7 +993,7 @@ public class ExportServiceImpl implements ExportService {
         orderTypeList.add(OrderTypeEnum.PRACTICE_GROUP_BUY);
         orderTypeList.add(OrderTypeEnum.PRACTICE_GROUP_RENEW);
         orderTypeList.add(OrderTypeEnum.SMALL_CLASS_TO_BUY);
-        List<OrderByTypeExportDto> orders = studentPaymentOrderDao.getOrderByMonthAndType(organIds, orderTypeList, startTime, EndTime);
+        List<OrderByTypeExportDto> orders = studentPaymentOrderService.getDao().getOrderByMonthAndType(organIds, orderTypeList, startTime, EndTime);
 
         if (orders.size() <= 0) {
             throw new BizException("没有可导出的记录");
@@ -1411,7 +1405,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setRoutingOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getRoutingOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1441,7 +1435,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setRoutingOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getRoutingOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1550,7 +1544,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<String, Object>();
         queryInfo.setRows(65535);
         MapUtil.populateMap(params, queryInfo);
-        int count = studentStatisticsDao.countCourseConsumerDetail(params);
+        int count = studentStatisticsService.getDao().countCourseConsumerDetail(params);
         checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_COURSE_CONSUMER_DETAIL,user.getId());
         return this.asyncExport(() -> this.initExportInfo(studentCourseConsumerService.findCourseConsumerDetail(params), managerDownload,ExportEnum.EXPORT_COURSE_CONSUMER_DETAIL),
@@ -1573,7 +1567,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<String, Object>();
         queryInfo.setRows(65535);
         MapUtil.populateMap(params, queryInfo);
-        int count = studentStatisticsDao.countPreCourseConsumerDetail(params);
+        int count = studentStatisticsService.getDao().countPreCourseConsumerDetail(params);
         checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL,user.getId());
         return this.asyncExport(() -> this.initExportInfo(studentCourseConsumerService.findPreCourseConsumerDetail(params), managerDownload,ExportEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL),
@@ -1674,7 +1668,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1684,7 +1678,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         params.put("notGroupType","MALL_SELL");
-        int count = studentPaymentOrderDao.queryCount(params);
+        int count = studentPaymentOrderService.getDao().queryCount(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -1702,7 +1696,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1712,7 +1706,7 @@ public class ExportServiceImpl implements ExportService {
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
         params.put("paymentType","MALL_BUY");
-        int count = studentPaymentOrderDao.queryCount(params);
+        int count = studentPaymentOrderService.getDao().queryCount(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -1731,7 +1725,7 @@ public class ExportServiceImpl implements ExportService {
         SysUser sysUser = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(sysUser.getId(), queryInfo.getOrganId(), sysUser.getIsSuperAdmin()));
         if (StringUtils.isNotBlank(queryInfo.getSearch())) {
-            List<BasicUserDto> users = studentPaymentOrderDao.getUsers(queryInfo.getSearch());
+            List<BasicUserDto> users = studentPaymentOrderService.getDao().getUsers(queryInfo.getSearch());
             List<Integer> userIds = users.stream().map(BasicUserDto::getUserId).collect(Collectors.toList());
             if (userIds.size() <= 0) {
                 userIds.add(0);
@@ -1740,7 +1734,7 @@ public class ExportServiceImpl implements ExportService {
         }
         Map<String, Object> params = new HashMap<>();
         MapUtil.populateMap(params, queryInfo);
-        int count = studentPaymentOrderDao.queryCount(params);
+        int count = studentPaymentOrderService.getDao().queryCount(params);
         if (count <= 0) {
             return BaseController.failed("没有可导出的数据");
         }
@@ -1782,7 +1776,7 @@ public class ExportServiceImpl implements ExportService {
 
     @Override
     public void mallOrderList(Map<String, Object> params, ManagerDownload managerDownload){
-        List<StudentPaymentOrderMallExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.exportMallQueryPage(params);
+        List<StudentPaymentOrderMallExportDto> studentPaymentOrderExportDtos = studentPaymentOrderService.getDao().exportMallQueryPage(params);
         long i = 1;
         //获取机构费率
         Integer tenantId = (Integer) params.get("tenantId");
@@ -2185,7 +2179,7 @@ public class ExportServiceImpl implements ExportService {
                     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());
+                            int orderNum = studentPaymentOrderService.getDao().getStudentMusicOrderNum(row.getMusicGroupId(), row.getUserId(), row.getId());
                             if (orderNum == 0) {
                                 row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.MUSIC_CONVERT.getMsg());
                             }
@@ -2311,305 +2305,7 @@ public class ExportServiceImpl implements ExportService {
 
     @Override
     public void operatingSummaryIncome(Map<String, Object> params, ManagerDownload managerDownload) {
-        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.ExportQueryPage1(params);
-        long i = 1;
-        //获取机构费率
-        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));
-        }
-        //阳光、善学、坚韧、做更好的自己
-        List<Integer> organIds = studentPaymentOrderExportDtos.stream().map(e -> e.getOrganId()).distinct().collect(Collectors.toList());
-        Map<Integer, String> userOrganNameMap = organizationService.getMap("organization","id_","name_",organIds,managerDownload.getTenantId(),Integer.class,String.class);
-        //按分部分组
-        Map<Integer, List<StudentPaymentOrderExportDto>> listMap = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
-        List<OperatingTotalIncomeDto> incomeDtos = new ArrayList<>();
-        //承担课程的云教练收入
-        String month = params.get("month").toString();
-//        String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-//        String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-
-        String cutMonth = DateUtil.dateToString(DateUtil.addMonths(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT),-1),DateUtil.ISO_YEAR_MONTH_FORMAT);
-        String cutFirstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(cutMonth,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-        String cutLastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(cutMonth,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-        Map<Integer, BigDecimal> groupCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderDao.sumGroupCloudAmount(cutMonth,cutFirstDayOfMonth,cutLastDayOfMonth));
-        //不承担课程的云教练收入
-        Map<Integer, BigDecimal> personalCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderDao.sumPersonalCloudAmount(cutMonth,cutFirstDayOfMonth,cutLastDayOfMonth));
-        List<Map> courseFeeStat = courseScheduleStudentPaymentDao.statCourseFee(cutFirstDayOfMonth,cutLastDayOfMonth);
-        Map<Integer, BigDecimal> courseIncome = courseFeeStat.stream().collect(Collectors.toMap(s -> Integer.parseInt(s.get("key").toString()), s -> BigDecimal.valueOf(Double.parseDouble(s.get("value").toString()))));
-        for (Integer organId : listMap.keySet()) {
-            OperatingTotalIncomeDto incomeDto = new OperatingTotalIncomeDto();
-            incomeDto.setOrganName(userOrganNameMap.get(organId));
-            for (StudentPaymentOrderExportDto row : listMap.get(organId)) {
-                if (row.getActualAmount() == null) {
-                    row.setActualAmount(BigDecimal.ZERO);
-                }
-                if (row.getBalancePaymentAmount() == null) {
-                    row.setBalancePaymentAmount(BigDecimal.ZERO);
-                }
-                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 (row.getGroupType() != GroupType.GOODS_SELL) {
-                                    if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
-                                        row.setLeaseFee(getActualAmount(orderDetail.getPrice(), row));
-                                    } 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:
-                                row.setMaintenanceFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case CLOUD_TEACHER:
-                            case CLOUD_TEACHER_PLUS:
-                                row.setCloudTeacherFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case DEGREE_REGISTRATION:
-                                row.setDegreeFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case PRACTICE:
-                                row.setPracticeCourseFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case VIP:
-                                row.setVipCourseFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case THEORY_COURSE:
-                                row.setTheoryCourseFee(getActualAmount(orderDetail.getPrice(), row));
-                                break;
-                            case REPAIR:
-                                row.setRepairFee(getActualAmount(orderDetail.getPrice(), row));
-                                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)) {
-                        if(StringUtils.isEmpty(row.getMemo())){
-                            row.setDegreeFee(row.getActualAmount());
-                        }else {
-                            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.getGroupType().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);
-                            } 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.setTransferFee(BigDecimal.ZERO);
-                            row.setPlatformFee(BigDecimal.ZERO);
-                        }
-                    }
-                }
-                row.setId(i);
-                row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
-                row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
-                i++;
-                //学员指导课费
-//                incomeDto.setStudentGuidanceIncome(incomeDto.getStudentGuidanceIncome()
-//                        .add(row.getMusicGroupCourseFee())
-//                        .add(row.getVipCourseFee())
-//                        .add(row.getPracticeCourseFee())
-//                        .add(row.getTheoryCourseFee()));
-                //学校课程采买
-                incomeDto.setCoursePurchaseIncome(incomeDto.getCoursePurchaseIncome()
-                        .add(row.getCourseSchoolBuyAmount()));
-                //考级
-                incomeDto.setExamIncome(incomeDto.getExamIncome()
-                        .add(row.getDegreeFee()));
-                //维修费用
-                incomeDto.setMaintenanceCost(incomeDto.getMaintenanceCost()
-                        .add(row.getRepairFee()));
-                //其他服务收入
-                incomeDto.setOtherServiceIncome(incomeDto.getOtherServiceIncome()
-                        .add(row.getLeaseFee())
-                        .add(row.getVisitFee())
-                        .add(row.getRechargeFee())
-                        .add(row.getOtherFee())
-                );
-                //团购乐器
-                incomeDto.setGroupPurchaseInstruments(incomeDto.getGroupPurchaseInstruments()
-                        .add(row.getMusicalFee()));
-                //零售乐器,计入其他
-                incomeDto.setOtherIncome(incomeDto.getOtherIncome()
-                        .add(row.getRetailGoodsFee()));
-                if(row.getGroupType() == GroupType.GOODS_SELL){
-                    //零售教辅,计入其他
-                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
-                            .add(row.getTeachingFee()));
-                }else {
-                    //团购教辅
-                    incomeDto.setGroupPurchaseTeachingAids(incomeDto.getGroupPurchaseTeachingAids()
-                            .add(row.getTeachingFee()));
-                }
-                //区分零售月保
-                if(row.getGroupType() == GroupType.MAINTENANCE){
-                    //零售月保,计入其他
-                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
-                            .add(row.getMaintenanceFee()));
-                }else {
-                    //团购月保
-                    incomeDto.setInstrumentInsuranceCost(incomeDto.getInstrumentInsuranceCost()
-                            .add(row.getMaintenanceFee()));
-                }
-
-                //大件乐器
-                incomeDto.setLargeInstruments(incomeDto.getLargeInstruments()
-                        .add(row.getLargeMusicalFee()));
-            }
-            //学员指导课费
-            incomeDto.setStudentGuidanceIncome(incomeDto.getStudentGuidanceIncome().add(courseIncome.getOrDefault(organId,BigDecimal.ZERO)));
-            incomeDto.setCloudCoachIncome(incomeDto.getCloudCoachIncome().add(groupCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
-            incomeDto.setSaleCloudCoachIncome(incomeDto.getSaleCloudCoachIncome().add(personalCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
-            //服务收入
-            incomeDto.setServiceIncome(incomeDto.getLargeInstruments()
-                    .add(incomeDto.getStudentGuidanceIncome())
-                    .add(incomeDto.getCoursePurchaseIncome())
-                    .add(incomeDto.getExamIncome())
-                    .add(incomeDto.getMaintenanceCost())
-                    .add(incomeDto.getInstrumentInsuranceCost())
-                    .add(incomeDto.getOtherServiceIncome())
-                    .add(incomeDto.getCloudCoachIncome())
-            );
-            incomeDto.setSalesIncome(incomeDto.getSalesIncome()
-                    .add(incomeDto.getSaleCloudCoachIncome())
-                    .add(incomeDto.getGroupPurchaseInstruments())
-                    .add(incomeDto.getGroupPurchaseTeachingAids())
-                    .add(incomeDto.getLargeInstruments())
-                    .add(incomeDto.getOtherIncome())
-            );
-            incomeDtos.add(incomeDto);
-        }
+        List<OperatingTotalIncomeDto> incomeDtos = studentPaymentOrderService.queryOperatingSummaryIncome(params);
         HSSFWorkbook workbook = getHSSFWorkbook(incomeDtos, ExportEnum.EXPORT_OPERATING_SUMMARY_INCOME);
         exportManagerDownload(workbook, managerDownload);
     }

+ 16 - 174
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OperatingReportNewServiceImpl.java

@@ -6,10 +6,12 @@ import com.ym.mec.biz.dal.dao.OperatingReportNewDao;
 import com.ym.mec.biz.dal.dao.VipGroupCategoryDao;
 import com.ym.mec.biz.dal.dto.HumanTypeDto;
 import com.ym.mec.biz.dal.dto.OASummaryExpensesDto;
+import com.ym.mec.biz.dal.dto.OperatingTotalIncomeDto;
 import com.ym.mec.biz.dal.entity.FinancialExpenditure;
 import com.ym.mec.biz.dal.entity.OperatingReportNew;
 import com.ym.mec.biz.dal.entity.VipGroupCategory;
 import com.ym.mec.biz.service.OperatingReportNewService;
+import com.ym.mec.biz.service.StudentPaymentOrderService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
@@ -34,6 +36,8 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 	private OperatingReportCloudDao operatingReportCloudDao;
 	@Autowired
 	private CourseScheduleDao courseScheduleDao;
+	@Autowired
+	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@Override
 	public BaseDAO<Integer, OperatingReportNew> getDAO() {
@@ -45,177 +49,6 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
         return operatingReportNewDao;
     }
 
-
-	@Transactional(rollbackFor = Exception.class)
-	public void operatingReportMonth1(Date month) {
-		String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-		String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_EXPANDED_DATE_FORMAT);
-		String currentMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_MONTH_FORMAT);
-		String currentYear = DateUtil.dateToString(DateUtil.getLastDayOfMonth(month),DateUtil.ISO_YEAR_FORMAT);
-		operatingReportNewDao.deleteByMonth(currentMonth);
-		List<OperatingReportNew> operatingList = operatingReportNewDao.initOperatingReport(currentMonth);
-		//更新团体云教练计费时间()
-		operatingReportNewDao.initCloudStartTime(lastDayOfMonth);
-		//标记缴费项目为已结算(已排课,并且在上个月有关联的课程)
-		operatingReportCloudDao.settlementCalender(currentMonth);
-		//标记当月结算的缴费项目(缴费项目结算后缴费、或者进行中加学员的都算当月结算)
-		operatingReportCloudDao.settlementCurrentCalender(currentMonth);
-		//分部销售收入、销售成本
-		List<OperatingReportNew> sellList = operatingReportNewDao.sumSellAmount(currentMonth);
-		Map<Integer, OperatingReportNew> collect = sellList.stream().collect(Collectors.groupingBy(OperatingReportNew::getOrganId,Collectors.collectingAndThen(Collectors.toList(),value->value.get(0))));
-		//服务收入
-		//导入的服务收入  (全部记录为课程收入)
-		Map<Integer, BigDecimal> collect24 = MapUtil.convertIntegerMap(operatingReportNewDao.sumImportServerOrderAmount(currentMonth));
-		//1、调整student_registration表surplus_course_fee_字段,原有逻辑是用于保存学员已缴费,但是未排课的总乐团课程费用。在课程结束后按课程预计金额分摊到课程实际收入。
-		// 现在需要新增逻辑,记录免费团溢出的乐器课费、以及云教练团溢出的课费。用于在课程结束后计算实际课费,涉及到乐团缴费项目、支付回调
-
-		//2、music_group_payment_calender_course_settings表新增字段,用于记录 云教练、乐器溢出的课程费用,在排课时用于计算预计课费、涉及到降费项目创建、报名支付回调
-
-		//3、course_schedule表新增字段 标记课程是否结算经营报表,用于年底确认经营报表收入、或者已结束调整到未开始,涉及到所有的排课、调整、合班、合课逻辑
-
-		//4、课程调整逻辑修改、已结算经营报表的课程不允许调整(需要合业务部门确认)。如果可以调整,需要在course_schedule_student_payment 表新增结算金额,用于记录已结算的金额,在下次结算时去单独计算。
-
-		//5、初始化历史云教练缴费数据,按课程数量和课费总额比例计算,已排课的初始化预计金额、已缴费的初始化实际金额、以及部分排课数据初始化
-
-		//6、云教练按月计算收入,只计算配置金额,溢出的部分分配给课程
-		//云教练赠送课程实际收入
-//		Map<Integer, BigDecimal> collect1 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCourseAmount(firstDayOfMonth,lastDayOfMonth));
-		//亏损的云教练算到当月实际收入
-//		Map<Integer, BigDecimal> collect22 = MapUtil.convertIntegerMap(operatingReportNewDao.sumLossCloudAmount(currentMonth));
-		//付费课程实际收入
-		Map<Integer, BigDecimal> collect2 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCourseAmount(firstDayOfMonth,lastDayOfMonth,currentYear));
-		//获取分部学员管理费(每个在读学员80块,算分部成本,总部收入)
-		Map<Integer, BigDecimal> studentManagementFeeMap = MapUtil.convertIntegerMap(operatingReportNewDao.sumStudentManagementFee());
-
-
-		//个人云教练当月收入
-		Map<Integer, BigDecimal> collect3 = MapUtil.convertIntegerMap(operatingReportNewDao.sumPersonalCloudAmount(currentMonth,firstDayOfMonth,lastDayOfMonth));
-		//团体云教练费用
-		Map<Integer, BigDecimal> collect4 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupCloudAmount(currentMonth,firstDayOfMonth,lastDayOfMonth));
-		//团体云教练当月一次性结转
-		Map<Integer, BigDecimal> collect5 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupAmount(currentMonth));
-
-		//乐保实收
-		Map<Integer, BigDecimal> collect26 = MapUtil.convertIntegerMap(operatingReportNewDao.sumMaintenanceAmount(currentMonth));
-
-		//业务退费
-		Map<Integer, BigDecimal> collect6 = MapUtil.convertIntegerMap(operatingReportNewDao.sumRefundAmount(currentMonth));
-		//变动费用
-		Map<Integer, BigDecimal> collect7 = MapUtil.convertIntegerMap(operatingReportNewDao.sumVariableCosts(currentMonth));
-		//固定费用
-		Map<Integer, BigDecimal> collect8 = MapUtil.convertIntegerMap(operatingReportNewDao.sumFixedCosts(currentMonth));
-		//内部结算
-		Map<Integer, BigDecimal> collect18 = MapUtil.convertIntegerMap(operatingReportNewDao.sumInternalSettlement(currentMonth));
-
-		//云教练预收款
-		//个人云教练预收款
-		Map<Integer, BigDecimal> collect9 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudPreAmount(currentMonth,lastDayOfMonth));
-		//团体云教练预收款
-		Map<Integer, BigDecimal> collect10 = MapUtil.convertIntegerMap(operatingReportNewDao.sumGroupCloudPreAmount(currentMonth,lastDayOfMonth));
-		//未生效云教练预收款
-		Map<Integer, BigDecimal> collect25 = MapUtil.convertIntegerMap(operatingReportNewDao.sumWaitCloudPreAmount());
-		//已排课但是课程未开始的云教练预收
-		Map<Integer, BigDecimal> collect27 = MapUtil.convertIntegerMap(operatingReportNewDao.sumNotStartCloudPreAmount());
-
-		//课程预收
-		//云教练赠课预收
-//		Map<Integer, BigDecimal> collect11 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudCoursePreAmount(lastDayOfMonth));
-		//云教练赠送,未排课排课资格预收
-		//获取categoryId
-		VipGroupCategory category = vipGroupCategoryDao.getTheory();
-		Map<Integer, BigDecimal> collect20 = MapUtil.convertIntegerMap(operatingReportNewDao.sumActivityUserMapperAmount(category.getId()));
-		//付费课程预收
-		Map<Integer, BigDecimal> collect12 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCoursePreAmount(lastDayOfMonth));
-		//付费团未排乐团课程预收(学员缴费)
-		Map<Integer, BigDecimal> collect21 = MapUtil.convertIntegerMap(operatingReportNewDao.sumMusicCourseAmount());
-		//排课资格预收
-		Map<Integer, BigDecimal> collect23 = MapUtil.convertIntegerMap(operatingReportNewDao.sumSubActivityUserMapperAmount());
-
-		//销售预收
-		Map<Integer, BigDecimal> collect13 = MapUtil.convertIntegerMap(operatingReportNewDao.sumSalePreAmount());
-
-		//其他预收
-		Map<Integer, BigDecimal> collect14 = MapUtil.convertIntegerMap(operatingReportNewDao.sumOtherPreAmount());
-
-		//预付款
-		//房租
-		Map<Integer, BigDecimal> collect19 = MapUtil.convertIntegerMap(operatingReportNewDao.sumPrepayments(currentMonth));
-
-		//应收
-		//欠费学员总金额
-		Map<Integer, BigDecimal> collect15 = MapUtil.convertIntegerMap(operatingReportNewDao.sumArrearsAmount());
-		//学校缴费订单待收款金额
-		Map<Integer, BigDecimal> collect16 = MapUtil.convertIntegerMap(operatingReportNewDao.sumSchoolAmount());
-
-		//应付(乐器押金)
-		List<Map<Integer, BigDecimal>> maps = operatingReportNewDao.sumMusicMargin();
-		Map<Integer, BigDecimal> collect17 = MapUtil.convertIntegerMap(maps);
-
-		for (OperatingReportNew operatingReportNew : operatingList) {
-			Integer organId = operatingReportNew.getOrganId();
-			OperatingReportNew reportNew = collect.get(organId);
-			if(Objects.nonNull(reportNew)){
-				operatingReportNew.setSaleAmount(reportNew.getSaleAmount());
-				operatingReportNew.setSaleCost(reportNew.getSaleCost());
-			}
-			operatingReportNew.setStudentManagementFee(studentManagementFeeMap.get(organId));
-			operatingReportNew.setCourseAmount(getAmount(collect2.get(organId)));
-//			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect2.get(organId))));
-			operatingReportNew.setCourseAmount(operatingReportNew.getCourseAmount().add(getAmount(collect24.get(organId))));
-
-			operatingReportNew.setCloudAmount(getAmount(collect3.get(organId)));
-			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect4.get(organId))));
-			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect5.get(organId))));
-//			operatingReportNew.setCloudAmount(operatingReportNew.getCloudAmount().add(getAmount(collect22.get(organId))));
-
-			operatingReportNew.setMaintenanceAmount(getAmount(collect26.get(organId)));
-			operatingReportNew.setBusinessRefund(getAmount(collect6.get(organId)));
-
-			operatingReportNew.setServiceAmount(operatingReportNew.getCloudAmount().add(operatingReportNew.getCourseAmount()).add(operatingReportNew.getMaintenanceAmount()));
-			operatingReportNew.setTotalIncome(operatingReportNew.getSaleAmount().add(operatingReportNew.getServiceAmount()).subtract(operatingReportNew.getBusinessRefund()));
-
-			operatingReportNew.setInternalSettlement(getAmount(collect18.get(organId)));
-			operatingReportNew.setVariableCosts(getAmount(collect7.get(organId)));
-			//固定费用
-			operatingReportNew.setFixedCosts(getAmount(collect8.get(organId)));
-			//成本合计
-			operatingReportNew.setTotalCost(operatingReportNew.getInternalSettlement().
-					add(operatingReportNew.getFixedCosts()).
-					add(operatingReportNew.getVariableCosts()).
-					add(operatingReportNew.getStudentManagementFee()));
-
-			operatingReportNew.setCloudPrepaidFee(getAmount(collect9.get(organId)).
-					add(getAmount(collect10.get(organId))).
-					add(getAmount(collect27.get(organId))).
-					add(getAmount(collect25.get(organId))));
-			operatingReportNew.setCoursePrepaidFee(getAmount(collect12.get(organId)).
-					add(getAmount(collect20.get(organId))).add(getAmount(collect21.get(organId))).add(getAmount(collect23.get(organId))));
-			operatingReportNew.setSalePrepaidFee(getAmount(collect13.get(organId)));
-			operatingReportNew.setOtherPrepaidFee(getAmount(collect14.get(organId)));
-			operatingReportNew.setPrepaidFee(operatingReportNew.getCloudPrepaidFee().
-					add(operatingReportNew.getSalePrepaidFee()).
-					add(operatingReportNew.getOtherPrepaidFee()).
-					add(operatingReportNew.getCoursePrepaidFee()));
-
-			operatingReportNew.setReceivables(getAmount(collect15.get(organId)).add(getAmount(collect16.get(organId))));
-			operatingReportNew.setPayable(getAmount(collect17.get(organId)));
-
-			operatingReportNew.setPrepayments(getAmount(collect19.get(organId)));
-
-			operatingReportNew.setQuasiDiscretionaryProfit(operatingReportNew.getTotalIncome().subtract(operatingReportNew.getTotalCost()));
-		}
-		//计算总部经营报表
-		OperatingReportNew operatingReportNew = new OperatingReportNew();
-		operatingReportNew.setOrganName("总部");
-		operatingReportNew.setStudentManagementFee(operatingList.stream().map(e->e.getStudentManagementFee()).reduce(BigDecimal.ZERO,BigDecimal::add));
-		OperatingReportNew totalSellAmount = operatingReportNewDao.sumTotalSellAmount(currentMonth);
-		operatingReportNew.setSaleAmount(totalSellAmount.getSaleAmount());
-		operatingReportNew.setSaleCost(totalSellAmount.getSaleCost());
-		operatingReportNewDao.batchInsert(operatingList);
-		//将本月乐团课标记为已结算
-		courseScheduleDao.makeSettlementReport(currentMonth);
-	}
-
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public void operatingReportMonth(Date month) {
@@ -231,9 +64,14 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		operatingReportCloudDao.settlementCalender(currentMonth);
 		//标记当月结算的缴费项目(缴费项目结算后缴费、或者进行中加学员的都算当月结算)
 		operatingReportCloudDao.settlementCurrentCalender(currentMonth);
-		//分部销售收入、销售成本
+		//分部销售成本
 		List<OperatingReportNew> sellList = operatingReportNewDao.sumSellAmount(currentMonth);
 		Map<Integer, OperatingReportNew> collect = sellList.stream().collect(Collectors.groupingBy(OperatingReportNew::getOrganId,Collectors.collectingAndThen(Collectors.toList(),value->value.get(0))));
+		//分部销售收入
+		Map<String, Object> paramMap = new HashMap<>(1);
+		paramMap.put("month",month);
+		List<OperatingTotalIncomeDto> incomeDtos = studentPaymentOrderService.queryOperatingSummaryIncome(paramMap);
+		Map<Integer, OperatingTotalIncomeDto> incomeDtoMap = incomeDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
 		//服务收入
 		//导入的服务收入  (全部记录为课程收入)
 		Map<Integer, BigDecimal> collect24 = MapUtil.convertIntegerMap(operatingReportNewDao.sumImportServerOrderAmount(currentMonth));
@@ -255,7 +93,6 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 		//固定费用
 		Map<Integer, BigDecimal> collect8 = MapUtil.convertIntegerMap(operatingReportNewDao.sumFixedCosts(currentMonth));
 
-
 		//云教练预收款
 		//个人云教练预收款
 		Map<Integer, BigDecimal> collect9 = MapUtil.convertIntegerMap(operatingReportNewDao.sumCloudPreAmount(currentMonth,lastDayOfMonth));
@@ -303,9 +140,14 @@ public class OperatingReportNewServiceImpl extends BaseServiceImpl<Integer, Oper
 
 		for (OperatingReportNew operatingReportNew : operatingList) {
 			Integer organId = operatingReportNew.getOrganId();
+			OperatingTotalIncomeDto incomeDto = incomeDtoMap.get(organId);
+			if(Objects.nonNull(incomeDto)){
+				//销售收入
+				operatingReportNew.setSaleAmount(incomeDto.getSalesIncome());
+			}
 			OperatingReportNew reportNew = collect.get(organId);
 			if(Objects.nonNull(reportNew)){
-				operatingReportNew.setSaleAmount(reportNew.getSaleAmount());
+//				operatingReportNew.setSaleAmount(reportNew.getSaleAmount());
 				operatingReportNew.setSaleCost(reportNew.getSaleCost());
 			}
 			HumanTypeDto humanTypeDto = humanMap.get(organId);

+ 332 - 19
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -124,7 +124,6 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private SysPaymentConfigService sysPaymentConfigService;
     @Autowired
     private SellOrderDao sellOrderDao;
-
     @Lazy
     @Autowired
     private ContractService contractService;
@@ -133,11 +132,10 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Autowired
     private StudentDao studentDao;
     @Autowired
-    private StudentPaymentOrderService studentPaymentOrderService;
-
-
-    @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
+    @Autowired
+    private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
+
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
     @Override
     public BaseDAO<Long, StudentPaymentOrder> getDAO() {
@@ -400,6 +398,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         sysCouponCodeService.quit(order.getCouponCodeId());
     }
 
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateOrder(Map<String, String> rpMap) throws Exception {
         DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
@@ -585,7 +584,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 memberRankSettingService.liveBuyOrderCallback(order);
             } else if (order.getType().equals(OrderTypeEnum.MALL_BUY)) {
                 // 商城购买订单回调
-                studentPaymentOrderService.mallBuyOrderCallback(order);
+                this.mallBuyOrderCallback(order);
             }
         }
     }
@@ -752,11 +751,15 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                     studentRegister.getPayingStatus().equals(2)) {
                 order.setPayingStatus(2);
             }
-            if (order.getOrderDetailList() == null) continue;
+            if (order.getOrderDetailList() == null) {
+                continue;
+            }
             
             BigDecimal organShareProfit = BigDecimal.ZERO;
             for (StudentPaymentOrderDetail studentPaymentOrderDetail : order.getOrderDetailList()) {
-                if (studentPaymentOrderDetail.getGoodsList() == null) continue;
+                if (studentPaymentOrderDetail.getGoodsList() == null) {
+                    continue;
+                }
 
                 String childGoodIds = "";
                 for (Goods goods : studentPaymentOrderDetail.getGoodsList()) {
@@ -1069,6 +1072,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
      *
      * @param param
      */
+    @Override
     public PageInfo<StudentPaymentOrderVo> queryOrder(Map<String, Object> param) throws Exception {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (Objects.isNull(user)) {
@@ -1090,6 +1094,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
      *
      * @param orderNo 订单编号
      */
+    @Override
     public StudentPaymentOrderVo queryOrderDetail(String orderNo) {
         Optional.ofNullable(orderNo)
                 .map(this::findOrderByOrderNo)
@@ -1190,7 +1195,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         BigDecimal balance = BigDecimal.ZERO;
 
         if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
-            StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(model.getOldOrderNo());
+            StudentPaymentOrder orderByOrderNo = this.findOrderByOrderNo(model.getOldOrderNo());
             if (orderByOrderNo == null) {
                 throw new BizException("未找到原订单");
             }
@@ -1199,7 +1204,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             // 已有订单,先关单
             orderByOrderNo.setStatus(CLOSE);
             orderByOrderNo.setMemo("关闭订单");
-            studentPaymentOrderService.update(orderByOrderNo);
+            this.update(orderByOrderNo);
             //退优惠券
             sysCouponCodeService.quit(orderByOrderNo.getCouponCodeId());
         }
@@ -1227,7 +1232,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         studentPaymentOrder.setOrganId(student.getOrganId());
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
         studentPaymentOrder.setTenantId(student.getTenantId());
-        studentPaymentOrderService.insert(studentPaymentOrder);
+        this.insert(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion());
 
         // 余额支付
@@ -1251,7 +1256,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 }
             }
         }
-        studentPaymentOrderService.update(studentPaymentOrder);
+        this.update(studentPaymentOrder);
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
         studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
@@ -1274,7 +1279,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             notifyMap.put("tradeState", "1");
             notifyMap.put("balanceAmount",studentPaymentOrder.getBalancePaymentAmount() == null?"0":studentPaymentOrder.getBalancePaymentAmount().toString());
             notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
-            studentPaymentOrderService.updateOrder(notifyMap);
+            this.updateOrder(notifyMap);
             notifyMap.put("orderNo", model.getOrderNo());
             return notifyMap;
         }
@@ -1296,7 +1301,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         payMap.put("balanceAmount",studentPaymentOrder.getBalancePaymentAmount() == null?BigDecimal.ZERO:studentPaymentOrder.getBalancePaymentAmount());
         studentPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
         studentPaymentOrder.setPaymentChannel((String) payMap.get("type"));
-        studentPaymentOrderService.update(studentPaymentOrder);
+        this.update(studentPaymentOrder);
         payMap.put("mallCouponAmount",studentPaymentOrder.getCouponRemitFee() == null?BigDecimal.ZERO:studentPaymentOrder.getCouponRemitFee());
         payMap.put("mallStatus",1);
         return payMap;
@@ -1308,7 +1313,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         Date nowDate = new Date();
         //更新订单信息
         studentPaymentOrder.setUpdateTime(nowDate);
-        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
+        int updateCount = this.update(studentPaymentOrder);
         if (updateCount <= 0) {
             throw new BizException("订单更新失败");
         }
@@ -1430,7 +1435,9 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 }
             }
             // 完全余额支付 不生成下面的记录
-            if (BigDecimal.ZERO.compareTo(studentPaymentOrder.getActualAmount()) == 0) return;
+            if (BigDecimal.ZERO.compareTo(studentPaymentOrder.getActualAmount()) == 0) {
+                return;
+            }
 
             //插入交易明细
             BigDecimal amount = studentPaymentOrder.getActualAmount();
@@ -1472,7 +1479,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Override
     @Transactional
     public void mallBuyOrderCallback1(Long orderId) {
-        StudentPaymentOrder studentPaymentOrder = studentPaymentOrderService.get(orderId);
+        StudentPaymentOrder studentPaymentOrder = this.get(orderId);
 
         Integer userId = studentPaymentOrder.getUserId();
 
@@ -1641,7 +1648,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional
     public BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo) {
 
-        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        StudentPaymentOrder orderByOrderNo = this.findOrderByOrderNo(orderNo);
         if (orderByOrderNo == null) {
             throw new BizException("为找到订单");
         }
@@ -1670,7 +1677,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     @Transactional
     public void receive(String orderNo, boolean autoReceive) {
 
-        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        StudentPaymentOrder orderByOrderNo = this.findOrderByOrderNo(orderNo);
         if (orderByOrderNo == null) {
             return;
         }
@@ -1691,4 +1698,310 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         }
         return userCashAccount.getBalance() == null?BigDecimal.ZERO:userCashAccount.getBalance();
     }
+
+    @Override
+    public List<OperatingTotalIncomeDto> queryOperatingSummaryIncome(Map<String, Object> params) {
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentOrderDao.ExportQueryPage1(params);
+        long i = 1;
+        //获取机构费率
+        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 (!org.springframework.util.CollectionUtils.isEmpty(otherOrderIds)) {
+            List<StudentPaymentOrderExportDto> feeByType = sellOrderDao.queryFeeByType(otherOrderIds);
+            feeByTypeMap = feeByType.stream().collect(Collectors.groupingBy(StudentPaymentOrderExportDto::getId));
+            childRepairMap = MapUtil.convertIntegerMap(sellOrderDao.queryChildRepair(otherOrderIds));
+        }
+        //阳光、善学、坚韧、做更好的自己
+        List<Integer> organIds = studentPaymentOrderExportDtos.stream().map(e -> e.getOrganId()).distinct().collect(Collectors.toList());
+        Map<Integer, String> userOrganNameMap = this.getMap("organization","id_","name_",organIds,1,Integer.class,String.class);
+        //按分部分组
+        Map<Integer, List<StudentPaymentOrderExportDto>> listMap = studentPaymentOrderExportDtos.stream().collect(Collectors.groupingBy(e -> e.getOrganId()));
+        List<OperatingTotalIncomeDto> incomeDtos = new ArrayList<>();
+        //承担课程的云教练收入
+        String month = params.get("month").toString();
+        String firstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        String lastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+
+        String cutMonth = DateUtil.dateToString(DateUtil.addMonths(DateUtil.stringToDate(month,DateUtil.ISO_YEAR_MONTH_FORMAT),-1),DateUtil.ISO_YEAR_MONTH_FORMAT);
+        String cutFirstDayOfMonth = DateUtil.dateToString(DateUtil.getFirstDayOfMonth(DateUtil.stringToDate(cutMonth,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        String cutLastDayOfMonth = DateUtil.dateToString(DateUtil.getLastDayOfMonth(DateUtil.stringToDate(cutMonth,DateUtil.ISO_YEAR_MONTH_FORMAT)),DateUtil.ISO_EXPANDED_DATE_FORMAT);
+        Map<Integer, BigDecimal> groupCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderService.getDao().sumGroupCloudAmount(month,firstDayOfMonth,lastDayOfMonth));
+        //不承担课程的云教练收入
+        Map<Integer, BigDecimal> personalCloudAmount = MapUtil.convertIntegerMap(cloudTeacherOrderService.getDao().sumPersonalCloudAmount(month,firstDayOfMonth,lastDayOfMonth));
+        List<Map> courseFeeStat = courseScheduleStudentPaymentDao.statCourseFee(cutFirstDayOfMonth,cutLastDayOfMonth);
+        Map<Integer, BigDecimal> courseIncome = courseFeeStat.stream().collect(Collectors.toMap(s -> Integer.parseInt(s.get("key").toString()), s -> BigDecimal.valueOf(Double.parseDouble(s.get("value").toString()))));
+        for (Integer organId : listMap.keySet()) {
+            OperatingTotalIncomeDto incomeDto = new OperatingTotalIncomeDto();
+            incomeDto.setOrganId(organId);
+            incomeDto.setOrganName(userOrganNameMap.get(organId));
+            for (StudentPaymentOrderExportDto row : listMap.get(organId)) {
+                if (row.getActualAmount() == null) {
+                    row.setActualAmount(BigDecimal.ZERO);
+                }
+                if (row.getBalancePaymentAmount() == null) {
+                    row.setBalancePaymentAmount(BigDecimal.ZERO);
+                }
+                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 (row.getGroupType() != GroupType.GOODS_SELL) {
+                                    if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                                        row.setLeaseFee(getActualAmount(orderDetail.getPrice(), row));
+                                    } 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:
+                                row.setMaintenanceFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case CLOUD_TEACHER:
+                            case CLOUD_TEACHER_PLUS:
+                                row.setCloudTeacherFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case DEGREE_REGISTRATION:
+                                row.setDegreeFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case PRACTICE:
+                                row.setPracticeCourseFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case VIP:
+                                row.setVipCourseFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case THEORY_COURSE:
+                                row.setTheoryCourseFee(getActualAmount(orderDetail.getPrice(), row));
+                                break;
+                            case REPAIR:
+                                row.setRepairFee(getActualAmount(orderDetail.getPrice(), row));
+                                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)) {
+                        if(StringUtils.isEmpty(row.getMemo())){
+                            row.setDegreeFee(row.getActualAmount());
+                        }else {
+                            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 (!org.springframework.util.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.getGroupType().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);
+                            } 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.setTransferFee(BigDecimal.ZERO);
+                            row.setPlatformFee(BigDecimal.ZERO);
+                        }
+                    }
+                }
+                row.setId(i);
+                row.setRepairFee(row.getRepairFee().add(row.getMaintenanceProductFee()));
+                row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
+                i++;
+                //学校课程采买
+                incomeDto.setCoursePurchaseIncome(incomeDto.getCoursePurchaseIncome()
+                        .add(row.getCourseSchoolBuyAmount()));
+                //考级
+                incomeDto.setExamIncome(incomeDto.getExamIncome()
+                        .add(row.getDegreeFee()));
+                //维修费用
+                incomeDto.setMaintenanceCost(incomeDto.getMaintenanceCost()
+                        .add(row.getRepairFee()));
+                //其他服务收入
+                incomeDto.setOtherServiceIncome(incomeDto.getOtherServiceIncome()
+                        .add(row.getLeaseFee())
+                        .add(row.getVisitFee())
+                        .add(row.getRechargeFee())
+                        .add(row.getOtherFee())
+                );
+                //团购乐器
+                incomeDto.setGroupPurchaseInstruments(incomeDto.getGroupPurchaseInstruments()
+                        .add(row.getMusicalFee()));
+                //零售乐器,计入其他
+                incomeDto.setOtherIncome(incomeDto.getOtherIncome()
+                        .add(row.getRetailGoodsFee()));
+                if(row.getGroupType() == GroupType.GOODS_SELL){
+                    //零售教辅,计入其他
+                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
+                            .add(row.getTeachingFee()));
+                }else {
+                    //团购教辅
+                    incomeDto.setGroupPurchaseTeachingAids(incomeDto.getGroupPurchaseTeachingAids()
+                            .add(row.getTeachingFee()));
+                }
+                //区分零售月保
+                if(row.getGroupType() == GroupType.MAINTENANCE){
+                    //零售月保,计入其他
+                    incomeDto.setOtherIncome(incomeDto.getOtherIncome()
+                            .add(row.getMaintenanceFee()));
+                }else {
+                    //团购月保
+                    incomeDto.setInstrumentInsuranceCost(incomeDto.getInstrumentInsuranceCost()
+                            .add(row.getMaintenanceFee()));
+                }
+
+                //大件乐器
+                incomeDto.setLargeInstruments(incomeDto.getLargeInstruments()
+                        .add(row.getLargeMusicalFee()));
+            }
+            //学员指导课费
+            incomeDto.setStudentGuidanceIncome(incomeDto.getStudentGuidanceIncome().add(courseIncome.getOrDefault(organId,BigDecimal.ZERO)));
+            incomeDto.setCloudCoachIncome(incomeDto.getCloudCoachIncome().add(groupCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
+            incomeDto.setSaleCloudCoachIncome(incomeDto.getSaleCloudCoachIncome().add(personalCloudAmount.getOrDefault(organId,BigDecimal.ZERO)));
+            //服务收入
+            incomeDto.setServiceIncome(incomeDto.getLargeInstruments()
+                    .add(incomeDto.getStudentGuidanceIncome())
+                    .add(incomeDto.getCoursePurchaseIncome())
+                    .add(incomeDto.getExamIncome())
+                    .add(incomeDto.getMaintenanceCost())
+                    .add(incomeDto.getInstrumentInsuranceCost())
+                    .add(incomeDto.getOtherServiceIncome())
+                    .add(incomeDto.getCloudCoachIncome())
+            );
+            incomeDto.setSalesIncome(incomeDto.getSalesIncome()
+                    .add(incomeDto.getSaleCloudCoachIncome())
+                    .add(incomeDto.getGroupPurchaseInstruments())
+                    .add(incomeDto.getGroupPurchaseTeachingAids())
+                    .add(incomeDto.getLargeInstruments())
+                    .add(incomeDto.getOtherIncome())
+            );
+            incomeDtos.add(incomeDto);
+        }
+        return incomeDtos;
+    }
+
+    public BigDecimal getActualAmount(BigDecimal price, StudentPaymentOrderExportDto row) {
+        if (row.getExpectAmount().compareTo(BigDecimal.ZERO) > 0) {
+            return price.multiply(row.getActualAmount()).divide(row.getExpectAmount(), 2, BigDecimal.ROUND_DOWN);
+        }
+        return BigDecimal.ZERO;
+    }
 }

+ 6 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java

@@ -41,7 +41,12 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 		return studentStatisticsDao;
 	}
 
-	@Override
+    @Override
+    public StudentStatisticsDao getDao() {
+        return studentStatisticsDao;
+    }
+
+    @Override
 	public void updateStudentStatistics() {
 		//更新学员基本信息
 		studentBasicInfoDao.updateStudentBasicInfo();