package com.zy.asrs.wms.utils;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.zy.asrs.framework.common.Cools;
|
import com.zy.asrs.framework.exception.CoolException;
|
import com.zy.asrs.wms.asrs.entity.*;
|
import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
|
import com.zy.asrs.wms.asrs.entity.enums.LocTypeHeightType;
|
import com.zy.asrs.wms.asrs.mapper.ViewLocDetlMapper;
|
import com.zy.asrs.wms.asrs.mapper.ViewTaskDetlMapper;
|
import com.zy.asrs.wms.asrs.service.*;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
|
@Component
|
public class LocUtils {
|
|
@Autowired
|
private TaskService taskService;
|
@Autowired
|
private LocService locService;
|
@Autowired
|
private SuggestLocRuleService suggestLocRuleService;
|
@Autowired
|
private LanewayRuleService lanewayRuleService;
|
@Autowired
|
private LocTypeService locTypeService;
|
@Autowired
|
private LocTypeBindService locTypeBindService;
|
@Autowired
|
private ViewLocDetlMapper viewLocDetlMapper;
|
@Autowired
|
private ViewTaskDetlMapper viewTaskDetlMapper;
|
|
//从库存或任务中匹配相邻库位(满托盘)
|
public Loc getNeighborLoc(Long taskType, OrderDetl orderDetl, Integer locTypeHeight) {
|
//满托盘
|
//从任务中进行匹配
|
List<Loc> locs = new ArrayList<>();
|
List<Map<String, Object>> list = viewTaskDetlMapper.getList(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField());
|
for (Map<String, Object> map : list) {
|
Task task = taskService.getById(map.get("taskId").toString());
|
if(task == null) {
|
continue;
|
}
|
|
String targetLoc = task.getTargetLoc();
|
Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, targetLoc));
|
if(one == null) {
|
continue;
|
}
|
locs.add(one);
|
}
|
|
Loc loc = filterLoc(taskType, locs);
|
if (loc != null) {
|
return loc;
|
}
|
|
//从库存中进行匹配
|
List<Loc> locs2 = new ArrayList<>();
|
List<Map<String, Object>> list2 = viewLocDetlMapper.getList(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField());
|
for (Map<String, Object> map : list2) {
|
Loc one = locService.getById(map.get("locId").toString());
|
if(one == null) {
|
continue;
|
}
|
locs2.add(one);
|
}
|
|
Loc loc2 = filterLoc(taskType, locs2);
|
if (loc2 != null) {
|
return loc2;
|
}
|
return null;
|
}
|
|
//获取推荐库位(满托盘)
|
public List<Loc> getSuggestLoc(Long taskType, Long matId, String batch, Integer locTypeHeight) {
|
//满托盘
|
List<Loc> locs = new ArrayList<>();
|
LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
|
if (locTypeHeightType == null) {
|
throw new CoolException("库位高度类型异常");
|
}
|
//获取库位高度
|
LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getFlag, locTypeHeightType.flag));
|
//符合库位高度的库位集合
|
List<Long> locIdList = locTypeBindService.getLocIdListByType(locType);
|
|
LambdaQueryWrapper<SuggestLocRule> wrapper = new LambdaQueryWrapper<>();
|
wrapper.eq(SuggestLocRule::getLocType, 1);
|
wrapper.eq(SuggestLocRule::getMatId, matId);
|
if (!Cools.isEmpty(batch)) {
|
wrapper.eq(SuggestLocRule::getBatch, batch);
|
}
|
List<SuggestLocRule> suggestLocRules = suggestLocRuleService.list(wrapper);
|
for (SuggestLocRule suggestLocRule : suggestLocRules) {
|
LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.ge(Loc::getRow1, suggestLocRule.getStartRow());
|
queryWrapper.le(Loc::getRow1, suggestLocRule.getTargetRow());
|
queryWrapper.ge(Loc::getBay1, suggestLocRule.getStartBay());
|
queryWrapper.le(Loc::getBay1, suggestLocRule.getTargetBay());
|
queryWrapper.ge(Loc::getLev1, suggestLocRule.getStartLev());
|
queryWrapper.le(Loc::getLev1, suggestLocRule.getTargetLev());
|
queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
|
queryWrapper.in(Loc::getId, locIdList);
|
List<Loc> list = locService.list(queryWrapper);
|
if (!list.isEmpty()) {
|
locs.addAll(list);
|
}
|
}
|
return locs;
|
}
|
|
//获取全局库位(完整巷道)
|
public List<Loc> getGlobalLoc(Long taskType, Integer locTypeHeight) {
|
List<Loc> locs = new ArrayList<>();
|
LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
|
if (locTypeHeightType == null) {
|
throw new CoolException("库位高度类型异常");
|
}
|
//获取库位高度
|
LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getFlag, locTypeHeightType.flag));
|
//符合库位高度的库位集合
|
List<Long> locIdList = locTypeBindService.getLocIdListByType(locType);
|
|
LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
|
queryWrapper.in(Loc::getId, locIdList);
|
List<Loc> list = locService.list(queryWrapper);
|
if (!list.isEmpty()) {
|
locs.addAll(list);
|
}
|
return locs;
|
}
|
|
//从库位集合中获取符合深浅的库位
|
public Loc filterLoc(Long taskType, List<Loc> locs) {
|
if (locs == null || locs.isEmpty()) {
|
return null;
|
}
|
|
Loc defaultLoc = null;
|
for (Loc loc : locs) {
|
//获取库位所在巷道
|
LanewayRule lanewayRule = lanewayRuleService.getLaneByLoc(loc);
|
if(lanewayRule == null) {
|
throw new CoolException("库位未配置巷道");
|
}
|
|
//获取库位方向
|
List<Integer> direction = null;
|
if (lanewayRule.getLaneX$().contains(loc.getRow1())) {
|
direction = lanewayRule.getLaneX$();
|
}else {
|
direction = lanewayRule.getLaneY$();
|
}
|
|
for (Integer row : direction) {
|
Loc one = locService.getOne(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getRow1, row)
|
.eq(Loc::getBay1, loc.getBay1())
|
.eq(Loc::getLev1, loc.getLev1()));
|
if (one == null) {
|
continue;
|
}
|
|
if(one.getLocStsId() != LocStsType.O.val()) {
|
continue;
|
}
|
|
//当前库位是空库位
|
defaultLoc = one;
|
break;
|
}
|
|
if (defaultLoc != null) {
|
break;
|
}
|
}
|
|
return defaultLoc;
|
}
|
|
//从库位集合中获取完整空巷道
|
public Loc filterAllLoc(List<Loc> locs) {
|
if (locs == null || locs.isEmpty()) {
|
return null;
|
}
|
|
Loc defaultLoc = null;
|
for (Loc loc : locs) {
|
//获取库位所在巷道
|
LanewayRule lanewayRule = lanewayRuleService.getLaneByLoc(loc);
|
if(lanewayRule == null) {
|
throw new CoolException("库位未配置巷道");
|
}
|
|
//获取库位方向
|
List<Integer> direction = null;
|
if (lanewayRule.getLaneX$().contains(loc.getRow1())) {
|
direction = lanewayRule.getLaneX$();
|
}else {
|
direction = lanewayRule.getLaneY$();
|
}
|
|
boolean flag = false;
|
List<Loc> allLocs = new ArrayList<>();
|
for (Integer row : direction) {
|
Loc one = locService.getOne(new LambdaQueryWrapper<Loc>()
|
.eq(Loc::getRow1, row)
|
.eq(Loc::getBay1, loc.getBay1())
|
.eq(Loc::getLev1, loc.getLev1()));
|
if (one == null) {
|
continue;
|
}
|
|
if(one.getLocStsId() != LocStsType.O.val()) {
|
flag = true;
|
break;
|
}
|
|
allLocs.add(one);
|
}
|
|
if (flag) {
|
continue;
|
}
|
|
if (!allLocs.isEmpty()) {
|
defaultLoc = allLocs.get(0);
|
break;//找到一个完整空巷道
|
}
|
}
|
|
return defaultLoc;
|
}
|
|
//从库存或任务中匹配相邻库位(空托盘)
|
public Loc getNeighborEmptyLoc(Long taskType, Integer locTypeHeight) {
|
//从任务中进行匹配
|
List<Loc> locs = new ArrayList<>();
|
List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskType, 10));
|
for (Task task : list) {
|
String targetLoc = task.getTargetLoc();
|
Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getLocNo, targetLoc));
|
if(one == null) {
|
continue;
|
}
|
locs.add(one);
|
}
|
|
Loc loc = filterLoc(taskType, locs);
|
if (loc != null) {
|
return loc;
|
}
|
|
//从库存中进行匹配
|
List<Loc> locs2 = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getLocStsId, LocStsType.D.val()));
|
Loc loc2 = filterLoc(taskType, locs2);
|
if (loc2 != null) {
|
return loc2;
|
}
|
return null;
|
}
|
|
//获取推荐库位(空托盘)
|
public List<Loc> getSuggestEmptyLoc(Long taskType, Integer locTypeHeight) {
|
List<Loc> locs = new ArrayList<>();
|
//空托盘
|
List<SuggestLocRule> suggestLocRules = suggestLocRuleService.list(new LambdaQueryWrapper<SuggestLocRule>().eq(SuggestLocRule::getLocType, 0));
|
for (SuggestLocRule suggestLocRule : suggestLocRules) {
|
LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.ge(Loc::getRow1, suggestLocRule.getStartRow());
|
queryWrapper.le(Loc::getRow1, suggestLocRule.getTargetRow());
|
queryWrapper.ge(Loc::getBay1, suggestLocRule.getStartBay());
|
queryWrapper.le(Loc::getBay1, suggestLocRule.getTargetBay());
|
queryWrapper.ge(Loc::getLev1, suggestLocRule.getStartLev());
|
queryWrapper.le(Loc::getLev1, suggestLocRule.getTargetLev());
|
queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
|
List<Loc> list = locService.list(queryWrapper);
|
if (!list.isEmpty()) {
|
locs.addAll(list);
|
}
|
}
|
return locs;
|
}
|
|
//获取全局库位(完整巷道)
|
public List<Loc> getGlobalEmptyLoc(Long taskType, Integer locTypeHeight) {
|
List<Loc> locs = new ArrayList<>();
|
LocTypeHeightType locTypeHeightType = LocTypeHeightType.get(locTypeHeight);
|
if (locTypeHeightType == null) {
|
throw new CoolException("库位高度类型异常");
|
}
|
//获取库位高度
|
LocType locType = locTypeService.getOne(new LambdaQueryWrapper<LocType>().eq(LocType::getFlag, locTypeHeightType.flag));
|
//符合库位高度的库位集合
|
List<Long> locIdList = locTypeBindService.getLocIdListByType(locType);
|
|
LambdaQueryWrapper<Loc> queryWrapper = new LambdaQueryWrapper<>();
|
queryWrapper.eq(Loc::getLocStsId, LocStsType.O.val());
|
queryWrapper.in(Loc::getId, locIdList);
|
List<Loc> list = locService.list(queryWrapper);
|
if (!list.isEmpty()) {
|
locs.addAll(list);
|
}
|
return locs;
|
}
|
|
}
|