|  | @@ -124,87 +124,90 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  | -    public List<SellOrder> addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails, StudentPaymentOrder studentPaymentOrder) {
 | 
	
		
			
				|  |  | -            List<SellOrder> sellOrders = new ArrayList<>();
 | 
	
		
			
				|  |  | -            //总余额支付
 | 
	
		
			
				|  |  | -            BigDecimal totalBalance = studentPaymentOrder.getBalancePaymentAmount() != null ? studentPaymentOrder.getBalancePaymentAmount() : BigDecimal.ZERO;
 | 
	
		
			
				|  |  | -            //总价格
 | 
	
		
			
				|  |  | -            BigDecimal totalPrice = studentPaymentOrder.getExpectAmount();
 | 
	
		
			
				|  |  | -            //商品总付款
 | 
	
		
			
				|  |  | -            BigDecimal detailTotalPrice = orderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 | 
	
		
			
				|  |  | -            //商品销售占的余额
 | 
	
		
			
				|  |  | -            BigDecimal detailTotalBalance = detailTotalPrice.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | -                    detailTotalPrice.multiply(totalBalance).divide(totalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            int i = 1;
 | 
	
		
			
				|  |  | -            BigDecimal detailRouteBalance = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | -            for (StudentPaymentOrderDetail orderDetail : orderDetails) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                BigDecimal detailBalance = orderDetail.getPrice().compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | -                        orderDetail.getPrice().multiply(detailTotalBalance).divide(detailTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -                if (i == orderDetails.size()) {
 | 
	
		
			
				|  |  | -                    detailBalance = detailTotalBalance.subtract(detailRouteBalance);
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                detailRouteBalance = detailRouteBalance.add(detailBalance);
 | 
	
		
			
				|  |  | -                i++;
 | 
	
		
			
				|  |  | +    public List<SellOrder> addOrderDetail2SellOrder(List<StudentPaymentOrderDetail> orderDetails, StudentPaymentOrder studentPaymentOrder, MusicGroup musicGroup) {
 | 
	
		
			
				|  |  | +        List<SellOrder> sellOrders = new ArrayList<>();
 | 
	
		
			
				|  |  | +        //总余额支付
 | 
	
		
			
				|  |  | +        BigDecimal totalBalance = studentPaymentOrder.getBalancePaymentAmount() != null ? studentPaymentOrder.getBalancePaymentAmount() : BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +        //总价格
 | 
	
		
			
				|  |  | +        BigDecimal totalPrice = studentPaymentOrder.getExpectAmount();
 | 
	
		
			
				|  |  | +        //商品总付款
 | 
	
		
			
				|  |  | +        BigDecimal detailTotalPrice = orderDetails.stream().map(StudentPaymentOrderDetail::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 | 
	
		
			
				|  |  | +        //商品销售占的余额
 | 
	
		
			
				|  |  | +        BigDecimal detailTotalBalance = detailTotalPrice.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                detailTotalPrice.multiply(totalBalance).divide(totalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
 | 
	
		
			
				|  |  | -                    continue;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        int i = 1;
 | 
	
		
			
				|  |  | +        BigDecimal detailRouteBalance = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +        for (StudentPaymentOrderDetail orderDetail : orderDetails) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            BigDecimal detailBalance = orderDetail.getPrice().compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO :
 | 
	
		
			
				|  |  | +                    orderDetail.getPrice().multiply(detailTotalBalance).divide(detailTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +            if (i == orderDetails.size()) {
 | 
	
		
			
				|  |  | +                detailBalance = detailTotalBalance.subtract(detailRouteBalance);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            detailRouteBalance = detailRouteBalance.add(detailBalance);
 | 
	
		
			
				|  |  | +            i++;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) && orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE)) {
 | 
	
		
			
				|  |  | +                continue;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                BigDecimal goodsTotalPrice = orderDetail.getGoodsList().stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 | 
	
		
			
				|  |  | -                BigDecimal routePrice = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | -                BigDecimal routeBalance = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | -                int j = 1;
 | 
	
		
			
				|  |  | -                for (Goods goods : orderDetail.getGoodsList()) {
 | 
	
		
			
				|  |  | -                    BigDecimal expectAmount = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | -                    BigDecimal balance = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | -                    if (goodsTotalPrice.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | -                        expectAmount = goods.getGroupPurchasePrice().multiply(orderDetail.getPrice()).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -                        balance = goods.getGroupPurchasePrice().multiply(detailBalance).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    if (j == orderDetail.getGoodsList().size()) {
 | 
	
		
			
				|  |  | -                        expectAmount = orderDetail.getPrice().subtract(routePrice);
 | 
	
		
			
				|  |  | -                        balance = orderDetail.getPrice().subtract(routeBalance);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    routePrice = routePrice.add(expectAmount);
 | 
	
		
			
				|  |  | -                    routeBalance = routeBalance.add(balance);
 | 
	
		
			
				|  |  | -                    j++;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    SellOrder sellOrder = new SellOrder();
 | 
	
		
			
				|  |  | -                    Map<String, BigDecimal> CostMap = new HashMap<>();
 | 
	
		
			
				|  |  | -                    CostMap.put("sellCost", goods.getDiscountPrice());
 | 
	
		
			
				|  |  | -                    if (goods.getAgreeCostPrice() != null) {
 | 
	
		
			
				|  |  | -                        CostMap.put("SellCost2", goods.getAgreeCostPrice());
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    sellOrder.setOrganId(studentPaymentOrder.getOrganId());
 | 
	
		
			
				|  |  | -                    sellOrder.setTransNo(studentPaymentOrder.getTransNo());
 | 
	
		
			
				|  |  | -                    sellOrder.setOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | -                    sellOrder.setOrderNo(studentPaymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | -                    sellOrder.setActualAmount(expectAmount.subtract(balance));
 | 
	
		
			
				|  |  | -                    sellOrder.setBalanceAmount(balance);
 | 
	
		
			
				|  |  | -                    sellOrder.setExpectAmount(expectAmount);
 | 
	
		
			
				|  |  | -                    sellOrder.setSellCost(goods.getDiscountPrice());
 | 
	
		
			
				|  |  | -                    sellOrder.setSellCost2(JSON.toJSONString(CostMap));
 | 
	
		
			
				|  |  | -                    sellOrder.setNum(1);
 | 
	
		
			
				|  |  | -                    sellOrder.setUserId(studentPaymentOrder.getUserId());
 | 
	
		
			
				|  |  | -                    sellOrder.setPaymentChannel(studentPaymentOrder.getPaymentChannel());
 | 
	
		
			
				|  |  | -                    sellOrder.setMerNo(studentPaymentOrder.getMerNos());
 | 
	
		
			
				|  |  | -                    sellOrder.setSellTime(studentPaymentOrder.getCreateTime());
 | 
	
		
			
				|  |  | -                    sellOrder.setCreateIme(new Date());
 | 
	
		
			
				|  |  | -                    sellOrder.setUpdateTime(new Date());
 | 
	
		
			
				|  |  | -                    if (goods.getType().equals(GoodsType.INSTRUMENT)) {
 | 
	
		
			
				|  |  | -                        sellOrder.setType(SellTypeEnum.INSTRUMENT);
 | 
	
		
			
				|  |  | -                    } else if (goods.getType().equals(GoodsType.ACCESSORIES)) {
 | 
	
		
			
				|  |  | -                        sellOrder.setType(SellTypeEnum.ACCESSORIES);
 | 
	
		
			
				|  |  | -                    } else {
 | 
	
		
			
				|  |  | -                        sellOrder.setType(SellTypeEnum.OTHER);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    sellOrders.add(sellOrder);
 | 
	
		
			
				|  |  | +            BigDecimal goodsTotalPrice = orderDetail.getGoodsList().stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 | 
	
		
			
				|  |  | +            BigDecimal routePrice = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +            BigDecimal routeBalance = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +            int j = 1;
 | 
	
		
			
				|  |  | +            for (Goods goods : orderDetail.getGoodsList()) {
 | 
	
		
			
				|  |  | +                BigDecimal expectAmount = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                BigDecimal balance = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +                if (goodsTotalPrice.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +                    expectAmount = goods.getGroupPurchasePrice().multiply(orderDetail.getPrice()).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +                    balance = goods.getGroupPurchasePrice().multiply(detailBalance).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (j == orderDetail.getGoodsList().size()) {
 | 
	
		
			
				|  |  | +                    expectAmount = orderDetail.getPrice().subtract(routePrice);
 | 
	
		
			
				|  |  | +                    balance = orderDetail.getPrice().subtract(routeBalance);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                routePrice = routePrice.add(expectAmount);
 | 
	
		
			
				|  |  | +                routeBalance = routeBalance.add(balance);
 | 
	
		
			
				|  |  | +                j++;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                SellOrder sellOrder = new SellOrder();
 | 
	
		
			
				|  |  | +                Map<String, BigDecimal> CostMap = new HashMap<>();
 | 
	
		
			
				|  |  | +                CostMap.put("sellCost", goods.getDiscountPrice());
 | 
	
		
			
				|  |  | +                if (goods.getAgreeCostPrice() != null) {
 | 
	
		
			
				|  |  | +                    CostMap.put("SellCost2", goods.getAgreeCostPrice());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                sellOrder.setOrganId(studentPaymentOrder.getOrganId());
 | 
	
		
			
				|  |  | +                sellOrder.setTransNo(studentPaymentOrder.getTransNo());
 | 
	
		
			
				|  |  | +                sellOrder.setOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | +                if (musicGroup != null) {
 | 
	
		
			
				|  |  | +                    sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                sellOrder.setOrderNo(studentPaymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +                sellOrder.setActualAmount(expectAmount.subtract(balance));
 | 
	
		
			
				|  |  | +                sellOrder.setBalanceAmount(balance);
 | 
	
		
			
				|  |  | +                sellOrder.setExpectAmount(expectAmount);
 | 
	
		
			
				|  |  | +                sellOrder.setSellCost(goods.getDiscountPrice());
 | 
	
		
			
				|  |  | +                sellOrder.setSellCost2(JSON.toJSONString(CostMap));
 | 
	
		
			
				|  |  | +                sellOrder.setNum(1);
 | 
	
		
			
				|  |  | +                sellOrder.setUserId(studentPaymentOrder.getUserId());
 | 
	
		
			
				|  |  | +                sellOrder.setPaymentChannel(studentPaymentOrder.getPaymentChannel());
 | 
	
		
			
				|  |  | +                sellOrder.setMerNo(studentPaymentOrder.getMerNos());
 | 
	
		
			
				|  |  | +                sellOrder.setSellTime(studentPaymentOrder.getCreateTime());
 | 
	
		
			
				|  |  | +                sellOrder.setCreateIme(new Date());
 | 
	
		
			
				|  |  | +                sellOrder.setUpdateTime(new Date());
 | 
	
		
			
				|  |  | +                if (goods.getType().equals(GoodsType.INSTRUMENT)) {
 | 
	
		
			
				|  |  | +                    sellOrder.setType(SellTypeEnum.INSTRUMENT);
 | 
	
		
			
				|  |  | +                } else if (goods.getType().equals(GoodsType.ACCESSORIES)) {
 | 
	
		
			
				|  |  | +                    sellOrder.setType(SellTypeEnum.ACCESSORIES);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    sellOrder.setType(SellTypeEnum.OTHER);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                sellOrders.add(sellOrder);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            sellOrderDao.batchInsert(sellOrders);
 | 
	
		
			
				|  |  | -            return sellOrders;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        sellOrderDao.batchInsert(sellOrders);
 | 
	
		
			
				|  |  | +        return sellOrders;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }
 |