feat(mat-product): 添加产品配料信息查询功能

- 在 IMatProductService 中新增 queryPageListWithMaterials 方法用于查询产品及关联配料信息
- 修改 MatProductController 的 list 接口返回 MatProductWithMaterialsVo 包含配料信息
- 在 MatProductServiceImpl 中实现产品配料关联查询逻辑和数据转换功能
- 新增 MatProductWithMaterialsVo 视图对象用于封装产品及配料信息
- 集成 matMaterialService 和 productMaterialRelationService 进行配料数据获取
- 实现 convertToProductWithMaterialsVo 方法将基础产品信息转换为带配料信息的 VO 对象
This commit is contained in:
2026-01-30 13:48:30 +08:00
parent 04ca5dc4f1
commit d39b9e6d2a
4 changed files with 164 additions and 2 deletions

View File

@@ -21,6 +21,7 @@ import com.gear.common.core.validate.QueryGroup;
import com.gear.common.enums.BusinessType;
import com.gear.common.utils.poi.ExcelUtil;
import com.gear.mat.domain.vo.MatProductVo;
import com.gear.mat.domain.vo.MatProductWithMaterialsVo;
import com.gear.mat.domain.bo.MatProductBo;
import com.gear.mat.service.IMatProductService;
import com.gear.common.core.page.TableDataInfo;
@@ -43,8 +44,8 @@ public class MatProductController extends BaseController {
* 查询产品基础信息列表
*/
@GetMapping("/list")
public TableDataInfo<MatProductVo> list(MatProductBo bo, PageQuery pageQuery) {
return iMatProductService.queryPageList(bo, pageQuery);
public TableDataInfo<MatProductWithMaterialsVo> list(MatProductBo bo, PageQuery pageQuery) {
return iMatProductService.queryPageListWithMaterials(bo, pageQuery);
}
/**

View File

@@ -0,0 +1,81 @@
package com.gear.mat.domain.vo;
import java.math.BigDecimal;
import java.util.List;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.gear.common.annotation.ExcelDictFormat;
import com.gear.common.convert.ExcelDictConvert;
import lombok.Data;
import java.util.Date;
/**
* 产品基础信息及配料信息视图对象
*
* @author ruoyi
* @date 2026-01-30
*/
@Data
@ExcelIgnoreUnannotated
public class MatProductWithMaterialsVo {
private static final long serialVersionUID = 1L;
/**
* 产品ID 主键
*/
@ExcelProperty(value = "产品ID 主键")
private Long productId;
/**
* 产品名称
*/
@ExcelProperty(value = "产品名称")
private String productName;
/**
* 产品规格
*/
@ExcelProperty(value = "产品规格")
private String spec;
/**
* 产品型号
*/
@ExcelProperty(value = "产品型号")
private String model;
/**
* 产品单价 可手动维护
*/
@ExcelProperty(value = "产品单价 可手动维护")
private BigDecimal unitPrice;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 关联的配料信息列表
*/
private List<MaterialInfo> materials;
/**
* 配料信息内部类
*/
@Data
public static class MaterialInfo {
private Long materialId;
private String materialName;
private String spec;
private String model;
private String factory;
private String unit;
private BigDecimal currentStock;
private BigDecimal materialNum; // 单产品所需配料数量
private Long sort; // 配料排序
private String remark;
}
}

View File

@@ -2,6 +2,7 @@ package com.gear.mat.service;
import com.gear.mat.domain.MatProduct;
import com.gear.mat.domain.vo.MatProductVo;
import com.gear.mat.domain.vo.MatProductWithMaterialsVo;
import com.gear.mat.domain.bo.MatProductBo;
import com.gear.common.core.page.TableDataInfo;
import com.gear.common.core.domain.PageQuery;
@@ -31,6 +32,11 @@ public interface IMatProductService {
* 查询产品基础信息列表
*/
List<MatProductVo> queryList(MatProductBo bo);
/**
* 查询产品基础信息列表(包含关联的配料信息)
*/
TableDataInfo<MatProductWithMaterialsVo> queryPageListWithMaterials(MatProductBo bo, PageQuery pageQuery);
/**
* 新增产品基础信息

View File

@@ -7,17 +7,25 @@ import com.gear.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gear.mat.domain.bo.MatProductMaterialRelationBo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.gear.mat.domain.bo.MatProductBo;
import com.gear.mat.domain.vo.MatProductVo;
import com.gear.mat.domain.vo.MatProductWithMaterialsVo;
import com.gear.mat.domain.MatProduct;
import com.gear.mat.mapper.MatProductMapper;
import com.gear.mat.service.IMatProductService;
import com.gear.mat.service.IMatMaterialService;
import com.gear.mat.service.IMatProductMaterialRelationService;
import com.gear.mat.domain.vo.MatMaterialVo;
import com.gear.mat.domain.vo.MatProductMaterialRelationVo;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
import java.util.ArrayList;
/**
* 产品基础信息Service业务层处理
@@ -30,6 +38,8 @@ import java.util.Collection;
public class MatProductServiceImpl implements IMatProductService {
private final MatProductMapper baseMapper;
private final IMatMaterialService matMaterialService;
private final IMatProductMaterialRelationService productMaterialRelationService;
/**
* 查询产品基础信息
@@ -68,6 +78,70 @@ public class MatProductServiceImpl implements IMatProductService {
return lqw;
}
/**
* 查询产品基础信息列表(包含关联的配料信息)
*/
@Override
public TableDataInfo<MatProductWithMaterialsVo> queryPageListWithMaterials(MatProductBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<MatProduct> lqw = buildQueryWrapper(bo);
Page<MatProductVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 转换为带配料信息的VO
List<MatProductWithMaterialsVo> productList = result.getRecords().stream()
.map(product -> convertToProductWithMaterialsVo(product))
.collect(Collectors.toList());
Page<MatProductWithMaterialsVo> pageResult = new Page<>();
pageResult.setRecords(productList);
pageResult.setTotal(result.getTotal());
pageResult.setSize(result.getSize());
pageResult.setCurrent(result.getCurrent());
return TableDataInfo.build(pageResult);
}
private MatProductWithMaterialsVo convertToProductWithMaterialsVo(MatProductVo productVo) {
MatProductWithMaterialsVo productWithMaterialsVo = new MatProductWithMaterialsVo();
// 复制基本产品信息
productWithMaterialsVo.setProductId(productVo.getProductId());
productWithMaterialsVo.setProductName(productVo.getProductName());
productWithMaterialsVo.setSpec(productVo.getSpec());
productWithMaterialsVo.setModel(productVo.getModel());
productWithMaterialsVo.setUnitPrice(productVo.getUnitPrice());
productWithMaterialsVo.setRemark(productVo.getRemark());
// 查询并设置关联的配料信息
List<MatProductMaterialRelationVo> relations = productMaterialRelationService.queryList(
new MatProductMaterialRelationBo() {{
setProductId(productVo.getProductId());
}}
);
List<MatProductWithMaterialsVo.MaterialInfo> materials = new ArrayList<>();
for (MatProductMaterialRelationVo relation : relations) {
MatMaterialVo material = matMaterialService.queryById(relation.getMaterialId());
if (material != null) {
MatProductWithMaterialsVo.MaterialInfo materialInfo = new MatProductWithMaterialsVo.MaterialInfo();
materialInfo.setMaterialId(material.getMaterialId());
materialInfo.setMaterialName(material.getMaterialName());
materialInfo.setSpec(material.getSpec());
materialInfo.setModel(material.getModel());
materialInfo.setFactory(material.getFactory());
materialInfo.setUnit(material.getUnit());
materialInfo.setCurrentStock(material.getCurrentStock());
materialInfo.setMaterialNum(relation.getMaterialNum());
materialInfo.setSort(relation.getSort());
materialInfo.setRemark(relation.getRemark());
materials.add(materialInfo);
}
}
productWithMaterialsVo.setMaterials(materials);
return productWithMaterialsVo;
}
/**
* 新增产品基础信息
*/