Commit 0048a539 孙克

修改出库任务分配逻辑,按照工痊13572468的顺序进行出库

1 个父辈 08deb920
...@@ -2,8 +2,10 @@ package com.neotel.smfcore.core.device.handler.impl; ...@@ -2,8 +2,10 @@ package com.neotel.smfcore.core.device.handler.impl;
import cn.hutool.core.thread.FinalizableDelegatedExecutorService; import cn.hutool.core.thread.FinalizableDelegatedExecutorService;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
...@@ -301,10 +303,8 @@ public class XLRBoxHandler extends BaseDeviceHandler { ...@@ -301,10 +303,8 @@ public class XLRBoxHandler extends BaseDeviceHandler {
return boxTask; return boxTask;
} }
//分配出料口不为空的 //先提取当前料仓出料口不为空的待执行任务
DataLog orderTask = null; List<DataLog> boxTaskListToExecute = new ArrayList<>();
//先提取出料口不为空的
List<DataLog> notEmptyExportList = new ArrayList<>();
for (DataLog dataLog : dataLogList) { for (DataLog dataLog : dataLogList) {
if (dataLog.isCheckOutTask() && dataLog.isWait() && cid.equals(dataLog.getCid())) { if (dataLog.isCheckOutTask() && dataLog.isWait() && cid.equals(dataLog.getCid())) {
String export = dataLog.getExport(); String export = dataLog.getExport();
...@@ -313,79 +313,126 @@ public class XLRBoxHandler extends BaseDeviceHandler { ...@@ -313,79 +313,126 @@ public class XLRBoxHandler extends BaseDeviceHandler {
isBox = false; isBox = false;
} }
if (StringUtils.isNotEmpty(export) && !isBox) { if (StringUtils.isNotEmpty(export) && !isBox) {
notEmptyExportList.add(dataLog); boxTaskListToExecute.add(dataLog);
} }
} }
} }
//获取到站位相同的任务
List<DataLog> resultList = new ArrayList<>(); String lastExport = lastOutExportMap.get(cid);
//获取到站位相同的任务 log.info(cid+"对应的上一次出料口为:"+lastExport);
for (DataLog dataLog : notEmptyExportList) { //查找下一出口的任务, 出口顺序为13572468, 桶的顺序为3,2,1
String export = dataLog.getExport(); DataLog orderTask = findNextTask(boxTaskListToExecute, lastExport);
String feederInfo = dataLog.getAppendData("feederInfo");
String feeder = StorageExportUtil.getCurrentExportFeeder(export); if (orderTask != null) {
if (feederInfo.startsWith(feeder)) { log.info("分配出库任务,站位号为:" + orderTask.getAppendData("feederInfo") + ",出料口为:" + orderTask.getExport() + ",barcode为:" + orderTask.getBarcode());
resultList.add(dataLog); lastOutExportMap.put(cid, orderTask.getExport());
} } else {
lastOutExportMap.put(cid, "");
} }
if (resultList != null && !resultList.isEmpty()) { return orderTask;
Collections.sort(resultList, (o1, o2) -> { }
String feederInfo1 = o1.getAppendData("feederInfo");
String feederInfo2 = o2.getAppendData("feederInfo");
return feederInfo1.compareTo(feederInfo2);
});
String lastExportMap = lastOutExportMap.get(cid);
log.info(cid+"对应的上一次出料口为:"+lastExportMap);
//获取到所有的出料口
List<String> allEportList = new ArrayList<>();
for (DataLog dataLog : resultList) {
String export = dataLog.getExport();
if (allEportList.isEmpty()) {
allEportList.add(export);
} else {
if (!allEportList.contains(export)) {
allEportList.add(export);
}
}
}
allEportList = allEportList.stream().sorted().collect(Collectors.toList());
int index = 0;
//寻找到对应的index //工位出库顺序UM1,UM3,UM5,UM7,UM2,UM4,UM6,UM8,工位排布顺序为UM8,MU7,UM4,UM3,|料仓出口皮带|,UM2,UM1,UM6,UM5,NG口, 这样可以同一个工单可以同时用上左右两边的皮带
for (int i = 0; i < allEportList.size(); i++) { List<String> outStationSequence = Lists.newArrayList("UM1","UM3","UM5","UM7","UM2","UM4","UM6","UM8");
String export = allEportList.get(i);
if (export.equals(lastExportMap)){ //工位上料桶的出库顺序为3,2,1,即首盘优先
index = i; List<String> outBucketSequence = Lists.newArrayList("_3","_2","_1");
break;
/**
* 查找下一个任务
* @param taskListToExcute
* @param lastTaskExport
* @return
*/
public DataLog findNextTask(List<DataLog> taskListToExcute, String lastTaskExport){
if(taskListToExcute == null || taskListToExcute.isEmpty()){
return null;
}
boolean start = false;
//第一盘,从头出
if(Strings.isNullOrEmpty(lastTaskExport)){
start = true;
}
for (String station : outStationSequence) {
if(start){
//task的顺序按照3,2,1出,
for (String bucket : outBucketSequence) {
String export = station + bucket;
DataLog exportTask = findExportTask(taskListToExcute,export);
if(exportTask != null){
return exportTask;
}
} }
} }else{
if (index != 0) { String currentExport = lastTaskExport;
index = index + 1; if(currentExport.startsWith(station)){
if (index >= allEportList.size()) { start = true;
index = 0;
} }
} }
String nextExport = allEportList.get(index); }
log.info(cid+"获取到下一个出料口为:"+nextExport);
for (DataLog dataLog : resultList) { //到这里还没有返回, 需要从第一个再找一遍
if (nextExport.equals(dataLog.getExport())){ for (String station : outStationSequence) {
orderTask = dataLog; //task的顺序按照3,2,1出,
break; for (String bucket : outBucketSequence) {
String export = station + bucket;
DataLog exportTask = findExportTask(taskListToExcute,export);
if(exportTask != null){
return exportTask;
} }
} }
} }
if (orderTask != null) { return null;
log.info("分配出库任务,站位号为:" + orderTask.getAppendData("feederInfo") + ",出料口为:" + orderTask.getExport() + ",barcode为:" + orderTask.getBarcode()); }
lastOutExportMap.put(cid, orderTask.getExport());
} else { /**
lastOutExportMap.put(cid, ""); * 查找某个出口的任务
* @param taskListToExcute
* @param export
* @return
*/
private static DataLog findExportTask(List<DataLog> taskListToExcute, String export){
for (DataLog task : taskListToExcute) {
String taskExport = task.getExport();
if(taskExport.startsWith(export)){
return task;
}
} }
return orderTask; return null;
} }
// public static void main(String[] args) {
// List<DataLog> taskListToExcute = new ArrayList<>();
// int index = 1;
// for (int i = 1; i <= 8; i++) {
// for (int bucket = 1; bucket <=3; bucket ++){
// int taskCount = RandomUtil.getRandom().nextInt(5);
// for (int count = 0; count< taskCount;count++){
// String export = "UM" + i +"_" + bucket;
// DataLog dataLog = new DataLog();
// dataLog.setId("" + index++);
// dataLog.setExport(export);
// taskListToExcute.add(dataLog);
// System.out.print(export+";");
// }
// }
// }
// int totleCount = taskListToExcute.size();
// System.out.println("任务数:" + totleCount);
// String lastExport = "";
// for (int i = 0; i < totleCount; i++) {
// DataLog nextTask = new XLRBoxHandler().findNextTask(taskListToExcute,lastExport);
// System.out.println(nextTask.getId() + "\t"+nextTask.getExport());
// lastExport = nextTask.getExport();
// taskListToExcute.remove(nextTask);
// }
// }
Map<String,String> lastOutExportMap = Maps.newConcurrentMap(); Map<String,String> lastOutExportMap = Maps.newConcurrentMap();
@Override @Override
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!