|
@@ -15,8 +15,8 @@ import com.fjhx.mapper.stock.StockMapper;
|
|
|
import com.fjhx.params.stock.StockChangeVo;
|
|
|
import com.fjhx.params.stock.StockVo;
|
|
|
import com.fjhx.service.stock.StockService;
|
|
|
+import com.fjhx.utils.Assert;
|
|
|
import com.fjhx.utils.WrapperUtil;
|
|
|
-import org.springblade.core.log.exception.ServiceException;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -67,66 +67,89 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public void changeQuantity(StockChangeVo stockChangeVo) {
|
|
|
+ Assert.notEmpty(stockChangeVo.getChangeDetailsList(), "变更数量数量列表为空");
|
|
|
+ // 合并变更数量
|
|
|
+ Map<String, Stock> map = mergeChangeQuantity(stockChangeVo);
|
|
|
+ // 变更数量
|
|
|
+ ChangeQuantity(map, stockChangeVo.getTypeEnum());
|
|
|
+ // 添加流水记录
|
|
|
+ addJournal(stockChangeVo);
|
|
|
+ }
|
|
|
|
|
|
- Enum<?> typeEnum = stockChangeVo.getTypeEnum();
|
|
|
- List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
|
|
|
+ /**
|
|
|
+ * 合并变更数量(如果同一种物品在出入库一个仓库,则合并数量)
|
|
|
+ */
|
|
|
+ private Map<String, Stock> mergeChangeQuantity(StockChangeVo stockChangeVo) {
|
|
|
|
|
|
- HashMap<String, Stock> map = new HashMap<>();
|
|
|
+ List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
|
|
|
+ Enum<?> typeEnum = stockChangeVo.getTypeEnum();
|
|
|
|
|
|
+ Map<String, Stock> map = new HashMap<>();
|
|
|
for (StockChangeVo.ChangeDetails changeDetails : changeDetailsList) {
|
|
|
-
|
|
|
// 变更数量
|
|
|
BigDecimal changeQuantity = changeDetails.getChangeQuantity();
|
|
|
// 变更数量小于等于0,则跳过
|
|
|
if (changeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
- return;
|
|
|
+ continue;
|
|
|
}
|
|
|
// 仓库id
|
|
|
Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
|
|
|
// 物品id
|
|
|
Long goodsId = changeDetails.getGoodsId();
|
|
|
-
|
|
|
- String key = goodsId + "" + warehouseId;
|
|
|
-
|
|
|
+ // 生成mapKey
|
|
|
+ String key = goodsId.toString() + warehouseId.toString();
|
|
|
Stock stock = map.get(key);
|
|
|
+
|
|
|
if (null == stock) {
|
|
|
stock = new Stock();
|
|
|
stock.setWarehouseId(warehouseId);
|
|
|
stock.setGoodsId(goodsId);
|
|
|
- stock.setQuantity(BigDecimal.ZERO);
|
|
|
- stock.setFrozenQuantity(changeQuantity);
|
|
|
+ if (typeEnum instanceof InTypeEnum) {
|
|
|
+ stock.setFrozenQuantity(changeQuantity);
|
|
|
+ } else {
|
|
|
+ stock.setQuantity(changeQuantity);
|
|
|
+ }
|
|
|
map.put(key, stock);
|
|
|
} else {
|
|
|
- stock.setFrozenQuantity(stock.getFrozenQuantity().add(changeQuantity));
|
|
|
+ if (typeEnum instanceof InTypeEnum) {
|
|
|
+ stock.setFrozenQuantity(stock.getFrozenQuantity().add(changeQuantity));
|
|
|
+ } else {
|
|
|
+ stock.setQuantity(stock.getQuantity().add(changeQuantity));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 变更库存数量
|
|
|
+ */
|
|
|
+ private synchronized void ChangeQuantity(Map<String, Stock> map, Enum<?> typeEnum) {
|
|
|
Set<String> keySet = map.keySet();
|
|
|
- if (keySet.size() == 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- synchronized (this) {
|
|
|
- List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", keySet));
|
|
|
- if (list.size() == 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
- for (Stock stock : list) {
|
|
|
- String key = stock.getGoodsId() + "" + stock.getWarehouseId();
|
|
|
- Stock itemStock = map.get(key);
|
|
|
- itemStock.setId(stock.getId());
|
|
|
- if (stockChangeVo.getTypeEnum() instanceof InTypeEnum) {
|
|
|
- itemStock.setFrozenQuantity(itemStock.getFrozenQuantity().add(stock.getFrozenQuantity()));
|
|
|
- } else {
|
|
|
- BigDecimal quantity = itemStock.getQuantity().subtract(stock.getQuantity());
|
|
|
- if (quantity.compareTo(BigDecimal.ZERO) < 0) {
|
|
|
- throw new ServiceException("产品库存不足,出库失败");
|
|
|
- }
|
|
|
- itemStock.setQuantity(quantity);
|
|
|
- }
|
|
|
+ List<Stock> list = list(Wrappers.<Stock>query().in("CONCAT(goods_id, warehouse_id)", keySet));
|
|
|
+ for (Stock stock : list) {
|
|
|
+ String key = stock.getGoodsId().toString() + stock.getWarehouseId().toString();
|
|
|
+ Stock changeStock = map.get(key);
|
|
|
+
|
|
|
+ changeStock.setId(stock.getId());
|
|
|
+ if (typeEnum instanceof InTypeEnum) {
|
|
|
+ changeStock.setFrozenQuantity(stock.getFrozenQuantity().add(changeStock.getFrozenQuantity()));
|
|
|
+ } else {
|
|
|
+ BigDecimal quantity = stock.getQuantity().subtract(changeStock.getQuantity());
|
|
|
+ Assert.geZero(quantity, "产品库存不足,出库失败");
|
|
|
+ changeStock.setQuantity(quantity);
|
|
|
}
|
|
|
- saveOrUpdateBatch(new ArrayList<>(map.values()));
|
|
|
}
|
|
|
+ saveOrUpdateBatch(new ArrayList<>(map.values()));
|
|
|
+ }
|
|
|
|
|
|
+ /**
|
|
|
+ * 添加流水记录
|
|
|
+ */
|
|
|
+ private void addJournal(StockChangeVo stockChangeVo) {
|
|
|
+ List<? extends StockChangeVo.ChangeDetails> changeDetailsList = stockChangeVo.getChangeDetailsList();
|
|
|
+ Enum<?> typeEnum = stockChangeVo.getTypeEnum();
|
|
|
|
|
|
// 添加入库明细
|
|
|
List<StockJournal> stockJournalList = new ArrayList<>();
|
|
@@ -135,30 +158,37 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
|
|
|
|
|
|
// 变更数量
|
|
|
BigDecimal changeQuantity = changeDetails.getChangeQuantity();
|
|
|
-
|
|
|
// 变更数量小于等于0,则跳过
|
|
|
if (changeQuantity.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
- return;
|
|
|
+ continue;
|
|
|
}
|
|
|
|
|
|
- StockJournal stockJournal = new StockJournal();
|
|
|
-
|
|
|
- Integer type = typeEnum instanceof InTypeEnum ? StockJournalTypeConstant.IN : StockJournalTypeConstant.OUT;
|
|
|
+ // 业务id
|
|
|
+ Long businessId = ObjectUtil.defaultIfNull(changeDetails.getBusinessId(), stockChangeVo.getDefaultBusinessId());
|
|
|
+ // 产品id
|
|
|
+ Long goodsId = changeDetails.getGoodsId();
|
|
|
+ // 仓库id
|
|
|
+ Long warehouseId = ObjectUtil.defaultIfNull(changeDetails.getWarehouseId(), stockChangeVo.getDefaultWarehouseId());
|
|
|
+ // 备注
|
|
|
+ String remarks = ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeVo.getDefaultRemarks());
|
|
|
|
|
|
- stockJournal.setType(type);
|
|
|
- stockJournal.setDetailsType(typeEnum instanceof InTypeEnum ?
|
|
|
- ((InTypeEnum) typeEnum).getKey() : ((OutTypeEnum) typeEnum).getKey());
|
|
|
- stockJournal.setBusinessId(ObjectUtil.defaultIfNull(changeDetails.getBusinessId(), stockChangeVo.getDefaultBusinessId()));
|
|
|
- stockJournal.setGoodsId(changeDetails.getGoodsId());
|
|
|
- stockJournal.setWarehouseId(changeDetails.getWarehouseId());
|
|
|
- stockJournal.setChangeQuantity(changeQuantity);
|
|
|
+ StockJournal stockJournal = new StockJournal();
|
|
|
|
|
|
if (typeEnum instanceof InTypeEnum) {
|
|
|
+ stockJournal.setType(StockJournalTypeConstant.IN);
|
|
|
+ stockJournal.setDetailsType(((InTypeEnum) typeEnum).getKey());
|
|
|
stockJournal.setActualQuantity(BigDecimal.ZERO);
|
|
|
stockJournal.setIsInStock(StatusConstant.NO);
|
|
|
+ } else {
|
|
|
+ stockJournal.setType(StockJournalTypeConstant.OUT);
|
|
|
+ stockJournal.setDetailsType(((OutTypeEnum) typeEnum).getKey());
|
|
|
}
|
|
|
|
|
|
- stockJournal.setRemarks(ObjectUtil.defaultIfNull(changeDetails.getRemarks(), stockChangeVo.getDefaultRemarks()));
|
|
|
+ stockJournal.setBusinessId(businessId);
|
|
|
+ stockJournal.setGoodsId(goodsId);
|
|
|
+ stockJournal.setWarehouseId(warehouseId);
|
|
|
+ stockJournal.setChangeQuantity(changeQuantity);
|
|
|
+ stockJournal.setRemarks(remarks);
|
|
|
stockJournalList.add(stockJournal);
|
|
|
}
|
|
|
|