add:中间站入库分配规则

This commit is contained in:
2025-12-05 15:29:15 +08:00
parent 8190cebe0d
commit c9a861772d
3 changed files with 109 additions and 11 deletions

View File

@@ -1,9 +1,14 @@
package org.nl.wms.basedata_manage.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import java.util.List;
import java.util.Map;
/**
* @author dsh
* 2025/5/15
@@ -11,4 +16,11 @@ import org.nl.wms.basedata_manage.service.dao.Structattr;
@Mapper
public interface StructattrMapper extends BaseMapper<Structattr>{
/**
* 查询一组全部都为空的一组仓位(中间站)
* @param json 入参
* @return List<Structattr> 返回组序号 block_num
*/
List<Structattr> queryAttrGroup(@Param("param") Map json);
}

View File

@@ -0,0 +1,24 @@
<?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="org.nl.wms.basedata_manage.service.dao.mapper.StructattrMapper">
<select id="queryAttrGroup" resultType="org.nl.wms.basedata_manage.service.dao.Structattr">
SELECT
attr.block_num
FROM
st_ivt_structattr attr
<where>
1 = 1
<if test="param.sect_id != null and param.sect_id != ''">
AND
attr.sect_id LIKE #{param.sect_id}
</if>
</where>
GROUP BY
attr.block_num
HAVING
MAX(TRIM(COALESCE(attr.storagevehicle_code, ''))) = ''
AND MAX(TRIM( attr.lock_type )) = '0'
ORDER BY attr.block_num
</select>
</mapper>

View File

@@ -3,16 +3,21 @@ package org.nl.wms.decision_manage.service.decisioner.impl.base;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.MapOf;
import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.basedata_manage.service.dao.mapper.StructattrMapper;
import org.nl.wms.basedata_manage.service.dto.StrategyMater;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.decision_manage.service.decisioner.Decisioner;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Comparator;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -31,24 +36,42 @@ public class MiddleRuleHandler extends Decisioner<Structattr, StrategyStructPara
@Resource
private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
@Resource
private IStructattrService iStructattrService;
@Resource
private StructattrMapper structattrMapper;
@Override
public List<Structattr> handler(List<Structattr> list, StrategyStructParam param) {
log.info("---------执行middle入库分配规则---------");
// 根据托盘查询库内库存
List<String> vehicleList = list.stream()
.filter(row -> ObjectUtil.isNotEmpty(row.getStoragevehicle_code()))
List<Structattr> resuList = new ArrayList<>();
Structattr structattr = list.get(0);
List<Structattr> attrList = iStructattrService.list(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getSect_id, structattr.getSect_id())
.and(row -> row.isNotNull(Structattr::getStoragevehicle_code)
.ne(Structattr::getStoragevehicle_code, "")
)
);
// 查询此托盘对应的库存信息
List<String> vehicleList = attrList.stream()
.map(Structattr::getStoragevehicle_code)
.distinct()
.collect(Collectors.toList());
if (ObjectUtil.isEmpty(vehicleList)) {
// 为空:查询空的一组可用货位
return this.queryAttrGroup(structattr);
}
List<MdPbStoragevehicleext> extList = iMdPbStoragevehicleextService.list(
new QueryWrapper<MdPbStoragevehicleext>().lambda()
.in(MdPbStoragevehicleext::getStoragevehicle_code, vehicleList)
);
if (ObjectUtil.isEmpty(extList)) {
// 查询一组未有货的仓位
}
// 不为空则判断是否有匹配的物料仓位
// 不为空:判断是否有相同物料批次的库存
StrategyMater strategyMater = param.getStrategyMaters().get(0);
MdPbStoragevehicleext extDaoLike = extList.stream()
.filter(row -> row.getMaterial_id().equals(strategyMater.getMaterial_id())
@@ -56,11 +79,50 @@ public class MiddleRuleHandler extends Decisioner<Structattr, StrategyStructPara
).findFirst().orElse(null);
if (ObjectUtil.isEmpty(extDaoLike)) {
// 为空:查询空的一组可用货位
return this.queryAttrGroup(structattr);
}
return null;
// 不为空查询此组空位
Structattr attrLikeVehicle = iStructattrService.getOne(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getStoragevehicle_code, extDaoLike.getStoragevehicle_code())
);
resuList = iStructattrService.list(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getSect_id, structattr.getSect_id())
.eq(Structattr::getBlock_num, attrLikeVehicle.getBlock_num())
.eq(Structattr::getLock_type, IOSEnum.LOCK_TYPE.code("未锁定"))
.and(row -> row.isNull(Structattr::getStoragevehicle_code)
.or().eq(Structattr::getStoragevehicle_code, "")
)
.orderByAsc(Structattr::getStruct_code)
);
if (ObjectUtil.isEmpty(resuList)) {
return this.queryAttrGroup(structattr);
}
return resuList;
}
/**
* 查询空的一组可用货位
*
* @param structattr 实体类
* @return List<Structattr>
*/
public List<Structattr> queryAttrGroup(Structattr structattr) {
// 查询一组未有货组仓位
List<Structattr> groupBlockList = structattrMapper.queryAttrGroup(MapOf.of("sect_id", structattr.getSect_id()));
if (ObjectUtil.isEmpty(groupBlockList)) {
throw new BadRequestException("当前组仓位不足!");
}
// 根据组查询可用仓位
return iStructattrService.list(
new QueryWrapper<Structattr>().lambda()
.eq(Structattr::getSect_id, structattr.getSect_id())
.eq(Structattr::getBlock_num, groupBlockList.get(0).getBlock_num())
.orderByAsc(Structattr::getStruct_code)
);
}
}