| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.utils.OrderUtils; |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | |
| | | import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper; |
| | | import com.ruoyi.stock.mapper.StockInventoryCheckPlanMapper; |
| | | import com.ruoyi.stock.mapper.StockInventoryCheckProductMapper; |
| | | import com.ruoyi.stock.mapper.WarehouseInfoMapper; |
| | | import com.ruoyi.stock.pojo.*; |
| | | import com.ruoyi.stock.service.*; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | private final StockUtils stockUtils; |
| | | private final StockInRecordService stockInRecordService; |
| | | private final StockOutRecordService stockOutRecordService; |
| | | private final WarehouseInfoMapper warehouseInfoMapper; |
| | | |
| | | @Override |
| | | public IPage<StockInventoryCheckPlanDto> listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public R start(Long id) { |
| | | StockInventoryCheckPlan stockInventoryCheckPlan = this.getById(id); |
| | | StockInventoryCheckPlanDto stockInventoryCheckPlanDto = new StockInventoryCheckPlanDto(); |
| | |
| | | StockInventoryCheckItemDto stockInventoryCheckItemDto = new StockInventoryCheckItemDto(); |
| | | stockInventoryCheckItemDto.setProductModelId(stockInventory.getProductModelId()); |
| | | stockInventoryCheckItemDto.setBatchNo(stockInventory.getBatchNo()); |
| | | stockInventoryCheckItemDto.setWarehouseInfoId(stockInventory.getWarehouseInfoId()); |
| | | stockInventoryCheckItemDto.setSystemQuantity(stockInventory.getQualitity()); |
| | | stockInventoryCheckItemDto.setModel(stockInventory.getModel()); |
| | | stockInventoryCheckItemDto.setUnit(stockInventory.getUnit()); |
| | |
| | | return R.fail("盘点单不存在"); |
| | | } |
| | | for (StockInventoryCheckItem item : stockInventoryCheckPlanDto.getCheckItems()) { |
| | | //更新库存锁定状态 |
| | | stockInventoryService.updateLocked(item.getProductModelId(),item.getBatchNo(), false); |
| | | if (item.getDifferenceQuantity() == null || item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) == 0) { |
| | | continue; |
| | | } |
| | |
| | | |
| | | if (item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) > 0) { |
| | | stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode()); |
| | | StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs (), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo()); |
| | | StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs (), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo(), resolveWarehouseInfoId(item.getProductModelId(), item.getBatchNo())); |
| | | //直接审核通过 |
| | | stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1); |
| | | stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1, resolveWarehouseInfoId(item.getProductModelId(), item.getBatchNo())); |
| | | }else { |
| | | stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode()); |
| | | StockOutRecordDto stock = stockUtils.substractStock(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo()); |
| | | stockInventoryDto.setRecordType(StockOutQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode()); |
| | | StockOutRecordDto stock = stockUtils.substractStock(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo(), resolveWarehouseInfoId(item.getProductModelId(), item.getBatchNo())); |
| | | //直接审核通过 |
| | | stockOutRecordService.batchApprove(Collections.singletonList(stock.getId()), 1); |
| | | stockOutRecordService.batchApprove(Collections.singletonList(stock.getId()), 1,item.getWarehouseInfoId()); |
| | | } |
| | | //更新库存锁定状态 |
| | | stockInventoryService.updateLocked(stockInventoryDto.getProductModelId(),stockInventoryDto.getBatchNo(), false); |
| | | } |
| | | stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems()); |
| | | plan.setStatus(2); |
| | |
| | | |
| | | @Override |
| | | public StockInventoryCheckPlanDto detail(Long id) { |
| | | //查询仓库 |
| | | List<WarehouseInfo> warehouseInfos = warehouseInfoMapper.selectList(null); |
| | | |
| | | StockInventoryCheckPlan byId = this.getById(id); |
| | | if (byId == null) { |
| | | return null; |
| | |
| | | List<StockInventoryCheckItem> checkItems = stockInventoryCheckItemMapper.selectList( |
| | | new LambdaQueryWrapper<StockInventoryCheckItem>() |
| | | .eq(StockInventoryCheckItem::getMainId, checkMain.getId())); |
| | | checkItems.stream().forEach(item -> { |
| | | item.setWarehouseName(warehouseInfos.stream().filter(warehouseInfo -> warehouseInfo.getId().equals(item.getWarehouseInfoId())).findFirst().get().getWarehouseName()); |
| | | }); |
| | | stockInventoryCheckPlanDto.setCheckItems(checkItems); |
| | | } |
| | | |
| | |
| | | public R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { |
| | | SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId()); |
| | | stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName()); |
| | | //赋值 |
| | | //设置盘点商品关联ID并查询系统库存 |
| | | // 查询数据库中的旧数据 |
| | | List<StockInventoryCheckProduct> oldItems = stockInventoryCheckProductMapper.selectList( |
| | | new LambdaQueryWrapper<StockInventoryCheckProduct>() |
| | | .eq(StockInventoryCheckProduct::getInventoryCheckPlanId, stockInventoryCheckPlanDto.getId())); |
| | | // 设置盘点商品关联 ID 并查询系统库存 |
| | | stockInventoryCheckPlanDto.getItems().forEach(item -> { |
| | | item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId()); |
| | | List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId())); |
| | | // 查询并设置系统库存 |
| | | List<StockInventory> list = stockInventoryService.list( |
| | | new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId())); |
| | | BigDecimal systemQty = list.stream() |
| | | .map(StockInventory::getQualitity) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | item.setSystemQuantity(systemQty); |
| | | // 如果旧数据中不存在该 ID,说明是新增,需要清空 ID 让数据库自动生成 |
| | | boolean isExisting = oldItems.stream().anyMatch(old -> old.getId().equals(item.getId())); |
| | | if (!isExisting) { |
| | | item.setId(null); |
| | | } |
| | | }); |
| | | //更新或新增 |
| | | // 使用 insertOrUpdate 批量处理,自动区分新增和更新 |
| | | stockInventoryCheckProductMapper.insertOrUpdate(stockInventoryCheckPlanDto.getItems()); |
| | | // 处理删除:旧数据中有但新数据中没有的项 |
| | | Set<Long> newItemIds = stockInventoryCheckPlanDto.getItems().stream() |
| | | .map(StockInventoryCheckProduct::getId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | List<Long> toDeleteIds = oldItems.stream() |
| | | .map(StockInventoryCheckProduct::getId) |
| | | .filter(id -> !newItemIds.contains(id)) |
| | | .collect(Collectors.toList()); |
| | | if (!toDeleteIds.isEmpty()) { |
| | | stockInventoryCheckProductMapper.deleteByIds(toDeleteIds); |
| | | } |
| | | return R.ok(this.updateById(stockInventoryCheckPlanDto)); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | private Long resolveWarehouseInfoId(Long productModelId, String batchNo) { |
| | | List<StockInventory> inventories = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, productModelId) |
| | | .eq(batchNo != null, StockInventory::getBatchNo, batchNo) |
| | | .isNull(batchNo == null, StockInventory::getBatchNo)); |
| | | if (inventories.isEmpty() || inventories.get(0).getWarehouseInfoId() == null) { |
| | | return 1L; |
| | | } |
| | | return inventories.get(0).getWarehouseInfoId(); |
| | | } |
| | | } |