refactor(stock): 优化库存管理和产品模型查询功能
- 移除ApproveProcessServiceImpl中的采购入库相关代码逻辑
- 在ProductController中添加产品型号分页查询接口并完善文档注解
- 重构ProductionOrderPickServiceImpl中的库存操作方法调用
- 优化ProductionProductMainServiceImpl中的生产报工库存处理逻辑
- 在ProductModelMapper中新增分页查询产品型号及库存数量的方法
- 完善StockInRecord相关的批量审批功能,增加仓库信息参数
- 优化ProductServiceImpl中的批号数量映射填充逻辑
- 修改StockInRecord实体类,增加仓库信息字段
- 更新Mapper XML文件中的查询语句以支持新的功能需求
| | |
| | | package com.ruoyi.approve.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.utils.FileUtil; |
| | | import com.ruoyi.common.enums.FileNameType; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.utils.OrderUtils; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.sales.mapper.ShippingInfoMapper; |
| | | import com.ruoyi.sales.pojo.CommonFile; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.service.impl.CommonFileServiceImpl; |
| | | import lombok.RequiredArgsConstructor; |
| | |
| | | .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason()) |
| | | .set(PurchaseLedger::getApprovalStatus, 3)); |
| | | //éè´å
¥åº |
| | | PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() |
| | | .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason()) |
| | | .last("limit 1")); |
| | | List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>() |
| | | .lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2)); |
| | | for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { |
| | | stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(),purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId()); |
| | | } |
| | | // PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>() |
| | | // .eq(PurchaseLedger::getPurchaseContractNumber, approveProcessVO.getApproveReason()) |
| | | // .last("limit 1")); |
| | | // List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>() |
| | | // .lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2)); |
| | | // for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { |
| | | // stockUtils.addStockWithBatchNo(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(),purchaseLedger.getPurchaseContractNumber()+"-"+salesLedgerProduct.getId()); |
| | | // } |
| | | } |
| | | |
| | | @Override |
| | |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.sales.service.ISalesLedgerProductService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | |
| | | @RestController |
| | | @AllArgsConstructor |
| | | @RequestMapping("/basic/product") |
| | | @Tag(name = "产å管ç", description = "产å管ç") |
| | | public class ProductController extends BaseController { |
| | | |
| | | private IProductService productService; |
| | |
| | | return productService.listPageProductModel(page, productModel); |
| | | } |
| | | |
| | | @Operation(summary = "å页æ¥è¯¢ææäº§ååå·ä»¥åæ°éæ¹å·") |
| | | @GetMapping("/pageModelAndQua") |
| | | public IPage<ProductModelVo> pageModelAndQua(Page<ProductModelVo> page, ProductModel productModel) { |
| | | return productService.pageModelAndQua(page, productModel); |
| | | } |
| | | |
| | | /** |
| | | * 导å
¥äº§å |
| | | */ |
| | |
| | | List<Map<String, Object>> getProductAndModelList(); |
| | | |
| | | List<ProductModelDto> selectModelByIds( @Param("list") List<Long> productIdList); |
| | | |
| | | IPage<ProductModelVo> pageModelAndQua(Page<ProductModelVo> page, @Param("c") ProductModel productModel); |
| | | |
| | | List<Map<String, Object>> selectBatchNoQtyByProductModelIds(@Param("list") List<Long> productModelIds); |
| | | } |
| | |
| | | import java.util.List; |
| | | |
| | | public interface IProductService extends IService<Product> { |
| | | |
| | | |
| | | int addOrEditProduct(ProductDto productDto); |
| | | |
| | | int delProductByIds(Long[] ids); |
| | |
| | | List<ProductTreeDto> selectProductList(ProductDto productDto); |
| | | |
| | | IPage<ProductModelVo> listPageProductModel(Page<ProductModelVo> page, ProductModel productModel); |
| | | |
| | | IPage<ProductModelVo> pageModelAndQua(Page<ProductModelVo> page, ProductModel productModel); |
| | | } |
| | |
| | | import com.ruoyi.basic.service.IProductService; |
| | | import com.ruoyi.basic.vo.ProductModelVo; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.stock.mapper.WarehouseInfoMapper; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.math.BigDecimal; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | | @AllArgsConstructor |
| | | public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService { |
| | | |
| | | private final WarehouseInfoMapper warehouseInfoMapper; |
| | | private ProductMapper productMapper; |
| | | |
| | | private ProductModelMapper productModelMapper; |
| | |
| | | return productModelMapper.listPageProductModel(page, productModel); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<ProductModelVo> pageModelAndQua(Page<ProductModelVo> page, ProductModel productModel) { |
| | | IPage<ProductModelVo> result = productModelMapper.pageModelAndQua(page, productModel); |
| | | fillBatchNoMaps(result.getRecords()); |
| | | return result; |
| | | } |
| | | |
| | | private void fillBatchNoMaps(List<ProductModelVo> records) { |
| | | if (records == null || records.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | List<Long> productModelIds = records.stream() |
| | | .map(ProductModelVo::getId) |
| | | .filter(Objects::nonNull) |
| | | .toList(); |
| | | if (productModelIds.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | List<Map<String, Object>> batchRows = productModelMapper.selectBatchNoQtyByProductModelIds(productModelIds); |
| | | Map<Long, HashMap<String, HashMap<String, BigDecimal>>> batchNoQtyMapsByProductModelId = new HashMap<>(); |
| | | for (Map<String, Object> batchRow : batchRows) { |
| | | Long productModelId = toLong(batchRow.get("productModelId")); |
| | | Long warehouseId = toLong(batchRow.get("warehouseId")); |
| | | String batchNo = (String) batchRow.get("batchNo"); |
| | | if (productModelId == null || warehouseId == null || batchNo == null || batchNo.isBlank()) { |
| | | continue; |
| | | } |
| | | |
| | | batchNoQtyMapsByProductModelId |
| | | .computeIfAbsent(productModelId, key -> new HashMap<>()) |
| | | .computeIfAbsent(String.valueOf(warehouseId), key -> new HashMap<>()) |
| | | .merge(batchNo, toBigDecimal(batchRow.get("qty")), BigDecimal::add); |
| | | } |
| | | |
| | | for (ProductModelVo record : records) { |
| | | HashMap<String, List<Map<String, BigDecimal>>> batchNoMaps = new HashMap<>(); |
| | | HashMap<String, HashMap<String, BigDecimal>> stockBatchNoQtyMaps = |
| | | batchNoQtyMapsByProductModelId.getOrDefault(record.getId(), new HashMap<>()); |
| | | |
| | | for (Map.Entry<String, HashMap<String, BigDecimal>> entry : stockBatchNoQtyMaps.entrySet()) { |
| | | List<Map<String, BigDecimal>> batchList = new ArrayList<>(); |
| | | for (Map.Entry<String, BigDecimal> batchEntry : entry.getValue().entrySet()) { |
| | | Map<String, BigDecimal> batchItem = new HashMap<>(); |
| | | batchItem.put(batchEntry.getKey(), batchEntry.getValue()); |
| | | batchList.add(batchItem); |
| | | } |
| | | batchNoMaps.put(entry.getKey(), batchList); |
| | | } |
| | | |
| | | record.setBatchNoMaps(batchNoMaps); |
| | | } |
| | | } |
| | | |
| | | private Long toLong(Object value) { |
| | | if (value instanceof Number number) { |
| | | return number.longValue(); |
| | | } |
| | | if (value instanceof String str && !str.isBlank()) { |
| | | return Long.parseLong(str); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private BigDecimal toBigDecimal(Object value) { |
| | | if (value instanceof BigDecimal bigDecimal) { |
| | | return bigDecimal; |
| | | } |
| | | if (value instanceof Number number) { |
| | | return BigDecimal.valueOf(number.doubleValue()); |
| | | } |
| | | if (value instanceof String str && !str.isBlank()) { |
| | | return new BigDecimal(str); |
| | | } |
| | | return BigDecimal.ZERO; |
| | | } |
| | | |
| | | // éå½æå»ºåèç¹ |
| | | private List<ProductTreeDto> buildChildrenNodes(Long parentId) { |
| | |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @EqualsAndHashCode(callSuper = true) |
| | | @Data |
| | | public class ProductModelVo extends ProductModel { |
| | | |
| | | private List<String> batchNoList; |
| | | |
| | | private HashMap<String, List<Map<String, BigDecimal>>> batchNoMaps; |
| | | } |
| | |
| | | private final StockInventoryMapper stockInventoryMapper; |
| | | |
| | | /** |
| | | * ä¸åæ ¼å
¥åº |
| | | * æ¶å¶
æéç
åæ´? |
| | | * |
| | | * @param productModelId |
| | | * @param quantity |
| | |
| | | stockUninventoryDto.setRecordType(String.valueOf(recordType)); |
| | | stockUninventoryDto.setQualitity(quantity); |
| | | stockUninventoryDto.setProductModelId(productModelId); |
| | | stockUninventoryService.addStockInRecordOnly(stockUninventoryDto); |
| | | stockUninventoryService.addStockUninventory(stockUninventoryDto); |
| | | } |
| | | |
| | | /** |
| | | * ä¸åæ ¼åºåº |
| | | * æ¶å¶
æéç
åæ´? |
| | | * |
| | | * @param productModelId |
| | | * @param quantity |
| | |
| | | } |
| | | |
| | | /** |
| | | * åæ ¼å
¥åº |
| | | * éå ç¸éã¥ç°± |
| | | * @param recordType |
| | | * @param recordId |
| | | */ |
| | | public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) { |
| | | addStock(productModelId, quantity, recordType, recordId, resolveWarehouseInfoId(null, productModelId, null)); |
| | | } |
| | | |
| | | public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, Long warehouseInfoId) { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(recordId); |
| | | stockInventoryDto.setRecordType(String.valueOf(recordType)); |
| | | stockInventoryDto.setQualitity(quantity); |
| | | stockInventoryDto.setProductModelId(productModelId); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInventoryService.addStockInRecordOnly(stockInventoryDto); |
| | | } |
| | | |
| | | /** |
| | | * åæ ¼å
¥åºå¸¦æ¹æ¬¡å· |
| | | * éå ç¸éã¥ç°±ç¯ï¸½å£å¨â³å½¿ |
| | | * @param productModelId |
| | | * @param quantity |
| | | * @param recordType |
| | | * @param recordId |
| | | */ |
| | | public StockInRecordDto addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { |
| | | return addStockWithBatchNo(productModelId, quantity, recordType, recordId, batchNo, |
| | | resolveWarehouseInfoId(null, productModelId, batchNo)); |
| | | } |
| | | |
| | | public StockInRecordDto addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo, Long warehouseInfoId) { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(recordId); |
| | | stockInventoryDto.setRecordType(String.valueOf(recordType)); |
| | | stockInventoryDto.setQualitity(quantity); |
| | | stockInventoryDto.setProductModelId(productModelId); |
| | | stockInventoryDto.setBatchNo(batchNo); |
| | | return stockInventoryService.addStockInRecordOnly(stockInventoryDto); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | return stockInventoryService.addStockInRecordOnly(stockInventoryDto); |
| | | } |
| | | |
| | | /** |
| | | * åæ ¼åºåº |
| | | * éå ç¸éåç°± |
| | | * |
| | | * @param productModelId |
| | | * @param quantity |
| | |
| | | * @param recordId |
| | | */ |
| | | public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) { |
| | | substractStock(productModelId, quantity, recordType, recordId, resolveWarehouseInfoId(null, productModelId, null)); |
| | | } |
| | | |
| | | public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, Long warehouseInfoId) { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(recordId); |
| | | stockInventoryDto.setRecordType(String.valueOf(recordType)); |
| | | stockInventoryDto.setQualitity(quantity); |
| | | stockInventoryDto.setProductModelId(productModelId); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInventoryService.subtractStockInventory(stockInventoryDto); |
| | | } |
| | | |
| | | public StockOutRecordDto substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { |
| | | return substractStock(productModelId, quantity, recordType, recordId, batchNo, |
| | | resolveWarehouseInfoId(null, productModelId, batchNo)); |
| | | } |
| | | |
| | | public StockOutRecordDto substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo, Long warehouseInfoId) { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(recordId); |
| | | stockInventoryDto.setRecordType(String.valueOf(recordType)); |
| | | stockInventoryDto.setQualitity(quantity); |
| | | stockInventoryDto.setProductModelId(productModelId); |
| | | stockInventoryDto.setBatchNo(batchNo); |
| | | return stockInventoryService.addStockOutRecordOnly(stockInventoryDto); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | return stockInventoryService.addStockOutRecordOnly(stockInventoryDto); |
| | | } |
| | | |
| | | /** |
| | | * å货审æ¹ç¶ææ´æ¹ |
| | | * @param recordType |
| | | * @param recordId |
| | | */ |
| | |
| | | stockOutRecordService.updateById(stockOutRecord); |
| | | } |
| | | |
| | | //ä¸åæ ¼åºåå é¤ |
| | | public void deleteStockInRecord(Long recordId, String recordType) { |
| | | StockInRecord one = stockInRecordService.getOne(new QueryWrapper<StockInRecord>() |
| | | .lambda().eq(StockInRecord::getRecordId, recordId) |
| | | .eq(StockInRecord::getRecordType, recordType)); |
| | | if (ObjectUtils.isNotEmpty(one)) { |
| | | stockInRecordService.batchDelete(Collections.singletonList(one.getId())); |
| | | //å°åºåå忥 |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(recordId); |
| | | stockInventoryDto.setRecordType(recordType); |
| | | stockInventoryDto.setQualitity(one.getStockInNum()); |
| | | stockInventoryDto.setProductModelId(one.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(one.getBatchNo()); |
| | | stockInventoryMapper.updateSubtractStockInventory((stockInventoryDto)); |
| | | } |
| | | |
| | |
| | | .eq(StockOutRecord::getRecordType, recordType)); |
| | | if (ObjectUtils.isNotEmpty(one)) { |
| | | stockOutRecordService.batchDelete(Collections.singletonList(one.getId())); |
| | | //å°åºåå 忥 |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(recordId); |
| | | stockInventoryDto.setRecordType(recordType); |
| | | stockInventoryDto.setQualitity(one.getStockOutNum()); |
| | | stockInventoryDto.setProductModelId(one.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(one.getBatchNo()); |
| | | stockInventoryDto.setWarehouseInfoId(one.getWarehouseInfoId()); |
| | | stockInventoryMapper.updateAddStockInventory((stockInventoryDto)); |
| | | } |
| | | |
| | | } |
| | | |
| | | private Long resolveWarehouseInfoId(Long warehouseInfoId, Long productModelId, String batchNo) { |
| | | if (warehouseInfoId == null) { |
| | | throw new IllegalArgumentException("warehouseInfoIdä¸è½ä¸ºç©º"); |
| | | } |
| | | return warehouseInfoId; |
| | | } |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.enums.ReviewStatusEnum; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | | import com.ruoyi.stock.pojo.StockInventory; |
| | | import com.ruoyi.stock.pojo.StockOutRecord; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import com.ruoyi.stock.service.StockInRecordService; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import com.ruoyi.stock.service.StockOutRecordService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | baseMapper.insert(orderPick); |
| | | |
| | | // å
æ°å¢åºåºç³è¯·ï¼å审æ¹éè¿ï¼å®æåºåæ£åã |
| | | subtractInventory(orderPick.getId(), resolvedDto.getProductModelId(), storedBatchNo, resolvedDto.getPickQuantity(), rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | // subtractInventory(orderPick.getId(), resolvedDto.getProductModelId(), storedBatchNo, resolvedDto.getPickQuantity(), rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | |
| | | // è®°å½æ¬æ¬¡é¢ææµæ°´ï¼before=0ï¼after=æ¬æ¬¡é¢æéï¼ã |
| | | insertPickRecord(orderPick.getId(), |
| | |
| | | } |
| | | String oldBatchNo = resolveInventoryBatchNoFromStored(existingPick.getBatchNo()); |
| | | BigDecimal oldQuantity = defaultDecimal(existingPick.getQuantity()); |
| | | addInventory(existingPick.getId(), existingPick.getProductModelId(), oldBatchNo, oldQuantity, PICK_RETURN_IN_RECORD_TYPE); |
| | | // addInventory(existingPick.getId(), existingPick.getProductModelId(), oldBatchNo, oldQuantity, PICK_RETURN_IN_RECORD_TYPE); |
| | | // å é¤å
³èé¢ææµæ°´ï¼é¿å
éçæ ä¸»è®°å½ã |
| | | productionOrderPickRecordMapper.delete( |
| | | Wrappers.<ProductionOrderPickRecord>lambdaQuery() |
| | |
| | | for (ProductionOrderPick missingPick : missingPickList) { |
| | | String oldBatchNo = resolveInventoryBatchNoFromStored(missingPick.getBatchNo()); |
| | | BigDecimal oldQuantity = defaultDecimal(missingPick.getQuantity()); |
| | | addInventory(missingPick.getId(), missingPick.getProductModelId(), oldBatchNo, oldQuantity, PICK_RETURN_IN_RECORD_TYPE); |
| | | // addInventory(missingPick.getId(), missingPick.getProductModelId(), oldBatchNo, oldQuantity, PICK_RETURN_IN_RECORD_TYPE); |
| | | // å é¤å
³èé¢ææµæ°´ï¼é¿å
éçæ ä¸»è®°å½ã |
| | | productionOrderPickRecordMapper.delete( |
| | | Wrappers.<ProductionOrderPickRecord>lambdaQuery() |
| | |
| | | baseMapper.insert(orderPick); |
| | | |
| | | // å
æ°å¢åºåºç³è¯·ï¼å审æ¹éè¿ï¼å®æåºåæ£åã |
| | | subtractInventory(orderPick.getId(), dto.getProductModelId(), storedBatchNo, dto.getPickQuantity(), rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | // subtractInventory(orderPick.getId(), dto.getProductModelId(), storedBatchNo, dto.getPickQuantity(), rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | |
| | | insertPickRecord(orderPick.getId(), |
| | | dto.getProductionOrderId(), |
| | |
| | | : formatBatchNoStorage(batchNoList); |
| | | BigDecimal feedingQuantity = dto.getFeedingQuantity(); |
| | | |
| | | subtractInventory(oldPick.getId(), productModelId, inventoryBatchNo, feedingQuantity, rowNo, FEED_STOCK_OUT_RECORD_TYPE); |
| | | // subtractInventory(oldPick.getId(), productModelId, inventoryBatchNo, feedingQuantity, rowNo, FEED_STOCK_OUT_RECORD_TYPE); |
| | | |
| | | // 计ç®è¡¥æååæ°éå¹¶åè¡¥ææµæ°´ã |
| | | BigDecimal beforeFeedingQty = sumFeedingQuantity(dto.getProductionOrderId(), oldPick.getId()); |
| | |
| | | BigDecimal totalReturnQty = oldReturnQty.add(currentReturnQty); |
| | | if (currentReturnQty.compareTo(BigDecimal.ZERO) > 0) { |
| | | String returnBatchNo = resolveInventoryBatchNoFromStored(oldPick.getBatchNo()); |
| | | addInventoryRecordOnly(oldPick.getId(), oldPick.getProductModelId(), returnBatchNo, currentReturnQty, FEED_RETURN_IN_RECORD_TYPE); |
| | | // addInventoryRecordOnly(oldPick.getId(), oldPick.getProductModelId(), returnBatchNo, currentReturnQty, FEED_RETURN_IN_RECORD_TYPE); |
| | | } |
| | | |
| | | BigDecimal actualQty = defaultDecimal(oldPick.getQuantity()) |
| | |
| | | BigDecimal deltaQuantity = newQuantity.subtract(oldQuantity); |
| | | if (deltaQuantity.compareTo(BigDecimal.ZERO) > 0) { |
| | | // æ°éå¢å ï¼åªæ£åæ°å¢é¨åã |
| | | subtractInventory(oldPick.getId(), newProductModelId, newStoredBatchNo, deltaQuantity, rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | // subtractInventory(oldPick.getId(), newProductModelId, newStoredBatchNo, deltaQuantity, rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | } else if (deltaQuantity.compareTo(BigDecimal.ZERO) < 0) { |
| | | // æ°éåå°ï¼åªåéå·®å¼é¨åã |
| | | addInventory(oldPick.getId(), oldProductModelId, oldBatchNo, deltaQuantity.abs(), PICK_RETURN_IN_RECORD_TYPE); |
| | | // addInventory(oldPick.getId(), oldProductModelId, oldBatchNo, deltaQuantity.abs(), PICK_RETURN_IN_RECORD_TYPE); |
| | | } |
| | | } else { |
| | | // è§æ ¼ææ¹æ¬¡ååï¼å
å
¨éå鿧颿ï¼åå
¨éæ£åæ°é¢æã |
| | | addInventory(oldPick.getId(), oldProductModelId, oldBatchNo, oldQuantity, PICK_RETURN_IN_RECORD_TYPE); |
| | | subtractInventory(oldPick.getId(), newProductModelId, newStoredBatchNo, newQuantity, rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | // addInventory(oldPick.getId(), oldProductModelId, oldBatchNo, oldQuantity, PICK_RETURN_IN_RECORD_TYPE); |
| | | // subtractInventory(oldPick.getId(), newProductModelId, newStoredBatchNo, newQuantity, rowNo, PICK_STOCK_OUT_RECORD_TYPE); |
| | | } |
| | | if (needReissuePickRecord) { |
| | | // æ£å¸¸é¢ææµæ°´æâææ°é¢æéâé建ï¼é¿å
ä¿çå岿§å¼ã |
| | |
| | | continue; |
| | | } |
| | | BigDecimal currentDeductQuantity = remainingQuantity.min(availableQuantity); |
| | | createAndApproveStockOutRecord(recordId, productModelId, entry.getKey(), currentDeductQuantity, rowNo, stockOutRecordType); |
| | | // createAndApproveStockOutRecord(recordId, productModelId, entry.getKey(), currentDeductQuantity, rowNo, stockOutRecordType); |
| | | remainingQuantity = remainingQuantity.subtract(currentDeductQuantity); |
| | | } |
| | | |
| | |
| | | } else { |
| | | recordWrapper.eq(StockOutRecord::getBatchNo, batchNo); |
| | | } |
| | | StockOutRecord stockOutRecord = stockOutRecordService.getOne(recordWrapper, false); |
| | | if (stockOutRecord == null || stockOutRecord.getId() == null) { |
| | | throw new ServiceException("第" + rowNo + "è¡æ£ååºåå¤±è´¥ï¼æªæ¾å°å¯¹åºåºåºç³è¯·è®°å½"); |
| | | } |
| | | stockOutRecordService.batchApprove( |
| | | Collections.singletonList(stockOutRecord.getId()), |
| | | ReviewStatusEnum.APPROVED.getCode() |
| | | ); |
| | | // StockOutRecord stockOutRecord = stockOutRecordService.getOne(recordWrapper, false); |
| | | // if (stockOutRecord == null || stockOutRecord.getId() == null) { |
| | | // throw new ServiceException("第" + rowNo + "è¡æ£ååºåå¤±è´¥ï¼æªæ¾å°å¯¹åºåºåºç³è¯·è®°å½"); |
| | | // } |
| | | // stockOutRecordService.batchApprove( |
| | | // Collections.singletonList(stockOutRecord.getId()), |
| | | // ReviewStatusEnum.APPROVED.getCode() |
| | | // ); |
| | | } catch (ServiceException ex) { |
| | | throw ex; |
| | | } catch (Exception ex) { |
| | |
| | | if (stockInRecord == null || stockInRecord.getId() == null) { |
| | | throw new ServiceException("åè¡¥åºåå¤±è´¥ï¼æªæ¾å°å¯¹åºå
¥åºç³è¯·è®°å½"); |
| | | } |
| | | stockInRecordService.batchApprove( |
| | | Collections.singletonList(stockInRecord.getId()), |
| | | ReviewStatusEnum.APPROVED.getCode() |
| | | ); |
| | | // stockInRecordService.batchApprove( |
| | | // Collections.singletonList(stockInRecord.getId()), |
| | | // ReviewStatusEnum.APPROVED.getCode(),stockInRecord.getWarehouseInfoId() |
| | | // ); |
| | | } catch (ServiceException ex) { |
| | | throw ex; |
| | | } catch (Exception ex) { |
| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.basic.mapper.ProductMapper; |
| | | import com.ruoyi.basic.mapper.ProductModelMapper; |
| | | import com.ruoyi.basic.pojo.Product; |
| | | import com.ruoyi.basic.pojo.ProductModel; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | | import com.ruoyi.production.bean.dto.ProductStructureDto; |
| | | import com.ruoyi.production.bean.dto.ProductionProductMainDto; |
| | |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.project.system.mapper.SysUserMapper; |
| | | import com.ruoyi.quality.mapper.*; |
| | | import com.ruoyi.quality.pojo.*; |
| | | import com.ruoyi.stock.dto.StockInventoryDto; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import com.ruoyi.technology.mapper.TechnologyOperationMapper; |
| | | import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; |
| | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.Collections; |
| | | import java.util.HashMap; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.LinkedHashSet; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | |
| | | .eq(ProductionOrderRoutingOperation::getProductionOrderId, routingOperation.getProductionOrderId())); |
| | | boolean isLastOperation = routingOperation.getDragSort() != null && routingOperation.getDragSort().equals(routingOperationList.size()); |
| | | if (productQty.compareTo(BigDecimal.ZERO) > 0) { |
| | | if (Boolean.TRUE.equals(routingOperation.getIsQuality())) { |
| | | // è´¨æ£å·¥åºå
çææ£éªåï¼éè´¨æ£å·¥åºç´æ¥å
¥åæ ¼ååºåã |
| | | int inspectType = isLastOperation ? 2 : 1; |
| | | String process = isLastOperation ? null : technologyOperation == null ? null : technologyOperation.getName(); |
| | | Product product = productMapper.selectById(productModel.getProductId()); |
| | | QualityInspect qualityInspect = new QualityInspect(); |
| | | qualityInspect.setProductId(product.getId()); |
| | | qualityInspect.setProductName(product.getProductName()); |
| | | qualityInspect.setModel(productModel.getModel()); |
| | | qualityInspect.setUnit(productModel.getUnit()); |
| | | qualityInspect.setQuantity(productQty); |
| | | qualityInspect.setProcess(process); |
| | | qualityInspect.setInspectState(0); |
| | | qualityInspect.setInspectType(inspectType); |
| | | qualityInspect.setProductMainId(productionProductMain.getId()); |
| | | qualityInspect.setProductModelId(productModel.getId()); |
| | | qualityInspectMapper.insert(qualityInspect); |
| | | List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process); |
| | | if (!qualityTestStandard.isEmpty()) { |
| | | qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); |
| | | qualityInspectMapper.updateById(qualityInspect); |
| | | qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() |
| | | .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId())) |
| | | .forEach(qualityTestStandardParam -> { |
| | | QualityInspectParam param = new QualityInspectParam(); |
| | | BeanUtils.copyProperties(qualityTestStandardParam, param); |
| | | param.setId(null); |
| | | param.setInspectId(qualityInspect.getId()); |
| | | qualityInspectParamMapper.insert(param); |
| | | }); |
| | | } |
| | | } else { |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setRecordId(productionProductMain.getId()); |
| | | stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode())); |
| | | stockInventoryDto.setQualitity(productQty); |
| | | stockInventoryDto.setProductModelId(productModel.getId()); |
| | | stockInventoryService.addStockInRecordOnly(stockInventoryDto); |
| | | } |
| | | // if (Boolean.TRUE.equals(routingOperation.getIsQuality())) { |
| | | // // è´¨æ£å·¥åºå
çææ£éªåï¼éè´¨æ£å·¥åºç´æ¥å
¥åæ ¼ååºåã |
| | | // int inspectType = isLastOperation ? 2 : 1; |
| | | // String process = isLastOperation ? null : technologyOperation == null ? null : technologyOperation.getName(); |
| | | // Product product = productMapper.selectById(productModel.getProductId()); |
| | | // QualityInspect qualityInspect = new QualityInspect(); |
| | | // qualityInspect.setProductId(product.getId()); |
| | | // qualityInspect.setProductName(product.getProductName()); |
| | | // qualityInspect.setModel(productModel.getModel()); |
| | | // qualityInspect.setUnit(productModel.getUnit()); |
| | | // qualityInspect.setQuantity(productQty); |
| | | // qualityInspect.setProcess(process); |
| | | // qualityInspect.setInspectState(0); |
| | | // qualityInspect.setInspectType(inspectType); |
| | | // qualityInspect.setProductMainId(productionProductMain.getId()); |
| | | // qualityInspect.setProductModelId(productModel.getId()); |
| | | // qualityInspectMapper.insert(qualityInspect); |
| | | // List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process); |
| | | // if (!qualityTestStandard.isEmpty()) { |
| | | // qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId()); |
| | | // qualityInspectMapper.updateById(qualityInspect); |
| | | // qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery() |
| | | // .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId())) |
| | | // .forEach(qualityTestStandardParam -> { |
| | | // QualityInspectParam param = new QualityInspectParam(); |
| | | // BeanUtils.copyProperties(qualityTestStandardParam, param); |
| | | // param.setId(null); |
| | | // param.setInspectId(qualityInspect.getId()); |
| | | // qualityInspectParamMapper.insert(param); |
| | | // }); |
| | | // } |
| | | // } else { |
| | | // StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | // stockInventoryDto.setRecordId(productionProductMain.getId()); |
| | | // stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode())); |
| | | // stockInventoryDto.setQualitity(productQty); |
| | | // stockInventoryDto.setProductModelId(productModel.getId()); |
| | | // stockInventoryService.addStockInRecordOnly(stockInventoryDto); |
| | | // } |
| | | |
| | | productionOperationTask.setCompleteQuantity(defaultDecimal(productionOperationTask.getCompleteQuantity()).add(productQty)); |
| | | if (ObjectUtils.isNull(productionOperationTask.getActualStartTime())) { |
| | |
| | | List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( |
| | | Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, productionProductMain.getId())); |
| | | // åæ°ä¸åç½®æ¡ä»¶æ ¡éª |
| | | if (qualityInspects.size() > 0) { |
| | | List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList( |
| | | Wrappers.<QualityUnqualified>lambdaQuery() |
| | | // éåå¤çæ°æ®å¹¶ç»è£
ç»æ |
| | | .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList()))); |
| | | if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) { |
| | | throw new ServiceException("è¯¥æ¡æ¥å·¥å·²ç»ä¸åæ ¼å¤çäºï¼ä¸å
许å é¤"); |
| | | } |
| | | } |
| | | // if (!qualityInspects.isEmpty()) { |
| | | // List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList( |
| | | // Wrappers.<QualityUnqualified>lambdaQuery() |
| | | // // éåå¤çæ°æ®å¹¶ç»è£
ç»æ |
| | | // .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList()))); |
| | | // if (!qualityUnqualifieds.isEmpty() && qualityUnqualifieds.getFirst().getInspectState() == 1) { |
| | | // throw new ServiceException("è¯¥æ¡æ¥å·¥å·²ç»ä¸åæ ¼å¤çäºï¼ä¸å
许å é¤"); |
| | | // } |
| | | // } |
| | | ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList( |
| | | Wrappers.<ProductionProductOutput>lambdaQuery() |
| | | .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId())) |
| | |
| | | } |
| | | } |
| | | |
| | | qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getProductMainId, productionProductMain.getId())).forEach(q -> { |
| | | qualityInspectParamMapper.delete(new LambdaQueryWrapper<QualityInspectParam>() |
| | | .eq(QualityInspectParam::getInspectId, q.getId())); |
| | | qualityInspectMapper.deleteById(q.getId()); |
| | | stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); |
| | | }); |
| | | // qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | // .eq(QualityInspect::getProductMainId, productionProductMain.getId())).forEach(q -> { |
| | | // qualityInspectParamMapper.delete(new LambdaQueryWrapper<QualityInspectParam>() |
| | | // .eq(QualityInspectParam::getInspectId, q.getId())); |
| | | // qualityInspectMapper.deleteById(q.getId()); |
| | | // stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()); |
| | | // }); |
| | | productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() |
| | | .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId())); |
| | | productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() |
| | |
| | | productionOrderRoutingOperationParamMapper.delete( |
| | | Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery() |
| | | .eq(ProductionOrderRoutingOperationParam::getProductionProductMainId, productionProductMain.getId())); |
| | | stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); |
| | | stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()); |
| | | stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); |
| | | // stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode()); |
| | | // stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode()); |
| | | // stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode()); |
| | | productionProductMainMapper.deleteById(productionProductMain.getId()); |
| | | return true; |
| | | } |
| | |
| | | |
| | | /** |
| | | * <p> |
| | | * |
| | | * |
| | | * </p> |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | |
| | | handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType()); |
| | | } |
| | | // 6.éè´å®¡æ ¸æ°å¢ï¼å®¡æ¹ç®¡çæªé
ç½®éè´å®¡æ¹äººæ¶ï¼å®¡æ¹æå¡ä¼èªå¨ç½®ä¸ºå®¡æ¹éè¿ã |
| | | addApproveByPurchase(loginUser, purchaseLedger); |
| | | // addApproveByPurchase(loginUser, purchaseLedger); |
| | | // 5. è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ |
| | | fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS()); |
| | | return 1; |
| | |
| | | salesLedgerProductMapper.insert(salesLedgerProduct); |
| | | } |
| | | // éè´å®¡æ ¸ |
| | | addApproveByPurchase(loginUser,salesLedger); |
| | | // addApproveByPurchase(loginUser,salesLedger); |
| | | } |
| | | |
| | | return AjaxResult.success("导å
¥æå"); |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | import org.springframework.util.ObjectUtils; |
| | | |
| | | import java.lang.reflect.Field; |
| | | import java.math.BigDecimal; |
| | |
| | | */ |
| | | public void addProductionData(SalesLedgerProduct salesLedgerProduct) { |
| | | //å
å¤æè¯¥äº§åæ¯å¦éè¦ç产 |
| | | if (!salesLedgerProduct.getIsProduction()) { |
| | | if (ObjectUtils.isEmpty(salesLedgerProduct.getIsProduction()) || !salesLedgerProduct.getIsProduction()) { |
| | | return; |
| | | } |
| | | SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerProduct.getSalesLedgerId()); |
| | |
| | | if(CollectionUtils.isEmpty(approveDto.getIds())){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | stockInRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus()); |
| | | stockInRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus(),approveDto.getWarehouseInfoId()); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| | |
| | | if(CollectionUtils.isEmpty(approveDto.getIds())){ |
| | | return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | | stockOutRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus()); |
| | | stockOutRecordService.batchApprove(approveDto.getIds(), approveDto.getApprovalStatus(),approveDto.getWarehouseInfoId()); |
| | | return AjaxResult.success(); |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.controller; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.stock.dto.WarehouseInfoDto; |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import com.ruoyi.stock.service.WarehouseInfoService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.ArrayList; |
| | | |
| | | /** |
| | | * <p> |
| | | * ä»åºä¿¡æ¯è¡¨ å端æ§å¶å¨ |
| | | * </p> |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | | * @since 2026-05-12 05:44:22 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/warehouseInfo") |
| | | @AllArgsConstructor |
| | | @Tag(name = "ä»åºä¿¡æ¯è¡¨") |
| | | public class WarehouseInfoController { |
| | | |
| | | private final WarehouseInfoService warehouseInfoService; |
| | | |
| | | @GetMapping("/listPage") |
| | | @Operation(summary = "å页æ¥è¯¢") |
| | | public R listPage(Page page, WarehouseInfoDto warehouseInfoDto) { |
| | | return R.ok(warehouseInfoService.listPage(page, warehouseInfoDto)); |
| | | } |
| | | |
| | | @PostMapping("/add") |
| | | @Operation(summary = "æ·»å ") |
| | | public R add(@RequestBody WarehouseInfoDto warehouseInfoDto) { |
| | | return R.ok(warehouseInfoService.save(warehouseInfoDto)); |
| | | } |
| | | |
| | | @PostMapping("/edit") |
| | | @Operation(summary = "ä¿®æ¹") |
| | | public R edit(@RequestBody WarehouseInfoDto warehouseInfoDto) { |
| | | return R.ok(warehouseInfoService.updateById(warehouseInfoDto)); |
| | | } |
| | | |
| | | |
| | | @PostMapping("/delete") |
| | | @Operation(summary = "å é¤") |
| | | public R delete(@RequestBody ArrayList<Long> ids) { |
| | | return R.ok(warehouseInfoService.deleteByIds(ids)); |
| | | } |
| | | |
| | | |
| | | @GetMapping("/list") |
| | | @Operation(summary = "æ¥è¯¢ä»åºä¿¡æ¯") |
| | | public R list() { |
| | | return R.ok(warehouseInfoService.list(new LambdaQueryWrapper<WarehouseInfo>().eq(WarehouseInfo::getStatus, true))); |
| | | } |
| | | } |
| | |
| | | @Schema(description = "è®°å½IDå表") |
| | | private List<Long> ids; |
| | | |
| | | @Schema(description = "ä»åºåç§°") |
| | | private String warehouseName; |
| | | |
| | | } |
| | |
| | | |
| | | @Schema(description = "ä¸åæ ¼åºåID") |
| | | private Long unQualifiedId; |
| | | |
| | | private String warehouseName; |
| | | } |
| | |
| | | |
| | | @Schema(description = "è®°å½IDå表") |
| | | private List<Long> ids; |
| | | |
| | | @Schema(description = "ä»åºåç§°") |
| | | private String warehouseName; |
| | | } |
| | |
| | | private Long recordId; |
| | | |
| | | private BigDecimal unLockedQuantity; |
| | | |
| | | private String warehouseName; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.dto; |
| | | |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class WarehouseInfoDto extends WarehouseInfo { |
| | | } |
| | |
| | | @Excel(name = "åä½") |
| | | private String unit; |
| | | |
| | | @Excel(name = "ä»åºåç§°") |
| | | private String warehouseName; |
| | | |
| | | @Excel(name = "æ¹å·") |
| | | private String batchNo; |
| | | |
| | | @Excel(name = "åæ ¼åºåæ°é") |
| | | private BigDecimal qualifiedQuantity; |
| | | |
| | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | |
| | | BigDecimal selectTotalByDate(@Param("now") LocalDate now); |
| | | |
| | | BigDecimal selectPendingOutQuantity(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("type") String type); |
| | | BigDecimal selectPendingOutQuantity(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("warehouseInfoId") Long warehouseInfoId, @Param("type") String type); |
| | | |
| | | List<StockInventory> listSelectableBatchNoByProductModelIds(@Param("productModelIds") List<Long> productModelIds); |
| | | |
| | |
| | | IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, @Param("ew") StockInventoryDto stockInventoryDto); |
| | | |
| | | int updateLocked(@Param("productModelId") Long productModelId, @Param("batchNo") String batchNo, @Param("locked") boolean b); |
| | | |
| | | Long existsUsed(@Param("ids") ArrayList<Long> ids); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.mapper; |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.stock.dto.WarehouseInfoDto; |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | /** |
| | | * <p> |
| | | * ä»åºä¿¡æ¯è¡¨ Mapper æ¥å£ |
| | | * </p> |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | | * @since 2026-05-12 05:44:22 |
| | | */ |
| | | @Mapper |
| | | public interface WarehouseInfoMapper extends BaseMapper<WarehouseInfo> { |
| | | |
| | | IPage<WarehouseInfoDto> listPage(Page page,@Param("ew") WarehouseInfoDto warehouseInfoDto); |
| | | } |
| | |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | private Long warehouseInfoId; |
| | | } |
| | |
| | | |
| | | @Schema(description = "æ¯å¦éå®") |
| | | private Boolean locked; |
| | | |
| | | @Schema(description = "ä»åºid") |
| | | @TableField("warehouse_info_id") |
| | | private Long warehouseInfoId; |
| | | } |
| | |
| | | private String batchNo; |
| | | |
| | | /** |
| | | * ä»åºID |
| | | */ |
| | | @Schema(description ="ä»åºID") |
| | | private Long warehouseInfoId; |
| | | |
| | | /** |
| | | * ç³»ç»åºåæ°é |
| | | */ |
| | | @Schema(description ="ç³»ç»åºåæ°é") |
| | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private Long updateUser; |
| | | |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | */ |
| | | @Schema(description = "å 餿 å¿ï¼0代表åå¨ 1代表å é¤ï¼") |
| | | private String delFlag; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | package com.ruoyi.stock.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Getter; |
| | |
| | | |
| | | |
| | | @ApiModelProperty("å建人") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private int createUser; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private int deptId; |
| | | } |
| | |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | @Schema(description = "å
¥åºæ¹æ¬¡") |
| | | @Schema(description = "åºåºæ¹æ¬¡") |
| | | private String outboundBatches; |
| | | |
| | | @Schema(description = "æ¹å·") |
| | | private String batchNo; |
| | | |
| | | @Schema(description = "å
¥åºæ°é") |
| | | @Schema(description = "åºåºæ°é") |
| | | private BigDecimal stockOutNum; |
| | | |
| | | @Schema(description = "å
¥åºæ¥æºid") |
| | | @Schema(description = "åºåºæ¥æºid") |
| | | private Long recordId; |
| | | |
| | | @Schema(description = "å
¥åºç±»å") |
| | | @Schema(description = "åºåºç±»å") |
| | | private String recordType; |
| | | |
| | | @Schema(description = "产åè§æ ¼id") |
| | |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | @TableField("warehouse_info_id") |
| | | private Long warehouseInfoId; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.pojo; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.*; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | import org.springframework.format.annotation.DateTimeFormat; |
| | | |
| | | import java.io.Serializable; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * <p> |
| | | * ä»åºä¿¡æ¯è¡¨ |
| | | * </p> |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | | * @since 2026-05-12 05:44:22 |
| | | */ |
| | | @Data |
| | | @TableName("stock_warehouse_info") |
| | | @ApiModel(value = "WarehouseInfo对象", description = "ä»åºä¿¡æ¯è¡¨") |
| | | public class WarehouseInfo implements Serializable { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 主é®ID |
| | | */ |
| | | @Schema(description = "主é®ID") |
| | | @TableId(value = "id", type = IdType.AUTO) |
| | | private Long id; |
| | | |
| | | /** |
| | | * ä»åºåç§° |
| | | */ |
| | | @Schema(description = "ä»åºåç§°") |
| | | private String warehouseName; |
| | | |
| | | /** |
| | | * ä»åºä½ç½® |
| | | */ |
| | | @Schema(description = "ä»åºä½ç½®") |
| | | private String location; |
| | | |
| | | /** |
| | | * è´è´£äºº |
| | | */ |
| | | @Schema(description = "è´è´£äºº") |
| | | private String managerName; |
| | | |
| | | /** |
| | | * èç³»çµè¯ |
| | | */ |
| | | @Schema(description = "èç³»çµè¯") |
| | | private String contactPhone; |
| | | |
| | | /** |
| | | * ç¶æï¼0åç¨ 1å¯ç¨ï¼ |
| | | */ |
| | | @Schema(description = "ç¶æï¼0åç¨ 1å¯ç¨ï¼") |
| | | private Boolean status; |
| | | |
| | | /** |
| | | * 夿³¨ |
| | | */ |
| | | @Schema(description = "夿³¨") |
| | | private String remark; |
| | | |
| | | /** |
| | | * å建人ID |
| | | */ |
| | | @Schema(description = "å建人ID") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long createUser; |
| | | |
| | | /** |
| | | * é¨é¨ID |
| | | */ |
| | | @Schema(description = "é¨é¨ID") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | |
| | | /** |
| | | * å建æ¶é´ |
| | | */ |
| | | @Schema(description = "å建æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private LocalDateTime createTime; |
| | | |
| | | /** |
| | | * æ´æ°æ¶é´ |
| | | */ |
| | | @Schema(description = "æ´æ°æ¶é´") |
| | | @TableField(fill = FieldFill.INSERT_UPDATE) |
| | | private LocalDateTime updateTime; |
| | | } |
| | |
| | | |
| | | void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto); |
| | | |
| | | int batchApprove(List<Long> ids, Integer approvalStatus); |
| | | int batchApprove(List<Long> ids, Integer approvalStatus,Long warehouseInfoId); |
| | | } |
| | |
| | | |
| | | IPage<StockInventoryDto> pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto); |
| | | |
| | | Boolean addstockInventory(StockInventoryDto stockInventoryDto); |
| | | StockInRecordDto addstockInventory(StockInventoryDto stockInventoryDto); |
| | | |
| | | StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto); |
| | | |
| | |
| | | |
| | | void exportStockOutRecord(HttpServletResponse response, StockOutRecordDto stockOutRecordDto); |
| | | |
| | | int batchApprove(List<Long> ids, Integer approvalStatus); |
| | | int batchApprove(List<Long> ids, Integer approvalStatus,Long warehouseInfoId); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.service; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.stock.dto.WarehouseInfoDto; |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | |
| | | import java.util.ArrayList; |
| | | |
| | | /** |
| | | * <p> |
| | | * ä»åºä¿¡æ¯è¡¨ æå¡ç±» |
| | | * </p> |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | | * @since 2026-05-12 05:44:22 |
| | | */ |
| | | public interface WarehouseInfoService extends IService<WarehouseInfo> { |
| | | |
| | | IPage<WarehouseInfoDto> listPage(Page page, WarehouseInfoDto warehouseInfoDto); |
| | | |
| | | Boolean deleteByIds(ArrayList<Long> ids); |
| | | } |
| | |
| | | for (Long id : ids) { |
| | | StockInRecord stockInRecord = stockInRecordMapper.selectById(id); |
| | | if (stockInRecord.getType().equals("0")) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockInRecord.getBatchNo())) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, stockInRecord.getBatchNo()); |
| | | } |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInRecord.getProductModelId(), |
| | | stockInRecord.getBatchNo(), |
| | | stockInRecord.getWarehouseInfoId() |
| | | ); |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(eq); |
| | | if (stockInventory == null) { |
| | | throw new BaseException("åºåè®°å½ä¸æ²¡æå¯¹åºç产å,æ æ³å é¤!!!"); |
| | |
| | | StockInventoryDto stockInRecordDto = new StockInventoryDto(); |
| | | stockInRecordDto.setProductModelId(stockInventory.getProductModelId()); |
| | | stockInRecordDto.setBatchNo(stockInventory.getBatchNo()); |
| | | stockInRecordDto.setWarehouseInfoId(stockInventory.getWarehouseInfoId()); |
| | | stockInRecordDto.setQualitity(stockInRecord.getStockInNum()); |
| | | stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto); |
| | | } |
| | |
| | | util.exportExcel(response,list, "å
¥åºè®°å½ä¿¡æ¯"); |
| | | } |
| | | |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, productModelId); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return stockInventoryMapper.selectOne(eq); |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo, Long warehouseInfoId) { |
| | | return stockInventoryMapper.selectOne(buildQualifiedInventoryQuery(productModelId, batchNo, warehouseInfoId)); |
| | | } |
| | | |
| | | private StockUninventory getStockUninventory(Long productModelId, String batchNo) { |
| | |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchApprove(List<Long> ids, Integer approvalStatus) { |
| | | public int batchApprove(List<Long> ids, Integer approvalStatus,Long warehouseInfoId) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new BaseException("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å®¡æ¹,å
¥åºæ¹æ¬¡:" + stockInRecord.getInboundBatches()); |
| | | } |
| | | stockInRecord.setApprovalStatus(approvalStatus); |
| | | stockInRecord.setWarehouseInfoId(warehouseInfoId); |
| | | stockInRecordMapper.updateById(stockInRecord); |
| | | // 审æ¹éè¿æ¶ï¼åºåå¢å |
| | | if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) { |
| | | if ("0".equals(stockInRecord.getType())) { |
| | | // åæ ¼å
¥åº -> å
æ¥åºåï¼åå¨åæ´æ°ï¼ä¸åå¨åæ°å¢ |
| | | StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo()); |
| | | StockInventory stockInventory = getStockInventory( |
| | | stockInRecord.getProductModelId(), |
| | | stockInRecord.getBatchNo(), |
| | | warehouseInfoId |
| | | ); |
| | | if (!ObjectUtils.isEmpty(stockInventory)) { |
| | | if (stockInventory.getLocked().equals( true)&&!stockInRecord.getRecordType().equals(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode())) { |
| | | throw new BaseException("æ£å¨åºåçç¹,æ æ³å
¥åº,å
¥åºæ¹æ¬¡:" + stockInRecord.getInboundBatches()); |
| | |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(stockInRecord.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(stockInRecord.getBatchNo()); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInventoryDto.setQualitity(stockInRecord.getStockInNum()); |
| | | stockInventoryDto.setRemark(stockInRecord.getRemark()); |
| | | if (stockInventory == null) { |
| | |
| | | setQualitity(stockInRecord.getStockInNum()); |
| | | setBatchNo(stockInRecord.getBatchNo()); |
| | | setRemark(stockInRecord.getRemark()); |
| | | setWarehouseInfoId(warehouseInfoId); |
| | | setVersion(1); |
| | | }}); |
| | | } else { |
| | |
| | | } |
| | | return ids.size(); |
| | | } |
| | | |
| | | private LambdaQueryWrapper<StockInventory> buildQualifiedInventoryQuery(Long productModelId, String batchNo, Long warehouseInfoId) { |
| | | LambdaQueryWrapper<StockInventory> wrapper = new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, productModelId); |
| | | if (warehouseInfoId != null) { |
| | | wrapper.eq(StockInventory::getWarehouseInfoId, warehouseInfoId); |
| | | } |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | wrapper.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | wrapper.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return wrapper; |
| | | } |
| | | } |
| | |
| | | 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.*; |
| | |
| | | } |
| | | |
| | | @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()); |
| | |
| | | |
| | | 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(StockOutQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode()); |
| | | StockOutRecordDto stock = stockUtils.substractStock(stockInventoryDto.getProductModelId(), item.getDifferenceQuantity().abs(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo()); |
| | | 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()); |
| | | } |
| | | } |
| | | stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems()); |
| | |
| | | } |
| | | |
| | | |
| | | 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(); |
| | | } |
| | | } |
| | |
| | | import com.ruoyi.stock.dto.StockUninventoryDto; |
| | | import com.ruoyi.stock.execl.StockInventoryExportData; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import com.ruoyi.stock.mapper.WarehouseInfoMapper; |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | | import com.ruoyi.stock.pojo.StockInventory; |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import com.ruoyi.stock.service.StockInRecordService; |
| | | import com.ruoyi.stock.service.StockInventoryService; |
| | | import com.ruoyi.stock.service.StockOutRecordService; |
| | | import com.ruoyi.stock.service.StockUninventoryService; |
| | | import com.ruoyi.warehouse.service.impl.WarehouseServiceImpl; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @AllArgsConstructor |
| | | public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService { |
| | | |
| | | private final WarehouseServiceImpl warehouseServiceImpl; |
| | | private final WarehouseInfoMapper warehouseInfoMapper; |
| | | private StockInventoryMapper stockInventoryMapper; |
| | | private StockInRecordService stockInRecordService; |
| | | private StockOutRecordService stockOutRecordService; |
| | |
| | | //å
¥åºè°ç¨ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean addstockInventory(StockInventoryDto stockInventoryDto) { |
| | | public StockInRecordDto addstockInventory(StockInventoryDto stockInventoryDto) { |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); |
| | | } |
| | | stockInventoryDto.setBatchNo(batchNo); |
| | | |
| | | LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda() |
| | | .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | stockInventoryDto.getWarehouseInfoId() |
| | | ); |
| | | //æ°å¢å
¥åºè®°å½åæ·»å åºå |
| | | StockInRecordDto stockInRecordDto = new StockInRecordDto(); |
| | | stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); |
| | |
| | | stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockInRecordDto.setType("0"); |
| | | stockInRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInRecordService.add(stockInRecordDto); |
| | | //åè¿è¡æ°å¢åºåæ°éåºå |
| | | //å
æ¥è¯¢åºå表ä¸çäº§åæ¯å¦åå¨ï¼ä¸å卿°å¢ï¼å卿´æ° |
| | |
| | | newStockInventory.setRemark(stockInventoryDto.getRemark()); |
| | | newStockInventory.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); |
| | | newStockInventory.setWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | newStockInventory.setWarnNum(stockInventoryDto.getWarnNum()); |
| | | stockInventoryMapper.insert(newStockInventory); |
| | | }else { |
| | | stockInventoryMapper.updateAddStockInventory(stockInventoryDto); |
| | | } |
| | | return true; |
| | | return stockInRecordDto; |
| | | } |
| | | |
| | | //åºåºè°ç¨ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto) { |
| | | LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda() |
| | | .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | stockInventoryDto.setBatchNo(null); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | } |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | stockInventoryDto.getWarehouseInfoId() |
| | | ); |
| | | // æ°å¢åºåºè®°å½ |
| | | StockOutRecordDto stockOutRecordDto = new StockOutRecordDto(); |
| | | stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId()); |
| | |
| | | stockOutRecordDto.setApprovalStatus(0); |
| | | stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setType("0"); |
| | | stockOutRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | Long id = stockOutRecordService.add(stockOutRecordDto); |
| | | stockInventoryDto.setId(id); |
| | | |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); |
| | |
| | | stockInRecordDto.setApprovalStatus(0); |
| | | stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockInRecordDto.setType("0"); |
| | | stockInRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockInRecordDto.setRemark(stockInventoryDto.getRemark()); |
| | | Long add = stockInRecordService.add(stockInRecordDto); |
| | | stockInRecordDto.setId( add); |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public StockOutRecordDto addStockOutRecordOnly(StockInventoryDto stockInventoryDto) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); |
| | | stockInventoryDto.setBatchNo(null); |
| | | } |
| | | Long warehouseInfoId = requireWarehouseInfoId(stockInventoryDto.getWarehouseInfoId()); |
| | | LambdaQueryWrapper<StockInventory> eq = buildQualifiedInventoryQuery( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | warehouseInfoId |
| | | ); |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(eq); |
| | | if (stockInventory == null) { |
| | | throw new ServiceException("åºåè®°å½ä¸åå¨"); |
| | |
| | | BigDecimal pendingOut = stockInventoryMapper.selectPendingOutQuantity( |
| | | stockInventoryDto.getProductModelId(), |
| | | stockInventoryDto.getBatchNo(), |
| | | warehouseInfoId, |
| | | "0" |
| | | ); |
| | | if (pendingOut == null) { |
| | |
| | | stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); |
| | | stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); |
| | | stockOutRecordDto.setType("0"); |
| | | stockOutRecordDto.setWarehouseInfoId(warehouseInfoId); |
| | | stockOutRecordDto.setRemark(stockInventoryDto.getRemark()); |
| | | Long add = stockOutRecordService.add(stockOutRecordDto); |
| | | stockInventoryDto.setId(add); |
| | | return stockOutRecordDto; |
| | | } |
| | | |
| | | private Long requireWarehouseInfoId(Long warehouseInfoId) { |
| | | if (warehouseInfoId == null) { |
| | | // throw new ServiceException("ä»åºä¸è½ä¸ºç©º"); |
| | | warehouseInfoId = 1L; |
| | | } |
| | | return warehouseInfoId; |
| | | } |
| | | |
| | | private LambdaQueryWrapper<StockInventory> buildQualifiedInventoryQuery(Long productModelId, String batchNo, Long warehouseInfoId) { |
| | | LambdaQueryWrapper<StockInventory> wrapper = new QueryWrapper<StockInventory>().lambda() |
| | | .eq(StockInventory::getProductModelId, productModelId); |
| | | if (warehouseInfoId == null) { |
| | | wrapper.isNull(StockInventory::getWarehouseInfoId); |
| | | } else { |
| | | wrapper.eq(StockInventory::getWarehouseInfoId, warehouseInfoId); |
| | | } |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | wrapper.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | wrapper.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return wrapper; |
| | | } |
| | | |
| | | @Override |
| | |
| | | try { |
| | | // æ¥è¯¢ææç产åå¹¶æå»ºæ å°ï¼æé«æ¥æ¾æç |
| | | List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectProduct(); |
| | | List<WarehouseInfo> warehouseInfos = warehouseInfoMapper.selectList(null); |
| | | Map<String, SalesLedgerProduct> productMap = new HashMap<>(); |
| | | for (SalesLedgerProduct product : salesLedgerProducts) { |
| | | // 使ç¨äº§åç±»å«åè§æ ¼åå·ä½ä¸ºé® |
| | |
| | | stockInventoryDto.setQualitity(dto.getQualifiedQuantity()); |
| | | stockInventoryDto.setRemark(dto.getRemark()); |
| | | stockInventoryDto.setWarnNum(dto.getWarnNum()); |
| | | stockInventoryDto.setBatchNo(dto.getBatchNo()); |
| | | stockInventoryDto.setWarehouseName(dto.getWarehouseName()); |
| | | Long warehouseInfoId = warehouseInfos.stream() |
| | | .filter(warehouseInfo -> dto.getWarehouseName().equals(warehouseInfo.getWarehouseName())) |
| | | .map(WarehouseInfo::getId) |
| | | .findFirst() |
| | | .orElseThrow(() -> new RuntimeException("ç³»ç»æªæ¾å°ä»åºï¼" + dto.getWarehouseName())); |
| | | stockInventoryDto.setWarehouseInfoId(warehouseInfoId); |
| | | |
| | | // éªè¯åæ ¼å»ç»æ°é |
| | | if (ObjectUtils.isNotEmpty(dto.getQualifiedLockedQuantity())) { |
| | |
| | | stockUninventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_UNSTOCK_IN.getCode()); |
| | | stockUninventoryDto.setQualitity(dto.getUnQualifiedQuantity()); |
| | | stockUninventoryDto.setRemark(dto.getRemark()); |
| | | stockUninventoryDto.setBatchNo(dto.getBatchNo()); |
| | | stockUninventoryDto.setWarehouseName(dto.getWarehouseName()); |
| | | |
| | | // éªè¯ä¸åæ ¼å»ç»æ°é |
| | | if (ObjectUtils.isNotEmpty(dto.getUnQualifiedLockedQuantity())) { |
| | |
| | | for (Long id : ids) { |
| | | StockOutRecord stockOutRecord = stockOutRecordMapper.selectById(id); |
| | | if (stockOutRecord.getType().equals("0")) { |
| | | LambdaQueryWrapper<StockInventory> wrapper = new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, stockOutRecord.getProductModelId()); |
| | | if (StringUtils.isEmpty(stockOutRecord.getBatchNo())) { |
| | | wrapper.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | wrapper.eq(StockInventory::getBatchNo, stockOutRecord.getBatchNo()); |
| | | } |
| | | LambdaQueryWrapper<StockInventory> wrapper = buildQualifiedInventoryQuery( |
| | | stockOutRecord.getProductModelId(), |
| | | stockOutRecord.getBatchNo(), |
| | | stockOutRecord.getWarehouseInfoId() |
| | | ); |
| | | StockInventory stockInventory = stockInventoryMapper.selectOne(wrapper); |
| | | if (stockInventory == null) { |
| | | throw new BaseException("åºåè®°å½ä¸æ²¡æå¯¹åºç产å,æ æ³å é¤!!!"); |
| | |
| | | stockInRecordDto.setProductModelId(stockInventory.getProductModelId()); |
| | | stockInRecordDto.setQualitity(stockOutRecord.getStockOutNum()); |
| | | stockInRecordDto.setBatchNo(stockInventory.getBatchNo()); |
| | | stockInRecordDto.setWarehouseInfoId(stockInventory.getWarehouseInfoId()); |
| | | stockInventoryMapper.updateAddStockInventory(stockInRecordDto); |
| | | } |
| | | }else if (stockOutRecord.getType().equals("1")) { |
| | |
| | | throw new BaseException("åªæå¾
审æ¹ç¶æçè®°å½æè½å é¤,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | | } |
| | | return stockOutRecordMapper.deleteBatchIds(ids); |
| | | return stockOutRecordMapper.deleteByIds(ids); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int batchApprove(List<Long> ids, Integer approvalStatus) { |
| | | public int batchApprove(List<Long> ids, Integer approvalStatus,Long warehouseInfoId) { |
| | | if (CollectionUtils.isEmpty(ids)) { |
| | | throw new BaseException("è¯·éæ©è³å°ä¸æ¡æ°æ®"); |
| | | } |
| | |
| | | if (ReviewStatusEnum.APPROVED.getCode().equals(approvalStatus)) { |
| | | if ("0".equals(stockOutRecord.getType())) { |
| | | // åæ ¼åºåº -> å
æ¥åºåæ¯å¦åå¨ï¼å卿æ£å |
| | | StockInventory stockInventory = getStockInventory(stockOutRecord.getProductModelId(), stockOutRecord.getBatchNo()); |
| | | StockInventory stockInventory = getStockInventory( |
| | | stockOutRecord.getProductModelId(), |
| | | stockOutRecord.getBatchNo(), |
| | | stockOutRecord.getWarehouseInfoId() |
| | | ); |
| | | if (stockInventory == null) { |
| | | throw new BaseException("åæ ¼åºåè®°å½ä¸åå¨,åºåºæ¹æ¬¡:" + stockOutRecord.getOutboundBatches()); |
| | | } |
| | |
| | | StockInventoryDto stockInventoryDto = new StockInventoryDto(); |
| | | stockInventoryDto.setProductModelId(stockOutRecord.getProductModelId()); |
| | | stockInventoryDto.setBatchNo(stockOutRecord.getBatchNo()); |
| | | stockInventoryDto.setWarehouseInfoId(stockOutRecord.getWarehouseInfoId()); |
| | | stockInventoryDto.setQualitity(stockOutRecord.getStockOutNum()); |
| | | stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto); |
| | | } else if ("1".equals(stockOutRecord.getType())) { |
| | |
| | | return ids.size(); |
| | | } |
| | | |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo) { |
| | | LambdaQueryWrapper<StockInventory> eq = new LambdaQueryWrapper<>(); |
| | | eq.eq(StockInventory::getProductModelId, productModelId); |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | eq.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | eq.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return stockInventoryMapper.selectOne(eq); |
| | | private StockInventory getStockInventory(Long productModelId, String batchNo, Long warehouseInfoId) { |
| | | return stockInventoryMapper.selectOne(buildQualifiedInventoryQuery(productModelId, batchNo, warehouseInfoId)); |
| | | } |
| | | |
| | | private StockUninventory getStockUninventory(Long productModelId, String batchNo) { |
| | |
| | | } |
| | | return stockUninventoryMapper.selectOne(eq); |
| | | } |
| | | |
| | | private LambdaQueryWrapper<StockInventory> buildQualifiedInventoryQuery(Long productModelId, String batchNo, Long warehouseInfoId) { |
| | | LambdaQueryWrapper<StockInventory> wrapper = new LambdaQueryWrapper<StockInventory>() |
| | | .eq(StockInventory::getProductModelId, productModelId); |
| | | if (warehouseInfoId == null) { |
| | | wrapper.isNull(StockInventory::getWarehouseInfoId); |
| | | } else { |
| | | wrapper.eq(StockInventory::getWarehouseInfoId, warehouseInfoId); |
| | | } |
| | | if (StringUtils.isEmpty(batchNo)) { |
| | | wrapper.isNull(StockInventory::getBatchNo); |
| | | } else { |
| | | wrapper.eq(StockInventory::getBatchNo, batchNo); |
| | | } |
| | | return wrapper; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.stock.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.stock.dto.WarehouseInfoDto; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import com.ruoyi.stock.mapper.WarehouseInfoMapper; |
| | | import com.ruoyi.stock.pojo.WarehouseInfo; |
| | | import com.ruoyi.stock.service.WarehouseInfoService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | |
| | | /** |
| | | * <p> |
| | | * ä»åºä¿¡æ¯è¡¨ æå¡å®ç°ç±» |
| | | * </p> |
| | | * |
| | | * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå
¬å¸ |
| | | * @since 2026-05-12 05:44:22 |
| | | */ |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class WarehouseInfoServiceImpl extends ServiceImpl<WarehouseInfoMapper, WarehouseInfo> implements WarehouseInfoService { |
| | | |
| | | private final WarehouseInfoMapper warehouseInfoMapper; |
| | | private final StockInventoryMapper stockInventoryMapper; |
| | | |
| | | @Override |
| | | public IPage<WarehouseInfoDto> listPage(Page page, WarehouseInfoDto warehouseInfoDto) { |
| | | return warehouseInfoMapper.listPage(page, warehouseInfoDto); |
| | | } |
| | | |
| | | @Override |
| | | public Boolean deleteByIds(ArrayList<Long> ids) { |
| | | Long usedCount = stockInventoryMapper.existsUsed(ids); |
| | | if (usedCount != null && usedCount > 0) { |
| | | throw new ServiceException("éä¸çä»åºå·²è¢«åºåè®°å½ä½¿ç¨ï¼æ æ³å é¤"); |
| | | } |
| | | return removeByIds(ids); |
| | | } |
| | | } |
| | |
| | | select="selectBatchNoListByProductModelId"/> |
| | | </resultMap> |
| | | |
| | | <resultMap id="ProductModelVoBaseResultMap" type="com.ruoyi.basic.vo.ProductModelVo" extends="BaseResultMap"> |
| | | <result column="create_time" property="createTime" /> |
| | | </resultMap> |
| | | |
| | | <select id="listPageProductModel" resultMap="ProductModelVoResultMap"> |
| | | select pm.*,p.product_name |
| | | from product_model pm |
| | |
| | | ) |
| | | </if> |
| | | </where> |
| | | |
| | | ORDER BY pm.id DESC |
| | | </select> |
| | | <select id="getProductAndModelList" resultType="java.util.Map"> |
| | |
| | | </if> |
| | | </where> |
| | | </select> |
| | | <select id="pageModelAndQua" resultMap="ProductModelVoBaseResultMap"> |
| | | select pm.*, p.product_name |
| | | from product_model pm |
| | | left join product p on pm.product_id = p.id |
| | | <where> |
| | | <if test="c.model != null and c.model != ''"> |
| | | and pm.model like concat('%',#{c.model},'%') |
| | | </if> |
| | | <if test="c.productName != null and c.productName != ''"> |
| | | and p.product_name like concat('%',#{c.productName},'%') |
| | | </if> |
| | | <if test="c.topProductParentId != null and c.topProductParentId > 0"> |
| | | and p.id in ( |
| | | WITH RECURSIVE product_tree AS ( |
| | | SELECT id |
| | | FROM product |
| | | WHERE id = #{c.topProductParentId} |
| | | |
| | | UNION ALL |
| | | |
| | | SELECT p.id |
| | | FROM product p |
| | | INNER JOIN product_tree pt ON p.parent_id = pt.id |
| | | ) |
| | | select id from product_tree |
| | | ) |
| | | </if> |
| | | </where> |
| | | order by pm.id |
| | | </select> |
| | | |
| | | <select id="selectBatchNoQtyByProductModelIds" resultType="java.util.Map"> |
| | | select si.product_model_id as productModelId, |
| | | si.warehouse_info_id as warehouseId, |
| | | si.batch_no as batchNo, |
| | | si.qualitity as qty |
| | | from stock_inventory si |
| | | where si.product_model_id in |
| | | <foreach collection="list" item="productModelId" separator="," open="(" close=")"> |
| | | #{productModelId} |
| | | </foreach> |
| | | and si.warehouse_info_id is not null |
| | | and si.batch_no is not null |
| | | and si.batch_no != '' |
| | | order by si.product_model_id, si.warehouse_info_id, si.batch_no, si.id |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | </if> |
| | | </where> |
| | | </select> |
| | | </mapper> |
| | | </mapper> |
| | |
| | | p.product_name as product_name, |
| | | pm.model, |
| | | pm.unit, |
| | | u.nick_name as createBy |
| | | u.nick_name as createBy, |
| | | swi.warehouse_name |
| | | FROM stock_in_record as sir |
| | | LEFT JOIN product_model as pm on sir.product_model_id = pm.id |
| | | LEFT JOIN product as p on pm.product_id = p.id |
| | | LEFT JOIN sys_user as u on sir.create_user = u.user_id |
| | | left join stock_warehouse_info swi on swi.id = sir.warehouse_info_id |
| | | <where> |
| | | <if test="params.timeStr != null and params.timeStr != ''"> |
| | | and sir.create_time like concat('%',#{params.timeStr},'%') |
| | |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventory"> |
| | | <result column="id" property="id"/> |
| | | <result column="product_model_id" property="productModelId"/> |
| | | <result column="batch_no" property="batchNo"/> |
| | | <result column="qualitity" property="qualitity"/> |
| | | <result column="create_time" property="createTime"/> |
| | | <result column="update_time" property="updateTime"/> |
| | | <result column="version" property="version"/> |
| | | <result column="locked_quantity" property="lockedQuantity"/> |
| | | <result column="warn_num" property="warnNum"/> |
| | | <result column="remark" property="remark"/> |
| | | <result column="locked" property="locked"/> |
| | | <result column="warehouse_info_id" property="warehouseInfoId"/> |
| | | </resultMap> |
| | | <update id="updateAddStockInventory"> |
| | | update stock_inventory |
| | |
| | | update_time = now() |
| | | </set> |
| | | where product_model_id = #{ew.productModelId} |
| | | <if test="ew.warehouseInfoId == null"> |
| | | and warehouse_info_id is null |
| | | </if> |
| | | <if test="ew.warehouseInfoId != null"> |
| | | and warehouse_info_id = #{ew.warehouseInfoId} |
| | | </if> |
| | | <if test="ew.batchNo == null"> |
| | | and batch_no is null |
| | | </if> |
| | |
| | | update_time = now() |
| | | </set> |
| | | where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity} |
| | | <if test="ew.warehouseInfoId == null"> |
| | | and warehouse_info_id is null |
| | | </if> |
| | | <if test="ew.warehouseInfoId != null"> |
| | | and warehouse_info_id = #{ew.warehouseInfoId} |
| | | </if> |
| | | <if test="ew.batchNo == null"> |
| | | and batch_no is null |
| | | </if> |
| | |
| | | si.qualitity, |
| | | COALESCE(si.locked_quantity, 0) as locked_quantity, |
| | | si.product_model_id, |
| | | si.warehouse_info_id, |
| | | si.create_time, |
| | | si.update_time, |
| | | COALESCE(si.warn_num, 0) as warn_num, |
| | |
| | | pm.model, |
| | | si.remark, |
| | | pm.unit, |
| | | p.product_name |
| | | p.product_name, |
| | | siw.warehouse_name |
| | | from stock_inventory si |
| | | left join product_model pm on si.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | | left join stock_warehouse_info siw on si.warehouse_info_id = siw.id |
| | | where 1 = 1 |
| | | <if test="ew.productName != null and ew.productName !=''"> |
| | | and p.product_name like concat('%',#{ew.productName},'%') |
| | |
| | | SUM(IFNULL(qualifiedPendingOut, 0)) as qualifiedPendingOutQuantity, |
| | | SUM(IFNULL(unQualifiedPendingOut, 0)) as unQualifiedPendingOutQuantity, |
| | | product_model_id, |
| | | warehouse_info_id, |
| | | warehouse_name, |
| | | MAX(create_time) as create_time, |
| | | MAX(update_time) as update_time, |
| | | MAX(warn_num) as warn_num, |
| | |
| | | COALESCE(si.locked_quantity, 0) as qualifiedLockedQuantity, |
| | | 0 as unQualifiedLockedQuantity, |
| | | si.product_model_id, |
| | | si.warehouse_info_id, |
| | | siw.warehouse_name, |
| | | si.create_time, |
| | | si.update_time, |
| | | COALESCE(si.warn_num, 0) as warn_num, |
| | |
| | | select IFNULL(SUM(sor.stock_out_num), 0) |
| | | from stock_out_record sor |
| | | where sor.product_model_id = si.product_model_id |
| | | and sor.warehouse_info_id = si.warehouse_info_id |
| | | and (si.batch_no is null and sor.batch_no is null or si.batch_no = sor.batch_no) |
| | | and sor.type = '0' |
| | | and sor.approval_status = 0 |
| | |
| | | from stock_inventory si |
| | | left join product_model pm on si.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | | left join stock_warehouse_info siw on si.warehouse_info_id = siw.id |
| | | |
| | | union all |
| | | |
| | |
| | | 0 as qualifiedLockedQuantity, |
| | | COALESCE(su.locked_quantity, 0) as unQualifiedLockedQuantity, |
| | | su.product_model_id, |
| | | null as warehouse_info_id, |
| | | null as warehouse_name, |
| | | su.create_time, |
| | | su.update_time, |
| | | 0 as warn_num, |
| | |
| | | and combined.product_id in (select id from product_tree) |
| | | </if> |
| | | </where> |
| | | group by batch_no, product_model_id, model, unit, product_name, product_id |
| | | group by batch_no, product_model_id, warehouse_info_id, warehouse_name, model, unit, product_name, product_id |
| | | </select> |
| | | |
| | | <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData"> |
| | |
| | | from |
| | | stock_in_record sir |
| | | left join stock_inventory si on sir.product_model_id = si.product_model_id |
| | | and (sir.batch_no = si.batch_no or (sir.batch_no is null and si.batch_no is null)) |
| | | and sir.warehouse_info_id = si.warehouse_info_id |
| | | left join product_model pm on sir.product_model_id = pm.id |
| | | left join product p on pm.product_id = p.id |
| | | left join sys_user su on sir.create_user = su.user_id |
| | |
| | | SELECT IFNULL(SUM(sor.stock_out_num), 0) |
| | | FROM stock_out_record sor |
| | | WHERE sor.product_model_id = #{productModelId} |
| | | AND sor.warehouse_info_id = #{warehouseInfoId} |
| | | AND (sor.batch_no = #{batchNo} OR (#{batchNo} IS NULL AND sor.batch_no IS NULL)) |
| | | AND sor.type = #{type} |
| | | AND sor.approval_status IN (0, 3) |
| | |
| | | order by si.product_model_id, si.batch_no |
| | | </select> |
| | | <select id="getByModelId" resultType="com.ruoyi.stock.pojo.StockInventory"> |
| | | select si.id, si.batch_no, si.locked_quantity, (si.qualitity - IFNULL(sd.qualitity, 0)) as qualitity |
| | | select si.id, si.batch_no, si.locked_quantity, si.warehouse_info_id, (si.qualitity - IFNULL(sd.qualitity, 0)) as qualitity |
| | | from stock_inventory si |
| | | left join ( |
| | | select spd.stock_inventory_id, sum(spd.quantity) as qualitity |
| | |
| | | where si.product_model_id = #{productModelId} |
| | | </select> |
| | | <select id="selectStockInvenrory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> |
| | | select spd.id, spd.batch_no,pm.model,pm.unit,p.product_name, spd.qualitity,spd.product_model_id |
| | | select spd.id, spd.batch_no, spd.warehouse_info_id, siw.warehouse_name, pm.model, pm.unit, p.product_name, spd.qualitity, spd.product_model_id |
| | | from stock_inventory spd |
| | | left join product_model pm on pm.id = spd.product_model_id |
| | | left join stock_warehouse_info siw on siw.id = spd.warehouse_info_id |
| | | left join product_model pm on pm.id = spd.product_model_id |
| | | left join product p on p.id = pm.product_id |
| | | where product_model_id = #{productModelId} |
| | | </select> |
| | |
| | | pm.unit, |
| | | p.product_name |
| | | </select> |
| | | <select id="existsUsed" resultType="java.lang.Long"> |
| | | select count(1) |
| | | from stock_inventory |
| | | where warehouse_info_id in |
| | | <foreach collection="ids" item="id" open="(" separator="," close=")"> |
| | | #{id} |
| | | </foreach> |
| | | </select> |
| | | |
| | | |
| | | </mapper> |
| | |
| | | p.product_name as productName, |
| | | pm.model, |
| | | pm.unit, |
| | | u.nick_name as createBy |
| | | u.nick_name as createBy, |
| | | swi.warehouse_name |
| | | FROM stock_out_record as sor |
| | | LEFT JOIN product_model as pm on sor.product_model_id = pm.id |
| | | LEFT JOIN product as p on pm.product_id = p.id |
| | | LEFT JOIN sys_user as u on sor.create_user = u.user_id |
| | | left join stock_warehouse_info as swi on sor.warehouse_info_id = swi.id |
| | | <where> |
| | | <if test="params.timeStr != null and params.timeStr != ''"> |
| | | and sor.create_time like concat('%',#{params.timeStr},'%') |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.stock.mapper.WarehouseInfoMapper"> |
| | | |
| | | <!-- éç¨æ¥è¯¢æ å°ç»æ --> |
| | | <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.WarehouseInfo"> |
| | | <id column="id" property="id"/> |
| | | <result column="warehouse_name" property="warehouseName"/> |
| | | <result column="location" property="location"/> |
| | | <result column="manager_name" property="managerName"/> |
| | | <result column="contact_phone" property="contactPhone"/> |
| | | <result column="status" property="status"/> |
| | | <result column="remark" property="remark"/> |
| | | <result column="create_user" property="createUser"/> |
| | | <result column="dept_id" property="deptId"/> |
| | | <result column="create_time" property="createTime"/> |
| | | <result column="update_time" property="updateTime"/> |
| | | </resultMap> |
| | | <select id="listPage" resultType="com.ruoyi.stock.dto.WarehouseInfoDto"> |
| | | select * from |
| | | stock_warehouse_info |
| | | <where> |
| | | <if test="ew.warehouseName != null and ew.warehouseName != ''"> |
| | | and warehouse_name like concat('%',#{ew.warehouseName},'%') |
| | | </if> |
| | | <if test="ew.location != null and ew.location != ''"> |
| | | and location like concat('%',#{ew.location},'%') |
| | | </if> |
| | | <if test="ew.managerName != null and ew.managerName != ''"> |
| | | and manager_name like concat('%',#{ew.managerName},'%') |
| | | </if> |
| | | </where> |
| | | </select> |
| | | |
| | | </mapper> |