Commit 5bb658b7 sunke

流水线料盘全部放上托盘后,提前出库下一个需求单

切换需求单时导致双层线上一需求单的最后一个料架不放行的问题修正
提前出库下一需求单时,导致紧急料需求单执行的问题修正
执行队列中有多个需求单时,只保留当前,其他包装仓未完成需求单放入未完成列表中

被取消入库的料盘再次入库时,解除库位禁用
需求单无绑定料盘时,用蓝框标识
1 个父辈 d8b78794
......@@ -483,3 +483,25 @@
>> - code: 0为正常,其他为异常,(未传参数, 未找到有效条码,多个有效条码)
>> - msg:消息,
>> - data: true 可以放上皮带线 false 继续留在环形线
"type":"task"或"error"或"info"
machine: 机器名称(如:料仓一)
type: 类型(task表示任务,error表示错误,info表示提示消息)
part: 部件名称(如:进出轴)
task: 任务名称(如: 入库)
step: 步骤(如:进出轴退回)
time: 开始时间(yyyy-MM-dd HH:mm:ss)
endTime: 结束时间(yyyy-MM-dd HH:mm:ss)
duration: 持续时长(秒)
{"device":"环形线","taskName":"待机任务","TargetPlace":"Standby","TaskStep":"END","MissionInfo":"在待机位检测到任务,执行任务","DateTime":"2021-06-15 23:30:56","EndDateTime":"2021-06-16 00:02:53","TaskRunTime":"31.95","Type":"Task"}
{"AGVNum":"15号车","DateTime":"2021-06-16 00:32:40","EndDateTime":"2021-06-16 00:33:10","ErrorMsg":"在A1停留超时","ErrorLastTime":"0.50","TaskName":"取料串任务","AGVMissionName":"MoveA1","MissionInfo":"待机位/充电位收到任务,开始执行","TargetPlace":"A1","Type":"Error"}
......@@ -405,6 +405,21 @@ public class Barcode extends BaseMongoBean {
return 0;
}
public String getInStoreTime(){
String time = "";
if(putInTime != -1){
long minutes = (System.currentTimeMillis() - getPutInTime()) / 60000;
long hour = minutes / 60;
long day = hour / 24;
if(day > 0){
time = day + "天";
}
hour = hour % 24;
time = time + hour +"小时";
}
return time;
}
public String getInFixture() {
return inFixture;
}
......
......@@ -627,6 +627,20 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
}
/**
* 是否出仓完成
*/
public boolean isOutBox(){
return status.toLowerCase().equals("outbox");
}
/**
* 是否在移栽上
*/
public boolean isOnMoving(){
return status.toLowerCase().equals("moving");
}
/**
* 非等待状态,超过10分钟未更新状态,等待状态,超过30分钟未更新过状态,认为超时
*/
public boolean isTimeout(){
......
......@@ -113,15 +113,15 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {
return tasks;
}
public List<DataLog> findUnExecuteTasks(String executingHSerial) {
Criteria c = Criteria.where("appendInfo.hSerial").ne(executingHSerial).and("status").in(StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.PAUSE.name());
Query query = Query.query(c);
List<DataLog> feederTasks = findByQuery(query);
if(feederTasks == null){
feederTasks = new ArrayList<>();
}
return feederTasks;
}
// public List<DataLog> findUnExecuteTasks(String executingHSerial) {
// Criteria c = Criteria.where("appendInfo.hSerial").ne(executingHSerial).and("status").in(StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.PAUSE.name());
// Query query = Query.query(c);
// List<DataLog> feederTasks = findByQuery(query);
// if(feederTasks == null){
// feederTasks = new ArrayList<>();
// }
// return feederTasks;
// }
@Override
public List<DataLog> findUnFinishedTasks(String executingHSerial){
......
......@@ -138,12 +138,43 @@ public class OutInfoCache {
}
}
public void executeOutTask(){
private void setNextHSerialToCurrent(){
String nextHSerial = QisdaCache.getNextOrderHSerial();
if(Strings.isNotBlank(nextHSerial)){
//没有预执行需求单时,不需要切换
//当前需求单的所有非包装料全部放上了料架时需要进行切换
boolean isCurrentHSerialEnd = true;
String currentHSerial = QisdaCache.getCurrentOrderHSerial();
if(Strings.isNotBlank(currentHSerial)){
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
//非包装料
String taskHSerial = task.getAppendInfo().gethSerial();
if(!task.isPackageReel() && currentHSerial.equals(taskHSerial)){
if(!task.isFinished() && !task.isCancel()){
//未取消并且未完成,说明还有料没放到料架上
isCurrentHSerialEnd = false;
}
}
}
}
if(isCurrentHSerialEnd){
//当前执行需求单流水线任务全部结束时,切换下一需求单为当前需求单
log.info("当前需求单["+currentHSerial+"]流水线任务全部放上料架");
QisdaCache.setNextOrderHSerialToCurrent();
}
}
}
public void executeOutTask(){
setNextHSerialToCurrent();
Date now = new Date();
List<OutInfo> cachedOutInfos = getCachedOutInfos();
for (OutInfo unEndOutInfo : cachedOutInfos) {
if(!unEndOutInfo.isClosed() && unEndOutInfo.isTaskEnd() && !unEndOutInfo.isReelCutAction()){
long lastEndTime = unEndOutInfo.getTaskEndTime();
if(lastEndTime>0 && now.getTime() - lastEndTime >= 5 * 60 * 1000){
......@@ -239,28 +270,10 @@ public class OutInfoCache {
}while (true);
if(outInfoToExecute != null){
//先看当前是否有执行中的任务
Collection<DataLog> queueTasks = taskService.getQueueTasks();
List<DataLog> allTasks = taskService.getFinishedTasks();
if(!queueTasks.isEmpty()){
allTasks.addAll(queueTasks);
}
//是否有工单料任务
boolean hasOrderTask = false;
for (DataLog dataLog : allTasks) {
if(dataLog.isCheckOutTask()){
if(!dataLog.isUrgentReel() && !dataLog.isCutReel() && !dataLog.isLessSendReel()){
//工单料(不是指定料也不是分盘料即首盘或补料)
hasOrderTask = true;
}
}
}
if(!hasOrderTask){
//无工单料任务,如果有优先执行任务先执行,如果没有执行到达建议时间的任务
checkOutOutItems(outInfoToExecute.gethSerial());
}
}
}
/**
* 添加事件信息
......@@ -521,10 +534,22 @@ public class OutInfoCache {
return ResultBean.newErrorResult(2201,"无需求单号参数hSerial,无法关闭");
}
log.info("开始关闭需求单hSerial=["+hSerial+"]");
OutInfo outInfoToClose = getOutInfoFromCache(hSerial);
int count = 0;
if(outInfoToClose.isUrgentAction()){
List<StoragePos> storagePosList = storagePosDao.listSoSeqBindPos("HSerial-" + hSerial);
for (StoragePos storagePos : storagePosList) {
count = count + 1;
log.info("解除["+storagePos.getBarcode()+"]的需求单hSerial=["+hSerial+"]绑定,累计解除"+count);
storagePosDao.unbindReel(storagePos);
}
}
int sendStatus = StorageConstants.SEND_STATUS.CLOSED;
outInfoDao.updateStatus(hSerial, -1 ,sendStatus);
removeFromCache(hSerial);
return ResultBean.newOkResult("需求单hSerial=["+hSerial+"]关闭成功","");
return ResultBean.newOkResult("需求单hSerial=["+hSerial+"]关闭成功,解除绑定["+count+"]盘","");
}
public ResultBean closeSoSeq(String soseq){
......@@ -881,21 +906,21 @@ public class OutInfoCache {
//本次任务已结束,清理料架(首盘和补料使用的C和D料架不清理)
long lastTaskEndTime = outInfo.getTaskEndTime();
if(lastTaskEndTime <= 0){
//outInfo是第一次执行的首盘或补料需求单,更新上次需求单使用过的料架
if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(outInfo.gethSerial());
QisdaCache.updateUsedRfid(usedRfidList);
log.info("更新需求单["+outInfo.gethSerial()+"]使用过的料架:" + String.join("," + usedRfidList));
}
}
// long lastTaskEndTime = outInfo.getTaskEndTime();
// if(lastTaskEndTime <= 0){
// //outInfo是第一次执行的首盘或补料需求单,更新上次需求单使用过的料架
// if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
// List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(outInfo.gethSerial());
// QisdaCache.updateUsedRfid(usedRfidList);
// log.info("更新需求单["+outInfo.gethSerial()+"]使用过的料架:" + String.join("," + usedRfidList));
//
// }
// }
String eventMsg = "任务结束";
outInfo = addEventItem(outInfo, eventMsg);
InquiryShelfBean.clearShelf(outInfo.gethSerial());
//InquiryShelfBean.clearShelf(outInfo.gethSerial());
outInfo.setTaskEndTime(System.currentTimeMillis());
outInfoDao.updateTaskEndTime(outInfo.gethSerial(), outInfo.getTaskEndTime());
......@@ -980,37 +1005,36 @@ public class OutInfoCache {
}
String hSerial = outInfo.gethSerial();
String executingHSerial = QisdaCache.getCurrentOrderHSerial();
if(hSerial.equals(executingHSerial)){
return ResultBean.newErrorResult(1006,"需求单["+outInfo.gethSerial()+"]正在执行",false);
}
// if(!outInfo.isNew() && !outInfo.isTaskEnd()){
// return ResultBean.newErrorResult(1007,"需求单["+outInfo.gethSerial()+"]执行未完成",false);
// }
//如果有其他任务在执行,不允许出库
Collection<DataLog> queueTasks = taskService.getQueueTasks();
List<DataLog> allTasks = taskService.getFinishedTasks();
if(!queueTasks.isEmpty()){
allTasks.addAll(queueTasks);
}
//是否有工单料任务
boolean hasOrderTask = false;
boolean hasUrgenReel = false;
String currentHSerial = QisdaCache.getCurrentOrderHSerial();
//当前需求单的所有非包装料是否全部放上了皮带线
boolean isAllCurrentHSerialOnBelt = true;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if(dataLog.isCheckOutTask()){
String taskHSerial = dataLog.getAppendInfo().gethSerial();
if(hSerial.equals(taskHSerial)){
return ResultBean.newErrorResult(1006,"需求单["+outInfo.gethSerial()+"]正在执行",false);
}
//if(!dataLog.isUrgentReel() && !dataLog.isCutReel() && !dataLog.isLessSendReel()){
if(dataLog.getAppendInfo().isTailAction() || dataLog.getAppendInfo().isFirstReelAction()){
//工单料(不是指定料也不是分盘料即首盘或补料)
hasOrderTask = true;
if(!dataLog.isPackageReel() && currentHSerial.equals(taskHSerial)){
if(dataLog.isWait() || dataLog.isExecuting() || dataLog.isOutBox() || dataLog.isOnMoving()){
isAllCurrentHSerialOnBelt = false;
}
}
}else{
//分盘和紧急料或缺料补发的料
String taskHSerial = dataLog.getAppendInfo().gethSerial();
if(taskHSerial.equals(outInfo.gethSerial())){
return ResultBean.newErrorResult(1002,"当前需求单还有未完成的任务",false);
}
// if(taskHSerial.equals(outInfo.gethSerial())){
// return ResultBean.newErrorResult(1002,"当前需求单还有未完成的任务",false);
// }
hasUrgenReel = true;
}
}
......@@ -1025,9 +1049,15 @@ public class OutInfoCache {
//首盘和补料
if(!outInfo.isReelCutAction() && !outInfo.isUrgentAction()){
if(!outInfoExecuted && hasOrderTask){
//预出库的需求单
String nextHSerial = QisdaCache.getNextOrderHSerial();
if(Strings.isNotBlank(nextHSerial)){
return ResultBean.newErrorResult(1008,"已有预出库的需求单["+nextHSerial+"]",false);
}
if(!outInfoExecuted && !isAllCurrentHSerialOnBelt){
//未执行过且还有未完成的任务
return ResultBean.newErrorResult(1003,"全部任务完成后才可执行",false);
return ResultBean.newErrorResult(1003,"非包装料全部放上皮带线后才可执行",false);
}
}
......@@ -1077,7 +1107,6 @@ public class OutInfoCache {
public synchronized ResultBean executeOutItems(String hSerial){
//OutInfo outInfo = outInfoDao.findByHSerial(hSerial);
OutInfo outInfoToExecute = getOutInfoFromCache(hSerial);
ResultBean resultBean = checkOutInfoCanOut(outInfoToExecute);
if(resultBean != null){
return resultBean;
......@@ -1118,7 +1147,7 @@ public class OutInfoCache {
}
}
if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
QisdaCache.setCurrentOrderHSerial(outInfo.gethSerial());
QisdaCache.executeHSerial(outInfo.gethSerial());
}
}else{
//已经执行过的首盘和补料,如果是工单的最后一个需求单,关闭工单
......@@ -1714,12 +1743,15 @@ public class OutInfoCache {
if(outItem.isUrgentAction()){
task.setUrgentReel(true);
if(DataCache.isProductionFor(DataCache.CUSTOMER.QISDA4D)){
if(outItem.isCheckAction()){
//盘点出库,不走紧急出料口
//4D盘点出库,不走紧急出料口
task.setUrgentReel(false);
}
}
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
if(storage.isPackage()){
//包装料仓
......
......@@ -47,7 +47,7 @@ public class DataCache{
/**
* 佳世达
*/
public static String QISDA = "QISDA";
public static String QISDA4D = "4D";
/**
* 测试程序
......@@ -395,17 +395,6 @@ public class DataCache{
// if(barcodeFromRule.getPlateSize() != component.getPlateSize()){
// String msg = barcodeFromRule.getBarcode() + "测量尺寸["+barcodeFromRule.getSizeStr()+"]与给定尺寸["+component.getSizeStr()+"]不符";
// throw new ValidateException(msg);
// }else{
// //如果厚度小于4mm,使用确认的尺寸入库
// int diffHeight = barcodeFromRule.getHeight() - component.getHeight();
// if(Math.abs(diffHeight) > 4){
// String msg = barcodeFromRule.getBarcode() + "测量厚度["+barcodeFromRule.getSizeStr()+"]与给定厚度["+component.getSizeStr()+"]误差过大";
// throw new ValidateException(msg);
// }else if(diffHeight !=0 && Math.abs(diffHeight) <= 4){
// log.info(barcodeFromRule.getBarcode() + "测量尺寸["+barcodeFromRule.getSizeStr()+"]与给定寸["+component.getSizeStr()+"]厚度误差在4mm以内,使用给定尺寸进行入库");
// barcodeFromRule.setHeight(component.getHeight());
// barcodeFromRule = barcodeManager.save(barcodeFromRule);
// }
// }
barcodeFromRule.setPlateSize(component.getPlateSize());
......
......@@ -40,9 +40,10 @@ public class MainTimer {
public void init(){
String currentorderHSerial = qisdaCache.getCurrentOrderHSerial();
log.info("加载未完成的任务,当前执行需求单["+currentorderHSerial+"]");
List<DataLog> unExecuteTasks = dataLogDao.findUnFinishedTasks(currentorderHSerial);
String currentOrderHSerial = qisdaCache.getCurrentOrderHSerial();
String nextOrderHSerial = qisdaCache.getNextOrderHSerial();
log.info("加载未完成的任务,当前执行需求单["+currentOrderHSerial+"],预执行需求单["+nextOrderHSerial+"]");
List<DataLog> unExecuteTasks = dataLogDao.findUnFinishedTasks(currentOrderHSerial);
for (DataLog unExecuteTask : unExecuteTasks) {
if(unExecuteTask.isExecuting() || unExecuteTask.isWait()){
taskService.addTaskToExecute(unExecuteTask);
......
......@@ -36,6 +36,8 @@ public class QisdaCache {
private static String CURRENT_ORDER_HSERIAL_KEY = "currentOrderHSerial";
private static String NEXT_ORDER_HSERIAL_KEY = "nextOrderHSerial";
/**
* RFID绑定的DN单信息Key
*/
......@@ -61,9 +63,9 @@ public class QisdaCache {
private static String currentOrderHSerial;
/**
* 上个需求单使用的料架信息
* 下一执行的需求单(当前工单需求单的非包装物料全部放上皮带线才可执行下一需求单)
*/
private static List<String> lastHSerialUsedRfidList;
private static String nextOrderHSerial;
/**
* RFID绑定DN单和Facility, Key为RFID, Value为DN单信息
......@@ -309,39 +311,32 @@ public class QisdaCache {
* 当前正在执行的工单需求单
* @param executeHSerial
*/
public static void setCurrentOrderHSerial(String executeHSerial) {
if(currentOrderHSerial == null){
currentOrderHSerial = "";
}
String oldHSerial = currentOrderHSerial;
log.info("设置当前正在执行的工单料需求为:" + executeHSerial+"清理之前["+oldHSerial+"]出库使用的料架");
InquiryShelfBean.clearShelf(oldHSerial);
currentOrderHSerial = executeHSerial;
// public static void setCurrentOrderHSerial(String executeHSerial) {
//
// if(currentOrderHSerial == null){
// currentOrderHSerial = "";
// }
// String oldHSerial = currentOrderHSerial;
// log.info("设置当前正在执行的工单料需求为:" + executeHSerial+"清理之前["+oldHSerial+"]出库使用的料架");
// InquiryShelfBean.clearShelf(oldHSerial);
// currentOrderHSerial = executeHSerial;
// cacheInfoDao.updateCacheItem(CURRENT_ORDER_HSERIAL_KEY, currentOrderHSerial);
// }
public static void executeHSerial(String executeHSerial){
log.info("设置预出库工单料需求为:" + executeHSerial+"");
nextOrderHSerial = executeHSerial;
cacheInfoDao.updateCacheItem(NEXT_ORDER_HSERIAL_KEY, nextOrderHSerial);
}
public static synchronized void setNextOrderHSerialToCurrent(){
if(Strings.isNotBlank(nextOrderHSerial)){
log.info("切换当前正在执行的工单料需求单:" + currentOrderHSerial + " => " + nextOrderHSerial);
currentOrderHSerial = nextOrderHSerial;
cacheInfoDao.updateCacheItem(CURRENT_ORDER_HSERIAL_KEY, currentOrderHSerial);
nextOrderHSerial = "";
cacheInfoDao.updateCacheItem(NEXT_ORDER_HSERIAL_KEY, nextOrderHSerial);
}
public static void updateUsedRfid(List<String> usedRfidList){
String oldUsedRfid = "";
if(lastHSerialUsedRfidList != null){
oldUsedRfid = String.join(",",lastHSerialUsedRfidList);
}
String newUsedRfid = "";
if(usedRfidList != null){
newUsedRfid = String.join(",",usedRfidList);
}
log.info("已使用过的料架信息更新:["+oldUsedRfid+"]=>["+newUsedRfid+"]");
lastHSerialUsedRfidList = usedRfidList;
}
/**
* 是否是上个工单需求单使用过的料架
*/
public static boolean isLastHSerialUsedRfid(String rfid){
if(lastHSerialUsedRfidList != null){
return lastHSerialUsedRfidList.contains(rfid);
}
return false;
}
/**
......@@ -360,6 +355,21 @@ public class QisdaCache {
}
/**
* 正在执行的等待放上皮带线的工单需求单
*/
public static String getNextOrderHSerial() {
if(nextOrderHSerial == null){
CacheInfo cacheInfo = cacheInfoDao.getCacheInfo(NEXT_ORDER_HSERIAL_KEY);
if(cacheInfo == null){
nextOrderHSerial = "";
}else{
nextOrderHSerial = cacheInfo.getCacheValue().toString();
}
}
return nextOrderHSerial;
}
/**
* 加载请求指令信息
*/
private static void initReelLockPosMap(){
......
......@@ -957,6 +957,7 @@ public class QisdaDeviceController extends BaseController {
if(cacheTask != null){
AppendInfo appendInfo = cacheTask.getAppendInfo();
boolean putResult = InquiryShelfBean.putInShelf(cacheTask,rfid, Integer.valueOf(rfidLoc));
//紧急料和分盘料放入失败不影响
boolean isCutTask = cacheTask.isUrgentReel() || cacheTask.isCutReel() || cacheTask.isLessSendReel();
if(!isCutTask && !putResult){
......@@ -1103,16 +1104,14 @@ public class QisdaDeviceController extends BaseController {
}
}
String currentOrderHSerial = QisdaCache.getCurrentOrderHSerial();
int packageTask = 0;
int cutPackageTask = 0;
int cutTask = 0;
int smallTask = 0;
int bigTask = 0;
Collection<DataLog> queueTasks = taskService.getQueueTasks();
List<DataLog> allTasks = taskService.getFinishedTasks();
if(!queueTasks.isEmpty()){
allTasks.addAll(queueTasks);
}
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if(!task.isFinished() && !task.isCancel() && task.isCheckOutTask()){
if(task.isPackageReel()){
......@@ -1121,7 +1120,10 @@ public class QisdaDeviceController extends BaseController {
}else{
packageTask = packageTask + 1;
}
}else if(task.isCutReel() || task.isUrgentReel() || task.isLessSendReel() || task.getAppendInfo().isCheckAction()){
}else{
String taskHSerial = task.getAppendInfo().gethSerial();
if(currentOrderHSerial.equals(taskHSerial)){
if(task.isCutReel() || task.isUrgentReel() || task.isLessSendReel() || task.getAppendInfo().isCheckAction()){
cutTask = cutTask + 1;
}else if(task.isSmallReel()){
smallTask = smallTask + 1;
......@@ -1130,19 +1132,21 @@ public class QisdaDeviceController extends BaseController {
}
}
}
}
}
//当前料架还可放入的料盘数
int smallEmpty = 0;
int bigEmpty = 0;
int packageEmpty = 0;
String hSerial = QisdaCache.getCurrentOrderHSerial();
if(cacheTask != null){
hSerial = cacheTask.getAppendInfo().gethSerial();
}
List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(hSerial);
// String hSerial = QisdaCache.getCurrentOrderHSerial();
// if(cacheTask != null){
// hSerial = cacheTask.getAppendInfo().gethSerial();
// }
List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(currentOrderHSerial);
ShelfInfo shelfInfo = InquiryShelfBean.findSameShelf(hSerial,rfid);
ShelfInfo shelfInfo = InquiryShelfBean.findSameShelf(currentOrderHSerial,rfid);
if(shelfInfo != null){
Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap();
for (ShelfLoc shelfLoc : locMap.values()) {
......@@ -1163,24 +1167,10 @@ public class QisdaDeviceController extends BaseController {
}
}
}else{
//料架上一个工单使用过,直接放行,其他情况继续使用
boolean lastHSerialUsed = QisdaCache.isLastHSerialUsedRfid(rfid);
if(!lastHSerialUsed){
//没有使用过
smallEmpty = 100;
bigEmpty = 100;
packageEmpty = 100;
}else{
//为了料架能重用,如果当前执行的需求单料已经放上料架,则清空上一个需求单使用过的料架
if(!usedRfidList.isEmpty()){
log.info("料架["+rfid+"]上一个需求单已使用,当前需求单["+hSerial+"]物料已放上料架,清理上一个需求单使用过的料架");
QisdaCache.updateUsedRfid(null);
smallEmpty = 100;
bigEmpty = 100;
packageEmpty = 100;
}
}
}
......@@ -1573,7 +1563,13 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newErrorResult(-1,"未找到料盘["+barcode+"]的任务信息");
}else{
String hSerial = task.getAppendInfo().gethSerial();
boolean canReelToBelt = hSerial.equals(QisdaCache.getCurrentOrderHSerial());
OutInfo outInfo = outInfoCache.getOutInfoFromCache(hSerial);
boolean canReelToBelt = false;
if(outInfo != null && outInfo.isCheckAction()){
canReelToBelt = true;
}else{
canReelToBelt = hSerial.equals(QisdaCache.getCurrentOrderHSerial());
}
return ResultBean.newOkResult(canReelToBelt);
}
}
......
......@@ -716,7 +716,7 @@ public class StorageDataController extends BaseController {
}
} catch (Exception e) {
errorMsg = e.getMessage();
log.info("查找空库位失败:" + errorMsg);
log.error("查找空库位失败:" + errorMsg,e);
resultMap.put("result","105");
resultMap.put("msg",errorMsg);
}
......
......@@ -402,6 +402,7 @@ public class TaskService implements ITaskService {
appendInfo.setFacility("");
DNInfo dnInfo = QisdaCache.getDnInfo(inRFID);
if(dnInfo != null){
if(dnInfo.isDNIn()){
String pn = barcodeSave.getPartNumber();
DNItem dnItem = dnInfo.getItem(pn);
......@@ -420,6 +421,9 @@ public class TaskService implements ITaskService {
}else{
appendInfo.setDnNo("");
}
}else{
appendInfo.setDnNo("");
}
log.info("[" + inRFID + "]"+ barcodeSave.getBarcode() + " 上次入库DN单:" + oldDnNo + " 当前入库DN单:" + appendInfo.getDnNo());
......@@ -822,6 +826,8 @@ public class TaskService implements ITaskService {
if(prohibitePos){
//库位里面没有物料的不需禁用
if(!Strings.isNullOrEmpty(task.getBarcode())){
//不是需求单任务的出库,不屏蔽
if(!Strings.isNullOrEmpty(task.getAppendInfo().gethSerial())){
log.info("库位["+task.getPosName()+"]料盘["+task.getBarcode()+"]空出,禁用库位");
task.setOutOrder(-task.getOutOrder());
try {
......@@ -837,6 +843,8 @@ public class TaskService implements ITaskService {
}
}
task.setStopSendToQisda(true);
task = dataLogDao.save(task);
......@@ -985,7 +993,7 @@ public class TaskService implements ITaskService {
for (DataLog task : waitTasks) {
if(task.isCheckOutTask()) {
AppendInfo appendInfo = task.getAppendInfo();
if(appendInfo.isFirstReelAction() && !task.isLessSendReel()){
if(!task.isPackageReel() && appendInfo.isFirstReelAction() && !task.isLessSendReel()){
//首盘料
hasFirstReelAction = true;
}
......@@ -1945,6 +1953,10 @@ public class TaskService implements ITaskService {
storagePos.setBarcode(barcode);
storagePos.setUsed(true);
storagePos.setCanCheckOutTime(System.currentTimeMillis());
if(!storagePos.isEnabled()){
log.info("库位["+task.getPosName()+"]料盘["+task.getBarcode()+"]入库任务完成时库位已禁用,解除禁用库位");
storagePos.setEnabled(true);
}
storagePosManager.save(storagePos);
//更新缓存中的库存信息
......
......@@ -172,15 +172,15 @@
<%--&lt;%&ndash;<display:column property="barcode.amount" titleKey="数量"/>&ndash;%&gt;--%>
<%--<display:column property="barcode.lockName" titleKey="menu.inRule"/>--%>
<display:column property="posName" titleKey="checkOut.pos" sortProperty="posName" sortable="true"/>
<display:column titleKey="尺寸">
${pos.sizeStr}
</display:column>
<display:column property="barcode.appendInfo.facility" titleKey="Facility" sortProperty="barcode.appendInfo.facility" sortable="true"/>
<display:column titleKey="时间" sortProperty="barcode.putInDate" sortable="true">
<display:column titleKey="入库时间" sortProperty="barcode.putInDate" sortable="true">
<fmt:formatDate value="${pos.barcode.putInDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column>
<%--<display:column titleKey="在库时长">--%>
<%--${pos.barcode.inStoreTime}--%>
<%--</display:column>--%>
<display:column titleKey="barcode.amount" sortProperty="barcode.amount" sortable="true">
<c:if test="${pos.barcode.type == 1 || pos.barcode.type == 4}">-</c:if>
<c:if test="${pos.barcode.type != 1 && pos.barcode.type != 4}">${pos.barcode.amount} ${pos.barcode.appendInfo.cutMap}</c:if>
......
......@@ -158,7 +158,7 @@
<span class='label label-sm label-${fn:toLowerCase(dataLog.status)}'>
<fmt:message key="op.status.${fn:toLowerCase(dataLog.status)}"/>=${dataLog.locInfo}
</span>
<c:if test="${dataLog.wait || dataLog.executing}">
<c:if test="${dataLog.type==2 && (dataLog.wait || dataLog.executing)}">
<a href="#" onclick="cancelTask('${dataLog.id}')"><fmt:message key="button.cancel"/></a>
</c:if>
</display:column>
......
<%@ page import="com.myproject.util.StorageConstants" %>
<%@ page import="com.myproject.webapp.controller.webService.QisdaCache" %>
<%@ include file="/common/taglibs.jsp" %>
<%@ page language="java" pageEncoding="UTF-8" %>
......@@ -188,21 +189,27 @@
//var index = parseInt(i) + 1;
//var outItems = outInfo.outItems;
var moveHandle = '';
if(outInfo.firstExecuteTime <= 0){
//moveHandle = '<span class="glyphicon glyphicon-arrow-up" style="width:30px;display:none;"></span>';
}
// if(outInfo.firstExecuteTime >= 0){
// //moveHandle = '<span class="glyphicon glyphicon-arrow-up" style="width:30px;display:none;"></span>';
// }
var bgClass = '';
var pannelColor = 'panel-default';
if(outInfo.executing){
pannelColor = 'panel-success';
}
var bgClass = '';
var bindShelfInfo = outInfo.lineBindShelfInfo;
if(bindShelfInfo){
bgClass = 'bg-red';
}else{
if(outInfo.firstExecuteTime > 0 && outInfo.taskNum <=0){
bgClass = "bg-blue";
}
}
var mdate = new Date(outInfo.mdate).Format("yyyy-MM-dd hh:mm:ss");
var sdate = new Date(outInfo.sdate).Format("yyyy-MM-dd hh:mm:ss");
var createDate = new Date(outInfo.createDate).Format("yyyy-MM-dd hh:mm:ss");
......@@ -212,7 +219,7 @@
'<a class="accordion-toggle" data-toggle="collapse" href="#'+outInfo.hSerial+'">' +
moveHandle + //outInfo.firstExecuteTime +
'需求单:'+ outInfo.hSerial+' ['+outInfo.action+'] 工单: ' + outInfo.so +' 备料单: ' + outInfo.refno + '[' + outInfo.sendStatus +'] 工单序号:' + outInfo.soseq +
'<span class="right">创建时间: '+createDate+'</span>' +
//'<span class="right">创建时间: '+createDate+'</span>' +
'<span class="right">建议时间: '+sdate+'</span>' +
'<span class="right">必须时间: '+mdate+'</span>' +
//'<span class="right">['+outInfo.firstExecuteTime+']</span>' +
......@@ -233,6 +240,12 @@
return infoHtml;
}
function flushOutInfos(){
$.post("${ctx}/rest/api/qisda/device/currentOutLine", {}, function (currentOutLine) {
var currentOutHSerial = "";
if(currentOutLine){
currentOutHSerial = currentOutLine.data.hSerial;
}
$.post("${ctx}/service/store/qisda/outInfoList", {}, function (data) {
var executingHtml = '';
......@@ -245,8 +258,22 @@
var infoHtml = getOutInfoHtml(outInfo);
if(outInfo.executing || outInfo.sendLess || outInfo.firstExecuteTime > 0){
if(!outInfo.taskEnd && (outInfo.firstReelAction || outInfo.tailAction)){
if(outInfo.firstExecuteTime > 0 && outInfo.taskNum <=0){
waitHtml = waitHtml + infoHtml;
}else{
if(outInfo.executing){
if(currentOutHSerial == outInfo.hSerial){
executingHtml = executingHtml + infoHtml;
}else{
//priorityHtml = priorityHtml + infoHtml;
unfinishedHtml = unfinishedHtml + infoHtml;
}
}else{
unfinishedHtml = unfinishedHtml + infoHtml;
}
}
}else{
unfinishedHtml = unfinishedHtml + infoHtml;
}
......@@ -254,7 +281,7 @@
if(outInfo.reelCutAction){
unfinishedHtml = unfinishedHtml + infoHtml;
}else{
if(priorityHtml == ""){
if(priorityHtml == ''){
priorityHtml = priorityHtml + infoHtml;
}else{
waitHtml = waitHtml + infoHtml;
......@@ -290,6 +317,8 @@
});
});
});
}
flushOutInfos();
......
......@@ -469,7 +469,7 @@
var allTasks = {};
function updateTasks(){
function updateTasks(currentOutHSerial){
//任务列表
$.post("${ctx}/service/store/tasks", {}, function (data) {
var newTasks = [];
......@@ -502,10 +502,12 @@
options['icon']='fa fa-sign-out';
showStr = partNumber + "["+barcode+"]${out_label}"+posStr;
}else{
options['closable'] = false;
//options['onClick']= modifyClick;
}
var position = 'bottom right';
var showClass = 'label-'+status;
......@@ -553,9 +555,22 @@
}
var sourceStr = "";
var sourceColor = "normal";
if(data[item].sourceName){
sourceStr = "<br/>${source_label} " + data[item].sourceStr;
var sourceInfo = data[item].sourceStr;
if(sourceInfo.includes(currentOutHSerial+"_")){
sourceInfo = "<label style='background-color: green;'>" +sourceInfo +"</label>";
sourceColor = "current";
}
var sourceLabel = "${source_label}";
if(data[item].outOrder < 0){
sourceInfo = "<label style='background-color: red;'>" + sourceLabel +"</label>";
sourceColor = "empty";
}
sourceStr = "<br/>"+ sourceLabel +" " + sourceInfo;
}
options['sourceColor']= sourceColor;
options['msg']= showStr + statusMsg + data[item].locInfo + sourceStr;
options['showClass'] = showClass;
......@@ -563,7 +578,7 @@
if(!task){
cidTasks[taskId] = Lobibox.notify('success', options);
}else{
if(showClass != task.$options["showClass"] || position != task.$options["position"]){
if(showClass != task.$options["showClass"] || position != task.$options["position"] || sourceColor != task.$options["sourceColor"]){
task.remove();
delete cidTasks[taskId];
cidTasks[taskId] = Lobibox.notify('success', options);
......@@ -776,7 +791,15 @@
}, 1000);
setInterval(function(){
updateTasks("all");
$.post("${ctx}/rest/api/qisda/device/currentOutLine", {}, function (currentOutLine) {
var currentOutHSerial = "";
if (currentOutLine) {
currentOutHSerial = currentOutLine.data.hSerial;
}
updateTasks(currentOutHSerial);
});
flushStatus();
//flushLineMsg();
flushUsageItem();
......
......@@ -12,6 +12,112 @@
<div class="row">
<div class="col-md-12">
<ul class="timeline">
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2021</span>
<span class="time">07-06</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021070610</h2>
<div class="timeline-content">
<ul>
<li>需求单无绑定料盘时,用蓝框标识</li>
</ul>
</div>
</div>
</li>
<li class="timeline-blue">
<div class="timeline-time">
<span class="date">2021 </span>
<span class="time">06-29 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021062910</h2>
<div class="timeline-content">
<ul>
<li>被取消入库的料盘再次入库时,解除库位禁用</li>
</ul>
</div>
</div>
</li>
<li class="timeline-yellow">
<div class="timeline-time">
<span class="date">2021 </span>
<span class="time">06-28 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021062815</h2>
<div class="timeline-content">
<ul>
<li>主页面不允许取消任务</li>
<li>客户端取消出库任务时,如果是同一条码清仓位的,不对库位进行屏蔽</li>
<li>出库任务为空出时,主界面任务框的来源标签变为红色</li>
</ul>
</div>
</div>
</li>
<li class="timeline-grey">
<div class="timeline-time">
<span class="date">2021</span>
<span class="time">06-23</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021062314</h2>
<div class="timeline-content">
<ul>
<li>切换需求单时导致双层线上一需求单的最后一个料架不放行的问题修正</li>
<li>提前出库下一需求单时,导致紧急料需求单执行的问题修正</li>
<li>执行队列中有多个需求单时,只保留当前,其他包装仓未完成需求单放入未完成列表中</li>
</ul>
</div>
</div>
</li>
<li class="timeline-purple">
<div class="timeline-time">
<span class="date">2021</span>
<span class="time">06-22</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021062213</h2>
<div class="timeline-content">
<ul>
<li>提前出库下一需求单时,导致绑定DN单无法入库问题修正</li>
</ul>
</div>
</div>
</li>
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2021</span>
<span class="time">06-17</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2021061710</h2>
<div class="timeline-content">
<ul>
<li>流水线料盘全部放上托盘后,提前出库下一个需求单</li>
</ul>
</div>
</div>
</li>
<li class="timeline-blue">
<div class="timeline-time">
<span class="date">2021 </span>
......
......@@ -239,7 +239,7 @@
<div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div>
<span class="right" style="color: #a3a3a3;">Version: 2021.06.02</span>
<span class="right" style="color: #a3a3a3;">Version: 2021.07.06</span>
<div class="scroll-to-top">
<i class="icon-arrow-up"></i>
</div>
......
......@@ -29,10 +29,6 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-mongodb:1.8.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.mongodb:mongo-java-driver:2.12.5" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.slf4j:jcl-over-slf4j:1.7.11" level="project" />
<orderEntry type="library" name="Maven: org.springframework.data:spring-data-commons:1.10.2.RELEASE" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-orm:4.1.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:4.1.6.RELEASE" level="project" />
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!