|
@@ -39,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.InputStream;
|
|
import java.io.InputStream;
|
|
|
|
+import java.math.BigDecimal;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -266,6 +267,8 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
}
|
|
}
|
|
goodsProcurementDao.batchInsert(goodsProcurements);
|
|
goodsProcurementDao.batchInsert(goodsProcurements);
|
|
|
|
|
|
|
|
+ sellOrderBatchNoAllot();
|
|
|
|
+
|
|
return goodsList;
|
|
return goodsList;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -304,8 +307,36 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public List<SellOrder> goodsBatchNoAllot(Goods goods) {
|
|
|
|
- return null;
|
|
|
|
|
|
+ public void sellOrderBatchNoAllot() {
|
|
|
|
+ List<SellOrder> noneBatchNoSellOrders = sellOrderDao.getNoneBatchNoSellOrders();
|
|
|
|
+ if(CollectionUtils.isEmpty(noneBatchNoSellOrders)){
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ List<SellOrder> updateSellOrders = new ArrayList<>();
|
|
|
|
+ for (SellOrder noneBatchNoSellOrder : noneBatchNoSellOrders) {
|
|
|
|
+ GoodsProcurement goodsProcurement = null;
|
|
|
|
+ if(StockType.INTERNAL.equals(noneBatchNoSellOrder.getStockType())||(StockType.ALL.equals(noneBatchNoSellOrder.getStockType())&&AccountType.INTERNAL.equals(noneBatchNoSellOrder.getAccountType()))){
|
|
|
|
+ goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(noneBatchNoSellOrder.getGoodsId());
|
|
|
|
+ if(Objects.nonNull(goodsProcurement)){
|
|
|
|
+ goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
|
|
|
|
+ }
|
|
|
|
+ }else if(StockType.EXTERNAL.equals(noneBatchNoSellOrder.getStockType())||(StockType.ALL.equals(noneBatchNoSellOrder.getStockType())&&AccountType.EXTERNAL.equals(noneBatchNoSellOrder.getAccountType()))){
|
|
|
|
+ goodsProcurement = goodsProcurementDao.getWithTaxStockSurplusProcurement(noneBatchNoSellOrder.getGoodsId());
|
|
|
|
+ if(Objects.nonNull(goodsProcurement)){
|
|
|
|
+ goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(Objects.nonNull(goodsProcurement)){
|
|
|
|
+ goodsProcurementDao.update(goodsProcurement);
|
|
|
|
+ noneBatchNoSellOrder.setBatchNo(goodsProcurement.getBatchNo());
|
|
|
|
+ noneBatchNoSellOrder.setSellCost(goodsProcurement.getDiscountPrice());
|
|
|
|
+ updateSellOrders.add(noneBatchNoSellOrder);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(!CollectionUtils.isEmpty(updateSellOrders)){
|
|
|
|
+ sellOrderDao.batchUpdate(updateSellOrders);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -319,7 +350,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
|
|
|
|
List<Goods> tempGoodsList = goodsDao.lockGoods(new ArrayList<>(goodsIds));
|
|
List<Goods> tempGoodsList = goodsDao.lockGoods(new ArrayList<>(goodsIds));
|
|
Map<Integer, Goods> idTempGoodsMap = tempGoodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
|
|
Map<Integer, Goods> idTempGoodsMap = tempGoodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
|
|
- List<SellOrder> goodsBatchNoDtos = new ArrayList<>();
|
|
|
|
|
|
+ List<GoodsProcurement> goodsProcurements = new ArrayList<>();
|
|
for (Integer goodsId : goodsIds) {
|
|
for (Integer goodsId : goodsIds) {
|
|
Goods tempGoods = idTempGoodsMap.get(goodsId);
|
|
Goods tempGoods = idTempGoodsMap.get(goodsId);
|
|
List<Goods> childGoods = new ArrayList<>();
|
|
List<Goods> childGoods = new ArrayList<>();
|
|
@@ -336,14 +367,12 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(goods.getId());
|
|
goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(goods.getId());
|
|
goods.setStockCount(new AtomicInteger(goods.getStockCount()).decrementAndGet());
|
|
goods.setStockCount(new AtomicInteger(goods.getStockCount()).decrementAndGet());
|
|
if(Objects.nonNull(goodsProcurement)){
|
|
if(Objects.nonNull(goodsProcurement)){
|
|
- goodsProcurement.setStockCount(new AtomicInteger(goodsProcurement.getStockCount()).decrementAndGet());
|
|
|
|
goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
|
|
goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
|
|
}
|
|
}
|
|
}else if(StockType.EXTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.EXTERNAL.equals(accountType))){
|
|
}else if(StockType.EXTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.EXTERNAL.equals(accountType))){
|
|
goodsProcurement = goodsProcurementDao.getWithTaxStockSurplusProcurement(goods.getId());
|
|
goodsProcurement = goodsProcurementDao.getWithTaxStockSurplusProcurement(goods.getId());
|
|
goods.setTaxStockCount(new AtomicInteger(goods.getTaxStockCount()).decrementAndGet());
|
|
goods.setTaxStockCount(new AtomicInteger(goods.getTaxStockCount()).decrementAndGet());
|
|
if(Objects.nonNull(goodsProcurement)){
|
|
if(Objects.nonNull(goodsProcurement)){
|
|
- goodsProcurement.setTaxStockCount(new AtomicInteger(goodsProcurement.getTaxStockCount()).decrementAndGet());
|
|
|
|
goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
|
|
goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -358,22 +387,56 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
goodsProcurement.setParentGoodsId(tempGoods.getId());
|
|
goodsProcurement.setParentGoodsId(tempGoods.getId());
|
|
}
|
|
}
|
|
|
|
|
|
-// goodsBatchNoDtos.add(goodsProcurement);
|
|
|
|
|
|
+ goodsProcurements.add(goodsProcurement);
|
|
}
|
|
}
|
|
// goodsDao.update(tempGoods);
|
|
// goodsDao.update(tempGoods);
|
|
}
|
|
}
|
|
goodsDao.batchUpdate(tempGoodsList);
|
|
goodsDao.batchUpdate(tempGoodsList);
|
|
- return goodsBatchNoDtos;
|
|
|
|
|
|
+
|
|
|
|
+ List<SellOrder> sellOrders = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ List<GoodsProcurement> singleGoodsList = goodsProcurements.stream().filter(g -> Objects.isNull(g.getParentGoodsId())&&Objects.nonNull(g.getBatchNo())).collect(Collectors.toList());
|
|
|
|
+ if(!CollectionUtils.isEmpty(singleGoodsList)){
|
|
|
|
+ Map<String, List<Integer>> batchNoGoodsIdMap = singleGoodsList.stream().collect(Collectors.groupingBy(GoodsProcurement::getBatchNo, Collectors.mapping(GoodsProcurement::getGoodsId, Collectors.toList())));
|
|
|
|
+ for (Map.Entry<String, List<Integer>> batchNoGoodsIdMapEntry : batchNoGoodsIdMap.entrySet()) {
|
|
|
|
+ Map<Integer, Long> goodsNumMap = batchNoGoodsIdMapEntry.getValue().stream().collect(Collectors.groupingBy(gid -> gid, Collectors.counting()));
|
|
|
|
+ for (Map.Entry<Integer, Long> goodsNumMapEntry : goodsNumMap.entrySet()) {
|
|
|
|
+ SellOrder sellOrder = new SellOrder();
|
|
|
|
+ sellOrder.setGoodsId(goodsNumMapEntry.getKey());
|
|
|
|
+ sellOrder.setNum(goodsNumMapEntry.getValue().intValue());
|
|
|
|
+ sellOrder.setBatchNo(batchNoGoodsIdMapEntry.getKey());
|
|
|
|
+ GoodsProcurement goodsProcurement = goodsProcurementDao.getWithGoodsAndBatchNo(sellOrder.getGoodsId(), sellOrder.getBatchNo());
|
|
|
|
+ sellOrder.setSellCost(goodsProcurement.getDiscountPrice().multiply(new BigDecimal(sellOrder.getNum())));
|
|
|
|
+ sellOrders.add(sellOrder);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<GoodsProcurement> groupGoodsList = goodsProcurements.stream().filter(g -> Objects.nonNull(g.getParentGoodsId())||Objects.isNull(g.getBatchNo())).collect(Collectors.toList());
|
|
|
|
+ if(!CollectionUtils.isEmpty(groupGoodsList)){
|
|
|
|
+ for (GoodsProcurement goodsProcurement : groupGoodsList) {
|
|
|
|
+ SellOrder sellOrder = new SellOrder();
|
|
|
|
+ sellOrder.setParentGoodsId(goodsProcurement.getParentGoodsId());
|
|
|
|
+ sellOrder.setGoodsId(goodsProcurement.getGoodsId());
|
|
|
|
+ sellOrder.setNum(1);
|
|
|
|
+ sellOrder.setBatchNo(goodsProcurement.getBatchNo());
|
|
|
|
+ if(Objects.nonNull(goodsProcurement.getBatchNo())){
|
|
|
|
+ sellOrder.setSellCost(goodsProcurement.getDiscountPrice().multiply(new BigDecimal(sellOrder.getNum())));
|
|
|
|
+ }
|
|
|
|
+ sellOrders.add(sellOrder);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return sellOrders;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
|
|
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
|
|
- public void increaseStock(List<Integer> sellOrderIds, AccountType accountType) {
|
|
|
|
- if(CollectionUtils.isEmpty(sellOrderIds)){
|
|
|
|
|
|
+ public void increaseStock(List<SellOrder> sellOrders, AccountType accountType) {
|
|
|
|
+ if(CollectionUtils.isEmpty(sellOrders)){
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- List<SellOrder> sellOrders = sellOrderDao.getSellOrders(sellOrderIds);
|
|
|
|
Set<Integer> goodsIdList = new HashSet<>();
|
|
Set<Integer> goodsIdList = new HashSet<>();
|
|
sellOrders.forEach(so -> {
|
|
sellOrders.forEach(so -> {
|
|
if(Objects.nonNull(so.getParentGoodsId())){
|
|
if(Objects.nonNull(so.getParentGoodsId())){
|
|
@@ -383,31 +446,39 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods> implement
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
- List<Goods> goods = goodsDao.lockGoods(new ArrayList<>(goodsIdList));
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-// Set<Integer> goodsIds = goodsBatchNoDtos.stream().map(GoodsBatchNoDto::getGoodsId).collect(Collectors.toSet());
|
|
|
|
-// List<Goods> goodsList = goodsDao.lockGoods(new ArrayList<>(goodsIds));
|
|
|
|
-// Map<Integer, Goods> idGoodsMap = goodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
|
|
|
|
-// for (GoodsBatchNoDto goodsBatchNoDto : goodsBatchNoDtos) {
|
|
|
|
-// Goods goods = idGoodsMap.get(goodsBatchNoDto.getGoodsId());
|
|
|
|
-// GoodsProcurement goodsProcurement = goodsProcurementDao.getWithGoodsAndBatchNo(goods.getId(), goodsBatchNoDto.getBatchNo());
|
|
|
|
-// if(StockType.INTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.INTERNAL.equals(accountType))){
|
|
|
|
-// goods.setStockCount(new AtomicInteger(goods.getStockCount()).incrementAndGet());
|
|
|
|
-// if(Objects.nonNull(goodsProcurement)){
|
|
|
|
-// goodsProcurement.setStockCount(new AtomicInteger(goodsProcurement.getStockCount()).incrementAndGet());
|
|
|
|
-// goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).decrementAndGet());
|
|
|
|
-// }
|
|
|
|
-// }else if(StockType.EXTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.EXTERNAL.equals(accountType))){
|
|
|
|
-// goods.setTaxStockCount(new AtomicInteger(goods.getTaxStockCount()).incrementAndGet());
|
|
|
|
-// if(Objects.nonNull(goodsProcurement)){
|
|
|
|
-// goodsProcurement.setTaxStockCount(new AtomicInteger(goodsProcurement.getTaxStockCount()).incrementAndGet());
|
|
|
|
-// goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).decrementAndGet());
|
|
|
|
-// }
|
|
|
|
-// }
|
|
|
|
-// goodsDao.update(goods);
|
|
|
|
-// goodsProcurementDao.update(goodsProcurement);
|
|
|
|
-// }
|
|
|
|
|
|
+ List<Goods> goodsList = goodsDao.lockGoods(new ArrayList<>(goodsIdList));
|
|
|
|
+ Map<Integer, Goods> idGoodsMap = goodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
|
|
|
|
+
|
|
|
|
+ for (SellOrder sellOrder : sellOrders) {
|
|
|
|
+ Goods goods = goodsDao.get(sellOrder.getGoodsId());
|
|
|
|
+ GoodsProcurement goodsProcurement = goodsProcurementDao.getWithGoodsAndBatchNo(sellOrder.getGoodsId(), sellOrder.getBatchNo());
|
|
|
|
+ if(StockType.INTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.INTERNAL.equals(accountType))){
|
|
|
|
+ goods.setStockCount(new AtomicInteger(goods.getStockCount()).addAndGet(sellOrder.getNum()));
|
|
|
|
+ if(Objects.nonNull(goodsProcurement)){
|
|
|
|
+ goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).addAndGet(-sellOrder.getNum()));
|
|
|
|
+ }
|
|
|
|
+ }else if(StockType.EXTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.EXTERNAL.equals(accountType))){
|
|
|
|
+ goods.setTaxStockCount(new AtomicInteger(goods.getTaxStockCount()).addAndGet(sellOrder.getNum()));
|
|
|
|
+ if(Objects.nonNull(goodsProcurement)){
|
|
|
|
+ goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).addAndGet(-sellOrder.getNum()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(Objects.isNull(sellOrder.getParentGoodsId())){
|
|
|
|
+ goods.setSellCount(new AtomicInteger(goods.getSellCount()).addAndGet(-sellOrder.getNum()));
|
|
|
|
+ }
|
|
|
|
+ goodsDao.update(goods);
|
|
|
|
+ goodsProcurementDao.update(goodsProcurement);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //处理组合商品
|
|
|
|
+ Map<Integer, Long> goodsNumMap = sellOrders.stream().filter(so -> Objects.nonNull(so.getParentGoodsId())).collect(Collectors.groupingBy(SellOrder::getParentGoodsId, Collectors.counting()));
|
|
|
|
+ for (Map.Entry<Integer, Long> goodsIdNumMapEntry : goodsNumMap.entrySet()) {
|
|
|
|
+ Goods goods = idGoodsMap.get(goodsIdNumMapEntry.getKey());
|
|
|
|
+ int goodSize = (int) sellOrders.stream().filter(so -> goodsIdNumMapEntry.getKey().equals(so.getParentGoodsId())).count();
|
|
|
|
+ int sellNum = (int) (goodSize/goodsIdNumMapEntry.getValue());
|
|
|
|
+ goods.setSellCount(new AtomicInteger(goods.getSellCount()).addAndGet(-sellNum));
|
|
|
|
+ goodsDao.update(goods);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|