Преглед на файлове

Merge remote-tracking branch 'origin/master'

Joburgess преди 5 години
родител
ревизия
832cda7fa0

+ 119 - 108
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SellOrderServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> implements SellOrderService {
@@ -71,15 +72,11 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
 
         BigDecimal hasRouteBalance = BigDecimal.ZERO;
         BigDecimal goodsTotalBalance = goodsTotalPrice.multiply(balance).divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
-        List<SellOrder> sellOrders = new ArrayList<>();
-
         AccountType accountType = sysPaymentConfigService.checkAccountType(PaymentChannelEnum.valueOf(order.getPaymentChannel()), order.getMerNos());
 
-        //批次号 TODO
         List<SellOrder> sellOrderList = goodsService.subtractStock(goodsIds, accountType);
 
         for (Integer goodsId : goodsIds) {
-            SellOrder sellOrder = new SellOrder();
             BigDecimal goodsPrice = BigDecimal.ZERO;
             Goods nowGoods = new Goods();
             for (Goods goods : goodies) {
@@ -95,63 +92,62 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 goodsBalance = goodsTotalBalance.subtract(hasRouteBalance);
             }
             hasRouteBalance = hasRouteBalance.add(goodsBalance);
-            sellOrder.setGoodsId(goodsId);
-            sellOrder.setGoodsName(nowGoods.getName());
-            sellOrder.setExpectAmount(goodsPrice);
-            sellOrder.setBalanceAmount(goodsBalance);
-            sellOrder.setActualAmount(goodsPrice.subtract(goodsBalance));
-            Map<String, BigDecimal> CostMap = new HashMap<>();
-            CostMap.put("sellCost", nowGoods.getDiscountPrice());
-            if (nowGoods.getAgreeCostPrice() != null) {
-                CostMap.put("SellCost2", nowGoods.getAgreeCostPrice());
-            }
-            sellOrder.setSellCost2(JSON.toJSONString(CostMap));
+            i++;
 
-            sellOrder.setOrganId(order.getOrganId());
-            sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
-            sellOrder.setTransNo(order.getTransNo());
-            sellOrder.setOrderId(order.getId());
-            sellOrder.setOrderNo(order.getOrderNo());
-            sellOrder.setSellCost(nowGoods.getDiscountPrice());
-            sellOrder.setNum(1);
-            sellOrder.setUserId(order.getUserId());
-            sellOrder.setPaymentChannel(order.getPaymentChannel());
-            sellOrder.setMerNo(order.getMerNos());
-            sellOrder.setAccountType(accountType);
-            sellOrder.setSellTime(order.getCreateTime());
-            sellOrder.setCreateIme(new Date());
-            sellOrder.setUpdateTime(new Date());
-            if (nowGoods.getType().equals(GoodsType.INSTRUMENT)) {
-                sellOrder.setType(SellTypeEnum.INSTRUMENT);
-            } else if (nowGoods.getType().equals(GoodsType.ACCESSORIES)) {
-                sellOrder.setType(SellTypeEnum.ACCESSORIES);
-            } else {
-                sellOrder.setType(SellTypeEnum.OTHER);
+            int complementGoodsNum = nowGoods.getComplementGoodsIdList() == null ? 1 : nowGoods.getComplementGoodsIdList().split(",").length;
+            BigDecimal complementPrice = nowGoods.getGroupPurchasePrice();
+            Map<Integer, BigDecimal> complementGoodsPrice = new HashMap<>();
+            complementGoodsPrice.put(nowGoods.getId(), nowGoods.getGroupPurchasePrice());
+            if (nowGoods.getComplementGoodsIdList() != null) {
+                List<Goods> complementGoodies = goodsDao.findGoodsByIds(nowGoods.getComplementGoodsIdList());
+                complementGoodsPrice = complementGoodies.stream().collect(Collectors.toMap(Goods::getId, Goods::getGroupPurchasePrice));
+                complementPrice = complementGoodies.stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
             }
 
-            StockType goodsStockType = StockType.INTERNAL;
-            for (Goods goods : goodies) {
-                if (goods.getId().equals(goodsId)) {
-                    goodsStockType = goods.getStockType();
-                    break;
+            BigDecimal hasRouteSellOrderActualAmount = BigDecimal.ZERO;
+            BigDecimal hasRouteSellOrderBalance = BigDecimal.ZERO;
+            for (SellOrder sellOrder : sellOrderList) {
+                if (!goodsId.equals(sellOrder.getParentGoodsId()) && !goodsId.equals(sellOrder.getParentGoodsId())) {
+                    continue;
+                }
+                BigDecimal sellOrderActualAmount = BigDecimal.ZERO;
+                BigDecimal sellOrderBalance = BigDecimal.ZERO;
+                if (complementPrice.compareTo(BigDecimal.ZERO) > 0) {
+                    sellOrderActualAmount = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(goodsPrice).divide(complementPrice, 2, BigDecimal.ROUND_HALF_UP);
+                    sellOrderBalance = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(goodsBalance).divide(complementPrice, 2, BigDecimal.ROUND_HALF_UP);
+                }
+                hasRouteSellOrderActualAmount = hasRouteSellOrderActualAmount.add(sellOrderActualAmount);
+                hasRouteSellOrderBalance = hasRouteSellOrderBalance.add(sellOrderBalance);
+                complementGoodsNum = complementGoodsNum - sellOrder.getNum();
+                if (complementGoodsNum <= 0) {
+                    sellOrderActualAmount = goodsPrice.subtract(hasRouteSellOrderActualAmount);
+                    sellOrderBalance = goodsBalance.subtract(hasRouteSellOrderActualAmount);
+                }
+                sellOrder.setExpectAmount(sellOrderActualAmount);
+                sellOrder.setBalanceAmount(sellOrderBalance);
+                sellOrder.setActualAmount(sellOrderActualAmount.subtract(sellOrderBalance));
+                sellOrder.setOrganId(order.getOrganId());
+                sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                sellOrder.setTransNo(order.getTransNo());
+                sellOrder.setOrderId(order.getId());
+                sellOrder.setOrderNo(order.getOrderNo());
+                sellOrder.setUserId(order.getUserId());
+                sellOrder.setPaymentChannel(order.getPaymentChannel());
+                sellOrder.setMerNo(order.getMerNos());
+                sellOrder.setSellTime(order.getCreateTime());
+                sellOrder.setCreateIme(new Date());
+                sellOrder.setUpdateTime(new Date());
+                if (nowGoods.getType().equals(GoodsType.INSTRUMENT)) {
+                    sellOrder.setType(SellTypeEnum.INSTRUMENT);
+                } else if (nowGoods.getType().equals(GoodsType.ACCESSORIES)) {
+                    sellOrder.setType(SellTypeEnum.ACCESSORIES);
+                } else {
+                    sellOrder.setType(SellTypeEnum.OTHER);
                 }
             }
-            //库存类型
-            if (goodsStockType.equals(StockType.ALL) && accountType.equals(AccountType.INTERNAL)) {
-                sellOrder.setStockType(StockType.INTERNAL);
-            } else if (goodsStockType.equals(StockType.ALL) && accountType.equals(AccountType.EXTERNAL)) {
-                sellOrder.setStockType(StockType.EXTERNAL);
-            } else {
-                sellOrder.setStockType(goodsStockType);
-            }
-            //批次号 TODO
-            //goodsService.subtractStock();
-
-            sellOrders.add(sellOrder);
-            i++;
         }
-        sellOrderDao.batchInsert(sellOrders);
-        return sellOrders;
+        sellOrderDao.batchInsert(sellOrderList);
+        return sellOrderList;
     }
 
     @Override
@@ -185,6 +181,9 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
             BigDecimal routePrice = BigDecimal.ZERO;
             BigDecimal routeBalance = BigDecimal.ZERO;
             int j = 1;
+
+            List<Integer> goodsIds = orderDetail.getGoodsList().stream().map(Goods::getId).collect(Collectors.toList());
+            List<SellOrder> sellOrderList = goodsService.subtractStock(goodsIds, accountType);
             for (Goods goods : orderDetail.getGoodsList()) {
                 BigDecimal expectAmount = BigDecimal.ZERO;
                 BigDecimal balance = BigDecimal.ZERO;
@@ -200,62 +199,74 @@ public class SellOrderServiceImpl extends BaseServiceImpl<Integer, SellOrder> im
                 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());
+                int complementGoodsNum = goods.getComplementGoodsIdList() == null ? 1 : goods.getComplementGoodsIdList().split(",").length;
+                BigDecimal complementPrice = goods.getGroupPurchasePrice();
+                Map<Integer, BigDecimal> complementGoodsPrice = new HashMap<>();
+                complementGoodsPrice.put(goods.getId(), goods.getGroupPurchasePrice());
+                if (goods.getComplementGoodsIdList() != null) {
+                    List<Goods> complementGoodies = goodsDao.findGoodsByIds(goods.getComplementGoodsIdList());
+                    complementGoodsPrice = complementGoodies.stream().collect(Collectors.toMap(Goods::getId, Goods::getGroupPurchasePrice));
+                    complementPrice = complementGoodies.stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
                 }
-                sellOrder.setOrganId(studentPaymentOrder.getOrganId());
-                sellOrder.setTransNo(studentPaymentOrder.getTransNo());
-                sellOrder.setOrderId(studentPaymentOrder.getId());
-                if (musicGroup != null) {
-                    sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
-                    sellOrder.setEduTeacherId(musicGroup.getEducationalTeacherId());
-                }
-                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.setGoodsId(goods.getId());
-                sellOrder.setGoodsName(goods.getName());
-                sellOrder.setNum(1);
-                sellOrder.setUserId(studentPaymentOrder.getUserId());
-                sellOrder.setPaymentChannel(studentPaymentOrder.getPaymentChannel());
-                sellOrder.setMerNo(studentPaymentOrder.getMerNos());
-                sellOrder.setAccountType(accountType);
-                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);
-                }
-                //租赁、免费的没有销售收入,有销售成本
-                if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) &&
-                        (orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE) ||
-                                orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)
-                        )) {
-                    sellOrder.setActualAmount(BigDecimal.ZERO);
-                    sellOrder.setBalanceAmount(BigDecimal.ZERO);
-                    sellOrder.setExpectAmount(BigDecimal.ZERO);
-                }
-                //库存类型
-                if (goods.getStockType().equals(StockType.ALL) && accountType.equals(AccountType.INTERNAL)) {
-                    sellOrder.setStockType(StockType.INTERNAL);
-                } else if (goods.getStockType().equals(StockType.ALL) && accountType.equals(AccountType.EXTERNAL)) {
-                    sellOrder.setStockType(StockType.EXTERNAL);
-                } else {
-                    sellOrder.setStockType(goods.getStockType());
+
+                BigDecimal hasRouteSellOrderActualAmount = BigDecimal.ZERO;
+                BigDecimal hasRouteSellOrderBalance = BigDecimal.ZERO;
+                for (SellOrder sellOrder : sellOrderList) {
+                    if (!goods.getId().equals(sellOrder.getParentGoodsId()) && !goods.getId().equals(sellOrder.getParentGoodsId())) {
+                        continue;
+                    }
+                    BigDecimal sellOrderActualAmount = BigDecimal.ZERO;
+                    BigDecimal sellOrderBalance = BigDecimal.ZERO;
+                    if (complementPrice.compareTo(BigDecimal.ZERO) > 0) {
+                        sellOrderActualAmount = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(expectAmount).divide(complementPrice, 2, BigDecimal.ROUND_HALF_UP);
+                        sellOrderBalance = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(balance).divide(complementPrice, 2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    hasRouteSellOrderActualAmount = hasRouteSellOrderActualAmount.add(sellOrderActualAmount);
+                    hasRouteSellOrderBalance = hasRouteSellOrderBalance.add(sellOrderBalance);
+                    complementGoodsNum = complementGoodsNum - sellOrder.getNum();
+                    if (complementGoodsNum <= 0) {
+                        sellOrderActualAmount = expectAmount.subtract(hasRouteSellOrderActualAmount);
+                        sellOrderBalance = balance.subtract(hasRouteSellOrderActualAmount);
+                    }
+                    sellOrder.setOrganId(studentPaymentOrder.getOrganId());
+                    sellOrder.setTransNo(studentPaymentOrder.getTransNo());
+                    sellOrder.setOrderId(studentPaymentOrder.getId());
+                    if (musicGroup != null) {
+                        sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                        sellOrder.setEduTeacherId(musicGroup.getEducationalTeacherId());
+                    }
+                    sellOrder.setOrderNo(studentPaymentOrder.getOrderNo());
+                    sellOrder.setActualAmount(sellOrderActualAmount.subtract(sellOrderBalance));
+                    sellOrder.setBalanceAmount(sellOrderBalance);
+                    sellOrder.setExpectAmount(sellOrderActualAmount);
+                    sellOrder.setNum(1);
+                    sellOrder.setUserId(studentPaymentOrder.getUserId());
+                    sellOrder.setPaymentChannel(studentPaymentOrder.getPaymentChannel());
+                    sellOrder.setMerNo(studentPaymentOrder.getMerNos());
+                    sellOrder.setAccountType(accountType);
+                    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);
+                    }
+                    //租赁、免费的没有销售收入,有销售成本
+                    if (orderDetail.getType().equals(OrderDetailTypeEnum.MUSICAL) &&
+                            (orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.LEASE) ||
+                                    orderDetail.getKitGroupPurchaseType().equals(KitGroupPurchaseTypeEnum.FREE)
+                            )) {
+                        sellOrder.setActualAmount(BigDecimal.ZERO);
+                        sellOrder.setBalanceAmount(BigDecimal.ZERO);
+                        sellOrder.setExpectAmount(BigDecimal.ZERO);
+                    }
                 }
-                //批次号 TODO
 
-                sellOrders.add(sellOrder);
+                sellOrders.addAll(sellOrderList);
+
             }
         }
         if (sellOrders.size() > 0) {

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.SellOrderService;
 import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
@@ -43,6 +44,8 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
     private GoodsDao goodsDao;
     @Autowired
     private GoodsService goodsService;
+    @Autowired
+    private SellOrderService sellOrderService;
 
     @Override
     public BaseDAO<Long, StudentPaymentRouteOrder> getDAO() {
@@ -208,8 +211,11 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
         }
         studentPaymentOrderDao.delete(orderId);
         studentPaymentRouteOrderDao.deleteByOrderNo(studentPaymentOrder.getOrderNo());
-        sellOrderDao.deleteByOrderId(orderId);
-        //归还库存 TODO
+        //归还库存
+        List<SellOrder> sellOrders = sellOrderService.getSellOrderByParentGoodsId(orderId, null);
+        if (sellOrders.size() > 0) {
+            sellOrderDao.deleteByOrderId(orderId);
+        }
         return true;
     }
 

+ 66 - 56
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SubjectChangeServiceImpl.java

@@ -70,6 +70,8 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
     private StudentPaymentOrderDao studentPaymentOrderDao;
     @Autowired
     private SellOrderService sellOrderService;
+    @Autowired
+    private GoodsService goodsService;
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -570,13 +572,12 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
         }
 
         BigDecimal hasRouteBalance = BigDecimal.ZERO;
-        BigDecimal goodsTotalBalance = balance == null ? BigDecimal.ZERO : balance;
-        List<SellOrder> sellOrders = new ArrayList<>();
+        BigDecimal hasRouteExpectAmount = BigDecimal.ZERO;
 
         AccountType accountType = sysPaymentConfigService.checkAccountType(PaymentChannelEnum.valueOf(order.getPaymentChannel()), order.getMerNos());
+        List<SellOrder> sellOrderList = goodsService.subtractStock(goodsIds, accountType);
 
         for (Integer goodsId : goodsIds) {
-            SellOrder sellOrder = new SellOrder();
             BigDecimal goodsPrice = BigDecimal.ZERO;
             Goods nowGoods = new Goods();
             for (Goods goods : goodies) {
@@ -586,67 +587,76 @@ public class SubjectChangeServiceImpl extends BaseServiceImpl<Integer, SubjectCh
                 }
             }
             goodsPrice = nowGoods.getGroupPurchasePrice();
+            BigDecimal expectAmount = BigDecimal.ZERO;
+            BigDecimal goodsBalance = BigDecimal.ZERO;
 
-            BigDecimal goodsBalance = goodsTotalBalance.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
+            if (goodsTotalPrice.compareTo(BigDecimal.ZERO) > 0) {
+                goodsBalance = balance.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
+                expectAmount = totalAmount.multiply(goodsPrice).divide(goodsTotalPrice, 2, BigDecimal.ROUND_HALF_UP);
+            }
             if (i == goodsNum) {
-                goodsBalance = goodsTotalBalance.subtract(hasRouteBalance);
+                goodsBalance = balance.subtract(hasRouteBalance);
+                expectAmount = totalAmount.subtract(hasRouteExpectAmount);
             }
             hasRouteBalance = hasRouteBalance.add(goodsBalance);
-            sellOrder.setGoodsId(goodsId);
-            sellOrder.setGoodsName(nowGoods.getName());
-            sellOrder.setExpectAmount(goodsPrice);
-            sellOrder.setBalanceAmount(goodsBalance);
-            sellOrder.setActualAmount(goodsPrice.subtract(goodsBalance));
-            Map<String, BigDecimal> CostMap = new HashMap<>();
-            CostMap.put("sellCost", nowGoods.getDiscountPrice());
-            if (nowGoods.getAgreeCostPrice() != null) {
-                CostMap.put("SellCost2", nowGoods.getAgreeCostPrice());
-            }
-            sellOrder.setSellCost2(JSON.toJSONString(CostMap));
-
-            sellOrder.setOrganId(order.getOrganId());
-            sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
-            sellOrder.setTransNo(order.getTransNo());
-            sellOrder.setOrderId(order.getId());
-            sellOrder.setOrderNo(order.getOrderNo());
-            sellOrder.setSellCost(nowGoods.getDiscountPrice());
-            sellOrder.setNum(1);
-            sellOrder.setUserId(order.getUserId());
-            sellOrder.setPaymentChannel(order.getPaymentChannel());
-            sellOrder.setMerNo(order.getMerNos());
-            sellOrder.setAccountType(accountType);
-            sellOrder.setSellTime(order.getCreateTime());
-            sellOrder.setCreateIme(new Date());
-            sellOrder.setUpdateTime(new Date());
-            if (nowGoods.getType().equals(GoodsType.INSTRUMENT)) {
-                sellOrder.setType(SellTypeEnum.INSTRUMENT);
-            } else if (nowGoods.getType().equals(GoodsType.ACCESSORIES)) {
-                sellOrder.setType(SellTypeEnum.ACCESSORIES);
-            } else {
-                sellOrder.setType(SellTypeEnum.OTHER);
+            hasRouteExpectAmount = hasRouteExpectAmount.add(expectAmount);
+            i++;
+
+            int complementGoodsNum = nowGoods.getComplementGoodsIdList() == null ? 1 : nowGoods.getComplementGoodsIdList().split(",").length;
+            BigDecimal complementPrice = nowGoods.getGroupPurchasePrice();
+            Map<Integer, BigDecimal> complementGoodsPrice = new HashMap<>();
+            complementGoodsPrice.put(nowGoods.getId(), nowGoods.getGroupPurchasePrice());
+            if (nowGoods.getComplementGoodsIdList() != null) {
+                List<Goods> complementGoodies = goodsDao.findGoodsByIds(nowGoods.getComplementGoodsIdList());
+                complementGoodsPrice = complementGoodies.stream().collect(Collectors.toMap(Goods::getId, Goods::getGroupPurchasePrice));
+                complementPrice = complementGoodies.stream().map(Goods::getGroupPurchasePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
             }
 
-            StockType goodsStockType = StockType.INTERNAL;
-            for (Goods goods : goodies) {
-                if (goods.getId().equals(goodsId)) {
-                    goodsStockType = goods.getStockType();
-                    break;
+            BigDecimal hasRouteSellOrderExpectAmount = BigDecimal.ZERO;
+            BigDecimal hasRouteSellOrderBalance = BigDecimal.ZERO;
+            for (SellOrder sellOrder : sellOrderList) {
+                if (!goodsId.equals(sellOrder.getParentGoodsId()) && !goodsId.equals(sellOrder.getParentGoodsId())) {
+                    continue;
+                }
+                BigDecimal sellOrderExpectAmount = BigDecimal.ZERO;
+                BigDecimal sellOrderBalance = BigDecimal.ZERO;
+                if (complementPrice.compareTo(BigDecimal.ZERO) > 0) {
+                    sellOrderExpectAmount = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(expectAmount).divide(complementPrice, 2, BigDecimal.ROUND_HALF_UP);
+                    sellOrderBalance = complementGoodsPrice.get(sellOrder.getGoodsId()).multiply(new BigDecimal(sellOrder.getNum())).multiply(goodsBalance).divide(complementPrice, 2, BigDecimal.ROUND_HALF_UP);
+                }
+                hasRouteSellOrderExpectAmount = hasRouteSellOrderExpectAmount.add(sellOrderExpectAmount);
+                hasRouteSellOrderBalance = hasRouteSellOrderBalance.add(sellOrderBalance);
+                complementGoodsNum = complementGoodsNum - sellOrder.getNum();
+                if (complementGoodsNum <= 0) {
+                    sellOrderExpectAmount = expectAmount.subtract(hasRouteSellOrderExpectAmount);
+                    sellOrderBalance = goodsBalance.subtract(hasRouteSellOrderBalance);
                 }
-            }
-            //库存类型
-            if (goodsStockType.equals(StockType.ALL) && accountType.equals(AccountType.INTERNAL)) {
-                sellOrder.setStockType(StockType.INTERNAL);
-            } else if (goodsStockType.equals(StockType.ALL) && accountType.equals(AccountType.EXTERNAL)) {
-                sellOrder.setStockType(StockType.EXTERNAL);
-            } else {
-                sellOrder.setStockType(goodsStockType);
-            }
-            //批次号 TODO
 
-            sellOrders.add(sellOrder);
-            i++;
+                sellOrder.setExpectAmount(sellOrderExpectAmount);
+                sellOrder.setBalanceAmount(sellOrderBalance);
+                sellOrder.setActualAmount(sellOrderExpectAmount.subtract(sellOrderBalance));
+                sellOrder.setOrganId(order.getOrganId());
+                sellOrder.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                sellOrder.setTransNo(order.getTransNo());
+                sellOrder.setOrderId(order.getId());
+                sellOrder.setOrderNo(order.getOrderNo());
+                sellOrder.setSellCost(nowGoods.getDiscountPrice());
+                sellOrder.setUserId(order.getUserId());
+                sellOrder.setPaymentChannel(order.getPaymentChannel());
+                sellOrder.setMerNo(order.getMerNos());
+                sellOrder.setSellTime(order.getCreateTime());
+                sellOrder.setCreateIme(new Date());
+                sellOrder.setUpdateTime(new Date());
+                if (nowGoods.getType().equals(GoodsType.INSTRUMENT)) {
+                    sellOrder.setType(SellTypeEnum.INSTRUMENT);
+                } else if (nowGoods.getType().equals(GoodsType.ACCESSORIES)) {
+                    sellOrder.setType(SellTypeEnum.ACCESSORIES);
+                } else {
+                    sellOrder.setType(SellTypeEnum.OTHER);
+                }
+            }
         }
-        sellOrderDao.batchInsert(sellOrders);
-        return sellOrders;
+        sellOrderDao.batchInsert(sellOrderList);
+        return sellOrderList;
     }
 }