|
@@ -22,7 +22,7 @@ import com.fjhx.wms.entity.stock.po.*;
|
|
|
import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
|
|
|
import com.fjhx.wms.entity.stock.vo.StockWaitVo;
|
|
|
import com.fjhx.wms.mapper.stock.StockWaitMapper;
|
|
|
-import com.fjhx.wms.service.MyPurchaseService;
|
|
|
+import com.fjhx.wms.service.MyWmsService;
|
|
|
import com.fjhx.wms.service.WmsService;
|
|
|
import com.fjhx.wms.service.arrival.ArrivalStockRecordsDetailsService;
|
|
|
import com.fjhx.wms.service.arrival.ArrivalStockRecordsService;
|
|
@@ -41,6 +41,8 @@ import java.math.RoundingMode;
|
|
|
import java.util.Collections;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -75,7 +77,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
@Autowired
|
|
|
private StockFrozenService stockFrozenService;
|
|
|
@Autowired
|
|
|
- private MyPurchaseService myPurchaseService;
|
|
|
+ private MyWmsService myWmsService;
|
|
|
|
|
|
@Override
|
|
|
public Page<StockWaitVo> getPage(StockWaitSelectDto dto) {
|
|
@@ -126,42 +128,26 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
|
|
|
@DSTransactional
|
|
|
@Override
|
|
|
- public synchronized void add(StockWaitDetailsDto dto) {
|
|
|
- StockWaitDetails stockWaitDetails = stockWaitDetailsService.getById(dto.getId());
|
|
|
- Assert.notEmpty(stockWaitDetails, "查询不到待出库明细信息");
|
|
|
- StockWait stockWait = this.getById(stockWaitDetails.getStockWaitId());
|
|
|
- Assert.notEmpty(stockWait, "查询不到待出库信息");
|
|
|
+ public synchronized void add(StockWaitDto dto) {
|
|
|
+ //查询待出入库明细信息
|
|
|
+// StockWaitDetails stockWaitDetails = stockWaitDetailsService.getById(dto.getId());
|
|
|
+// Assert.notEmpty(stockWaitDetails, "查询不到待出库明细信息");
|
|
|
+ StockWait stockWait = this.getById(dto.getId());
|
|
|
+ Assert.notEmpty(stockWait, "查询不到待出入库信息");
|
|
|
|
|
|
//获取需要的相关参数
|
|
|
Long warehouseId = dto.getWarehouseId();
|
|
|
//根据待出入库类型获取流水类型
|
|
|
JournalType stockJournalType = getStockJournalType(stockWait.getBusinessType());
|
|
|
- Long productId = stockWaitDetails.getProductId();
|
|
|
- BigDecimal inOutQuantity = dto.getQuantity();
|
|
|
-
|
|
|
- //更新待出入库明细,出入库数量,状态
|
|
|
- BigDecimal receiptQuantity = stockWaitDetails.getReceiptQuantity().add(inOutQuantity);
|
|
|
- Integer stockWaitDetailsStatus = receiptQuantity.compareTo(stockWaitDetails.getQuantity()) >= 0 ? 2 : 1;
|
|
|
- stockWaitDetailsService.update(q -> q
|
|
|
- .eq(StockWaitDetails::getId, stockWaitDetails.getId())
|
|
|
- .set(StockWaitDetails::getReceiptQuantity, receiptQuantity)
|
|
|
- .set(StockWaitDetails::getStatus, stockWaitDetailsStatus)
|
|
|
- );
|
|
|
-
|
|
|
- //判断业务类型是否是采购到货
|
|
|
- int purchaseArrival = StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType().equals(stockWait.getBusinessType()) ? 1 : 0;
|
|
|
- //获取采购单价(只有采购到货才有)
|
|
|
- PurchaseDetailPo purchaseDetail = baseMapper.getPurchaseDetail(IWrapper.getWrapper().eq("swd.id", stockWaitDetails.getId()));
|
|
|
- BigDecimal purchasePrice = null;
|
|
|
- if(ObjectUtil.isNotEmpty(purchaseDetail)){
|
|
|
- purchasePrice = purchaseDetail.getPrice();
|
|
|
- }
|
|
|
- //计算结存单价
|
|
|
- StockJournalDetails stockJournalDetails = calculateUnitPrice(stockJournalType.getType(), productId, warehouseId, inOutQuantity, purchaseArrival, purchasePrice);
|
|
|
|
|
|
- //操作库存
|
|
|
- InOutBo inOutBo = new InOutBo(productId, inOutQuantity);
|
|
|
- stockService.changeStock(Collections.singletonList(inOutBo), warehouseId, stockJournalType);
|
|
|
+ //获取明细列表
|
|
|
+ List<StockWaitDetailsDto> stockList = dto.getStockWaitDetailsList();
|
|
|
+
|
|
|
+ //解析扫码部分数据
|
|
|
+ List<Long> scanIds = stockList.stream().map(StockWaitDetails::getPurchaseDetailId).distinct().collect(Collectors.toList());
|
|
|
+ List<PurchaseDetailPo> purchaseDetailList = myWmsService.getPurchaseDetailList(scanIds);
|
|
|
+ Map<Long, BigDecimal> purchaseDetailMap = purchaseDetailList
|
|
|
+ .stream().collect(Collectors.toMap(PurchaseDetailPo::getId, PurchaseDetailPo::getPrice));
|
|
|
|
|
|
//创建流水
|
|
|
StockJournal stockJournal = new StockJournal();
|
|
@@ -178,36 +164,89 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
stockJournal.setExWarehousePerson(dto.getExWarehousePerson());
|
|
|
stockJournal.setReceivingPerson(dto.getReceivingPerson());
|
|
|
stockJournalService.save(stockJournal);
|
|
|
- //创建流水明细
|
|
|
- stockJournalDetails.setStockJournalId(stockJournal.getId());
|
|
|
- stockJournalDetails.setProductId(productId);
|
|
|
- stockJournalDetails.setQuantity(inOutQuantity);
|
|
|
- stockJournalDetails.setBusinessDetailsId(stockWaitDetails.getId());
|
|
|
- stockJournalDetailsService.save(stockJournalDetails);
|
|
|
-
|
|
|
- //更新待入库状态(等待明细操作完执行)
|
|
|
- long count = stockWaitDetailsService.count(q -> q
|
|
|
- .eq(StockWaitDetails::getStockWaitId, stockWait.getId())
|
|
|
- .ne(StockWaitDetails::getStatus, 2)
|
|
|
- );
|
|
|
- Integer StockWaitStatus = count > 0 ? 1 : 2;
|
|
|
- this.update(q -> q
|
|
|
- .eq(StockWait::getId, stockWait.getId())
|
|
|
- .set(StockWait::getStatus, StockWaitStatus)
|
|
|
- .set(BasePo::getUpdateTime, new Date())
|
|
|
- .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
|
|
|
- );
|
|
|
-
|
|
|
- //生产任务待出库(物料出库解冻冻结库存)
|
|
|
- if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(stockWait.getType())) {
|
|
|
- //减少冻结库存
|
|
|
- StockFrozen stockFrozen = stockFrozenService.getOne(q -> q.eq(StockFrozen::getProductId, productId));
|
|
|
- stockFrozenService.update(q -> q
|
|
|
- .eq(StockFrozen::getId, stockFrozen.getId())
|
|
|
- .setSql("frozen_quantity - " + inOutQuantity)
|
|
|
+
|
|
|
+ //处理每条明细
|
|
|
+ for (StockWaitDetailsDto stockWaitDetailsDto : stockList) {
|
|
|
+ //如果有采购明细id就获取采购单价,要不然单价为空(自动计算)
|
|
|
+ BigDecimal price = purchaseDetailMap.getOrDefault(stockWaitDetailsDto.getPurchaseDetailId(), null);
|
|
|
+
|
|
|
+ // 每次重新获取最新的数据
|
|
|
+ StockWaitDetails stockWaitDetails1 = stockWaitDetailsService.getById(stockWaitDetailsDto.getId());
|
|
|
+ Assert.notEmpty(stockWaitDetails1, "查询不到待出入库明细信息");
|
|
|
+
|
|
|
+
|
|
|
+ //获取产品id
|
|
|
+ Long productId = stockWaitDetails1.getProductId();
|
|
|
+ //获取出入库数量
|
|
|
+ BigDecimal inOutQuantity = stockWaitDetailsDto.getQuantity();
|
|
|
+
|
|
|
+ //更新待出入库明细,出入库数量,状态
|
|
|
+ BigDecimal receiptQuantity = stockWaitDetails1.getReceiptQuantity().add(inOutQuantity);
|
|
|
+ Integer stockWaitDetailsStatus = receiptQuantity.compareTo(stockWaitDetails1.getQuantity()) >= 0 ? 2 : 1;
|
|
|
+ stockWaitDetailsService.update(q -> q
|
|
|
+ .eq(StockWaitDetails::getId, stockWaitDetails1.getId())
|
|
|
+ .set(StockWaitDetails::getReceiptQuantity, receiptQuantity)
|
|
|
+ .set(StockWaitDetails::getStatus, stockWaitDetailsStatus)
|
|
|
+ );
|
|
|
+
|
|
|
+ //判断业务类型是否是采购到货
|
|
|
+ int purchaseArrival = StockWaitType.PURCHASE_ARRIVAL_IN.getDetailType().equals(stockWait.getBusinessType()) ? 1 : 0;
|
|
|
+ //获取采购单价(只有采购到货才有)
|
|
|
+ PurchaseDetailPo purchaseDetail = baseMapper.getPurchaseDetail(IWrapper.getWrapper().eq("swd.id", stockWaitDetails1.getId()));
|
|
|
+ //如果是采购到货
|
|
|
+ if (purchaseArrival == 1) {
|
|
|
+ if (ObjectUtil.isEmpty(purchaseDetail)) {
|
|
|
+ throw new ServiceException("查询不到采购到货,采购信息!");
|
|
|
+ }
|
|
|
+ price = purchaseDetail.getPrice();
|
|
|
+ }
|
|
|
+ //计算结存单价
|
|
|
+ StockJournalDetails stockJournalDetails = calculateUnitPrice(stockJournalType.getType(), productId, warehouseId, inOutQuantity, purchaseArrival, price);
|
|
|
+
|
|
|
+ //操作库存
|
|
|
+ InOutBo inOutBo = new InOutBo(productId, inOutQuantity);
|
|
|
+ stockService.changeStock(Collections.singletonList(inOutBo), warehouseId, stockJournalType);
|
|
|
+
|
|
|
+
|
|
|
+ //赋值是否扫码入库
|
|
|
+ Long scanId = stockWaitDetailsDto.getPurchaseDetailId();
|
|
|
+ int isScan = stockWaitDetailsDto.getIsScan();
|
|
|
+ stockJournalDetails.setIsScan(ObjectUtil.isEmpty(isScan) ? 0 : isScan);
|
|
|
+ //如果是采购到货直接拿采购明细id,不是拿扫码结果的采购明细id/空
|
|
|
+ Long purchaseDetailId = purchaseArrival == 1 ? purchaseDetail.getId() : scanId;
|
|
|
+ stockJournalDetails.setPurchaseDetailId(purchaseDetailId);
|
|
|
+
|
|
|
+ //创建流水明细
|
|
|
+ stockJournalDetails.setStockJournalId(stockJournal.getId());
|
|
|
+ stockJournalDetails.setProductId(productId);
|
|
|
+ stockJournalDetails.setQuantity(inOutQuantity);
|
|
|
+ stockJournalDetails.setBusinessDetailsId(stockWaitDetails1.getId());
|
|
|
+ stockJournalDetailsService.save(stockJournalDetails);
|
|
|
+
|
|
|
+ //更新待入库状态(等待明细操作完执行)
|
|
|
+ long count = stockWaitDetailsService.count(q -> q
|
|
|
+ .eq(StockWaitDetails::getStockWaitId, stockWait.getId())
|
|
|
+ .ne(StockWaitDetails::getStatus, 2)
|
|
|
+ );
|
|
|
+ Integer StockWaitStatus = count > 0 ? 1 : 2;
|
|
|
+ this.update(q -> q
|
|
|
+ .eq(StockWait::getId, stockWait.getId())
|
|
|
+ .set(StockWait::getStatus, StockWaitStatus)
|
|
|
.set(BasePo::getUpdateTime, new Date())
|
|
|
.set(BasePo::getUpdateUser, SecurityUtils.getUserId())
|
|
|
);
|
|
|
+
|
|
|
+ //生产任务待出库(物料出库解冻冻结库存)
|
|
|
+ if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(stockWait.getType())) {
|
|
|
+ //减少冻结库存
|
|
|
+ StockFrozen stockFrozen = stockFrozenService.getOne(q -> q.eq(StockFrozen::getProductId, productId));
|
|
|
+ stockFrozenService.update(q -> q
|
|
|
+ .eq(StockFrozen::getId, stockFrozen.getId())
|
|
|
+ .setSql("frozen_quantity - " + inOutQuantity)
|
|
|
+ .set(BasePo::getUpdateTime, new Date())
|
|
|
+ .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -215,7 +254,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
* 计算结存单价(在操作库存之前计算)
|
|
|
*/
|
|
|
@Override
|
|
|
- public synchronized StockJournalDetails calculateUnitPrice(InOutType inOutType, Long productId, Long warehouseId, BigDecimal inOutQuantity, Integer purchaseArrival, BigDecimal purchasePrice) {
|
|
|
+ public synchronized StockJournalDetails calculateUnitPrice(InOutType inOutType, Long productId, Long warehouseId, BigDecimal inOutQuantity, Integer purchaseArrival, BigDecimal price) {
|
|
|
StockJournalDetails stockJournalDetails = new StockJournalDetails();
|
|
|
stockJournalDetails.setProductId(productId);
|
|
|
stockJournalDetails.setQuantity(inOutQuantity);
|
|
@@ -237,7 +276,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
//获取产品当前仓库信息
|
|
|
Stock stock = stockService.getOne(q -> q.eq(Stock::getWarehouseId, warehouseId).eq(Stock::getProductId, productId));
|
|
|
//库存不存在创建0库存记录
|
|
|
- if(ObjectUtil.isEmpty(stock)){
|
|
|
+ if (ObjectUtil.isEmpty(stock)) {
|
|
|
stock = new Stock();
|
|
|
stock.setWarehouseId(warehouseId);
|
|
|
stock.setProductId(productId);
|
|
@@ -247,13 +286,11 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
Stock finalStock = stock;
|
|
|
if (inOutType.equals(InOutType.IN)) {
|
|
|
//入库
|
|
|
- //【其他入库】当前价值=实时不在库单价
|
|
|
- BigDecimal price = outUnitPrice;
|
|
|
-
|
|
|
- //【采购入库】当前价值=采购单价
|
|
|
- if (purchaseArrival == 1) {
|
|
|
- price = purchasePrice;
|
|
|
+ //有单价【采购入库等】按单价算,没有按【其他入库】当前价值=实时不在库单价
|
|
|
+ if (price == null) {
|
|
|
+ price = outUnitPrice;
|
|
|
}
|
|
|
+
|
|
|
//【入库】实时在库单价=(库存*实时在库单价 + 当前入库数量*当前价值) / (库存+当前入库数量)
|
|
|
BigDecimal multiply0 = stockQuantity.multiply(unitPrice);//库存*实时在库单价
|
|
|
BigDecimal multiply1 = inOutQuantity.multiply(price);//当前入库数量*当前价值
|
|
@@ -286,8 +323,11 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
|
|
|
stockJournalDetails.setOutStockPrice(outUnitPrice);
|
|
|
} else {
|
|
|
//出库
|
|
|
- //【出库】当前价值=实时在库单价
|
|
|
- BigDecimal price = unitPrice;
|
|
|
+
|
|
|
+ //有单价按单价算,没有按【出库】当前价值=实时在库单价
|
|
|
+ if (price == null) {
|
|
|
+ price = unitPrice;
|
|
|
+ }
|
|
|
|
|
|
//【出库】实时不在库单价=(不在库数量*实时不在库单价 + 当前出库数量*当前价值) / (不在库数量+当前出库数量)
|
|
|
BigDecimal multiply0 = stockOutQuantity.multiply(outUnitPrice);//不在库数量*实时不在库单价
|