src/main/java/com/ruoyi/basic/service/IProductService.java
@@ -22,9 +22,9 @@ IPage<ProductModelVo> listPageProductModel(Page<ProductModelVo> page, ProductModel productModel); /** * 台账手工录入品名/材质/规格型号时,自动注册产品大类(品名)-子类(材质)-规格型号,已存在则复用 * 台账手工录入产品大类/规格型号时,统一注册到「成品」大类下:成品-产品大类-规格型号,已存在则复用 * * @return 规格型号记录,未注册时返回 null */ ProductModel ensureProductHierarchy(String productName, String material, String modelName, String unit); ProductModel ensureProductHierarchy(String productName, String modelName, String unit); } src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -172,49 +172,51 @@ return deleteCount; } /** 台账手工录入的产品大类/规格型号统一挂到这个大类下 */ private static final String TOP_CATEGORY_NAME = "成品"; @Override public ProductModel ensureProductHierarchy(String productName, String material, String modelName, String unit) { public ProductModel ensureProductHierarchy(String productName, String modelName, String unit) { productName = StringUtils.trim(productName); material = StringUtils.trim(material); modelName = StringUtils.trim(modelName); if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(material) || StringUtils.isEmpty(modelName)) { if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(modelName)) { return null; } // 品名:一级大类(parentId 为空) // 一级大类:固定「成品」(不存在则建) LambdaQueryWrapper<Product> categoryWrapper = new LambdaQueryWrapper<>(); categoryWrapper.isNull(Product::getParentId) .eq(Product::getProductName, productName) .eq(Product::getProductName, TOP_CATEGORY_NAME) .last("limit 1"); Product category = productMapper.selectOne(categoryWrapper); if (category == null) { category = new Product(); category.setProductName(productName); category.setProductName(TOP_CATEGORY_NAME); productMapper.insert(category); } // 材质:大类下的子类 LambdaQueryWrapper<Product> materialWrapper = new LambdaQueryWrapper<>(); materialWrapper.eq(Product::getParentId, category.getId()) .eq(Product::getProductName, material) // 二级:产品大类(成品下的子类) LambdaQueryWrapper<Product> nameWrapper = new LambdaQueryWrapper<>(); nameWrapper.eq(Product::getParentId, category.getId()) .eq(Product::getProductName, productName) .last("limit 1"); Product materialProduct = productMapper.selectOne(materialWrapper); if (materialProduct == null) { materialProduct = new Product(); materialProduct.setParentId(category.getId()); materialProduct.setProductName(material); productMapper.insert(materialProduct); Product nameProduct = productMapper.selectOne(nameWrapper); if (nameProduct == null) { nameProduct = new Product(); nameProduct.setParentId(category.getId()); nameProduct.setProductName(productName); productMapper.insert(nameProduct); } // 规格型号:子类下的规格 // 三级:规格型号(产品大类下的规格) LambdaQueryWrapper<ProductModel> modelWrapper = new LambdaQueryWrapper<>(); modelWrapper.eq(ProductModel::getProductId, materialProduct.getId()) modelWrapper.eq(ProductModel::getProductId, nameProduct.getId()) .eq(ProductModel::getModel, modelName) .last("limit 1"); ProductModel productModel = productModelMapper.selectOne(modelWrapper); if (productModel == null) { productModel = new ProductModel(); productModel.setProductId(materialProduct.getId()); productModel.setProductId(nameProduct.getId()); productModel.setModel(modelName); productModel.setUnit(unit); productModelMapper.insert(productModel); src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -44,15 +44,14 @@ private BigDecimal warnNum; /** * 产品大类(品名) * 产品大类 */ @Excel(name = "产品大类") private String productCategory; /** * 材质 * 材质(已废弃:台账不再录入,保留该列以兼容历史数据) */ @Excel(name = "材质") private String material; /** src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -183,12 +183,10 @@ @Transactional(rollbackFor = Exception.class) public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { // 销售台账(type=1)手工录入品名/材质/规格型号时,自动注册到产品维护 if (Integer.valueOf(1).equals(salesLedgerProduct.getType()) && StringUtils.isNotBlank(salesLedgerProduct.getMaterial())) { // 销售台账(type=1)手工录入产品大类/规格型号时,自动注册到产品维护(统一挂「成品」大类下) if (Integer.valueOf(1).equals(salesLedgerProduct.getType())) { ProductModel productModel = productService.ensureProductHierarchy( salesLedgerProduct.getProductCategory(), salesLedgerProduct.getMaterial(), salesLedgerProduct.getSpecificationModel(), salesLedgerProduct.getUnit()); if (productModel != null) { src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -613,7 +613,7 @@ @Override public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) { // 销售台账手工录入「品名+材质+规格型号」时,自动注册到产品维护 // 销售台账手工录入「产品大类+规格型号」时,自动注册到产品维护(统一挂「成品」大类下) if (SaleEnum.SALE.equals(type)) { for (SalesLedgerProduct product : products) { registerProductFromLedgerProduct(product); @@ -647,21 +647,19 @@ } /** * 手工录入「品名+材质+规格型号」时,在产品维护自动注册: * 品名=一级大类,材质=大类下的子类,规格型号=子类下的规格 * 手工录入「产品大类+规格型号」时,在产品维护自动注册: * 统一挂在「成品」大类下 —— 成品=一级大类,产品大类=子类,规格型号=子类下的规格 */ private void registerProductFromLedgerProduct(SalesLedgerProduct product) { String productName = StringUtils.trim(product.getProductCategory()); String material = StringUtils.trim(product.getMaterial()); String modelName = StringUtils.trim(product.getSpecificationModel()); if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(material) || StringUtils.isEmpty(modelName)) { if (StringUtils.isEmpty(productName) || StringUtils.isEmpty(modelName)) { return; } product.setProductCategory(productName); product.setMaterial(material); product.setSpecificationModel(modelName); ProductModel productModel = productService.ensureProductHierarchy(productName, material, modelName, product.getUnit()); ProductModel productModel = productService.ensureProductHierarchy(productName, modelName, product.getUnit()); if (productModel != null) { product.setProductId(productModel.getProductId()); product.setProductModelId(productModel.getId());