Commit b557a600 zshaohui

任务分配逻辑修改

1 个父辈 700055ad
...@@ -67,5 +67,8 @@ public enum OP_STATUS { ...@@ -67,5 +67,8 @@ public enum OP_STATUS {
* 需要从流水线上拿走 * 需要从流水线上拿走
*/ */
NEED_AWAY, NEED_AWAY,
OUT_POS OUT_POS,
//出料口
ON_SLIDE
} }
...@@ -397,6 +397,10 @@ public class DataLog extends BasePo implements Serializable { ...@@ -397,6 +397,10 @@ public class DataLog extends BasePo implements Serializable {
return OP_STATUS.EXECUTING.name().equals(status); return OP_STATUS.EXECUTING.name().equals(status);
} }
public boolean isOnSlide() {
return OP_STATUS.ON_SLIDE.name().equals(status);
}
public boolean isOnInnerLine(){ public boolean isOnInnerLine(){
return OP_STATUS.ON_INNER_LINE.name().equals(status); return OP_STATUS.ON_INNER_LINE.name().equals(status);
} }
......
...@@ -84,19 +84,19 @@ public class TaskService { ...@@ -84,19 +84,19 @@ public class TaskService {
/** /**
* key为料仓cid,value为A/B面 * key为料仓cid,value为A/B面
*/ */
private static Map<String,String> posSideMap = Maps.newConcurrentMap(); private static Map<String, String> posSideMap = Maps.newConcurrentMap();
/** /**
* key为料箱号,value库位号 * key为料箱号,value库位号
*/ */
private static Map<String,String> boxPosName = Maps.newConcurrentMap(); private static Map<String, String> boxPosName = Maps.newConcurrentMap();
/** /**
* 出料口信息缓存 * 出料口信息缓存
*/ */
public static Map<String,String> exportMap = Maps.newConcurrentMap(); public static Map<String, String> exportMap = Maps.newConcurrentMap();
// public TaskService(List<ITaskListener> listenerList){ // public TaskService(List<ITaskListener> listenerList){
// for (ITaskListener taskListener: listenerList) { // for (ITaskListener taskListener: listenerList) {
...@@ -113,7 +113,7 @@ public class TaskService { ...@@ -113,7 +113,7 @@ public class TaskService {
task.setType(OP.PUT_IN); task.setType(OP.PUT_IN);
task.setStatus(OP_STATUS.EXECUTING.name()); task.setStatus(OP_STATUS.EXECUTING.name());
task.setExtendType(ExtendType.AUTO_PUTIN); //自动入库 task.setExtendType(ExtendType.AUTO_PUTIN); //自动入库
if(barcode!=null){ if (barcode != null) {
task.setWarehouseCode(barcode.getWarehouseCode()); task.setWarehouseCode(barcode.getWarehouseCode());
task.setDescribe(barcode.getDescribe()); task.setDescribe(barcode.getDescribe());
task.setBatchInfo(barcode.getBatch()); task.setBatchInfo(barcode.getBatch());
...@@ -126,7 +126,7 @@ public class TaskService { ...@@ -126,7 +126,7 @@ public class TaskService {
barcodeManager.saveBarcode(barcode); barcodeManager.saveBarcode(barcode);
} }
String loginUser = DevicesStatusUtil.getLastOpUsername(storage.getCid()); String loginUser = DevicesStatusUtil.getLastOpUsername(storage.getCid());
if(Strings.isNullOrEmpty(loginUser)){ if (Strings.isNullOrEmpty(loginUser)) {
loginUser = SecurityUtils.getLoginUsername(); loginUser = SecurityUtils.getLoginUsername();
} }
task.setOperator(loginUser); task.setOperator(loginUser);
...@@ -136,8 +136,8 @@ public class TaskService { ...@@ -136,8 +136,8 @@ public class TaskService {
} }
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String stationName) throws ValidateException { public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName, String stationName) throws ValidateException {
return checkout(storage,pos,isSingleOut,opUserName,stationName,-1); return checkout(storage, pos, isSingleOut, opUserName, stationName, -1);
} }
/** /**
...@@ -149,7 +149,7 @@ public class TaskService { ...@@ -149,7 +149,7 @@ public class TaskService {
* @return * @return
* @throws ValidateException * @throws ValidateException
*/ */
public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName,String stationName,int extendType) throws ValidateException { public synchronized String checkout(Storage storage, StoragePos pos, boolean isSingleOut, String opUserName, String stationName, int extendType) throws ValidateException {
if (pos.getBarcode() == null) { if (pos.getBarcode() == null) {
String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略"; String msg = "库位[" + pos.getPosName() + "]中已无物料,忽略";
log.info(msg); log.info(msg);
...@@ -197,7 +197,7 @@ public class TaskService { ...@@ -197,7 +197,7 @@ public class TaskService {
task.setProvider(barcode.getProvider()); task.setProvider(barcode.getProvider());
task.setProviderNumber(barcode.getProviderNumber()); task.setProviderNumber(barcode.getProviderNumber());
task.setKeeperCode(barcode.getKeeperCode()); task.setKeeperCode(barcode.getKeeperCode());
if (StringUtils.isNotBlank(SecurityUtils.getLoginUsername())){ if (StringUtils.isNotBlank(SecurityUtils.getLoginUsername())) {
task.setCreator(SecurityUtils.getLoginUsername()); task.setCreator(SecurityUtils.getLoginUsername());
} }
if (extendType != -1) { if (extendType != -1) {
...@@ -247,11 +247,11 @@ public class TaskService { ...@@ -247,11 +247,11 @@ public class TaskService {
for (DataLog task : tasks) { for (DataLog task : tasks) {
String barcode = taskToExecute.getBarcode(); String barcode = taskToExecute.getBarcode();
String posName = taskToExecute.getPosName(); String posName = taskToExecute.getPosName();
if(task.getType() == taskToExecute.getType()){ if (task.getType() == taskToExecute.getType()) {
if (!Strings.isNullOrEmpty(barcode) && task.getBarcode().equals(barcode)) { if (!Strings.isNullOrEmpty(barcode) && task.getBarcode().equals(barcode)) {
log.info("二维码:[" + barcode + "]已在操作队列中,操作失败"); log.info("二维码:[" + barcode + "]已在操作队列中,操作失败");
throw new ValidateException("smfcore.error.barcode.inQueue", "二维码[{0}]已在操作队列中,操作失败", new String[]{barcode}); throw new ValidateException("smfcore.error.barcode.inQueue", "二维码[{0}]已在操作队列中,操作失败", new String[]{barcode});
} else if (task.getPosName().equals(posName)&& ObjectUtil.isNotEmpty(posName)) { } else if (task.getPosName().equals(posName) && ObjectUtil.isNotEmpty(posName)) {
log.info("位置:[" + posName + "]已在操作队列中,操作失败"); log.info("位置:[" + posName + "]已在操作队列中,操作失败");
throw new ValidateException("smfcore.error.pos.inQueue", "位置:[{0}}]已在操作队列中,操作失败", new String[]{posName}); throw new ValidateException("smfcore.error.pos.inQueue", "位置:[{0}}]已在操作队列中,操作失败", new String[]{posName});
} }
...@@ -278,6 +278,7 @@ public class TaskService { ...@@ -278,6 +278,7 @@ public class TaskService {
} }
return allTasks; return allTasks;
} }
/** /**
* 获取所有任务 * 获取所有任务
*/ */
...@@ -318,11 +319,11 @@ public class TaskService { ...@@ -318,11 +319,11 @@ public class TaskService {
log.info("任务[" + task.getId() + "] posName[" + task.getPosName() + "] Reel Id[" + task.getBarcode() + "]取消成功"); log.info("任务[" + task.getId() + "] posName[" + task.getPosName() + "] Reel Id[" + task.getBarcode() + "]取消成功");
//同时进行库位屏蔽 //同时进行库位屏蔽
if (/*task.isPutInTask() &&*/ !task.isFinished()){ if (/*task.isPutInTask() &&*/ !task.isFinished()) {
String posName = task.getPosName(); String posName = task.getPosName();
if (StringUtils.isNotBlank(posName)){ if (StringUtils.isNotBlank(posName)) {
StoragePos pos = storagePosManager.getByPosName(posName); StoragePos pos = storagePosManager.getByPosName(posName);
if (pos != null){ if (pos != null) {
//排查料架 //排查料架
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
if (!storage.isNLShelf() && !storage.isNLMShelf() && !storage.isNLPShelf() && !storage.isShelf()) { if (!storage.isNLShelf() && !storage.isNLMShelf() && !storage.isNLPShelf() && !storage.isShelf()) {
...@@ -452,24 +453,11 @@ public class TaskService { ...@@ -452,24 +453,11 @@ public class TaskService {
task.setUpdateDate(new Date()); task.setUpdateDate(new Date());
return task; return task;
} }
//只能同时有两个正在执行的出库任务,如果超过两个不再分配了
/*if (task.isCheckOutTask()) {
checkoutSize++;
if (checkoutSize >= 2) {
//log.error("cid["+cid + "]的BOX["+ boxId+"]的出库任务已经超过2个,不再分配!");
return null;
}
}*/
} }
} }
//指定紧急单盘出库的优先出库,否则按批量出库处理 //指定紧急单盘出库的优先出库,否则按批量出库处理
DataLog singleOutTask = null; DataLog singleOutTask = null;
DataLog outTask = null;
for (DataLog task : allTasks) {//优先分配单盘任务和没有工单的任务 for (DataLog task : allTasks) {//优先分配单盘任务和没有工单的任务
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) { if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
String posName = task.getPosName(); String posName = task.getPosName();
...@@ -483,89 +471,146 @@ public class TaskService { ...@@ -483,89 +471,146 @@ public class TaskService {
} }
} }
} }
if (singleOutTask != null) { if (singleOutTask != null) {
log.info("分配优先(单盘或无工单)出库任务" + singleOutTask.getBarcode() + "[" + singleOutTask.getPosName() + "]到 " + cid); log.info("分配优先(单盘或无工单)出库任务" + singleOutTask.getBarcode() + "[" + singleOutTask.getPosName() + "]到 " + cid);
return singleOutTask; return singleOutTask;
} }
//判断出料口位置是否一样 DataLog outTask = null;
for (DataLog task : allTasks) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) { //获取上一次出料口
String posName = task.getPosName(); String export = exportMap.get(cid);
if (!Strings.isNullOrEmpty(posName)) {
if (!task.isSingleOut()) { //1.找到与上一次出料口不同的任务
if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) { outTask = getNeedOutTask(allTasks, export, cid, true);
String export = task.getExport();
String cacheExport = exportMap.get(cid); //2.如果没找到,不找到最早的任务
if (StringUtils.isNotBlank(cacheExport)) { if (outTask == null) {
if (cacheExport.equals(export)) { outTask = getNeedOutTask(allTasks, export, cid, false);
continue; }
}
if (outTask != null) {
if (outTask.getPlateSize() > 7) {
log.info(outTask.getBarcode() + "当前任务为大盘料,不需要处理:"+outTask.getBarcode());
}
//3.如果当前任务不是大盘料
else {
//4.判断是否属于工单任务
String sourceId = outTask.getSourceId();
if (StringUtils.isNotBlank(sourceId)) {
//5.判断工单在当前库位中有没有大盘料
DataLog bigReelTask = getBigReelTask(allTasks, cid);
if (bigReelTask != null) {
log.info(outTask.getSourceName()+"当前工单中,料仓:"+cid+"有大盘料:"+bigReelTask.getBarcode()+",优先出库");
exportMap.put(cid, bigReelTask.getExport());
return bigReelTask;
}
//6.判断其他料仓有没有大料盘
else {
boolean hasBigReel = otherStorageHasBigReel(allTasks, sourceId);
//7.如果其他仓有大盘料,则优先出B面的
DataLog task = null;
if (hasBigReel) {
log.info(outTask.getSourceName()+"当前工单中,其他料仓有大盘料,优先出B面料");
task = getOutTaskBySide(allTasks, cid, "B");
}
//8.如果其他仓没有大盘料,则优先出T面
else {
log.info(outTask.getSourceName()+"当前工单中,其他料仓没有大盘料,优先出T面料");
task = getOutTaskBySide(allTasks, cid, "T");
if (task == null) {
log.info(outTask.getSourceName()+"当前工单中,其他料仓没有大盘料,T面料没有,出B面料");
task = getOutTaskBySide(allTasks, cid, "B");
} }
outTask = task; }
if (task != null) {
log.info(outTask.getSourceName()+"barcode为:"+task.getBarcode()+"面别为:"+task.getSide());
exportMap.put(cid, task.getSide());
return task;
} }
} }
} }
} }
} }
//如果出料口相同,则重新赋值一遍
if (outTask == null){ if (outTask != null) {
for (DataLog task : allTasks) { log.info(outTask.getSourceName()+"barcode为:"+outTask.getBarcode()+"面别为:"+outTask.getSide());
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) { exportMap.put(cid, outTask.getSide());
String posName = task.getPosName(); }
if (!Strings.isNullOrEmpty(posName)) {
if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) { return outTask;
}
public DataLog getOutTaskBySide(Collection<DataLog> allTasks, String cid, String side) {
DataLog outTask = null;
for (DataLog task : allTasks) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
String posName = task.getPosName();
if (!Strings.isNullOrEmpty(posName)) {//有库位号
if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) {
if (side.equals(task.getSide())){
outTask = task; outTask = task;
} }
} }
} }
} }
} }
return outTask;
}
//判断发送的任务与当前执行的工单是否一致 public boolean otherStorageHasBigReel(Collection<DataLog> allTasks, String sourceId) {
if (outTask != null) { boolean hasBigReel = false;
//判断当前任务是不是大盘料 for (DataLog dataLog : allTasks) {
if (outTask.getW() > 7) { if (sourceId.equals(dataLog.getSourceId())) {
return outTask; int plateSize = dataLog.getPlateSize();
if (plateSize > 7) {
if (dataLog.isCheckOutTask() && (dataLog.isWait() || dataLog.isExecuting() || dataLog.isOnSlide())) {
hasBigReel = true;
break;
}
}
} }
}
return hasBigReel;
}
String sourceName = outTask.getSourceName(); public DataLog getBigReelTask(Collection<DataLog> allTasks, String cid) {
DataLog outTask = null;
//判断当前工单有没有大盘料 for (DataLog task : allTasks) {
boolean otherStorageBigReel = false; if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
if (StringUtils.isNotBlank(sourceName)) { String posName = task.getPosName();
for (DataLog dataLog : allTasks) { if (!Strings.isNullOrEmpty(posName)) {//有库位号
if (dataLog.isCheckOutTask() && dataLog.isWait() && sourceName.equals(dataLog.getSourceName()) && dataLog.getW() > 7) { if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) {
if (dataLog.getCid().equals(cid)) { if (task.getPlateSize() > 7) {
exportMap.put(dataLog.getCid(),dataLog.getExport()); outTask = task;
return dataLog;
} else {
otherStorageBigReel = true;
} }
} }
} }
}
}
return outTask;
}
//没有大盘料,直接返回当前任务
if (!otherStorageBigReel) {
exportMap.put(outTask.getCid(),outTask.getExport());
return outTask;
}
//如果有大盘料,取B面的料 public DataLog getNeedOutTask(Collection<DataLog> allTasks, String exportStr, String cid, boolean hasExport) {
else { DataLog outTask = null;
if ("B".equals(outTask.getSide())) { for (DataLog task : allTasks) {
exportMap.put(outTask.getCid(),outTask.getExport()); if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
return outTask; String posName = task.getPosName();
} else { if (!Strings.isNullOrEmpty(posName)) {//有库位号
for (DataLog dataLog : allTasks) { if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) {
if (dataLog.isCheckOutTask() && dataLog.isWait() && sourceName.equals(dataLog.getSourceName())) { if (hasExport) {
if (dataLog.getCid().equals(cid) && "B".equals(outTask.getCid())) { if (StringUtils.isNotBlank(exportStr) && !exportStr.equals(task.getExport())) {
exportMap.put(dataLog.getCid(),dataLog.getExport()); outTask = task;
return dataLog;
}
} }
} else {
outTask = task;
} }
} }
} }
...@@ -575,6 +620,7 @@ public class TaskService { ...@@ -575,6 +620,7 @@ public class TaskService {
} }
/** /**
* 出库处理 * 出库处理
*/ */
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!