Commit 5bb658b7 sunke

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

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

被取消入库的料盘再次入库时,解除库位禁用
需求单无绑定料盘时,用蓝框标识
1 个父辈 d8b78794
...@@ -483,3 +483,25 @@ ...@@ -483,3 +483,25 @@
>> - code: 0为正常,其他为异常,(未传参数, 未找到有效条码,多个有效条码) >> - code: 0为正常,其他为异常,(未传参数, 未找到有效条码,多个有效条码)
>> - msg:消息, >> - msg:消息,
>> - data: true 可以放上皮带线 false 继续留在环形线 >> - 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 { ...@@ -405,6 +405,21 @@ public class Barcode extends BaseMongoBean {
return 0; 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() { public String getInFixture() {
return inFixture; return inFixture;
} }
......
...@@ -627,6 +627,20 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -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分钟未更新过状态,认为超时 * 非等待状态,超过10分钟未更新状态,等待状态,超过30分钟未更新过状态,认为超时
*/ */
public boolean isTimeout(){ public boolean isTimeout(){
......
...@@ -113,15 +113,15 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao { ...@@ -113,15 +113,15 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {
return tasks; return tasks;
} }
public List<DataLog> findUnExecuteTasks(String executingHSerial) { // 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()); // 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); // Query query = Query.query(c);
List<DataLog> feederTasks = findByQuery(query); // List<DataLog> feederTasks = findByQuery(query);
if(feederTasks == null){ // if(feederTasks == null){
feederTasks = new ArrayList<>(); // feederTasks = new ArrayList<>();
} // }
return feederTasks; // return feederTasks;
} // }
@Override @Override
public List<DataLog> findUnFinishedTasks(String executingHSerial){ public List<DataLog> findUnFinishedTasks(String executingHSerial){
......
...@@ -138,12 +138,43 @@ public class OutInfoCache { ...@@ -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(); Date now = new Date();
List<OutInfo> cachedOutInfos = getCachedOutInfos(); List<OutInfo> cachedOutInfos = getCachedOutInfos();
for (OutInfo unEndOutInfo : cachedOutInfos) { for (OutInfo unEndOutInfo : cachedOutInfos) {
if(!unEndOutInfo.isClosed() && unEndOutInfo.isTaskEnd() && !unEndOutInfo.isReelCutAction()){ if(!unEndOutInfo.isClosed() && unEndOutInfo.isTaskEnd() && !unEndOutInfo.isReelCutAction()){
long lastEndTime = unEndOutInfo.getTaskEndTime(); long lastEndTime = unEndOutInfo.getTaskEndTime();
if(lastEndTime>0 && now.getTime() - lastEndTime >= 5 * 60 * 1000){ if(lastEndTime>0 && now.getTime() - lastEndTime >= 5 * 60 * 1000){
...@@ -239,28 +270,10 @@ public class OutInfoCache { ...@@ -239,28 +270,10 @@ public class OutInfoCache {
}while (true); }while (true);
if(outInfoToExecute != null){ 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()); checkOutOutItems(outInfoToExecute.gethSerial());
} }
} }
}
/** /**
* 添加事件信息 * 添加事件信息
...@@ -521,10 +534,22 @@ public class OutInfoCache { ...@@ -521,10 +534,22 @@ public class OutInfoCache {
return ResultBean.newErrorResult(2201,"无需求单号参数hSerial,无法关闭"); return ResultBean.newErrorResult(2201,"无需求单号参数hSerial,无法关闭");
} }
log.info("开始关闭需求单hSerial=["+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; int sendStatus = StorageConstants.SEND_STATUS.CLOSED;
outInfoDao.updateStatus(hSerial, -1 ,sendStatus); outInfoDao.updateStatus(hSerial, -1 ,sendStatus);
removeFromCache(hSerial); removeFromCache(hSerial);
return ResultBean.newOkResult("需求单hSerial=["+hSerial+"]关闭成功",""); return ResultBean.newOkResult("需求单hSerial=["+hSerial+"]关闭成功,解除绑定["+count+"]盘","");
} }
public ResultBean closeSoSeq(String soseq){ public ResultBean closeSoSeq(String soseq){
...@@ -881,21 +906,21 @@ public class OutInfoCache { ...@@ -881,21 +906,21 @@ public class OutInfoCache {
//本次任务已结束,清理料架(首盘和补料使用的C和D料架不清理) //本次任务已结束,清理料架(首盘和补料使用的C和D料架不清理)
long lastTaskEndTime = outInfo.getTaskEndTime(); // long lastTaskEndTime = outInfo.getTaskEndTime();
if(lastTaskEndTime <= 0){ // if(lastTaskEndTime <= 0){
//outInfo是第一次执行的首盘或补料需求单,更新上次需求单使用过的料架 // //outInfo是第一次执行的首盘或补料需求单,更新上次需求单使用过的料架
if(outInfo.isFirstReelAction() || outInfo.isTailAction()){ // if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(outInfo.gethSerial()); // List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(outInfo.gethSerial());
QisdaCache.updateUsedRfid(usedRfidList); // QisdaCache.updateUsedRfid(usedRfidList);
log.info("更新需求单["+outInfo.gethSerial()+"]使用过的料架:" + String.join("," + usedRfidList)); // log.info("更新需求单["+outInfo.gethSerial()+"]使用过的料架:" + String.join("," + usedRfidList));
//
} // }
} // }
String eventMsg = "任务结束"; String eventMsg = "任务结束";
outInfo = addEventItem(outInfo, eventMsg); outInfo = addEventItem(outInfo, eventMsg);
InquiryShelfBean.clearShelf(outInfo.gethSerial()); //InquiryShelfBean.clearShelf(outInfo.gethSerial());
outInfo.setTaskEndTime(System.currentTimeMillis()); outInfo.setTaskEndTime(System.currentTimeMillis());
outInfoDao.updateTaskEndTime(outInfo.gethSerial(), outInfo.getTaskEndTime()); outInfoDao.updateTaskEndTime(outInfo.gethSerial(), outInfo.getTaskEndTime());
...@@ -980,37 +1005,36 @@ public class OutInfoCache { ...@@ -980,37 +1005,36 @@ public class OutInfoCache {
} }
String hSerial = outInfo.gethSerial(); 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; boolean hasUrgenReel = false;
String currentHSerial = QisdaCache.getCurrentOrderHSerial();
//当前需求单的所有非包装料是否全部放上了皮带线
boolean isAllCurrentHSerialOnBelt = true;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) { for (DataLog dataLog : allTasks) {
if(dataLog.isCheckOutTask()){ 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.isUrgentReel() && !dataLog.isCutReel() && !dataLog.isLessSendReel()){
if(dataLog.getAppendInfo().isTailAction() || dataLog.getAppendInfo().isFirstReelAction()){ 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{ }else{
//分盘和紧急料或缺料补发的料 //分盘和紧急料或缺料补发的料
String taskHSerial = dataLog.getAppendInfo().gethSerial(); // if(taskHSerial.equals(outInfo.gethSerial())){
if(taskHSerial.equals(outInfo.gethSerial())){ // return ResultBean.newErrorResult(1002,"当前需求单还有未完成的任务",false);
return ResultBean.newErrorResult(1002,"当前需求单还有未完成的任务",false); // }
}
hasUrgenReel = true; hasUrgenReel = true;
} }
} }
...@@ -1025,9 +1049,15 @@ public class OutInfoCache { ...@@ -1025,9 +1049,15 @@ public class OutInfoCache {
//首盘和补料 //首盘和补料
if(!outInfo.isReelCutAction() && !outInfo.isUrgentAction()){ 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 { ...@@ -1077,7 +1107,6 @@ public class OutInfoCache {
public synchronized ResultBean executeOutItems(String hSerial){ public synchronized ResultBean executeOutItems(String hSerial){
//OutInfo outInfo = outInfoDao.findByHSerial(hSerial); //OutInfo outInfo = outInfoDao.findByHSerial(hSerial);
OutInfo outInfoToExecute = getOutInfoFromCache(hSerial); OutInfo outInfoToExecute = getOutInfoFromCache(hSerial);
ResultBean resultBean = checkOutInfoCanOut(outInfoToExecute); ResultBean resultBean = checkOutInfoCanOut(outInfoToExecute);
if(resultBean != null){ if(resultBean != null){
return resultBean; return resultBean;
...@@ -1118,7 +1147,7 @@ public class OutInfoCache { ...@@ -1118,7 +1147,7 @@ public class OutInfoCache {
} }
} }
if(outInfo.isFirstReelAction() || outInfo.isTailAction()){ if(outInfo.isFirstReelAction() || outInfo.isTailAction()){
QisdaCache.setCurrentOrderHSerial(outInfo.gethSerial()); QisdaCache.executeHSerial(outInfo.gethSerial());
} }
}else{ }else{
//已经执行过的首盘和补料,如果是工单的最后一个需求单,关闭工单 //已经执行过的首盘和补料,如果是工单的最后一个需求单,关闭工单
...@@ -1714,12 +1743,15 @@ public class OutInfoCache { ...@@ -1714,12 +1743,15 @@ public class OutInfoCache {
if(outItem.isUrgentAction()){ if(outItem.isUrgentAction()){
task.setUrgentReel(true); task.setUrgentReel(true);
if(DataCache.isProductionFor(DataCache.CUSTOMER.QISDA4D)){
if(outItem.isCheckAction()){ if(outItem.isCheckAction()){
//盘点出库,不走紧急出料口 //4D盘点出库,不走紧急出料口
task.setUrgentReel(false); task.setUrgentReel(false);
} }
} }
}
Storage storage = dataCache.getStorageById(pos.getStorageId()); Storage storage = dataCache.getStorageById(pos.getStorageId());
if(storage.isPackage()){ if(storage.isPackage()){
//包装料仓 //包装料仓
......
...@@ -47,7 +47,7 @@ public class DataCache{ ...@@ -47,7 +47,7 @@ public class DataCache{
/** /**
* 佳世达 * 佳世达
*/ */
public static String QISDA = "QISDA"; public static String QISDA4D = "4D";
/** /**
* 测试程序 * 测试程序
...@@ -395,17 +395,6 @@ public class DataCache{ ...@@ -395,17 +395,6 @@ public class DataCache{
// if(barcodeFromRule.getPlateSize() != component.getPlateSize()){ // if(barcodeFromRule.getPlateSize() != component.getPlateSize()){
// String msg = barcodeFromRule.getBarcode() + "测量尺寸["+barcodeFromRule.getSizeStr()+"]与给定尺寸["+component.getSizeStr()+"]不符"; // String msg = barcodeFromRule.getBarcode() + "测量尺寸["+barcodeFromRule.getSizeStr()+"]与给定尺寸["+component.getSizeStr()+"]不符";
// throw new ValidateException(msg); // 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()); barcodeFromRule.setPlateSize(component.getPlateSize());
......
...@@ -40,9 +40,10 @@ public class MainTimer { ...@@ -40,9 +40,10 @@ public class MainTimer {
public void init(){ public void init(){
String currentorderHSerial = qisdaCache.getCurrentOrderHSerial(); String currentOrderHSerial = qisdaCache.getCurrentOrderHSerial();
log.info("加载未完成的任务,当前执行需求单["+currentorderHSerial+"]"); String nextOrderHSerial = qisdaCache.getNextOrderHSerial();
List<DataLog> unExecuteTasks = dataLogDao.findUnFinishedTasks(currentorderHSerial); log.info("加载未完成的任务,当前执行需求单["+currentOrderHSerial+"],预执行需求单["+nextOrderHSerial+"]");
List<DataLog> unExecuteTasks = dataLogDao.findUnFinishedTasks(currentOrderHSerial);
for (DataLog unExecuteTask : unExecuteTasks) { for (DataLog unExecuteTask : unExecuteTasks) {
if(unExecuteTask.isExecuting() || unExecuteTask.isWait()){ if(unExecuteTask.isExecuting() || unExecuteTask.isWait()){
taskService.addTaskToExecute(unExecuteTask); taskService.addTaskToExecute(unExecuteTask);
......
...@@ -36,6 +36,8 @@ public class QisdaCache { ...@@ -36,6 +36,8 @@ public class QisdaCache {
private static String CURRENT_ORDER_HSERIAL_KEY = "currentOrderHSerial"; private static String CURRENT_ORDER_HSERIAL_KEY = "currentOrderHSerial";
private static String NEXT_ORDER_HSERIAL_KEY = "nextOrderHSerial";
/** /**
* RFID绑定的DN单信息Key * RFID绑定的DN单信息Key
*/ */
...@@ -61,9 +63,9 @@ public class QisdaCache { ...@@ -61,9 +63,9 @@ public class QisdaCache {
private static String currentOrderHSerial; private static String currentOrderHSerial;
/** /**
* 上个需求单使用的料架信息 * 下一执行的需求单(当前工单需求单的非包装物料全部放上皮带线才可执行下一需求单)
*/ */
private static List<String> lastHSerialUsedRfidList; private static String nextOrderHSerial;
/** /**
* RFID绑定DN单和Facility, Key为RFID, Value为DN单信息 * RFID绑定DN单和Facility, Key为RFID, Value为DN单信息
...@@ -309,39 +311,32 @@ public class QisdaCache { ...@@ -309,39 +311,32 @@ public class QisdaCache {
* 当前正在执行的工单需求单 * 当前正在执行的工单需求单
* @param executeHSerial * @param executeHSerial
*/ */
public static void setCurrentOrderHSerial(String executeHSerial) { // public static void setCurrentOrderHSerial(String executeHSerial) {
//
if(currentOrderHSerial == null){ // if(currentOrderHSerial == null){
currentOrderHSerial = ""; // currentOrderHSerial = "";
} // }
String oldHSerial = currentOrderHSerial; // String oldHSerial = currentOrderHSerial;
log.info("设置当前正在执行的工单料需求为:" + executeHSerial+"清理之前["+oldHSerial+"]出库使用的料架"); // log.info("设置当前正在执行的工单料需求为:" + executeHSerial+"清理之前["+oldHSerial+"]出库使用的料架");
InquiryShelfBean.clearShelf(oldHSerial); // InquiryShelfBean.clearShelf(oldHSerial);
currentOrderHSerial = executeHSerial; // 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); 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 { ...@@ -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(){ private static void initReelLockPosMap(){
......
...@@ -957,6 +957,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -957,6 +957,7 @@ public class QisdaDeviceController extends BaseController {
if(cacheTask != null){ if(cacheTask != null){
AppendInfo appendInfo = cacheTask.getAppendInfo(); AppendInfo appendInfo = cacheTask.getAppendInfo();
boolean putResult = InquiryShelfBean.putInShelf(cacheTask,rfid, Integer.valueOf(rfidLoc)); boolean putResult = InquiryShelfBean.putInShelf(cacheTask,rfid, Integer.valueOf(rfidLoc));
//紧急料和分盘料放入失败不影响 //紧急料和分盘料放入失败不影响
boolean isCutTask = cacheTask.isUrgentReel() || cacheTask.isCutReel() || cacheTask.isLessSendReel(); boolean isCutTask = cacheTask.isUrgentReel() || cacheTask.isCutReel() || cacheTask.isLessSendReel();
if(!isCutTask && !putResult){ if(!isCutTask && !putResult){
...@@ -1103,16 +1104,14 @@ public class QisdaDeviceController extends BaseController { ...@@ -1103,16 +1104,14 @@ public class QisdaDeviceController extends BaseController {
} }
} }
String currentOrderHSerial = QisdaCache.getCurrentOrderHSerial();
int packageTask = 0; int packageTask = 0;
int cutPackageTask = 0; int cutPackageTask = 0;
int cutTask = 0; int cutTask = 0;
int smallTask = 0; int smallTask = 0;
int bigTask = 0; int bigTask = 0;
Collection<DataLog> queueTasks = taskService.getQueueTasks(); List<DataLog> allTasks = taskService.getAllTasks();
List<DataLog> allTasks = taskService.getFinishedTasks();
if(!queueTasks.isEmpty()){
allTasks.addAll(queueTasks);
}
for (DataLog task : allTasks) { for (DataLog task : allTasks) {
if(!task.isFinished() && !task.isCancel() && task.isCheckOutTask()){ if(!task.isFinished() && !task.isCancel() && task.isCheckOutTask()){
if(task.isPackageReel()){ if(task.isPackageReel()){
...@@ -1121,7 +1120,10 @@ public class QisdaDeviceController extends BaseController { ...@@ -1121,7 +1120,10 @@ public class QisdaDeviceController extends BaseController {
}else{ }else{
packageTask = packageTask + 1; 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; cutTask = cutTask + 1;
}else if(task.isSmallReel()){ }else if(task.isSmallReel()){
smallTask = smallTask + 1; smallTask = smallTask + 1;
...@@ -1130,19 +1132,21 @@ public class QisdaDeviceController extends BaseController { ...@@ -1130,19 +1132,21 @@ public class QisdaDeviceController extends BaseController {
} }
} }
} }
}
}
//当前料架还可放入的料盘数 //当前料架还可放入的料盘数
int smallEmpty = 0; int smallEmpty = 0;
int bigEmpty = 0; int bigEmpty = 0;
int packageEmpty = 0; int packageEmpty = 0;
String hSerial = QisdaCache.getCurrentOrderHSerial(); // String hSerial = QisdaCache.getCurrentOrderHSerial();
if(cacheTask != null){ // if(cacheTask != null){
hSerial = cacheTask.getAppendInfo().gethSerial(); // hSerial = cacheTask.getAppendInfo().gethSerial();
} // }
List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(hSerial); List<String> usedRfidList = InquiryShelfBean.getUsedRfidList(currentOrderHSerial);
ShelfInfo shelfInfo = InquiryShelfBean.findSameShelf(hSerial,rfid); ShelfInfo shelfInfo = InquiryShelfBean.findSameShelf(currentOrderHSerial,rfid);
if(shelfInfo != null){ if(shelfInfo != null){
Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap(); Map<Integer, ShelfLoc> locMap = shelfInfo.getLocMap();
for (ShelfLoc shelfLoc : locMap.values()) { for (ShelfLoc shelfLoc : locMap.values()) {
...@@ -1163,24 +1167,10 @@ public class QisdaDeviceController extends BaseController { ...@@ -1163,24 +1167,10 @@ public class QisdaDeviceController extends BaseController {
} }
} }
}else{ }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; smallEmpty = 100;
bigEmpty = 100; bigEmpty = 100;
packageEmpty = 100; packageEmpty = 100;
} }
}
}
...@@ -1573,7 +1563,13 @@ public class QisdaDeviceController extends BaseController { ...@@ -1573,7 +1563,13 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newErrorResult(-1,"未找到料盘["+barcode+"]的任务信息"); return ResultBean.newErrorResult(-1,"未找到料盘["+barcode+"]的任务信息");
}else{ }else{
String hSerial = task.getAppendInfo().gethSerial(); 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); return ResultBean.newOkResult(canReelToBelt);
} }
} }
......
...@@ -716,7 +716,7 @@ public class StorageDataController extends BaseController { ...@@ -716,7 +716,7 @@ public class StorageDataController extends BaseController {
} }
} catch (Exception e) { } catch (Exception e) {
errorMsg = e.getMessage(); errorMsg = e.getMessage();
log.info("查找空库位失败:" + errorMsg); log.error("查找空库位失败:" + errorMsg,e);
resultMap.put("result","105"); resultMap.put("result","105");
resultMap.put("msg",errorMsg); resultMap.put("msg",errorMsg);
} }
......
...@@ -402,6 +402,7 @@ public class TaskService implements ITaskService { ...@@ -402,6 +402,7 @@ public class TaskService implements ITaskService {
appendInfo.setFacility(""); appendInfo.setFacility("");
DNInfo dnInfo = QisdaCache.getDnInfo(inRFID); DNInfo dnInfo = QisdaCache.getDnInfo(inRFID);
if(dnInfo != null){
if(dnInfo.isDNIn()){ if(dnInfo.isDNIn()){
String pn = barcodeSave.getPartNumber(); String pn = barcodeSave.getPartNumber();
DNItem dnItem = dnInfo.getItem(pn); DNItem dnItem = dnInfo.getItem(pn);
...@@ -420,6 +421,9 @@ public class TaskService implements ITaskService { ...@@ -420,6 +421,9 @@ public class TaskService implements ITaskService {
}else{ }else{
appendInfo.setDnNo(""); appendInfo.setDnNo("");
} }
}else{
appendInfo.setDnNo("");
}
log.info("[" + inRFID + "]"+ barcodeSave.getBarcode() + " 上次入库DN单:" + oldDnNo + " 当前入库DN单:" + appendInfo.getDnNo()); log.info("[" + inRFID + "]"+ barcodeSave.getBarcode() + " 上次入库DN单:" + oldDnNo + " 当前入库DN单:" + appendInfo.getDnNo());
...@@ -822,6 +826,8 @@ public class TaskService implements ITaskService { ...@@ -822,6 +826,8 @@ public class TaskService implements ITaskService {
if(prohibitePos){ if(prohibitePos){
//库位里面没有物料的不需禁用 //库位里面没有物料的不需禁用
if(!Strings.isNullOrEmpty(task.getBarcode())){ if(!Strings.isNullOrEmpty(task.getBarcode())){
//不是需求单任务的出库,不屏蔽
if(!Strings.isNullOrEmpty(task.getAppendInfo().gethSerial())){
log.info("库位["+task.getPosName()+"]料盘["+task.getBarcode()+"]空出,禁用库位"); log.info("库位["+task.getPosName()+"]料盘["+task.getBarcode()+"]空出,禁用库位");
task.setOutOrder(-task.getOutOrder()); task.setOutOrder(-task.getOutOrder());
try { try {
...@@ -837,6 +843,8 @@ public class TaskService implements ITaskService { ...@@ -837,6 +843,8 @@ public class TaskService implements ITaskService {
} }
}
task.setStopSendToQisda(true); task.setStopSendToQisda(true);
task = dataLogDao.save(task); task = dataLogDao.save(task);
...@@ -985,7 +993,7 @@ public class TaskService implements ITaskService { ...@@ -985,7 +993,7 @@ public class TaskService implements ITaskService {
for (DataLog task : waitTasks) { for (DataLog task : waitTasks) {
if(task.isCheckOutTask()) { if(task.isCheckOutTask()) {
AppendInfo appendInfo = task.getAppendInfo(); AppendInfo appendInfo = task.getAppendInfo();
if(appendInfo.isFirstReelAction() && !task.isLessSendReel()){ if(!task.isPackageReel() && appendInfo.isFirstReelAction() && !task.isLessSendReel()){
//首盘料 //首盘料
hasFirstReelAction = true; hasFirstReelAction = true;
} }
...@@ -1945,6 +1953,10 @@ public class TaskService implements ITaskService { ...@@ -1945,6 +1953,10 @@ public class TaskService implements ITaskService {
storagePos.setBarcode(barcode); storagePos.setBarcode(barcode);
storagePos.setUsed(true); storagePos.setUsed(true);
storagePos.setCanCheckOutTime(System.currentTimeMillis()); storagePos.setCanCheckOutTime(System.currentTimeMillis());
if(!storagePos.isEnabled()){
log.info("库位["+task.getPosName()+"]料盘["+task.getBarcode()+"]入库任务完成时库位已禁用,解除禁用库位");
storagePos.setEnabled(true);
}
storagePosManager.save(storagePos); storagePosManager.save(storagePos);
//更新缓存中的库存信息 //更新缓存中的库存信息
......
...@@ -172,15 +172,15 @@ ...@@ -172,15 +172,15 @@
<%--&lt;%&ndash;<display:column property="barcode.amount" titleKey="数量"/>&ndash;%&gt;--%> <%--&lt;%&ndash;<display:column property="barcode.amount" titleKey="数量"/>&ndash;%&gt;--%>
<%--<display:column property="barcode.lockName" titleKey="menu.inRule"/>--%> <%--<display:column property="barcode.lockName" titleKey="menu.inRule"/>--%>
<display:column property="posName" titleKey="checkOut.pos" sortProperty="posName" sortable="true"/> <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 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"/> <fmt:formatDate value="${pos.barcode.putInDate}" pattern="yyyy-MM-dd HH:mm"/>
</display:column> </display:column>
<%--<display:column titleKey="在库时长">--%>
<%--${pos.barcode.inStoreTime}--%>
<%--</display:column>--%>
<display:column titleKey="barcode.amount" sortProperty="barcode.amount" sortable="true"> <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}">-</c:if>
<c:if test="${pos.barcode.type != 1 && pos.barcode.type != 4}">${pos.barcode.amount} ${pos.barcode.appendInfo.cutMap}</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 @@ ...@@ -158,7 +158,7 @@
<span class='label label-sm label-${fn:toLowerCase(dataLog.status)}'> <span class='label label-sm label-${fn:toLowerCase(dataLog.status)}'>
<fmt:message key="op.status.${fn:toLowerCase(dataLog.status)}"/>=${dataLog.locInfo} <fmt:message key="op.status.${fn:toLowerCase(dataLog.status)}"/>=${dataLog.locInfo}
</span> </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> <a href="#" onclick="cancelTask('${dataLog.id}')"><fmt:message key="button.cancel"/></a>
</c:if> </c:if>
</display:column> </display:column>
......
<%@ page import="com.myproject.util.StorageConstants" %> <%@ page import="com.myproject.util.StorageConstants" %>
<%@ page import="com.myproject.webapp.controller.webService.QisdaCache" %>
<%@ include file="/common/taglibs.jsp" %> <%@ include file="/common/taglibs.jsp" %>
<%@ page language="java" pageEncoding="UTF-8" %> <%@ page language="java" pageEncoding="UTF-8" %>
...@@ -188,21 +189,27 @@ ...@@ -188,21 +189,27 @@
//var index = parseInt(i) + 1; //var index = parseInt(i) + 1;
//var outItems = outInfo.outItems; //var outItems = outInfo.outItems;
var moveHandle = ''; var moveHandle = '';
if(outInfo.firstExecuteTime <= 0){ // if(outInfo.firstExecuteTime >= 0){
//moveHandle = '<span class="glyphicon glyphicon-arrow-up" style="width:30px;display:none;"></span>'; // //moveHandle = '<span class="glyphicon glyphicon-arrow-up" style="width:30px;display:none;"></span>';
} // }
var bgClass = '';
var pannelColor = 'panel-default'; var pannelColor = 'panel-default';
if(outInfo.executing){ if(outInfo.executing){
pannelColor = 'panel-success'; pannelColor = 'panel-success';
} }
var bgClass = '';
var bindShelfInfo = outInfo.lineBindShelfInfo; var bindShelfInfo = outInfo.lineBindShelfInfo;
if(bindShelfInfo){ if(bindShelfInfo){
bgClass = 'bg-red'; 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 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 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"); var createDate = new Date(outInfo.createDate).Format("yyyy-MM-dd hh:mm:ss");
...@@ -212,7 +219,7 @@ ...@@ -212,7 +219,7 @@
'<a class="accordion-toggle" data-toggle="collapse" href="#'+outInfo.hSerial+'">' + '<a class="accordion-toggle" data-toggle="collapse" href="#'+outInfo.hSerial+'">' +
moveHandle + //outInfo.firstExecuteTime + moveHandle + //outInfo.firstExecuteTime +
'需求单:'+ outInfo.hSerial+' ['+outInfo.action+'] 工单: ' + outInfo.so +' 备料单: ' + outInfo.refno + '[' + outInfo.sendStatus +'] 工单序号:' + outInfo.soseq + '需求单:'+ 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">建议时间: '+sdate+'</span>' +
'<span class="right">必须时间: '+mdate+'</span>' + '<span class="right">必须时间: '+mdate+'</span>' +
//'<span class="right">['+outInfo.firstExecuteTime+']</span>' + //'<span class="right">['+outInfo.firstExecuteTime+']</span>' +
...@@ -233,6 +240,12 @@ ...@@ -233,6 +240,12 @@
return infoHtml; return infoHtml;
} }
function flushOutInfos(){ 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) { $.post("${ctx}/service/store/qisda/outInfoList", {}, function (data) {
var executingHtml = ''; var executingHtml = '';
...@@ -245,8 +258,22 @@ ...@@ -245,8 +258,22 @@
var infoHtml = getOutInfoHtml(outInfo); var infoHtml = getOutInfoHtml(outInfo);
if(outInfo.executing || outInfo.sendLess || outInfo.firstExecuteTime > 0){ if(outInfo.executing || outInfo.sendLess || outInfo.firstExecuteTime > 0){
if(!outInfo.taskEnd && (outInfo.firstReelAction || outInfo.tailAction)){ 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; executingHtml = executingHtml + infoHtml;
}else{ }else{
//priorityHtml = priorityHtml + infoHtml;
unfinishedHtml = unfinishedHtml + infoHtml;
}
}else{
unfinishedHtml = unfinishedHtml + infoHtml;
}
}
}else{
unfinishedHtml = unfinishedHtml + infoHtml; unfinishedHtml = unfinishedHtml + infoHtml;
} }
...@@ -254,7 +281,7 @@ ...@@ -254,7 +281,7 @@
if(outInfo.reelCutAction){ if(outInfo.reelCutAction){
unfinishedHtml = unfinishedHtml + infoHtml; unfinishedHtml = unfinishedHtml + infoHtml;
}else{ }else{
if(priorityHtml == ""){ if(priorityHtml == ''){
priorityHtml = priorityHtml + infoHtml; priorityHtml = priorityHtml + infoHtml;
}else{ }else{
waitHtml = waitHtml + infoHtml; waitHtml = waitHtml + infoHtml;
...@@ -290,6 +317,8 @@ ...@@ -290,6 +317,8 @@
}); });
}); });
});
} }
flushOutInfos(); flushOutInfos();
......
...@@ -469,7 +469,7 @@ ...@@ -469,7 +469,7 @@
var allTasks = {}; var allTasks = {};
function updateTasks(){ function updateTasks(currentOutHSerial){
//任务列表 //任务列表
$.post("${ctx}/service/store/tasks", {}, function (data) { $.post("${ctx}/service/store/tasks", {}, function (data) {
var newTasks = []; var newTasks = [];
...@@ -502,10 +502,12 @@ ...@@ -502,10 +502,12 @@
options['icon']='fa fa-sign-out'; options['icon']='fa fa-sign-out';
showStr = partNumber + "["+barcode+"]${out_label}"+posStr; showStr = partNumber + "["+barcode+"]${out_label}"+posStr;
}else{ }else{
options['closable'] = false;
//options['onClick']= modifyClick; //options['onClick']= modifyClick;
} }
var position = 'bottom right'; var position = 'bottom right';
var showClass = 'label-'+status; var showClass = 'label-'+status;
...@@ -553,9 +555,22 @@ ...@@ -553,9 +555,22 @@
} }
var sourceStr = ""; var sourceStr = "";
var sourceColor = "normal";
if(data[item].sourceName){ 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['msg']= showStr + statusMsg + data[item].locInfo + sourceStr;
options['showClass'] = showClass; options['showClass'] = showClass;
...@@ -563,7 +578,7 @@ ...@@ -563,7 +578,7 @@
if(!task){ if(!task){
cidTasks[taskId] = Lobibox.notify('success', options); cidTasks[taskId] = Lobibox.notify('success', options);
}else{ }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(); task.remove();
delete cidTasks[taskId]; delete cidTasks[taskId];
cidTasks[taskId] = Lobibox.notify('success', options); cidTasks[taskId] = Lobibox.notify('success', options);
...@@ -776,7 +791,15 @@ ...@@ -776,7 +791,15 @@
}, 1000); }, 1000);
setInterval(function(){ setInterval(function(){
updateTasks("all"); $.post("${ctx}/rest/api/qisda/device/currentOutLine", {}, function (currentOutLine) {
var currentOutHSerial = "";
if (currentOutLine) {
currentOutHSerial = currentOutLine.data.hSerial;
}
updateTasks(currentOutHSerial);
});
flushStatus(); flushStatus();
//flushLineMsg(); //flushLineMsg();
flushUsageItem(); flushUsageItem();
......
...@@ -12,6 +12,112 @@ ...@@ -12,6 +12,112 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<ul class="timeline"> <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"> <li class="timeline-blue">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2021 </span> <span class="date">2021 </span>
......
...@@ -239,7 +239,7 @@ ...@@ -239,7 +239,7 @@
<div class="page-footer-inner"> <div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a> 2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div> </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"> <div class="scroll-to-top">
<i class="icon-arrow-up"></i> <i class="icon-arrow-up"></i>
</div> </div>
......
...@@ -29,10 +29,6 @@ ...@@ -29,10 +29,6 @@
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <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: 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-orm:4.1.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans: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!