Browse Source

feat(automatedWarehouse): 添加合托查询功能模块

- 新增 PalletMergeQueryController 提供合托查询相关接口
- 新增 PalletMergeQueryData 实体类定义合托查询业务数据结构
- 新增 PalletTypeOption 实体类用于托盘类型下拉选项
- 实现 PalletMergeQueryService 服务接口及具体业务逻辑
- 集成 MyBatis Mapper 和 XML 配置完成数据库查询操作
- 实现托盘类型筛选和合托托盘列表查询功能
- 添加参数校验和查询逻辑处理机制
master
常熟吴彦祖 6 days ago
parent
commit
28537b4834
  1. 69
      src/main/java/com/gaotao/modules/automatedWarehouse/controller/PalletMergeQueryController.java
  2. 83
      src/main/java/com/gaotao/modules/automatedWarehouse/entity/PalletMergeQueryData.java
  3. 32
      src/main/java/com/gaotao/modules/automatedWarehouse/entity/PalletTypeOption.java
  4. 51
      src/main/java/com/gaotao/modules/automatedWarehouse/mapper/PalletMergeQueryMapper.java
  5. 35
      src/main/java/com/gaotao/modules/automatedWarehouse/service/PalletMergeQueryService.java
  6. 96
      src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/PalletMergeQueryServiceImpl.java
  7. 74
      src/main/resources/mapper/automatedWarehouse/PalletMergeQueryMapper.xml

69
src/main/java/com/gaotao/modules/automatedWarehouse/controller/PalletMergeQueryController.java

@ -0,0 +1,69 @@
package com.gaotao.modules.automatedWarehouse.controller;
import com.gaotao.common.utils.R;
import com.gaotao.modules.automatedWarehouse.entity.PalletMergeQueryData;
import com.gaotao.modules.automatedWarehouse.entity.PalletTypeOption;
import com.gaotao.modules.automatedWarehouse.service.PalletMergeQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Description 合托查询Controller - rqrq
* @Author rqrq
* @Date 2026/01/06
*/
@RestController
@RequestMapping("automatedWarehouse/palletMergeQuery")
public class PalletMergeQueryController {
@Autowired
private PalletMergeQueryService palletMergeQueryService;
/**
* @Description 获取托盘类型下拉选项用于合托查询筛选- rqrq
* @Title getPalletTypeOptions
* @param data 查询条件包含site
* @return R
* @author rqrq
* @date 2026/01/06
*/
@PostMapping(value = "/getPalletTypeOptions")
public R getPalletTypeOptions(@RequestBody PalletMergeQueryData data) throws Exception {
List<PalletTypeOption> rows = palletMergeQueryService.getPalletTypeOptions(data.getSite());
return R.ok().put("rows", rows);
}
/**
* @Description 查询需要合托的托盘列表 - rqrq
* @Title searchPalletMergeList
* @param data 查询条件包含site和palletType
* @return R
* @author rqrq
* @date 2026/01/06
*/
@PostMapping(value = "/searchPalletMergeList")
public R searchPalletMergeList(@RequestBody PalletMergeQueryData data) throws Exception {
List<PalletMergeQueryData> rows = palletMergeQueryService.searchPalletMergeList(data);
return R.ok().put("rows", rows);
}
/**
* @Description 提交合托请求预留方法- rqrq
* @Title submitPalletMerge
* @param dataList 选中的托盘列表
* @return R
* @author rqrq
* @date 2026/01/06
*/
@PostMapping(value = "/submitPalletMerge")
public R submitPalletMerge(@RequestBody List<PalletMergeQueryData> dataList) throws Exception {
// TODO: 后续实现合托逻辑 - rqrq
return R.ok();
}
}

83
src/main/java/com/gaotao/modules/automatedWarehouse/entity/PalletMergeQueryData.java

@ -0,0 +1,83 @@
package com.gaotao.modules.automatedWarehouse.entity;
import lombok.Data;
import org.apache.ibatis.type.Alias;
/**
* @Description 合托查询业务实体类 - 用于查询需要合托的托盘 - rqrq
*
* <p><b>用途</b></p>
* <ul>
* <li>查询立库中可以合托的栈板列表</li>
* <li>根据pallet_type筛选只显示未装满的栈板</li>
* <li>按已用位置数量从小到大排序</li>
* </ul>
*
* <p><b>查询逻辑</b></p>
* <pre>
* 1. 先计算该pallet_type在立库中装得最多的栈板的position+layer count
* 2. 查询立库中该类型的栈板count>0 count<最大count
* 3. 按count从小到大排序
* </pre>
*
* @Author rqrq
* @Date 2026/01/06
*/
@Data
@Alias("PalletMergeQueryData")
public class PalletMergeQueryData {
// ==================== 查询条件字段 ====================
/**
* 工厂编码必需
*/
private String site;
/**
* 托盘类型编码必选下拉框选择
* <p>SQL示例WHERE p.pallet_type = #{palletType}</p>
*/
private String palletType;
// ==================== 返回字段 ====================
/**
* 托盘ID
*/
private String palletId;
/**
* 库位编码
*/
private String locationCode;
/**
* 调用标志Y=正在被调用, N=未被调用
*/
private String callingFlag;
/**
* 已用位置数量position+layer的唯一组合数
* <p>用于排序从小到大显示</p>
*/
private Integer usedPositionCount;
/**
* 托盘类型描述关联pallet_type表
*/
private String typeDesc;
// ==================== 分页参数 ====================
/**
* 分页参数 - 当前页码
*/
private Integer page;
/**
* 分页参数 - 每页数量
*/
private Integer limit;
}

32
src/main/java/com/gaotao/modules/automatedWarehouse/entity/PalletTypeOption.java

@ -0,0 +1,32 @@
package com.gaotao.modules.automatedWarehouse.entity;
import lombok.Data;
import org.apache.ibatis.type.Alias;
/**
* @Description 托盘类型下拉选项实体类 - 用于合托查询的下拉框 - rqrq
*
* <p><b>用途</b></p>
* <ul>
* <li>提供合托查询页面的托盘类型下拉选项</li>
* <li>筛选条件wcs_auto_sort='Y' pallet_family != 'A02'</li>
* </ul>
*
* @Author rqrq
* @Date 2026/01/06
*/
@Data
@Alias("PalletTypeOption")
public class PalletTypeOption {
/**
* 托盘类型编码下拉框value
*/
private String palletType;
/**
* 类型描述下拉框label
*/
private String typeDesc;
}

51
src/main/java/com/gaotao/modules/automatedWarehouse/mapper/PalletMergeQueryMapper.java

@ -0,0 +1,51 @@
package com.gaotao.modules.automatedWarehouse.mapper;
import com.gaotao.modules.automatedWarehouse.entity.PalletMergeQueryData;
import com.gaotao.modules.automatedWarehouse.entity.PalletTypeOption;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Description 合托查询Mapper接口 - rqrq
* @Author rqrq
* @Date 2026/01/06
*/
@Mapper
public interface PalletMergeQueryMapper {
/**
* @Description 获取托盘类型下拉选项wcs_auto_sort='Y' pallet_family != 'A02'- rqrq
* @param site 工厂编码
* @return List<PalletTypeOption>
* @author rqrq
* @date 2026/01/06
*/
List<PalletTypeOption> getPalletTypeOptions(@Param("site") String site);
/**
* @Description 获取该类型在立库中装得最多的栈板的已用位置数 - rqrq
* @param site 工厂编码
* @param palletType 托盘类型
* @return Integer 最大已用位置数
* @author rqrq
* @date 2026/01/06
*/
Integer getMaxPositionCount(@Param("site") String site, @Param("palletType") String palletType);
/**
* @Description 查询需要合托的托盘列表 - rqrq
* @param site 工厂编码
* @param palletType 托盘类型
* @param maxPositionCount 最大已用位置数
* @return List<PalletMergeQueryData>
* @author rqrq
* @date 2026/01/06
*/
List<PalletMergeQueryData> searchPalletMergeList(
@Param("site") String site,
@Param("palletType") String palletType,
@Param("maxPositionCount") Integer maxPositionCount);
}

35
src/main/java/com/gaotao/modules/automatedWarehouse/service/PalletMergeQueryService.java

@ -0,0 +1,35 @@
package com.gaotao.modules.automatedWarehouse.service;
import com.gaotao.modules.automatedWarehouse.entity.PalletMergeQueryData;
import com.gaotao.modules.automatedWarehouse.entity.PalletTypeOption;
import java.util.List;
/**
* @Description 合托查询Service接口 - rqrq
* @Author rqrq
* @Date 2026/01/06
*/
public interface PalletMergeQueryService {
/**
* @Description 获取托盘类型下拉选项用于合托查询筛选- rqrq
* @Title getPalletTypeOptions
* @param site 工厂编码
* @return List<PalletTypeOption>
* @author rqrq
* @date 2026/01/06
*/
List<PalletTypeOption> getPalletTypeOptions(String site);
/**
* @Description 查询需要合托的托盘列表 - rqrq
* @Title searchPalletMergeList
* @param data 查询条件包含site和palletType
* @return List<PalletMergeQueryData>
* @author rqrq
* @date 2026/01/06
*/
List<PalletMergeQueryData> searchPalletMergeList(PalletMergeQueryData data);
}

96
src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/PalletMergeQueryServiceImpl.java

@ -0,0 +1,96 @@
package com.gaotao.modules.automatedWarehouse.service.impl;
import com.gaotao.modules.automatedWarehouse.entity.PalletMergeQueryData;
import com.gaotao.modules.automatedWarehouse.entity.PalletTypeOption;
import com.gaotao.modules.automatedWarehouse.mapper.PalletMergeQueryMapper;
import com.gaotao.modules.automatedWarehouse.service.PalletMergeQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @Description 合托查询Service实现类 - rqrq
* @Author rqrq
* @Date 2026/01/06
*/
@Service
public class PalletMergeQueryServiceImpl implements PalletMergeQueryService {
@Autowired
private PalletMergeQueryMapper palletMergeQueryMapper;
/**
* @Description 获取托盘类型下拉选项用于合托查询筛选- rqrq
* @Title getPalletTypeOptions
* @param site 工厂编码
* @return List<PalletTypeOption>
* @author rqrq
* @date 2026/01/06
*/
@Override
public List<PalletTypeOption> getPalletTypeOptions(String site) {
System.out.println("开始获取合托查询托盘类型下拉选项 - rqrq,site=" + site);
// 参数校验 - rqrq
if (!StringUtils.hasText(site)) {
throw new RuntimeException("工厂编码不能为空");
}
// 查询数据wcs_auto_sort='Y' pallet_family != 'A02' - rqrq
List<PalletTypeOption> list = palletMergeQueryMapper.getPalletTypeOptions(site);
System.out.println("获取合托查询托盘类型下拉选项完成,共" + list.size() + "条记录 - rqrq");
return list;
}
/**
* @Description 查询需要合托的托盘列表 - rqrq
*
* <p><b>查询逻辑</b></p>
* <ol>
* <li>先计算该pallet_type在立库中装得最多的栈板的position+layer count</li>
* <li>查询立库中该类型的栈板count>0 count<最大count</li>
* <li>只查询calling_flag='N'的栈板</li>
* <li>按count从小到大排序</li>
* </ol>
*
* @Title searchPalletMergeList
* @param data 查询条件包含site和palletType
* @return List<PalletMergeQueryData>
* @author rqrq
* @date 2026/01/06
*/
@Override
public List<PalletMergeQueryData> searchPalletMergeList(PalletMergeQueryData data) {
System.out.println("开始查询需要合托的托盘列表 - rqrq,site=" + data.getSite() + ", palletType=" + data.getPalletType());
// 参数校验 - rqrq
if (!StringUtils.hasText(data.getSite())) {
throw new RuntimeException("工厂编码不能为空");
}
if (!StringUtils.hasText(data.getPalletType())) {
throw new RuntimeException("托盘类型不能为空");
}
// Step 1: 计算该类型在立库中装得最多的栈板的position+layer count - rqrq
Integer maxPositionCount = palletMergeQueryMapper.getMaxPositionCount(data.getSite(), data.getPalletType());
System.out.println("该类型最大已用位置数: " + maxPositionCount + " - rqrq");
// 如果没有任何栈板或最大count为0返回空列表 - rqrq
if (maxPositionCount == null || maxPositionCount <= 0) {
System.out.println("没有找到该类型的栈板,返回空列表 - rqrq");
return new ArrayList<>();
}
// Step 2: 查询count>0 count<最大count的栈板按count从小到大排序 - rqrq
List<PalletMergeQueryData> list = palletMergeQueryMapper.searchPalletMergeList(
data.getSite(), data.getPalletType(), maxPositionCount);
System.out.println("查询需要合托的托盘列表完成,共" + list.size() + "条记录 - rqrq");
return list;
}
}

74
src/main/resources/mapper/automatedWarehouse/PalletMergeQueryMapper.xml

@ -0,0 +1,74 @@
<?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.gaotao.modules.automatedWarehouse.mapper.PalletMergeQueryMapper">
<!-- rqrq - 获取托盘类型下拉选项(wcs_auto_sort='Y' 且 pallet_family != 'A02') -->
<select id="getPalletTypeOptions" resultType="PalletTypeOption">
SELECT
pt.pallet_type AS palletType,
pt.type_desc AS typeDesc
FROM pallet_type pt
WHERE pt.site = #{site}
AND pt.wcs_auto_sort = 'Y'
AND (pt.pallet_family IS NULL OR pt.pallet_family != 'A02')
AND pt.active = 'Y'
ORDER BY pt.pallet_type
</select>
<!-- rqrq - 获取该类型在立库中装得最多的栈板的已用位置数 -->
<!-- 立库中的栈板:pallet_family IS NOT NULL -->
<!-- 已用位置数:pallet_detail中 position+layer 的唯一组合数 -->
<select id="getMaxPositionCount" resultType="Integer">
SELECT MAX(position_count) AS maxPositionCount
FROM (
SELECT
pd.pallet_id,
COUNT(DISTINCT CONCAT(ISNULL(pd.position, ''), '_', ISNULL(CAST(pd.layer AS VARCHAR), ''))) AS position_count
FROM pallet p
INNER JOIN pallet_detail pd ON p.site = pd.site AND p.pallet_id = pd.pallet_id
WHERE p.site = #{site}
AND p.pallet_type = #{palletType}
AND p.wcs_location IS NOT NULL
AND p.calling_flag = 'N'
AND p.is_deleted = '0'
GROUP BY pd.pallet_id
) t
</select>
<!-- rqrq - 查询需要合托的托盘列表 -->
<!-- 条件:立库中、calling_flag='N'、count>0 且 count<最大count -->
<!-- 排序:按已用位置数从小到大 -->
<select id="searchPalletMergeList" resultType="PalletMergeQueryData">
SELECT
t.site,
t.palletId,
t.palletType,
t.locationCode,
t.callingFlag,
t.usedPositionCount,
pt.type_desc AS typeDesc
FROM (
SELECT
p.site AS site,
p.pallet_id AS palletId,
p.pallet_type AS palletType,
p.location_code AS locationCode,
p.calling_flag AS callingFlag,
COUNT(DISTINCT CONCAT(ISNULL(pd.position, ''), '_', ISNULL(CAST(pd.layer AS VARCHAR), ''))) AS usedPositionCount
FROM pallet p
INNER JOIN pallet_detail pd ON p.site = pd.site AND p.pallet_id = pd.pallet_id
WHERE p.site = #{site}
AND p.pallet_type = #{palletType}
AND p.wcs_location IS NOT NULL
AND p.calling_flag = 'N'
AND p.is_deleted = '0'
GROUP BY p.site, p.pallet_id, p.pallet_type, p.location_code, p.calling_flag
HAVING COUNT(DISTINCT CONCAT(ISNULL(pd.position, ''), '_', ISNULL(CAST(pd.layer AS VARCHAR), ''))) > 0
AND COUNT(DISTINCT CONCAT(ISNULL(pd.position, ''), '_', ISNULL(CAST(pd.layer AS VARCHAR), ''))) &lt; #{maxPositionCount}
) t
LEFT JOIN pallet_type pt ON t.site = pt.site AND t.palletType = pt.pallet_type
ORDER BY t.usedPositionCount ASC
</select>
</mapper>
Loading…
Cancel
Save