|  | @@ -9,6 +9,7 @@ import com.ym.mec.biz.dal.dao.GoodsProcurementDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.SysConfigDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.TeacherDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dto.BasicUserDto;
 | 
	
		
			
				|  |  | +import com.ym.mec.biz.dal.dto.GoodsBatchNoDto;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dto.GoodsSellDto;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.entity.Goods;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.entity.GoodsProcurement;
 | 
	
	
		
			
				|  | @@ -77,7 +78,8 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 | 
	
		
			
				|  |  |  			existsGood.setTaxStockCount(existsGood.getTaxStockCount()+existsGood.getTaxStockCount());
 | 
	
		
			
				|  |  |  			goodsDao.update(existsGood);
 | 
	
		
			
				|  |  |  		}else{
 | 
	
		
			
				|  |  | -			goodsDao.insert(existsGood);
 | 
	
		
			
				|  |  | +			goodsDao.insert(goods);
 | 
	
		
			
				|  |  | +			existsGood=goods;
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		String batchNo = idGeneratorService.generatorId("payment") + "";
 | 
	
	
		
			
				|  | @@ -269,7 +271,7 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Override
 | 
	
		
			
				|  |  |  	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 | 
	
		
			
				|  |  | -	public List<Goods> subtractStock(List<Integer> goodsIds, AccountType accountType) {
 | 
	
		
			
				|  |  | +	public List<GoodsBatchNoDto> subtractStock(List<Integer> goodsIds, AccountType accountType) {
 | 
	
		
			
				|  |  |  		if(CollectionUtils.isEmpty(goodsIds)){
 | 
	
		
			
				|  |  |  			return Collections.emptyList();
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -277,7 +279,6 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 | 
	
		
			
				|  |  |  		Map<Integer, Long> goodsSellNumMap = goodsIds.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		List<Goods> tempGoodsList = goodsDao.lockGoods(new ArrayList<>(goodsIds));
 | 
	
		
			
				|  |  | -		Map<Integer, Integer> singleGoodsSellNumMap = new HashMap<>();
 | 
	
		
			
				|  |  |  		Map<Integer, Goods> idTempGoodsMap = tempGoodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
 | 
	
		
			
				|  |  |  		List<Integer> singleGoodsIds = new ArrayList<>();
 | 
	
		
			
				|  |  |  		for (Integer goodsId : goodsIds) {
 | 
	
	
		
			
				|  | @@ -288,30 +289,67 @@ public class GoodsServiceImpl extends BaseServiceImpl<Integer, Goods>  implement
 | 
	
		
			
				|  |  |  				List<Integer> complementGoodsIds = Arrays.stream(tempGoods.getComplementGoodsIdList().split(",")).map(s -> Integer.valueOf(s)).collect(Collectors.toList());
 | 
	
		
			
				|  |  |  				singleGoodsIds.addAll(complementGoodsIds);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | +			tempGoods.setSellCount((int) (tempGoods.getSellCount() + goodsSellNumMap.get(tempGoods.getId())));
 | 
	
		
			
				|  |  | +//			goodsDao.update(tempGoods);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +		goodsDao.batchUpdate(tempGoodsList);
 | 
	
		
			
				|  |  |  		List<Goods> singleGoodsList = goodsDao.getGoodies(singleGoodsIds);
 | 
	
		
			
				|  |  |  		Map<Integer, Goods> idSingleGoodsMap = singleGoodsList.stream().collect(Collectors.toMap(Goods::getId, g -> g));
 | 
	
		
			
				|  |  | +		List<GoodsBatchNoDto> goodsBatchNoDtos = new ArrayList<>();
 | 
	
		
			
				|  |  |  		for (Integer singleGoodsId : singleGoodsIds) {
 | 
	
		
			
				|  |  |  			Goods goods = idSingleGoodsMap.get(singleGoodsId);
 | 
	
		
			
				|  |  |  			GoodsProcurement goodsProcurement = null;
 | 
	
		
			
				|  |  |  			if(StockType.INTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.INTERNAL.equals(accountType))){
 | 
	
		
			
				|  |  |  				goodsProcurement = goodsProcurementDao.getWithStockSurplusProcurement(goods.getId());
 | 
	
		
			
				|  |  |  				goods.setStockCount(new AtomicInteger(goods.getStockCount()).decrementAndGet());
 | 
	
		
			
				|  |  | -				goodsProcurement.setStockCount(new AtomicInteger(goodsProcurement.getStockCount()).decrementAndGet());
 | 
	
		
			
				|  |  | -				goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
 | 
	
		
			
				|  |  | +				if(Objects.nonNull(goodsProcurement)){
 | 
	
		
			
				|  |  | +					goodsProcurement.setStockCount(new AtomicInteger(goodsProcurement.getStockCount()).decrementAndGet());
 | 
	
		
			
				|  |  | +					goodsProcurement.setStockSoldNum(new AtomicInteger(goodsProcurement.getStockSoldNum()).incrementAndGet());
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  |  			}else if(StockType.EXTERNAL.equals(goods.getStockType())||(StockType.ALL.equals(goods.getStockType())&&AccountType.EXTERNAL.equals(accountType))){
 | 
	
		
			
				|  |  |  				goodsProcurement = goodsProcurementDao.getWithTaxStockSurplusProcurement(goods.getId());
 | 
	
		
			
				|  |  |  				goods.setTaxStockCount(new AtomicInteger(goods.getTaxStockCount()).decrementAndGet());
 | 
	
		
			
				|  |  | -				goodsProcurement.setTaxStockCount(new AtomicInteger(goodsProcurement.getTaxStockCount()).decrementAndGet());
 | 
	
		
			
				|  |  | -				goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
 | 
	
		
			
				|  |  | +				if(Objects.nonNull(goodsProcurement)){
 | 
	
		
			
				|  |  | +					goodsProcurement.setTaxStockCount(new AtomicInteger(goodsProcurement.getTaxStockCount()).decrementAndGet());
 | 
	
		
			
				|  |  | +					goodsProcurement.setTaxStockSoldNum(new AtomicInteger(goodsProcurement.getTaxStockSoldNum()).incrementAndGet());
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			goodsDao.update(goods);
 | 
	
		
			
				|  |  | +			if(Objects.nonNull(goodsProcurement)){
 | 
	
		
			
				|  |  | +				goodsBatchNoDtos.add(new GoodsBatchNoDto(goods.getId(), goodsProcurement.getBatchNo()));
 | 
	
		
			
				|  |  | +				goodsProcurementDao.update(goodsProcurement);
 | 
	
		
			
				|  |  | +			}else{
 | 
	
		
			
				|  |  | +				goodsBatchNoDtos.add(new GoodsBatchNoDto(goods.getId(), goodsProcurement.getBatchNo()));
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | -			if(Objects.isNull(goodsProcurement)){
 | 
	
		
			
				|  |  | -				throw new BizException("商品类型不明");
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return goodsBatchNoDtos;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public void increaseStock(List<GoodsBatchNoDto> goodsBatchNoDtos, AccountType accountType) {
 | 
	
		
			
				|  |  | +		Set<Integer> goodsIds = goodsBatchNoDtos.stream().map(GoodsBatchNoDto::getGoodsId).collect(Collectors.toSet());
 | 
	
		
			
				|  |  | +		List<Goods> goodsList = goodsDao.getGoodies(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);
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		return null;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 |