Commit b557a600 zshaohui

任务分配逻辑修改

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