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