feat(material): 支持物料类别及子孙类别的展开查询与导出

- 在分页查询接口中增加物料类别编码展开,包含所有子孙类别
- 实现一次查询获取类别及其所有子孙类别编码列表的方法
- 在导出接口中同样支持物料类别编码展开
- Mapper 查询条件支持使用物料类别编码列表进行IN查询
- 修改排序规则,将分页查询结果按物料编号降序排列
- 在请求参数中新增物料类别编码列表字段,由服务层自动填充
This commit is contained in:
曹鹏飞 2026-05-06 18:21:41 +08:00
parent 12d0e0ca71
commit 4143924357
3 changed files with 73 additions and 7 deletions

View File

@ -78,6 +78,11 @@ public class QmsQcMaterialControllerService {
* 分页查询质检物料
*/
public PageData<QmsQcMaterialVO> search(QmsQcMaterialSearchQO request) {
// 若传入了物料类别编码展开为包含当前类别及所有子孙类别的编码列表
if (StrUtil.isNotBlank(request.getMaterialCategoryCode())) {
request.setMaterialCategoryCodes(expandCategoryCodes(request.getMaterialCategoryCode()));
}
IPage<QmsQcMaterialVO> page = qcMaterialMapper.searchPage(
request, new Page<>(request.getPage(), request.getPageSize()));
@ -89,6 +94,40 @@ public class QmsQcMaterialControllerService {
return result;
}
/**
* 展开物料类别编码查询指定编码对应的类别及其所有子孙类别的编码列表一次查询无递归
* <p>
* parentTree 存储完整祖先路径ltree 格式 0.A.B.C子孙节点满足
* parentTree = fullPath OR parentTree LIKE 'fullPath.%'
* </p>
*/
private List<String> expandCategoryCodes(String categoryCode) {
QmsQcMaterialCategory category = qcMaterialCategoryService.lambdaQuery()
.eq(QmsQcMaterialCategory::getCategoryCode, categoryCode)
.one();
if (category == null) {
// 类别不存在原样返回Mapper IN 条件查不到数据
return List.of(categoryCode);
}
// 构建当前节点完整路径parentTree.id parentTree 为空则直接取 id
String fullPath = StrUtil.isBlank(category.getParentTree())
? String.valueOf(category.getId())
: category.getParentTree() + "." + category.getId();
// 一次查询自身 + 直接子节点parentTree=fullPath+ 孙级及更深parentTree LIKE 'fullPath.%'
return qcMaterialCategoryService.lambdaQuery()
.eq(QmsQcMaterialCategory::getCategoryCode, categoryCode)
.or().eq(QmsQcMaterialCategory::getParentTree, fullPath)
.or().likeRight(QmsQcMaterialCategory::getParentTree, fullPath + ".")
.list()
.stream()
.map(QmsQcMaterialCategory::getCategoryCode)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
}
/**
* 新增质检物料
*/
@ -375,6 +414,10 @@ public class QmsQcMaterialControllerService {
* 导出质检物料不分页
*/
public void exportSearch(HttpServletResponse response, QmsQcMaterialSearchQO request) throws IOException {
// 导出同样支持子孙类别展开
if (StrUtil.isNotBlank(request.getMaterialCategoryCode())) {
request.setMaterialCategoryCodes(expandCategoryCodes(request.getMaterialCategoryCode()));
}
EecExcelUtil.export("质检物料", "质检物料", qcMaterialMapper.searchAll(request), response);
}

View File

@ -2,6 +2,8 @@ package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import java.util.List;
/**
* 查询质检物料列表 请求参数分页
*/
@ -13,6 +15,11 @@ public class QmsQcMaterialSearchQO extends PageQO {
*/
private String materialCategoryCode;
/**
* 物料类别编码列表内部使用 Service 层自动填充包含当前类别及其所有子孙类别编码
*/
private List<String> materialCategoryCodes;
/**
* 物料编号模糊匹配
*/

View File

@ -27,9 +27,17 @@
update_time
FROM qms_qc_material
<where>
<if test="request.materialCategoryCode != null and request.materialCategoryCode != ''">
<choose>
<when test="request.materialCategoryCodes != null and !request.materialCategoryCodes.isEmpty()">
AND material_category_code IN
<foreach collection="request.materialCategoryCodes" item="code" open="(" separator="," close=")">
#{code}
</foreach>
</when>
<when test="request.materialCategoryCode != null and request.materialCategoryCode != ''">
AND material_category_code = #{request.materialCategoryCode}
</if>
</when>
</choose>
<if test="request.materialNo != null and request.materialNo != ''">
AND material_no ilike concat('%', #{request.materialNo}, '%')
</if>
@ -40,7 +48,7 @@
AND material_name ilike concat('%', #{request.materialName}, '%')
</if>
</where>
ORDER BY id DESC
ORDER BY material_no DESC
</select>
<!--
@ -65,9 +73,17 @@
TO_CHAR(create_time, 'YYYY-MM-DD HH24:MI:SS') AS create_time
FROM qms_qc_material
<where>
<if test="request.materialCategoryCode != null and request.materialCategoryCode != ''">
<choose>
<when test="request.materialCategoryCodes != null and !request.materialCategoryCodes.isEmpty()">
AND material_category_code IN
<foreach collection="request.materialCategoryCodes" item="code" open="(" separator="," close=")">
#{code}
</foreach>
</when>
<when test="request.materialCategoryCode != null and request.materialCategoryCode != ''">
AND material_category_code = #{request.materialCategoryCode}
</if>
</when>
</choose>
<if test="request.materialNo != null and request.materialNo != ''">
AND material_no ilike concat('%', #{request.materialNo}, '%')
</if>