Browse Source
feat(automatedWarehouse): 添加合托查询功能模块
feat(automatedWarehouse): 添加合托查询功能模块
- 新增 PalletMergeQueryController 提供合托查询相关接口 - 新增 PalletMergeQueryData 实体类定义合托查询业务数据结构 - 新增 PalletTypeOption 实体类用于托盘类型下拉选项 - 实现 PalletMergeQueryService 服务接口及具体业务逻辑 - 集成 MyBatis Mapper 和 XML 配置完成数据库查询操作 - 实现托盘类型筛选和合托托盘列表查询功能 - 添加参数校验和查询逻辑处理机制master
7 changed files with 440 additions and 0 deletions
-
69src/main/java/com/gaotao/modules/automatedWarehouse/controller/PalletMergeQueryController.java
-
83src/main/java/com/gaotao/modules/automatedWarehouse/entity/PalletMergeQueryData.java
-
32src/main/java/com/gaotao/modules/automatedWarehouse/entity/PalletTypeOption.java
-
51src/main/java/com/gaotao/modules/automatedWarehouse/mapper/PalletMergeQueryMapper.java
-
35src/main/java/com/gaotao/modules/automatedWarehouse/service/PalletMergeQueryService.java
-
96src/main/java/com/gaotao/modules/automatedWarehouse/service/impl/PalletMergeQueryServiceImpl.java
-
74src/main/resources/mapper/automatedWarehouse/PalletMergeQueryMapper.xml
@ -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(); |
|||
} |
|||
} |
|||
|
|||
@ -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; |
|||
} |
|||
|
|||
@ -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; |
|||
} |
|||
|
|||
@ -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); |
|||
} |
|||
|
|||
@ -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); |
|||
} |
|||
|
|||
@ -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; |
|||
} |
|||
} |
|||
|
|||
@ -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), ''))) < #{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> |
|||
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue