zouxuan 3 rokov pred
rodič
commit
3c936ad28d

+ 288 - 102
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -45,6 +45,7 @@ import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -2259,17 +2260,148 @@ public class ExportServiceImpl implements ExportService {
         if (!CollectionUtils.isEmpty(orderDetails)) {
             orderDetailMap = orderDetails.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getPaymentOrderId));
         }
+        //获取零星收费订单(订单类型是SPORADIC)
+//        Map<String, Integer> chargeTypeMap = new HashMap<>();
+//        if(studentPaymentOrderExportDtos.stream().anyMatch(e-> e.getGroupType() == GroupType.SPORADIC && e.getType() != OrderTypeEnum.DEGREE_REGISTRATION)){
+//            String sporadicIds = studentPaymentOrderExportDtos.stream().filter(e -> e.getGroupType() == GroupType.SPORADIC && e.getType() != OrderTypeEnum.DEGREE_REGISTRATION)
+//                    .map(e -> e.getMusicGroupId()).collect(Collectors.joining(","));
+//            chargeTypeMap = sporadicChargeInfoService.getMap("sporadic_charge_info","id_","charge_type_",sporadicIds,String.class,Integer.class);
+//        }
+        //获取对外订单关联的合作单位
+        Map<Integer, String> cooperationOrganMap = new HashMap<>();
+        List<Integer> cooperationOrganIds = studentPaymentOrderExportDtos.stream()
+                .filter(e -> OUTORDER.equals(e.getType()))
+                .filter(e -> e.getMusicGroupId() != null)
+                .map(e -> Integer.valueOf(e.getMusicGroupId()))
+                .distinct()
+                .collect(Collectors.toList());
+        if (cooperationOrganIds.size() > 0) {
+            List<CooperationOrgan> cooperationOrgans = cooperationOrganDao.getCooperationOrganByIds(cooperationOrganIds);
+            cooperationOrganMap = cooperationOrgans.stream().collect(Collectors.toMap(CooperationOrgan::getId, CooperationOrgan::getName));
+        }
+        //计算手续费
+        Map<String,BigDecimal> serviceChargeMap = new HashMap<>();
+        Map<String,Integer> orderCountMap = new HashMap<>();
+        Integer tenantId = (Integer) params.get("tenantId");
+        TenantConfig tenantConfig = tenantConfigService.queryByTenantId(tenantId);
+        //获取乐团信息
+        List<Long> calenderIds = studentPaymentOrderExportDtos.stream().map(e -> e.getCalenderId()).filter(e -> e != null).distinct().collect(Collectors.toList());
+        Map<Long, Integer> calenderCooperationMap = new HashMap<>();
+        Map<Integer, String> firstMusicMap = new HashMap<>();
+        if(calenderIds != null && calenderIds.size() > 0){
+            //获取缴费项目关联的合作单位
+            calenderCooperationMap = musicGroupPaymentCalenderService.findCooperationByIds(calenderIds);
+            //获取合作单位第一个乐团
+            firstMusicMap = MapUtil.convertMybatisMap(cooperationOrganDao.findFirstMusic());
+        }
+        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> userLastMusicIdMap = MapUtil.convertMybatisMap(studentRegistrationDao.getLastMusicGroupId(studentIds));
+        Map<Integer, String> userLastMusicNameMap = MapUtil.convertMybatisMap(studentRegistrationDao.getLastMusicGroupName(studentIds));
+        Set<String> musicGroupIds = studentPaymentOrderExportDtos.stream().map(e -> e.getMusicGroupId()).collect(Collectors.toSet());
+        Map<String, String> musicGroupNameMap = new HashMap<>();
+        if(musicGroupIds != null && musicGroupIds.size() > 0){
+            musicGroupNameMap = MapUtil.convertIntegerMap(musicGroupDao.queryMusicGroupNameMap(musicGroupIds));
+        }
+        //获取学员名称
+        Map<Integer, String> studentNameMap = studentService.getMap("sys_user", "id_", "username_", studentIds, tenantId, Integer.class, String.class);
+
 
         for (StudentPaymentOrderExportDto basicOrder : studentPaymentOrderExportDtos) {
             if(basicOrder.getRouteAmount().compareTo(BigDecimal.ZERO) == 0){
                 continue;
             }
+            basicOrder.getUser().setUsername(studentNameMap.get(basicOrder.getUserId()));
+            //填充业务数据
+            //计算手续费
+            this.calcPlatformFee(basicOrder,serviceChargeMap,orderCountMap,tenantConfig);
+            //获取乐团信息
+            this.initMusicGroupInfo(basicOrder,musicGroupNameMap,firstMusicMap,userLastMusicIdMap,userLastMusicNameMap,calenderCooperationMap);
+            //备注信息
+            if (basicOrder.getGoodsList() != null) {
+                String goodsName = basicOrder.getGoodsList().stream().map(Goods::getName).collect(Collectors.joining("|"));
+                basicOrder.setMemo(goodsName);
+            }
+            if (basicOrder.getType() == OUTORDER && StringUtils.isNotEmpty(basicOrder.getMusicGroupId())) {
+                if (cooperationOrganMap.containsKey(Integer.valueOf(basicOrder.getMusicGroupId()))) {
+                    basicOrder.setCooperationOrganName(cooperationOrganMap.get(Integer.valueOf(basicOrder.getMusicGroupId())));
+                    CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(Integer.valueOf(basicOrder.getMusicGroupId()));
+                    if (cooperationOrganEduTeacher != null) {
+                        basicOrder.setEduTeacher(cooperationOrganEduTeacher.getLinkman());
+                    }
+                }
+            }
+            //VIP课程组相关
+            if(basicOrder.getGroupType() == GroupType.VIP){
+                if(StringUtils.isNotEmpty(basicOrder.getMusicGroupId()) && basicOrder.getClassGroupId() != null) {
+                    VipGroup vipGroupInfo = vipGroupDao.findVipGroupInfo(Integer.parseInt(basicOrder.getMusicGroupId()), basicOrder.getClassGroupId());
+                    if (vipGroupInfo != null) {
+                        basicOrder.setSchoolName(vipGroupInfo.getSchoolName());
+                        basicOrder.setSubjectName(vipGroupInfo.getSubjectName());
+                        basicOrder.setEduTeacher(vipGroupInfo.getEducationalTeacherName());
+                    }
+                }
+                if(basicOrder.getTypeDesc() == null){
+                    //学员没有历史VIP课程则导出为【VIP课新增】
+                    //学员有历史VIP课程到导出为【VIP课续费]
+                    if(Objects.equals(userFirstVipMap.get(basicOrder.getUserId()),basicOrder.getMusicGroupId())){
+                        basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP);
+                    }else {
+                        basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP);
+                    }
+                }
+            }else if(basicOrder.getGroupType() == GroupType.SPORADIC && basicOrder.getType() != OrderTypeEnum.DEGREE_REGISTRATION){
+//                basicOrder.setChargeType(chargeTypeMap.get(basicOrder.getMusicGroupId()));
+                if (basicOrder.getChargeType() != null) {
+                    for (SporadicChargeTypeEnum chargeType : SporadicChargeTypeEnum.values()) {
+                        if (!chargeType.getCode().equals(basicOrder.getChargeType())) continue;
+                        basicOrder.setSporadicType(chargeType.getMsg());
+                    }
+                }
+            }else if(basicOrder.getGroupType() == GroupType.PRACTICE && StringUtils.isNotEmpty(basicOrder.getMusicGroupId())){
+                PracticeCourseDto practiceGroup = practiceGroupDao.findByGroupId(Integer.parseInt(basicOrder.getMusicGroupId()));
+                if (practiceGroup != null) {
+                    basicOrder.setSubjectName(practiceGroup.getSubjectName());
+                    basicOrder.setEduTeacher(practiceGroup.getEduTeacherName());
+                }
+            }else if(basicOrder.getGroupType() == GroupType.REPLACEMENT && StringUtils.isNotEmpty(basicOrder.getMusicGroupId())){
+                ReplacementInstrumentActivityStatDto info = replacementInstrumentActivityDao.getInfo(Integer.parseInt(basicOrder.getMusicGroupId()));
+                if (info != null) {
+                    basicOrder.setSubjectName(info.getSubjectName());
+                    basicOrder.setCooperationOrganName(info.getCooperationOrganName());
+                    basicOrder.setMemo(info.getBrand() + "(" + info.getSpecification() + ")");
+                    CooperationOrgan cooperationOrganEduTeacher = musicGroupDao.findCooperationOrganEduTeacher(info.getCooperationOrganId());
+                    if (cooperationOrganEduTeacher != null) {
+                        basicOrder.setEduTeacher(cooperationOrganEduTeacher.getLinkman());
+                    }
+                }
+            }else if (basicOrder.getGroupType() == GroupType.MUSIC) {
+                StudentRegistration studentRegistration = studentRegistrationDao.findStudentByMusicGroupIdAndUserId(basicOrder.getMusicGroupId(), basicOrder.getUserId());
+                if (studentRegistration != null) {
+                    basicOrder.setSubjectName(studentRegistration.getSubjectName());
+                    basicOrder.setSchoolName(studentRegistration.getSchoolName());
+                    basicOrder.setCooperationOrganName(studentRegistration.getRemark());
+                    basicOrder.setEduTeacher(studentRegistration.getName());
+                }
+            }
+            if(basicOrder.getTypeDesc() == null){
+                if(basicOrder.getGroupType().equals(GroupType.SUBJECT_CHANGE)){
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                }else if(basicOrder.getGroupType().equals(GroupType.REPAIR)){
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.REPAIR);
+                }else {
+                    basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.OTHER);
+                }
+            }
+
             //如果有订单详情
             List<StudentPaymentOrderDetail> detailList = orderDetailMap.get(basicOrder.getId());
             if (!CollectionUtils.isEmpty(detailList)) {
                 if(basicOrder.getServiceAmount().compareTo(BigDecimal.ZERO) > 0){
                     //计算服务收入
-                    Consumer<StudentPaymentOrderDetail> con = (orderDetail)->this.setServiceFee(basicOrder,orderDetail);
+                    Consumer<StudentPaymentOrderDetail> con = (orderDetail)->this.setServiceFee(basicOrder,orderDetail,userFirstVipMap);
                     detailList.stream().forEach(con);
                 }else if(basicOrder.getSaleAmount().compareTo(BigDecimal.ZERO) > 0){
                     //计算销售收入
@@ -2301,45 +2433,51 @@ public class ExportServiceImpl implements ExportService {
             //如果只有订单,那么按分类统计
             if(basicOrder.getServiceAmount().compareTo(BigDecimal.ZERO) > 0){
                 //计算服务收入
-                this.setServiceFee(basicOrder);
+                Optional.ofNullable(groupTypeConsumerMap.get(basicOrder.getGroupType())).ifPresent(c->c.accept(basicOrder));
             }else if(basicOrder.getSaleAmount().compareTo(BigDecimal.ZERO) > 0){
                 //计算销售收入
                 this.setSaleFee(basicOrder);
-            }else {
-                this.setServiceFee(basicOrder);
-                this.setSaleFee(basicOrder);
             }
+            String paymentChannel = "";
+            if (basicOrder.getPaymentChannel() == null) {
+            } else if (basicOrder.getPaymentChannel().equals("YQPAY")) {
+                paymentChannel = "双乾";
+            } else if (basicOrder.getPaymentChannel().equals("ADAPAY")) {
+                paymentChannel = "汇付";
+            } else if (basicOrder.getPaymentChannel().equals("BALANCE")) {
+                paymentChannel = "余额";
+            }
+            basicOrder.setPaymentChannel(paymentChannel);
+            basicOrder.setOrderAmount(basicOrder.getExpectAmount().add(basicOrder.getCouponRemitFee()));
         }
         HSSFWorkbook workbook = getHSSFWorkbook(studentPaymentOrderExportDtos,headColumns,ExportEnum.ROUTE_ORDER_LIST1);
         exportManagerDownload(workbook,managerDownload);
     }
 
-    public void setServiceFee(StudentPaymentOrderExportDto basicOrder){
-        BigDecimal actualAmount = basicOrder.getActualAmount();
-        switch (basicOrder.getGroupType()) {
-            case ACTIVITY:
-            case VIP:
-                basicOrder.setVipCourseFee(basicOrder.getVipCourseFee().add(actualAmount));
-                break;
-            case MEMBER:
-                basicOrder.setCloudTeacherFee(basicOrder.getCloudTeacherFee().add(actualAmount));
-                break;
-            case MUSIC:
-                //历史订单无法区分,统一放在乐团课下,原来的财务导出明细都是空的
-                basicOrder.setMusicGroupCourseFee(basicOrder.getMusicGroupCourseFee().add(actualAmount));
-                break;
-            case PRACTICE:
-                basicOrder.setPracticeCourseFee(basicOrder.getPracticeCourseFee().add(actualAmount));
-                break;
-            case REPAIR:
-                basicOrder.setRepairFee(basicOrder.getRepairFee().add(actualAmount));
-                break;
-            case SPORADIC:
-                if(basicOrder.getType() == OrderTypeEnum.DEGREE_REGISTRATION){
-                    basicOrder.setDegreeFee(basicOrder.getDegreeFee().add(actualAmount));
-                }
-        }
+    Map<GroupType,Consumer<StudentPaymentOrderExportDto>> groupTypeConsumerMap = new HashMap<>(GroupType.values().length);
+    @PostConstruct
+    public void initGroupTypeConsumerMap(){
+        groupTypeConsumerMap.put(GroupType.ACTIVITY,(orderDto)->orderDto.setVipCourseFee(orderDto.getVipCourseFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.VIP,(orderDto)->orderDto.setVipCourseFee(orderDto.getVipCourseFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.MEMBER,(orderDto)->orderDto.setCloudTeacherFee(orderDto.getCloudTeacherFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.MUSIC,(orderDto)->orderDto.setMusicGroupCourseFee(orderDto.getMusicGroupCourseFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.PRACTICE,(orderDto)->orderDto.setPracticeCourseFee(orderDto.getPracticeCourseFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.REPAIR,(orderDto)->orderDto.setRepairFee(orderDto.getRepairFee().add(orderDto.getActualAmount())));
+        groupTypeConsumerMap.put(GroupType.SPORADIC, this::accept);
     }
+
+    Map<Integer,Consumer<StudentPaymentOrderExportDto>> chargeTypeConsumerMap = new HashMap<>(SporadicChargeTypeEnum.values().length);
+    @PostConstruct
+    public void initChargeTypeConsumerMap(){
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.LEVEL.getCode(),(orderDto)->orderDto.setDegreeFee(orderDto.getDegreeFee().add(orderDto.getActualAmount())));
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.PRACTICE_GROUP_BUY.getCode(),(orderDto)->orderDto.setPracticeCourseFee(orderDto.getPracticeCourseFee().add(orderDto.getActualAmount())));
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.MUSIC_UPKEEP.getCode(),(orderDto)->orderDto.setMaintenanceFee(orderDto.getMaintenanceFee().add(orderDto.getActualAmount())));
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.VISITING_FEE.getCode(),(orderDto)->orderDto.setVisitFee(orderDto.getVisitFee().add(orderDto.getActualAmount())));
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.RECHARGE.getCode(),(orderDto)->orderDto.setRechargeFee(orderDto.getRechargeFee().add(orderDto.getActualAmount())));
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.HIGH_ONLINE_ACTIVITY.getCode(),(orderDto)->orderDto.setRechargeFee(orderDto.getRechargeFee().add(orderDto.getActualAmount())));
+        chargeTypeConsumerMap.put(SporadicChargeTypeEnum.CLOUD_TEACHER_BUY.getCode(),(orderDto)->orderDto.setCloudTeacherFee(orderDto.getCloudTeacherFee().add(orderDto.getActualAmount())));
+    }
+
     public void setSaleFee(StudentPaymentOrderExportDto basicOrder){
         BigDecimal actualAmount = basicOrder.getActualAmount();
         switch (basicOrder.getGroupType()) {
@@ -2360,42 +2498,44 @@ public class ExportServiceImpl implements ExportService {
                 break;
         }
     }
-    public void setServiceFee(StudentPaymentOrderExportDto basicOrder, StudentPaymentOrderDetail orderDetail){
-        BigDecimal price = orderDetail.getPrice();
-        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:
-                basicOrder.setMusicGroupCourseFee(basicOrder.getMusicGroupCourseFee().add(price));
-                break;
-            case DEGREE_REGISTRATION:
-                basicOrder.setDegreeFee(basicOrder.getDegreeFee().add(price));
-                break;
-            case CLOUD_TEACHER:
-            case CLOUD_TEACHER_PLUS:
-                basicOrder.setCloudTeacherFee(basicOrder.getCloudTeacherFee().add(price));
-                break;
-            case THEORY_COURSE:
-                basicOrder.setTheoryCourseFee(basicOrder.getTheoryCourseFee().add(price));
-                break;
-            case PRACTICE:
-                basicOrder.setPracticeCourseFee(basicOrder.getPracticeCourseFee().add(price));
-                break;
-            case VIP:
-                basicOrder.setVipCourseFee(basicOrder.getVipCourseFee().add(price));
-                break;
-            case REPAIR:
-                basicOrder.setRepairFee(basicOrder.getRepairFee().add(price));
-                break;
+
+    Map<OrderDetailTypeEnum,BiConsumer<StudentPaymentOrderExportDto,StudentPaymentOrderDetail>> orderDetailTypeServiceConsumerMap = new HashMap<>(OrderDetailTypeEnum.values().length);
+    @PostConstruct
+    public void initOrderDetailTypeServiceConsumerMap() {
+        BiConsumer<StudentPaymentOrderExportDto,StudentPaymentOrderDetail> con1 = (orderDto, detail) -> orderDto.setMusicGroupCourseFee(orderDto.getMusicGroupCourseFee().add(detail.getPrice()));
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.COURSE, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.CLASSROOM, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.SINGLE, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.MIX, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.COMPREHENSIVE, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.ENLIGHTENMENT, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.TRAINING_SINGLE, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.TRAINING_MIX, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.MUSIC_NETWORK, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.HIGH, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.HIGH_ONLINE, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.HIGH_ONLINE_COURSE, con1);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.DEGREE_REGISTRATION, (orderDto, detail) -> orderDto.setDegreeFee(orderDto.getDegreeFee().add(detail.getPrice())));
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.MAINTENANCE, (orderDto, detail) -> orderDto.setMaintenanceFee(orderDto.getMaintenanceFee().add(detail.getPrice())));
+        BiConsumer<StudentPaymentOrderExportDto,StudentPaymentOrderDetail> con2 = (orderDto, detail) -> orderDto.setCloudTeacherFee(orderDto.getCloudTeacherFee().add(detail.getPrice()));
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.CLOUD_TEACHER,con2);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.CLOUD_TEACHER_PLUS,con2);
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.THEORY_COURSE,(orderDto, detail) -> orderDto.setTheoryCourseFee(orderDto.getTheoryCourseFee().add(detail.getPrice())));
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.PRACTICE,(orderDto, detail) -> orderDto.setPracticeCourseFee(orderDto.getPracticeCourseFee().add(detail.getPrice())));
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.VIP,(orderDto, detail) -> orderDto.setVipCourseFee(orderDto.getVipCourseFee().add(detail.getPrice())));
+        orderDetailTypeServiceConsumerMap.put(OrderDetailTypeEnum.REPAIR,(orderDto, detail) -> orderDto.setRepairFee(orderDto.getRepairFee().add(detail.getPrice())));
+    }
+
+    public void setServiceFee(StudentPaymentOrderExportDto basicOrder, StudentPaymentOrderDetail orderDetail,Map<Integer, String> userFirstVipMap){
+        Optional.ofNullable(orderDetailTypeServiceConsumerMap.get(orderDetail.getType())).ifPresent(consumer -> consumer.accept(basicOrder, orderDetail));
+        if(orderDetail.getType() == OrderDetailTypeEnum.VIP && basicOrder.getTypeDesc() == null){
+                //学员没有历史VIP课程则导出为【VIP课新增】
+                //学员有历史VIP课程到导出为【VIP课续费]
+            if(Objects.equals(userFirstVipMap.get(basicOrder.getUserId()),basicOrder.getMusicGroupId())){
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_VIP);
+            }else {
+                basicOrder.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_VIP);
+            }
         }
         //如果是内部库存转化部分收入为云教练收入
         if(orderDetail.getType() == OrderDetailTypeEnum.MUSICAL ||
@@ -2447,6 +2587,75 @@ public class ExportServiceImpl implements ExportService {
         }
     }
 
+    //计算汇付手续费和平台手续费
+    public void calcPlatformFee(StudentPaymentOrderExportDto row,Map<String,BigDecimal> serviceChargeMap,
+                                Map<String,Integer> orderCountMap,TenantConfig tenantConfig){
+        BigDecimal currentFee = BigDecimal.ZERO;
+        if (row.getPaymentChannel() != null && row.getPaymentChannel().equals("ADAPAY")) {
+            FeeFlagNumDto countFeeFlagNum = studentPaymentRouteOrderDao.getCountFeeFlagNum(row.getOrderNo());
+
+            Integer times = orderCountMap.get(row.getOrderNo());
+            if (times == null) {
+                times = 1;
+            } else {
+                ++times;
+            }
+            orderCountMap.put(row.getOrderNo(), times);
+
+            currentFee = row.getServiceFee();
+
+            //兼容2022年之前的数据
+            if (currentFee == null || (currentFee.floatValue() == 0 && row.getCreateTime().before(DateUtil.stringToDate("2022-01-01 00:00:00")))) {
+                BigDecimal transferFee = serviceChargeMap.get(row.getOrderNo());
+                if (transferFee == null) {
+                    transferFee = BigDecimal.ZERO;
+                }
+
+                currentFee = row.getRouteAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                BigDecimal totalFee = row.getActualAmount().multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+                if (totalFee.subtract(transferFee.add(currentFee)).doubleValue() < 0 || times == countFeeFlagNum.getTotalNum()) {
+                    currentFee = totalFee.subtract(transferFee);
+                    serviceChargeMap.put(row.getOrderNo(), totalFee);
+                } else {
+                    serviceChargeMap.put(row.getOrderNo(), transferFee.add(currentFee));
+                }
+            }
+        }
+        row.setTransferFee(currentFee);
+        row.setPlatformFee(row.getActualAmount().multiply(tenantConfig.getChargeRate()).divide(new BigDecimal(1000), 2, BigDecimal.ROUND_HALF_UP));
+    }
+
+    //获取乐团信息
+    public void initMusicGroupInfo(StudentPaymentOrderExportDto row,Map<String, String> musicGroupNameMap,Map<Integer, String> firstMusicMap
+    ,Map<Integer, String> userLastMusicIdMap,Map<Integer, String> userLastMusicNameMap,Map<Long, Integer> calenderCooperationMap ){
+        Long calenderId = row.getCalenderId();
+        if(calenderId != null){
+            row.setFeeMusicGroupId(row.getMusicGroupId());
+            row.setFeeMusicGroupName(musicGroupNameMap.get(row.getMusicGroupId()));
+            OrderTypeEnum orderTypeEnum = row.getType();
+            if(orderTypeEnum == OrderTypeEnum.APPLY || orderTypeEnum == OrderTypeEnum.ADD_STUDENT){
+                Integer cooperationId = calenderCooperationMap.get(calenderId);
+                if(cooperationId != null){
+                    String firstMusicId = firstMusicMap.get(cooperationId);
+                    if(StringUtils.isEmpty(firstMusicId)){
+                        row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                    }else {
+                        if(Objects.equals(firstMusicId,row.getMusicGroupId())){
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.NEW_MUSIC);
+                        }else {
+                            row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.ADD_MUSIC);
+                        }
+                    }
+                }
+            }else {
+                row.setTypeDesc(StudentPaymentOrderExportDto.TypeDesc.RENEW_MUSIC);
+            }
+        }else {
+            row.setFeeMusicGroupId(userLastMusicIdMap.get(row.getUserId()));
+            row.setFeeMusicGroupName(userLastMusicNameMap.get(row.getUserId()));
+        }
+    }
+
     @Override
     public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns){
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);
@@ -2813,42 +3022,6 @@ public class ExportServiceImpl implements ExportService {
             }
             row.setPaymentChannel(paymentChannel);
             row.setOrderAmount(row.getExpectAmount().add(row.getCouponRemitFee()));
-            BigDecimal freeFee = row.getRouteAmount().subtract(row.getMusicGroupCourseFee()).subtract(row.getVipCourseFee()).subtract(row.getPracticeCourseFee()).
-                    subtract(row.getTheoryCourseFee()).subtract(row.getDegreeFee()).subtract(row.getRepairFee()).subtract(row.getMaintenanceFee())
-                    .subtract(row.getCloudTeacherFee()).subtract(row.getLeaseFee()).subtract(row.getMusicalFee()).subtract(row.getTeachingFee())
-                    .subtract(row.getVisitFee()).subtract(row.getRechargeFee()).subtract(row.getOtherFee());
-            if(freeFee.compareTo(BigDecimal.ZERO) > 0){
-                //获取不为空的金额
-                if(row.getMusicGroupCourseFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setMusicGroupCourseFee(freeFee.add(row.getMusicGroupCourseFee()));
-                }else if(row.getVipCourseFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setVipCourseFee(freeFee.add(row.getVipCourseFee()));
-                }else if(row.getPracticeCourseFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setPracticeCourseFee(freeFee.add(row.getPracticeCourseFee()));
-                }else if(row.getTheoryCourseFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setTheoryCourseFee(freeFee.add(row.getTheoryCourseFee()));
-                }else if(row.getDegreeFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setDegreeFee(freeFee.add(row.getDegreeFee()));
-                }else if(row.getRepairFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setRepairFee(freeFee.add(row.getRepairFee()));
-                }else if(row.getMaintenanceFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setMaintenanceFee(freeFee.add(row.getMaintenanceFee()));
-                }else if(row.getCloudTeacherFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setCloudTeacherFee(freeFee.add(row.getCloudTeacherFee()));
-                }else if(row.getLeaseFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setLeaseFee(freeFee.add(row.getLeaseFee()));
-                }else if(row.getMusicalFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setMusicalFee(freeFee.add(row.getMusicalFee()));
-                }else if(row.getTeachingFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setTeachingFee(freeFee.add(row.getTeachingFee()));
-                }else if(row.getVisitFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setVisitFee(freeFee.add(row.getVisitFee()));
-                }else if(row.getRechargeFee().compareTo(BigDecimal.ZERO) > 0){
-                    row.setRechargeFee(freeFee.add(row.getRechargeFee()));
-                }else {
-                    row.setOtherFee(freeFee.add(row.getOtherFee()));
-                }
-            }
         }
         
 		//查询商品收款账户配置
@@ -3236,4 +3409,17 @@ public class ExportServiceImpl implements ExportService {
         succeed.setMsg(excelName + "导出申请已提交,请到【报表中心-下载列表查看】");
         return succeed;
     }
+
+    private void accept(StudentPaymentOrderExportDto orderDto) {
+        if (orderDto.getType() == OrderTypeEnum.DEGREE_REGISTRATION) {
+            orderDto.setDegreeFee(orderDto.getDegreeFee().add(orderDto.getActualAmount()));
+        } else {
+            Consumer<StudentPaymentOrderExportDto> dtoConsumer = chargeTypeConsumerMap.get(orderDto.getChargeType());
+            if (dtoConsumer != null) {
+                dtoConsumer.accept(orderDto);
+            } else {
+                orderDto.setOtherFee(orderDto.getOtherFee().add(orderDto.getActualAmount()));
+            }
+        }
+    }
 }

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

@@ -294,7 +294,8 @@ calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
                spro.service_amount_,
                spro.service_fee_,
                spro.mer_no_ routeMerNo,
-               spro.fee_flag_ feeFlag
+               spro.fee_flag_ feeFlag,
+               sci.charge_type_
         FROM student_payment_route_order spro
         LEFT JOIN student_payment_order spo ON spo.order_no_ = spro.order_no_
         LEFT JOIN sporadic_charge_info sci ON spo.music_group_id_ = sci.id_