浏览代码

财务导出

zouxuan 3 年之前
父节点
当前提交
fbe0630d47

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

@@ -10,6 +10,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
@@ -227,4 +228,6 @@ public interface SellOrderDao extends BaseDAO<Integer, SellOrder> {
 
     //统计外部销售收入总金额
     List<Map<Long, String>> sumOutOrderAmount(@Param("outOrderList") List<Long> outOrderList);
+
+    List<SellOrder> querySellOrderByOrderIds(@Param("orderIds") Set<Long> paymentOrderIds);
 }

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

@@ -48,6 +48,8 @@ public interface StudentPaymentRouteOrderDao extends BaseDAO<Long, StudentPaymen
 
     List<StudentPaymentOrderExportDto> ExportQueryPage(Map<String, Object> params);
 
+    List<StudentPaymentOrderExportDto> ExportQueryPage1(Map<String, Object> params);
+
     /**
      * 根据订单号删除
      *

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

@@ -284,6 +284,8 @@ public interface ExportService {
 
     void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns);
 
+    void routeOrderList1(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns);
+
     void superFindCourseSchedules(EndCourseScheduleQueryInfo queryInfo, ManagerDownload managerDownload);
 
     void studentVipPractice(String organId, ManagerDownload managerDownload, Integer tenantId,List<String> headColumns);

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDetailDao;
 import com.ym.mec.biz.dal.dto.MusicalListDetailDto;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.DealStatusEnum;
@@ -11,6 +12,8 @@ import java.util.List;
 
 public interface StudentPaymentOrderDetailService extends BaseService<Long, StudentPaymentOrderDetail> {
 
+    StudentPaymentOrderDetailDao getDao();
+
 
     /**
      * 批量添加订单

+ 224 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -28,6 +28,7 @@ import com.ym.mec.util.ini.IniFileUtil;
 import com.ym.mec.util.upload.UploadUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.snaker.engine.entity.Order;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.system.ApplicationHome;
@@ -44,8 +45,8 @@ 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;
 import java.util.stream.Collectors;
 
@@ -1391,7 +1392,7 @@ public class ExportServiceImpl implements ExportService {
         }
 //        queryInfo.setRoutingOrganId(null);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.ROUTE_ORDER,sysUser.getId());
-        return this.asyncExport(() -> this.routeOrderList(params, managerDownload, headColumns),
+        return this.asyncExport(() -> this.routeOrderList1(params, managerDownload, headColumns),
                 managerDownload.getName());
     }
 
@@ -2225,6 +2226,227 @@ public class ExportServiceImpl implements ExportService {
         exportManagerDownload(workbook,managerDownload);
     }
 
+    public BigDecimal subtract(BigDecimal a, BigDecimal b) {
+        BigDecimal subtract = a.subtract(b);
+        if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+            subtract = BigDecimal.ZERO;
+        }
+        return subtract;
+    }
+
+    public void routeOrderList1(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns){
+        //获取分润订单(不包含订单详情)(纯余额支付不处理)
+        List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage1(params);
+        if (CollectionUtils.isEmpty(studentPaymentOrderExportDtos)) {
+            return;
+        }
+        Set<Long> paymentOrderIds = studentPaymentOrderExportDtos.stream().map(e -> e.getId()).collect(Collectors.toSet());
+        //获取商品订单详情
+        List<SellOrder> sellOrders = sellOrderDao.querySellOrderByOrderIds(paymentOrderIds);
+        Map<Long, List<SellOrder>> sellOrderMap = new HashMap<>();
+        Map<Integer, Goods> goodsMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(sellOrders)){
+            sellOrderMap = sellOrders.stream().collect(Collectors.groupingBy(SellOrder::getOrderId));
+            //获取商品列表
+            List<Goods> goodsList = goodsService.findGoodsByIds(sellOrders.stream().map(e -> e.getGoodsId().toString()).distinct().collect(Collectors.joining(",")));
+            goodsMap = goodsList.stream().collect(Collectors.toMap(Goods::getId, Function.identity()));
+        }
+
+        //获取订单详情
+        List<StudentPaymentOrderDetail> orderDetails = studentPaymentOrderDetailService.getDao().getOrderDetailByOrderId(new ArrayList<>(paymentOrderIds));
+        Map<Long, List<StudentPaymentOrderDetail>> orderDetailMap = new HashMap<>();
+        //订单详情塞到对应的订单中
+        if (!CollectionUtils.isEmpty(orderDetails)) {
+            orderDetailMap = orderDetails.stream().collect(Collectors.groupingBy(StudentPaymentOrderDetail::getPaymentOrderId));
+        }
+
+        for (StudentPaymentOrderExportDto basicOrder : studentPaymentOrderExportDtos) {
+            if(basicOrder.getRouteAmount().compareTo(BigDecimal.ZERO) == 0){
+                continue;
+            }
+            //如果有订单详情
+            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);
+                    detailList.stream().forEach(con);
+                }else if(basicOrder.getSaleAmount().compareTo(BigDecimal.ZERO) > 0){
+                    //计算销售收入
+                    Consumer<StudentPaymentOrderDetail> con = (orderDetail)->this.setSaleFee(basicOrder,orderDetail);
+                    detailList.stream().forEach(con);
+                }else {
+                    continue;
+                }
+                continue;
+            }
+            //如果没有订单详情,则计算商品收入
+            List<SellOrder> sellOrderList = sellOrderMap.get(basicOrder.getId());
+            if (!CollectionUtils.isEmpty(sellOrderList)) {
+                if(basicOrder.getServiceAmount().compareTo(BigDecimal.ZERO) > 0){
+                    //计算服务收入(如果商品编号是76)那么算乐器保养费用
+                    if(sellOrderList.stream().anyMatch(e -> e.getGoodsId().equals("76"))){
+                        sellOrderList.stream().forEach(e->basicOrder.setMaintenanceProductFee(basicOrder.getMaintenanceProductFee().add(e.getActualAmount())));
+                    }
+                }else if(basicOrder.getSaleAmount().compareTo(BigDecimal.ZERO) > 0){
+                    //计算销售收入,排除商品编号是76的商品,其他的商品按分类统计
+                    for (SellOrder e : sellOrderList) {
+                        this.setSaleFee(basicOrder,e,goodsMap.get(e.getGoodsId()));
+                    }
+                }else {
+                    continue;
+                }
+                continue;
+            }
+            //如果只有订单,那么按分类统计
+            if(basicOrder.getServiceAmount().compareTo(BigDecimal.ZERO) > 0){
+                //计算服务收入
+                this.setServiceFee(basicOrder);
+            }else if(basicOrder.getSaleAmount().compareTo(BigDecimal.ZERO) > 0){
+                //计算销售收入
+                this.setSaleFee(basicOrder);
+            }else {
+                this.setServiceFee(basicOrder);
+                this.setSaleFee(basicOrder);
+            }
+        }
+        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));
+                }
+        }
+    }
+    public void setSaleFee(StudentPaymentOrderExportDto basicOrder){
+        BigDecimal actualAmount = basicOrder.getActualAmount();
+        switch (basicOrder.getGroupType()) {
+            case GOODS_SELL:
+                basicOrder.setMusicalFee(basicOrder.getMusicalFee().add(actualAmount));
+                break;
+            case REPLACEMENT:
+                //乐器置换统一算到乐器收入
+                basicOrder.setMusicalFee(basicOrder.getMusicalFee().add(actualAmount));
+                break;
+            case SPORADIC:
+                if(basicOrder.getType() != OrderTypeEnum.DEGREE_REGISTRATION){
+                    basicOrder.setOtherFee(basicOrder.getOtherFee().add(actualAmount));
+                }
+            case SUBJECT_CHANGE:
+                //有一部分声部更换没有定义,放到辅件里面
+                basicOrder.setTeachingFee(basicOrder.getTeachingFee().add(actualAmount));
+                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;
+        }
+        //如果是内部库存转化部分收入为云教练收入
+        if(orderDetail.getType() == OrderDetailTypeEnum.MUSICAL ||
+                orderDetail.getType() == OrderDetailTypeEnum.TEACHING ||
+                orderDetail.getType() == OrderDetailTypeEnum.OTHER ||
+                orderDetail.getType() == OrderDetailTypeEnum.ACCESSORIES){
+            basicOrder.setCloudTeacherFee(basicOrder.getCloudTeacherFee().add(orderDetail.getIncome()));
+        }
+    }
+    public void setSaleFee(StudentPaymentOrderExportDto basicOrder,StudentPaymentOrderDetail orderDetail){
+        BigDecimal price = orderDetail.getPrice();
+        switch (orderDetail.getType()) {
+            case OTHER:
+                basicOrder.setOtherFee(basicOrder.getOtherFee().add(price));
+                break;
+            case MAINTENANCE:
+                basicOrder.setMaintenanceFee(basicOrder.getMaintenanceFee().add(price));
+                break;
+            case MUSICAL:
+                if (orderDetail.getKitGroupPurchaseType() != null && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
+                    basicOrder.setLeaseFee(price);
+                } else {
+                    basicOrder.setMusicalFee(this.subtract(price,orderDetail.getIncome()));
+                }
+                break;
+            case TEACHING:
+            case ACCESSORIES:
+                basicOrder.setTeachingFee(basicOrder.getTeachingFee().add(price));
+                break;
+        }
+    }
+
+    public void setSaleFee(StudentPaymentOrderExportDto basicOrder,SellOrder sellOrder,Goods goods){
+        if(sellOrder.getOrderId().equals("76")){
+            return;
+        }
+        switch (goods.getType()) {
+            case ACCESSORIES:
+            case TEACHING:
+            case STAFF:
+                basicOrder.setTeachingFee(basicOrder.getTeachingFee().add(sellOrder.getActualAmount()));
+                break;
+            case INSTRUMENT:
+                basicOrder.setMusicalFee(basicOrder.getMusicalFee().add(sellOrder.getActualAmount()));
+                break;
+            case OTHER:
+                basicOrder.setOtherFee(basicOrder.getOtherFee().add(sellOrder.getActualAmount()));
+                break;
+        }
+    }
+
     @Override
     public void routeOrderList(Map<String, Object> params, ManagerDownload managerDownload,List<String> headColumns){
         List<StudentPaymentOrderExportDto> studentPaymentOrderExportDtos = studentPaymentRouteOrderDao.ExportQueryPage(params);

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

@@ -67,6 +67,11 @@ public class StudentPaymentOrderDetailServiceImpl extends BaseServiceImpl<Long,
         return studentPaymentOrderDetailDao;
     }
 
+    @Override
+    public StudentPaymentOrderDetailDao getDao() {
+        return studentPaymentOrderDetailDao;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public int batchAdd(List<StudentPaymentOrderDetail> studentPaymentOrderDetailList) {

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

@@ -651,5 +651,11 @@
         </foreach>
         GROUP BY order_id_
     </select>
+    <select id="querySellOrderByOrderIds" resultMap="SellOrder">
+        SELECT * FROM sell_order WHERE order_id_ IN
+        <foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
+            #{orderId}
+        </foreach>
+    </select>
 
 </mapper>

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

@@ -286,6 +286,24 @@ calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
         </if>
     </select>
 
+    <select id="ExportQueryPage1" resultMap="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.orderAndDetail"
+            parameterType="map">
+        SELECT spo.*,spro.route_amount_ routeAmount,
+               spro.route_balance_amount_ routeBalance,
+               spro.sale_amount_,
+               spro.service_amount_,
+               spro.service_fee_,
+               spro.mer_no_ routeMerNo,
+               spro.fee_flag_ feeFlag
+        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_
+        <include refid="queryPaymentOrder"/>
+        ORDER BY spro.id_
+    </select>
+
+
+
     <select id="ExportQueryPage" resultMap="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.orderAndDetail"
             parameterType="map">
         SELECT spo.*,u.username_,spod.id_ detail_id_,spod.type_ detail_type_,spod.price_
@@ -301,7 +319,7 @@ calender_id_,create_time_,create_by_,update_time_,update_by_,tenant_id_,type_
         LEFT JOIN sporadic_charge_info sci on spo.music_group_id_ = sci.id_
         LEFT JOIN goods g on FIND_IN_SET(g.id_,spod.goods_id_list_)
         <include refid="queryPaymentOrder"/>
-        ORDER BY spro.id_ asc,spro.mer_no_,spod.price_ DESC,spod.id_
+        ORDER BY spro.id_
     </select>
     <select id="countByTransNo" resultType="java.lang.String">
         SELECT trans_no_ FROM student_payment_route_order WHERE trans_no_ IN