Commit 11b40cce sunke

取消任务时清理占用库位, 第一次传料架时,空闲位置设置为100

1 个父辈 9b70a0d7
...@@ -301,7 +301,7 @@ public class InquiryShelfBean { ...@@ -301,7 +301,7 @@ public class InquiryShelfBean {
* 根据tempRfid编号获取料架信息 * 根据tempRfid编号获取料架信息
*/ */
public ShelfInfo findSameShelf(String hSerial, String rfid){ public ShelfInfo findSameShelf(String hSerial, String rfid){
if(hSerial != null){ if(hSerial != null && !hSerial.isEmpty()){
Map<String, ShelfInfo> shelfMap = hSerialShelfMap.get(hSerial); Map<String, ShelfInfo> shelfMap = hSerialShelfMap.get(hSerial);
if(shelfMap != null){ if(shelfMap != null){
for (ShelfInfo shelf : shelfMap.values()) { for (ShelfInfo shelf : shelfMap.values()) {
...@@ -362,7 +362,7 @@ public class InquiryShelfBean { ...@@ -362,7 +362,7 @@ public class InquiryShelfBean {
* @return * @return
*/ */
public ShelfInfo findPackageShelf(String hSerial, String packageRfid){ public ShelfInfo findPackageShelf(String hSerial, String packageRfid){
if(packageRfid == null){ if(packageRfid == null || packageRfid.isEmpty()){
return null; return null;
} }
Map<String, ShelfInfo> shSerialShelfInfoMap = hSerialShelfMap.get(hSerial); Map<String, ShelfInfo> shSerialShelfInfoMap = hSerialShelfMap.get(hSerial);
...@@ -514,6 +514,59 @@ public class InquiryShelfBean { ...@@ -514,6 +514,59 @@ public class InquiryShelfBean {
return null; return null;
} }
/**
* 取消任务,解除料盘对料架的占用
*/
public static void cancelReelTask(DataLog task){
AppendInfo appendInfo = task.getAppendInfo();
String barcode = task.getBarcode();
String hSerial = appendInfo.gethSerial();
String taskShelfType = appendInfo.getShelfType();
Map<String, ShelfInfo> shelfMap = hSerialShelfMap.get(hSerial);
if(appendInfo.isFirstReelAction()){
//首盘料,解除绑定的位置
if(shelfMap != null){
ShelfInfo shelfInfo = shelfMap.get(appendInfo.getTempRfid());
if(shelfInfo != null){
boolean result = shelfInfo.cancelLimitLoc(taskShelfType, barcode);
if(result){
log.info("首盘料["+task.getBarcode()+"]任务取消,解除料架" + shelfInfo.tempRfid() +"锁定架位绑定");
updateShelfInfo(shelfInfo);
}
}
}
}else if(appendInfo.isTailAction()){
//补料盘,解除最后一个料架上的位置
ShelfInfo maxShelf = null;
for (ShelfInfo shelfInfo : shelfMap.values()) {
if(shelfInfo.getShelfType().equals(taskShelfType)){
int limitLoc = shelfInfo.getBarcodeLoc(barcode, taskShelfType);
if(limitLoc > 0){
//已经锁定过
boolean result = shelfInfo.cancelLimitLoc(taskShelfType,barcode);
if(result){
log.info("补料盘["+task.getBarcode()+"]任务取消,解除料架" + shelfInfo.tempRfid() +"的锁定架位绑定");
updateShelfInfo(shelfInfo);
}
return;
}else{
if(maxShelf == null || shelfInfo.getRfidIndex() > maxShelf.getRfidIndex()){
maxShelf = shelfInfo;
}
}
}
}
if(maxShelf != null){
boolean result =maxShelf.cancelLoc(appendInfo.getShelfType(), barcode);
if(result){
log.info("补料盘["+task.getBarcode()+"]任务取消,解除料架" + maxShelf.tempRfid() +"架位绑定");
updateShelfInfo(maxShelf);
}
}
}
}
public synchronized boolean putInShelf(DataLog task, String rfid, int loc){ public synchronized boolean putInShelf(DataLog task, String rfid, int loc){
AppendInfo appendInfo = task.getAppendInfo(); AppendInfo appendInfo = task.getAppendInfo();
......
...@@ -211,6 +211,45 @@ public class ShelfInfo { ...@@ -211,6 +211,45 @@ public class ShelfInfo {
} }
} }
/**
* 为补料取消一个库位
*/
public boolean cancelLoc(String rfidType, String barcode){
if(rfidType.equals(this.getShelfType())){
int usedCount = getUsedLocCount();
for(int i=usedCount; i> 0; i--){
ShelfLoc shelfLoc = locMap.get(i);
if(shelfLoc != null && shelfLoc.isEmpty() && !shelfLoc.isLock()){
//未放过料,且未锁定
shelfLoc.putIn(barcode);
return true;
}
}
}
return false;
}
/**
* 为首盘料取消一个锁定的库位
*/
public boolean cancelLimitLoc(String rfidType, String barcode){
if(rfidType.equals(this.getShelfType())){
for (ShelfLoc shelfLoc : locMap.values()) {
if(shelfLoc.isInThisLoc(barcode)){
if(shelfLoc.isEmpty()){
shelfLoc.putIn(barcode);
locMap.put(shelfLoc.getLoc(), shelfLoc);
return true;
}else {
log.error("料盘["+barcode+"]解除绑定架位失败,此位置料盘已放入");
}
}
}
}
return false;
}
public boolean putInLimitLoc(String rfid, int rfidLoc, String barcode){ public boolean putInLimitLoc(String rfid, int rfidLoc, String barcode){
if(rfid.contains(shelfType)){//不是同一种料架的忽略 if(rfid.contains(shelfType)){//不是同一种料架的忽略
ShelfLoc shelfLoc = locMap.get(rfidLoc); ShelfLoc shelfLoc = locMap.get(rfidLoc);
......
...@@ -1430,7 +1430,7 @@ public class QisdaApiController extends BaseController { ...@@ -1430,7 +1430,7 @@ public class QisdaApiController extends BaseController {
} }
} }
return "需求单任务分配完成,共["+outReelNum+"]盘任务"; return "需求单"+hSerial+"任务分配完成,共["+outReelNum+"]盘任务";
} }
private DataLog newTask(OutItem outItem, StoragePos pos){ private DataLog newTask(OutItem outItem, StoragePos pos){
......
...@@ -267,7 +267,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -267,7 +267,7 @@ public class QisdaDeviceController extends BaseController {
} }
String barcode = ""; String barcode = "";
String packageLoc = ""; int packageLoc = -1;
int reelInPackage = 0; int reelInPackage = 0;
if(packageShelf == null){ if(packageShelf == null){
log.info("机器人[3]获取包装料摆放位置信息,未找到包装料架["+packageRfid+"]的信息"); log.info("机器人[3]获取包装料摆放位置信息,未找到包装料架["+packageRfid+"]的信息");
...@@ -279,7 +279,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -279,7 +279,7 @@ public class QisdaDeviceController extends BaseController {
reelInPackage = reelInPackage + 1; reelInPackage = reelInPackage + 1;
if(barcode.isEmpty()){ if(barcode.isEmpty()){
barcode = shelfLoc.getBarcode(); barcode = shelfLoc.getBarcode();
packageLoc = shelfLoc.getLoc() + ""; packageLoc = shelfLoc.getLoc();
} }
} }
} }
...@@ -299,7 +299,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -299,7 +299,7 @@ public class QisdaDeviceController extends BaseController {
//当前大料架上空位数 //当前大料架上空位数
int emptyInBig = 0; int emptyInBig = 0;
String bigLoc = ""; int bigLoc = -1;
Map<Integer, ShelfLoc> bigShelfLocMap = bigShelf.getLocMap(); Map<Integer, ShelfLoc> bigShelfLocMap = bigShelf.getLocMap();
for (ShelfLoc shelfLoc : bigShelfLocMap.values()) { for (ShelfLoc shelfLoc : bigShelfLocMap.values()) {
...@@ -308,17 +308,17 @@ public class QisdaDeviceController extends BaseController { ...@@ -308,17 +308,17 @@ public class QisdaDeviceController extends BaseController {
emptyInBig = emptyInBig + 1; emptyInBig = emptyInBig + 1;
if(taskAppendInfo != null){ if(taskAppendInfo != null){
//找到了包装料架上物料的任务才能查找位置 //找到了包装料架上物料的任务才能查找位置
if(bigLoc.isEmpty()){ if(bigLoc <= 0){
if(taskAppendInfo.isFirstReelAction()){ if(taskAppendInfo.isFirstReelAction()){
//首套料,需要固定位置 //首套料,需要固定位置
if(shelfLoc.isInThisLoc(barcode)){ if(shelfLoc.isInThisLoc(barcode)){
bigLoc = shelfLoc.getLoc() + ""; bigLoc = shelfLoc.getLoc();
} }
}else{ }else{
//尾料,不需要固定位置,返回机器人架位的同时,锁定此位置 //尾料,不需要固定位置,返回机器人架位的同时,锁定此位置
bigShelf.lockForPackage(shelfLoc,barcode); bigShelf.lockForPackage(shelfLoc,barcode);
InquiryShelfBean.updateShelfInfo(bigShelf); InquiryShelfBean.updateShelfInfo(bigShelf);
bigLoc = shelfLoc.getLoc() + ""; bigLoc = shelfLoc.getLoc();
} }
} }
} }
...@@ -326,7 +326,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -326,7 +326,7 @@ public class QisdaDeviceController extends BaseController {
} }
if(packageTask == 0){ if(packageTask == 0){
log.info("已无包装料任务,更改料架可放包装料数量"+ emptyInBig + "为0"); //log.info("已无包装料任务,更改料架可放包装料数量"+ emptyInBig + "为0");
//emptyInBig = 0; //emptyInBig = 0;
} }
...@@ -334,10 +334,10 @@ public class QisdaDeviceController extends BaseController { ...@@ -334,10 +334,10 @@ public class QisdaDeviceController extends BaseController {
Map<String,Object> resultMap = new HashMap<>(); Map<String,Object> resultMap = new HashMap<>();
resultMap.put("barcode", barcode); resultMap.put("barcode", barcode);
//大料架上可放包装料数量 //大料架上可放包装料数量
resultMap.put("emptyInBig", emptyInBig+ ""); resultMap.put("emptyInBig", emptyInBig);
//包装料架上剩余的包装料数量(包含当前获取的物料) //包装料架上剩余的包装料数量(包含当前获取的物料)
resultMap.put("reelInPackage", reelInPackage +""); resultMap.put("reelInPackage", reelInPackage);
resultMap.put("packageTask", packageTask +""); resultMap.put("packageTask", packageTask);
resultMap.put("packageRfid", packageRfid); resultMap.put("packageRfid", packageRfid);
resultMap.put("packageLoc", packageLoc); resultMap.put("packageLoc", packageLoc);
resultMap.put("bigRfid", bigShelf.tempRfid()); resultMap.put("bigRfid", bigShelf.tempRfid());
...@@ -680,7 +680,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -680,7 +680,7 @@ public class QisdaDeviceController extends BaseController {
if(!task.isFinished() && !task.isCancel() && task.isCheckOutTask()){ if(!task.isFinished() && !task.isCancel() && task.isCheckOutTask()){
totalTaskCount = totalTaskCount + 1; totalTaskCount = totalTaskCount + 1;
if(task.isPackageReel()){ if(task.isPackageReel()){
if(task.isCutReel()){ if(task.isCutReel() || task.isUrgentReel()){
cutPackageTask = cutPackageTask + 1; cutPackageTask = cutPackageTask + 1;
}else{ }else{
packageTask = packageTask + 1; packageTask = packageTask + 1;
...@@ -700,38 +700,32 @@ public class QisdaDeviceController extends BaseController { ...@@ -700,38 +700,32 @@ public class QisdaDeviceController extends BaseController {
int bigEmpty = 0; int bigEmpty = 0;
int packageEmpty = 0; int packageEmpty = 0;
if(cacheTask != null ){ String hSerial = outInfoCache.getCurrentOrderHSerial();
AppendInfo appendInfo = cacheTask.getAppendInfo(); ShelfInfo shelfInfo = inquiryShelfBean.findSameShelf(hSerial,rfid);
String hSerial = appendInfo.gethSerial(); if(shelfInfo != null){
ShelfInfo shelfInfo = inquiryShelfBean.findSameShelf(hSerial,rfid); Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap();
if(shelfInfo != null){ for (ShelfLoc shelfLoc : locMap.values()) {
Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap(); if(shelfLoc.isEmpty()){
for (ShelfLoc shelfLoc : locMap.values()) { if(shelfLoc.isSmallLoc()){
if(shelfLoc.isEmpty()){ smallEmpty = smallEmpty + 1;
if(shelfLoc.isSmallLoc()){ }else if(shelfLoc.isBigLoc()){
smallEmpty = smallEmpty + 1; bigEmpty = bigEmpty + 1;
}else if(shelfLoc.isBigLoc()){ }else if(shelfLoc.isPackageLoc()){
//包装料架
if(StorageConstants.SHEFL_TYPE.isAShelf(shelfInfo.getShelfType())){
packageEmpty = packageEmpty + 1;
}else{
//大料架,并且不是首套料
bigEmpty = bigEmpty + 1; bigEmpty = bigEmpty + 1;
}else if(shelfLoc.isPackageLoc()){
//包装料架
if(StorageConstants.SHEFL_TYPE.isAShelf(shelfInfo.getShelfType())){
packageEmpty = packageEmpty + 1;
}else if(!appendInfo.isFirstReelAction()){
//大料架,并且不是首套料
bigEmpty = bigEmpty + 1;
}
//首套料,需要按顺序
// if(appendInfo.isFirstReelAction()){
// //packageEmpty = packageEmpty + 1;
// }else{
// //补料盘不需要按顺序,具体还可以放多少,到包装料工位再确定
// bigEmpty = bigEmpty + 1;
// }
} }
} }
} }
} }
}else{
//没找到料架,小料空位和大料空位都返回100
smallEmpty = 100;
bigEmpty = 100;
packageEmpty = 100;
} }
//剩余的任务数 //剩余的任务数
......
...@@ -784,11 +784,11 @@ public class TaskService implements ITaskService { ...@@ -784,11 +784,11 @@ public class TaskService implements ITaskService {
if(!Strings.isNullOrEmpty(barcode)){ if(!Strings.isNullOrEmpty(barcode)){
finishedTaskMap.put(task.getBarcode(), task); finishedTaskMap.put(task.getBarcode(), task);
} }
task.setStatus(StorageConstants.OP_STATUS.CANCEL.name()); task.setStatus(StorageConstants.OP_STATUS.CANCEL.name());
dataLogDao.save(task); dataLogDao.save(task);
log.info("任务["+task.getId() + "] posName["+task.getPosName()+"] Reel Id["+task.getBarcode()+"]取消成功"); log.info("任务["+task.getId() + "] posName["+task.getPosName()+"] Reel Id["+task.getBarcode()+"]取消成功");
finishedOrderTask(task); finishedOrderTask(task);
InquiryShelfBean.cancelReelTask(task);
return true; return true;
} }
return false; return false;
...@@ -806,15 +806,14 @@ public class TaskService implements ITaskService { ...@@ -806,15 +806,14 @@ public class TaskService implements ITaskService {
//发送取消(发料)指令到佳世达 //发送取消(发料)指令到佳世达
if(task.isCheckOutTask()){ if(task.isCheckOutTask()){
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode()); AppendInfo taskAppendInfo = task.getAppendInfo();
//if(barcode.needToQisda()){ if(taskAppendInfo.isFirstReelAction() || taskAppendInfo.isTailAction()){
log.info("["+task.getBarcode()+"]任务已出库完成,但未放上小车,发送E状态到佳世达"); Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
log.info("["+task.getBarcode()+"]任务已出库完成,但未放上小车,发送E状态到佳世达,同时解除料架架位");
InquiryShelfBean.cancelReelTask(task);
QisdaApiController.VMIMateriaRecAss(task, barcode, "E"); QisdaApiController.VMIMateriaRecAss(task, barcode, "E");
//} }
} }
//TODO:如果是首盘料的料架任务,需要填充料架相应的架位,否则料架会卡在那里
finishedTaskMap.remove(task.getBarcode()); finishedTaskMap.remove(task.getBarcode());
} }
...@@ -1523,7 +1522,7 @@ public class TaskService implements ITaskService { ...@@ -1523,7 +1522,7 @@ public class TaskService implements ITaskService {
task = dataLogDao.save(task); task = dataLogDao.save(task);
Barcode barcode = pos.getBarcode(); // Barcode barcode = pos.getBarcode();
// if(barcode != null){ // if(barcode != null){
// if(barcode.needToQisda()){ // if(barcode.needToQisda()){
// log.info("非测试物料["+barcode.getBarcode()+"]出库" + barcode.getAppendInfo()); // log.info("非测试物料["+barcode.getBarcode()+"]出库" + barcode.getAppendInfo());
...@@ -2032,48 +2031,48 @@ public class TaskService implements ITaskService { ...@@ -2032,48 +2031,48 @@ public class TaskService implements ITaskService {
* 更新工单状态信息 * 更新工单状态信息
*/ */
private synchronized void finishedOrderTask(DataLog task){ private synchronized void finishedOrderTask(DataLog task){
if(StorageConstants.OP.CHECKOUT == task.getType()){ // if(StorageConstants.OP.CHECKOUT == task.getType()){
//更新工单状态 // //更新工单状态
String orderNo = task.getSourceName(); // String orderNo = task.getSourceName();
if(!Strings.isNullOrEmpty(orderNo)){ // if(!Strings.isNullOrEmpty(orderNo)){
LiteOrder order = liteOrderMap.get(orderNo); // LiteOrder order = liteOrderMap.get(orderNo);
if(order == null){ // if(order == null){
log.info("缓存中未找到["+orderNo+"],从数据库中重新加载"); // log.info("缓存中未找到["+orderNo+"],从数据库中重新加载");
order = liteOrderDao.findWithItemsByOrderNo(orderNo); // order = liteOrderDao.findWithItemsByOrderNo(orderNo);
} // }
if(order != null){ // if(order != null){
//任务是取消的,需要将总待出库数量-1 // //任务是取消的,需要将总待出库数量-1
if(task.isCancel()){ // if(task.isCancel()){
order.setTaskReelCount(order.getTaskReelCount() -1); // order.setTaskReelCount(order.getTaskReelCount() -1);
log.info("工单["+orderNo+"]的任务"+task.getPartNumber()+"["+task.getBarcode()+"]已取消,任务数-1="+order.getFinishedReelCount() + "/" + order.getTaskReelCount()); // log.info("工单["+orderNo+"]的任务"+task.getPartNumber()+"["+task.getBarcode()+"]已取消,任务数-1="+order.getFinishedReelCount() + "/" + order.getTaskReelCount());
}else if(task.isFinished()){ // }else if(task.isFinished()){
order.setFinishedReelCount(order.getFinishedReelCount() + 1); // order.setFinishedReelCount(order.getFinishedReelCount() + 1);
String orderItemId = task.getSubSourceId(); // String orderItemId = task.getSubSourceId();
List<LiteOrderItem> items = new ArrayList<>(); // List<LiteOrderItem> items = new ArrayList<>();
for (LiteOrderItem liteOrderItem : order.getOrderItems()) { // for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
if(liteOrderItem.getId().equals(orderItemId)){ // if(liteOrderItem.getId().equals(orderItemId)){
log.info("工单["+orderNo+"]的任务"+task.getPartNumber()+"["+task.getBarcode()+"]出库完成,已完成数量+1="+order.getFinishedReelCount()+"/" + order.getTaskReelCount()); // log.info("工单["+orderNo+"]的任务"+task.getPartNumber()+"["+task.getBarcode()+"]出库完成,已完成数量+1="+order.getFinishedReelCount()+"/" + order.getTaskReelCount());
//更新对应条目的已出库数量和出库盘数 // //更新对应条目的已出库数量和出库盘数
liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum()); // liteOrderItem.setOutNum(liteOrderItem.getOutNum() + task.getNum());
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1); // liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem = liteOrderItemDao.save(liteOrderItem); // liteOrderItem = liteOrderItemDao.save(liteOrderItem);
} // }
items.add(liteOrderItem); // items.add(liteOrderItem);
} // }
}else{ // }else{
log.error("工单["+orderNo+"]的任务["+task.getBarcode()+"]完成时,状态为:"+ task.getStatus()); // log.error("工单["+orderNo+"]的任务["+task.getBarcode()+"]完成时,状态为:"+ task.getStatus());
} // }
if(order.getFinishedReelCount() >= order.getTaskReelCount()){ // if(order.getFinishedReelCount() >= order.getTaskReelCount()){
log.info("工单["+orderNo+"]的出库任务已完成,共出库:"+ order.getFinishedReelCount() +" 盘"); // log.info("工单["+orderNo+"]的出库任务已完成,共出库:"+ order.getFinishedReelCount() +" 盘");
order.finishedTasks(); // order.finishedTasks();
} // }
liteOrderDao.save(order); // liteOrderDao.save(order);
liteOrderMap.put(orderNo, order); // liteOrderMap.put(orderNo, order);
} else{ // } else{
log.error("完成任务时,未找到工单["+orderNo+"]信息"); // log.error("完成任务时,未找到工单["+orderNo+"]信息");
} // }
} // }
} // }
} }
} }
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
</display:column> </display:column>
<display:column titleKey="checkOut.operate" media="html"> <display:column titleKey="checkOut.operate" media="html">
<c:if test="${outInfo.sendStatus != 2}"> <c:if test="${outInfo.sendStatus != 2 && outInfo.taskNum == 0}">
<button class="btn yellow" id="btn${outInfo.hSerial}" <button class="btn yellow" id="btn${outInfo.hSerial}"
onclick="executeOut('${outInfo.hSerial}')"> onclick="executeOut('${outInfo.hSerial}')">
<i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button> <i class="fa fa-sign-out"></i><fmt:message key="button.checkout"/></button>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!