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; package org.nl.wms.basedata_manage.service.dao.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.nl.wms.basedata_manage.service.dao.Structattr; import org.nl.wms.basedata_manage.service.dao.Structattr;
import java.util.List;
import java.util.Map;
/** /**
* @author dsh * @author dsh
* 2025/5/15 * 2025/5/15
@@ -11,4 +16,11 @@ import org.nl.wms.basedata_manage.service.dao.Structattr;
@Mapper @Mapper
public interface StructattrMapper extends BaseMapper<Structattr>{ 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 cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j; 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.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.MdPbStoragevehicleext;
import org.nl.wms.basedata_manage.service.dao.Structattr; 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.StrategyMater;
import org.nl.wms.basedata_manage.service.dto.StrategyStructParam; import org.nl.wms.basedata_manage.service.dto.StrategyStructParam;
import org.nl.wms.decision_manage.service.decisioner.Decisioner; import org.nl.wms.decision_manage.service.decisioner.Decisioner;
import org.nl.wms.warehouse_management.enums.IOSEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Comparator; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -31,24 +36,42 @@ public class MiddleRuleHandler extends Decisioner<Structattr, StrategyStructPara
@Resource @Resource
private IMdPbStoragevehicleextService iMdPbStoragevehicleextService; private IMdPbStoragevehicleextService iMdPbStoragevehicleextService;
@Resource
private IStructattrService iStructattrService;
@Resource
private StructattrMapper structattrMapper;
@Override @Override
public List<Structattr> handler(List<Structattr> list, StrategyStructParam param) { public List<Structattr> handler(List<Structattr> list, StrategyStructParam param) {
log.info("---------执行middle入库分配规则---------"); log.info("---------执行middle入库分配规则---------");
// 根据托盘查询库内库存 List<Structattr> resuList = new ArrayList<>();
List<String> vehicleList = list.stream()
.filter(row -> ObjectUtil.isNotEmpty(row.getStoragevehicle_code())) 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) .map(Structattr::getStoragevehicle_code)
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
if (ObjectUtil.isEmpty(vehicleList)) {
// 为空:查询空的一组可用货位
return this.queryAttrGroup(structattr);
}
List<MdPbStoragevehicleext> extList = iMdPbStoragevehicleextService.list( List<MdPbStoragevehicleext> extList = iMdPbStoragevehicleextService.list(
new QueryWrapper<MdPbStoragevehicleext>().lambda() new QueryWrapper<MdPbStoragevehicleext>().lambda()
.in(MdPbStoragevehicleext::getStoragevehicle_code, vehicleList) .in(MdPbStoragevehicleext::getStoragevehicle_code, vehicleList)
); );
if (ObjectUtil.isEmpty(extList)) {
// 查询一组未有货的仓位
} // 不为空:判断是否有相同物料批次的库存
// 不为空则判断是否有匹配的物料仓位
StrategyMater strategyMater = param.getStrategyMaters().get(0); StrategyMater strategyMater = param.getStrategyMaters().get(0);
MdPbStoragevehicleext extDaoLike = extList.stream() MdPbStoragevehicleext extDaoLike = extList.stream()
.filter(row -> row.getMaterial_id().equals(strategyMater.getMaterial_id()) .filter(row -> row.getMaterial_id().equals(strategyMater.getMaterial_id())
@@ -56,11 +79,50 @@ public class MiddleRuleHandler extends Decisioner<Structattr, StrategyStructPara
).findFirst().orElse(null); ).findFirst().orElse(null);
if (ObjectUtil.isEmpty(extDaoLike)) { 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)
);
}
} }