| | |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProductFrozen; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.service.ISalesLedgerProductService; |
| | | import com.ruoyi.sales.service.ISalesLedgerProductFrozenService; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import com.ruoyi.stock.pojo.StockInventory; |
| | | import lombok.AllArgsConstructor; |
| | |
| | | private StockInventoryMapper stockInventoryMapper; |
| | | @Autowired |
| | | private ProductOrderServiceImpl productOrderServiceImpl; |
| | | @Autowired |
| | | private ISalesLedgerProductFrozenService salesLedgerProductFrozenService; |
| | | |
| | | @Override |
| | | public SalesLedgerProduct selectSalesLedgerProductById(Long id) { |
| | |
| | | //删除对应的生产订单 |
| | | deleteProductionData(Arrays.asList(ids)); |
| | | |
| | | for (Long id : ids) { |
| | | revertFrozenStock(id); |
| | | } |
| | | |
| | | // 3. 对每个主表ID进行金额更新 |
| | | for (Long salesLedgerId : mainIds) { |
| | | LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); |
| | |
| | | if (salesLedgerProduct.getId() == null) { |
| | | salesLedgerProduct.setRegisterDate(LocalDateTime.now()); |
| | | result = salesLedgerProductMapper.insert(salesLedgerProduct); |
| | | addProductionData(salesLedgerProduct); |
| | | processStockAndProduction(salesLedgerProduct); |
| | | } else { |
| | | checkProductionDataExist(Collections.singletonList(salesLedgerProduct.getId())); |
| | | |
| | | revertFrozenStock(salesLedgerProduct.getId()); |
| | | |
| | | //查询原本的产品型号id |
| | | salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); |
| | |
| | | deleteProductionData(Arrays.asList(salesLedgerProduct.getId())); |
| | | // 删除生产核算数据 |
| | | |
| | | addProductionData(salesLedgerProduct); |
| | | processStockAndProduction(salesLedgerProduct); |
| | | } |
| | | |
| | | // 如果插入或更新成功,并且有 salesLedgerId,才继续更新主表金额 |
| | |
| | | return result; |
| | | } |
| | | |
| | | public void processStockAndProduction(SalesLedgerProduct salesLedgerProduct) { |
| | | BigDecimal salesQty = salesLedgerProduct.getQuantity(); |
| | | if (salesQty == null) salesQty = BigDecimal.ZERO; |
| | | |
| | | BigDecimal frozenQty = BigDecimal.ZERO; |
| | | BigDecimal productionQty = salesQty; |
| | | |
| | | // 查询可用库存 |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, salesLedgerProduct.getProductModelId()) |
| | | .last("for update")); |
| | | if (stockInventory != null) { |
| | | BigDecimal quality = stockInventory.getQualitity() != null ? stockInventory.getQualitity() : BigDecimal.ZERO; |
| | | BigDecimal lockedQty = stockInventory.getLockedQuantity() != null ? stockInventory.getLockedQuantity() : BigDecimal.ZERO; |
| | | BigDecimal availableStock = quality.subtract(lockedQty); |
| | | |
| | | if (availableStock.compareTo(BigDecimal.ZERO) > 0) { |
| | | // 有可用库存 |
| | | if (availableStock.compareTo(salesQty) >= 0) { |
| | | frozenQty = salesQty; |
| | | productionQty = BigDecimal.ZERO; |
| | | } else { |
| | | frozenQty = availableStock; |
| | | productionQty = salesQty.subtract(frozenQty); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 冻结库存 |
| | | if (frozenQty.compareTo(BigDecimal.ZERO) > 0) { |
| | | SalesLedgerProductFrozen frozenRecord = new SalesLedgerProductFrozen(); |
| | | frozenRecord.setSalesLedgerProductId(salesLedgerProduct.getId()); |
| | | frozenRecord.setProductModelId(salesLedgerProduct.getProductModelId()); |
| | | frozenRecord.setFrozenQuantity(frozenQty); |
| | | frozenRecord.setCreateTime(LocalDateTime.now()); |
| | | salesLedgerProductFrozenService.save(frozenRecord); |
| | | |
| | | if (stockInventory != null) { |
| | | BigDecimal currentLocked = stockInventory.getLockedQuantity() != null ? stockInventory.getLockedQuantity() : BigDecimal.ZERO; |
| | | stockInventory.setLockedQuantity(currentLocked.add(frozenQty)); |
| | | stockInventoryMapper.updateById(stockInventory); |
| | | } |
| | | } |
| | | |
| | | // 如果需要生产,则生成生产数据 |
| | | if (productionQty.compareTo(BigDecimal.ZERO) > 0) { |
| | | addProductionData(salesLedgerProduct, productionQty); |
| | | } |
| | | } |
| | | |
| | | public void revertFrozenStock(Long salesLedgerProductId) { |
| | | SalesLedgerProductFrozen frozenRecord = salesLedgerProductFrozenService.getOne(new LambdaQueryWrapper<SalesLedgerProductFrozen>() |
| | | .eq(SalesLedgerProductFrozen::getSalesLedgerProductId, salesLedgerProductId) |
| | | .last("limit 1")); |
| | | if (frozenRecord != null) { |
| | | BigDecimal frozenQty = frozenRecord.getFrozenQuantity(); |
| | | if (frozenQty != null && frozenQty.compareTo(BigDecimal.ZERO) > 0) { |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, frozenRecord.getProductModelId()) |
| | | .last("for update")); |
| | | if (stockInventory != null) { |
| | | BigDecimal currentLocked = stockInventory.getLockedQuantity() != null ? stockInventory.getLockedQuantity() : BigDecimal.ZERO; |
| | | stockInventory.setLockedQuantity(currentLocked.subtract(frozenQty)); |
| | | stockInventoryMapper.updateById(stockInventory); |
| | | } |
| | | } |
| | | salesLedgerProductFrozenService.removeById(frozenRecord.getId()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 新增生产数据 |
| | | */ |
| | | public void addProductionData(SalesLedgerProduct salesLedgerProduct) { |
| | | public void addProductionData(SalesLedgerProduct salesLedgerProduct, BigDecimal productionQty) { |
| | | ProductOrder productOrder = new ProductOrder(); |
| | | productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); |
| | | productOrder.setProductModelId(salesLedgerProduct.getProductModelId()); |
| | | productOrder.setSaleLedgerProductId(salesLedgerProduct.getId()); |
| | | String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))); |
| | | productOrder.setNpsNo(string); |
| | | productOrder.setQuantity(salesLedgerProduct.getQuantity());//需求数量 |
| | | productOrder.setQuantity(productionQty);//需求数量 |
| | | productOrder.setCompleteQuantity(BigDecimal.ZERO);//完成数量 |
| | | productOrderMapper.insert(productOrder); |
| | | |
| | |
| | | ProductWorkOrder productWorkOrder = new ProductWorkOrder(); |
| | | productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); |
| | | productWorkOrder.setProductOrderId(productOrder.getId()); |
| | | productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); |
| | | productWorkOrder.setPlanQuantity(productionQty); |
| | | productWorkOrder.setWorkOrderNo(workOrderNoStr); |
| | | productWorkOrder.setStatus(1); |
| | | |