gongchunyi
10 小时以前 f5c9d4c54da8d60d8b798f67679263a8aec1607f
feat: 库存区分产品大类
已修改7个文件
126 ■■■■ 文件已修改
doc/河南鹤壁天沐钢化玻璃厂.sql 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/ProductController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/ProductModel.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/IProductModelService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/ProductModelMapper.xml 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ºÓÄϺױÚÌìãå¸Ö»¯²£Á§³§.sql
@@ -91,3 +91,10 @@
ALTER TABLE `product-inventory-management-hbtmblc`.`sales_ledger`
    MODIFY COLUMN `delivery_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '发货状态:1-未发货,2-审批中,3-审批不通过,4-审批通过,5-已发货' AFTER `delivery_date`;
ALTER TABLE `product-inventory-management-hbtmblc`.`sales_ledger_product`
    MODIFY COLUMN `quantity` decimal(18, 2) NULL COMMENT '数量' AFTER `unit`,
    MODIFY COLUMN `tax_rate` decimal(5, 0) NULL COMMENT '税率' AFTER `min_stock`,
    MODIFY COLUMN `tax_inclusive_unit_price` decimal(18, 2) NULL COMMENT '含税单价' AFTER `tax_rate`,
    MODIFY COLUMN `tax_inclusive_total_price` decimal(18, 2) NULL COMMENT '含税总价' AFTER `tax_inclusive_unit_price`,
    MODIFY COLUMN `tax_exclusive_total_price` decimal(18, 2) NULL COMMENT '不含税总价' AFTER `tax_inclusive_total_price`;
src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -7,6 +7,7 @@
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.basic.dto.ProductModelExportDto;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.service.IProductModelService;
import com.ruoyi.basic.service.IProductService;
@@ -38,6 +39,7 @@
    private IProductModelService productModelService;
    @Autowired
    private ISalesLedgerProductService salesLedgerProductService;
    /**
     * æŸ¥è¯¢äº§å“
     */
@@ -85,7 +87,7 @@
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SalesLedgerProduct::getProductId, ids);
        List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper);
        if (salesLedgerProductList.size() > 0) {
        if (!salesLedgerProductList.isEmpty()) {
            return AjaxResult.error("该产品存在销售/采购记录,不能删除");
        }
        return toAjax(productService.delProductByIds(ids));
@@ -143,4 +145,14 @@
        ExcelUtil<ProductModelExportDto> excelUtil = new ExcelUtil<>(ProductModelExportDto.class);
        excelUtil.importTemplateExcel(response, "产品规格导入模板");
    }
    /**
     * èŽ·å–äº§å“å¤§ç±»
     */
    @GetMapping("/getParentNames")
    @ApiOperation("获取产品大类")
    public AjaxResult getParentNames() {
        List<Product> list = productModelService.getParentNames();
        return AjaxResult.success(list);
    }
}
src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -69,4 +69,10 @@
    @TableField(exist = false)
    private LocalDateTime createTime;
    @TableField(exist = false)
    private Long parentId;
    @TableField(exist = false)
    private String parentName;
}
src/main/java/com/ruoyi/basic/service/IProductModelService.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.ProductDto;
import com.ruoyi.basic.dto.ProductModelDto;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.web.multipart.MultipartFile;
@@ -35,4 +36,7 @@
    IPage<ProductModel> modelListPage(Page page , ProductDto productDto);
    AjaxResult importProductModel(MultipartFile file, Integer productId);
    List<Product> getParentNames();
}
src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -151,4 +151,11 @@
            throw new ServiceException("导入失败");
        }
    }
    @Override
    public List<Product> getParentNames() {
        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.isNull(Product::getParentId).select(Product::getId, Product::getProductName);
        return productMapper.selectList(queryWrapper);
    }
}
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -89,27 +89,48 @@
    @Override
    public int addOrEditProduct(ProductDto productDto) {
        checkDuplicateName(productDto);
        if (productDto.getId() == null) {
            // æ–°å¢žäº§å“é€»è¾‘
            if (productDto.getParentId() == null) {
                // è‹¥æœªæŒ‡å®šçˆ¶èŠ‚ç‚¹ï¼Œé»˜è®¤ä¸ºæ ¹èŠ‚ç‚¹ï¼ˆparentId è®¾ä¸º null)
                productDto.setParentId(null);
            } else {
                // æ£€æŸ¥çˆ¶èŠ‚ç‚¹æ˜¯å¦å­˜åœ¨ï¼ˆå¯é€‰ï¼Œæ ¹æ®ä¸šåŠ¡éœ€æ±‚ï¼‰
            if (productDto.getParentId() != null) {
                Product parent = productMapper.selectById(productDto.getParentId());
                if (parent == null) {
                    throw new IllegalArgumentException("父节点不存在,无法添加子产品");
                    throw new IllegalArgumentException("父节点不存在");
                }
            }
            return productMapper.insert(productDto);
            Product product = new Product();
            BeanUtils.copyProperties(productDto, product);
            return productMapper.insert(product);
        } else {
            // ç¼–辑产品逻辑
            // æ£€æŸ¥äº§å“æ˜¯å¦å­˜åœ¨ï¼ˆå¯é€‰ï¼Œæ ¹æ®ä¸šåŠ¡éœ€æ±‚ï¼‰
            Product existingProduct = productMapper.selectById(productDto.getId());
            if (existingProduct == null) {
                throw new IllegalArgumentException("要编辑的产品不存在");
                throw new IllegalArgumentException("产品不存在");
            }
            return productMapper.updateById(productDto);
            Product product = new Product();
            BeanUtils.copyProperties(productDto, product);
            return productMapper.updateById(product);
        }
    }
    /**
     * æ ¡éªŒåŒçº§ç›®å½•下是否存在重复名称
     */
    private void checkDuplicateName(ProductDto productDto) {
        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
        if (productDto.getParentId() == null) {
            queryWrapper.isNull(Product::getParentId);
        } else {
            queryWrapper.eq(Product::getParentId, productDto.getParentId());
        }
        queryWrapper.eq(Product::getProductName, productDto.getProductName());
        if (productDto.getId() != null) {
            queryWrapper.ne(Product::getId, productDto.getId());
        }
        if (productMapper.selectCount(queryWrapper) > 0) {
            throw new IllegalArgumentException("在该层级下已存在名为 [" + productDto.getProductName() + "] çš„产品");
        }
    }
src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -15,20 +15,51 @@
        <result column="product_name" property="productName" />
        <result column="product_id" property="productId" />
    </resultMap>
    <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel">
        select pm.*,p.product_name
        from product_model pm
        left join product p on pm.product_id = p.id
        WITH RECURSIVE product_tree AS (
        SELECT
        id,
        product_name,
        id AS top_id,
        product_name AS top_name
        FROM product
        WHERE parent_id IS NULL OR parent_id = 0
        UNION ALL
        SELECT
        p.id,
        p.product_name,
        t.top_id,
        t.top_name
        FROM product p
        INNER JOIN product_tree t ON p.parent_id = t.id
        )
        SELECT
        pm.*,
        pt.product_name AS productName,
        pt.top_name AS parentName
        FROM product_model pm
        LEFT JOIN product_tree pt ON pm.product_id = pt.id
        <where>
            <if test="c.parentId != null">
                AND pt.top_id = #{c.parentId}
            </if>
            <if test="c.model != null and c.model != ''">
                and pm.model  like  concat('%',#{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},'%')
                AND pt.product_name LIKE CONCAT('%', #{c.productName}, '%')
            </if>
            <if test="c.parentName != null and c.parentName != ''">
                AND pt.top_name LIKE CONCAT('%', #{c.parentName}, '%')
            </if>
        </where>
        order by  pm.id
        ORDER BY pm.id DESC
    </select>
    <select id="selectLatestRecord" resultType="com.ruoyi.basic.pojo.ProductModel">
            SELECT * FROM product_model
            ORDER BY create_time DESC, id DESC