add:中间站入库分配规则
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user