Commit 9e082650 sunke

异常看板

包装料仓锁定时,如果架位不匹配只清理当前架位锁定信息
1 个父辈 2e89c33b
...@@ -357,6 +357,22 @@ IP: 10.85.160.181 ...@@ -357,6 +357,22 @@ IP: 10.85.160.181
>> - code: 0为正常,其他为异常, >> - code: 0为正常,其他为异常,
>> - msg:消息, >> - msg:消息,
>> - data: >> - data:
14. 异常看板
>地址:
>>/rest/api/qisda/device/updateDeviceAlarmMsg
>
>参数:
>>deviceAlarmList : 异常列表Json字符串 `[{"name":"移栽5", "msgKey":"line.move5.timeOut", "msgValue":"运动超时"},{"name":"移栽4", "msgKey":"line.move4.timeOut", "msgValue":"误差过大"}]`
>>>name : 异常位置名称
>>>msgKey : 异常信息唯一标识
>>>msgValue : 异常信息
>
> 返回:
>>` {"code":0,"msg":"ok","data":""}`
>>
>> - code: 0为正常,其他为异常,
>> - msg:消息,
>> - data:
...@@ -82,4 +82,14 @@ public class ReelLockPosInfo { ...@@ -82,4 +82,14 @@ public class ReelLockPosInfo {
public void setRfidLoc(String rfidLoc) { public void setRfidLoc(String rfidLoc) {
this.rfidLoc = rfidLoc; this.rfidLoc = rfidLoc;
} }
@Override
public String toString() {
return "ReelLockPosInfo{" +
"barcode='" + barcode + '\'' +
", lockPos='" + lockPos + '\'' +
", rfid='" + rfid + '\'' +
", rfidLoc='" + rfidLoc + '\'' +
'}';
}
} }
...@@ -592,6 +592,8 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -592,6 +592,8 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
}else if(isCutReel()){ }else if(isCutReel()){
//分盘料放在同一个料串或包装料架上,需求单号使用2 //分盘料放在同一个料串或包装料架上,需求单号使用2
shelfMapKey = InquiryShelfBean.CUT_SHELF_MAP_KEY; shelfMapKey = InquiryShelfBean.CUT_SHELF_MAP_KEY;
}else if(isLessSendReel()){
//shelfMapKey = "3";
} }
return shelfMapKey; return shelfMapKey;
} }
...@@ -616,4 +618,16 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ { ...@@ -616,4 +618,16 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
public void setOutOrder(int outOrder) { public void setOutOrder(int outOrder) {
this.outOrder = outOrder; this.outOrder = outOrder;
} }
/**
* 非等待状态,超过10分钟未更新状态,等待状态,超过30分钟未更新过状态,认为超时
*/
public boolean isTimeout(){
long now = System.currentTimeMillis();
long timeoutTime = 20 * 60 * 1000;
if(!isWait()){
timeoutTime = 10 * 60 * 1000;
}
return now - getUpdateDate().getTime() > timeoutTime;
}
} }
...@@ -135,10 +135,10 @@ public class StatusBean { ...@@ -135,10 +135,10 @@ public class StatusBean {
} }
/** /**
* 是否超时(3秒) * 是否超时(15秒)
*/ */
public boolean timeOut(){ public boolean timeOut(){
return System.currentTimeMillis() - time > 10 * 1000; return System.currentTimeMillis() - time > 15 * 1000;
} }
/** /**
......
...@@ -75,6 +75,11 @@ public class QisdaController extends BaseController { ...@@ -75,6 +75,11 @@ public class QisdaController extends BaseController {
return "qisda/dnIn"; return "qisda/dnIn";
} }
@RequestMapping("/qisda/alarmMsg")
public String alarmMsg(HttpServletRequest request){
return "qisda/alarmMsg";
}
private static String vimRfid = ""; private static String vimRfid = "";
/** /**
......
...@@ -310,6 +310,14 @@ public class QisdaApiController extends BaseController { ...@@ -310,6 +310,14 @@ public class QisdaApiController extends BaseController {
} }
}else{ }else{
//不是指定料 //不是指定料
if(outItem.isReelCutAction() || outItem.isFirstReelAction() || outItem.isTailAction()){
//判断是否有重复,如果有重复,忽略
OutItem oldItem = outItemDao.findItem(outItem.gethSerial(), outItem.getSlotlocation());
if(oldItem != null){
log.error("需求单["+outItem.gethSerial()+"]的站位["+outItem.getSlotlocation()+"]已存在,忽略");
continue;
}
}
outItem = outItemDao.save(outItem); outItem = outItemDao.save(outItem);
outInfo.updateItem(outItem); outInfo.updateItem(outItem);
outInfoMap.put(hSerial, outInfo); outInfoMap.put(hSerial, outInfo);
......
...@@ -126,7 +126,7 @@ public class QisdaCache { ...@@ -126,7 +126,7 @@ public class QisdaCache {
String lockRfid = reelLockPosInfo.getRfid(); String lockRfid = reelLockPosInfo.getRfid();
String lockRfidLoc = reelLockPosInfo.getRfidLoc(); String lockRfidLoc = reelLockPosInfo.getRfidLoc();
if(Strings.isNotBlank(lockRfid) && Strings.isNotBlank(lockRfidLoc)){ if(Strings.isNotBlank(lockRfid) && Strings.isNotBlank(lockRfidLoc)){
if(rfid.equals(lockRfid) && rfidLoc.equals(rfidLoc)){ if(rfid.equals(lockRfid) && rfidLoc.equals(lockRfidLoc)){
return reelLockPosInfo; return reelLockPosInfo;
} }
} }
......
...@@ -4,16 +4,15 @@ import com.myproject.bean.CodeBean; ...@@ -4,16 +4,15 @@ import com.myproject.bean.CodeBean;
import com.myproject.bean.qisda.*; import com.myproject.bean.qisda.*;
import com.myproject.bean.update.*; import com.myproject.bean.update.*;
import com.myproject.bean.update.qisda.OutInfo; import com.myproject.bean.update.qisda.OutInfo;
import com.myproject.bean.update.qisda.OutItem; import com.myproject.bean.utils.BoxStatusBean;
import com.myproject.bean.utils.StatusBean;
import com.myproject.dao.mongo.IAlarmInfoDao; import com.myproject.dao.mongo.IAlarmInfoDao;
import com.myproject.dao.mongo.IDataLogDao; import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao;
import com.myproject.exception.ValidateException; import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager; import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IComponentManager; import com.myproject.manager.IComponentManager;
import com.myproject.manager.IStoragePosManager; import com.myproject.manager.IStoragePosManager;
import com.myproject.util.JsonUtil;
import com.myproject.util.QisdaApi; import com.myproject.util.QisdaApi;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.qisda.StockCheckController; import com.myproject.webapp.controller.qisda.StockCheckController;
...@@ -1108,6 +1107,66 @@ public class QisdaDeviceController extends BaseController { ...@@ -1108,6 +1107,66 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
private Map<String,DeviceAlarmMsgBean> deviceAlarmMap = new ConcurrentHashMap<>();
@RequestMapping(value = "/updateDeviceAlarmMsg")
@ResponseBody
public ResultBean updateDeviceAlarmMsg(HttpServletRequest request){
String alarmListStr = request.getParameter("deviceAlarmList");
if(Strings.isNotBlank(alarmListStr)){
List<DeviceAlarmMsgBean> alarmList = JsonUtil.toList(alarmListStr, DeviceAlarmMsgBean.class);
for (DeviceAlarmMsgBean deviceAlarmMsgBean : alarmList) {
String msgKey = deviceAlarmMsgBean.getMsgKey();
DeviceAlarmMsgBean oldBean = deviceAlarmMap.get(msgKey);
if(oldBean != null){
oldBean.updateMsg(deviceAlarmMsgBean);
if(oldBean.getMsgValue().isEmpty()){
deviceAlarmMap.remove(msgKey);
continue;
}
}else{
log.info("收到新的设备报警信息:" + alarmListStr);
deviceAlarmMsgBean.setStartTime(new Date());
oldBean = deviceAlarmMsgBean;
}
deviceAlarmMap.put(msgKey,oldBean);
}
}
return ResultBean.newOkResult("");
}
@RequestMapping(value = "/deviceMsgList")
@ResponseBody
public Collection<DeviceAlarmMsgBean> updateAlarmList(HttpServletRequest request){
List<DeviceAlarmMsgBean> alarmList = new ArrayList<>();
for (DeviceAlarmMsgBean deviceAlarmMsgBean : deviceAlarmMap.values()) {
if(deviceAlarmMsgBean.isTimeout()){
deviceAlarmMap.remove(deviceAlarmMsgBean);
}else{
alarmList.add(deviceAlarmMsgBean);
}
}
for (Storage storage : dataCache.getAllStorage().values()) {
StatusBean statusBean = taskService.getStatus(storage.getCid());
Map<Integer, BoxStatusBean> boxStatusMap = statusBean.getBoxStatus();
if(statusBean.getStatus() == StorageConstants.STATUS.OFFLINE){
String msgKey = "box." + storage.getCid()+ ".offline";
DeviceAlarmMsgBean alarmMsgBean = new DeviceAlarmMsgBean(storage.getName(),msgKey,"设备离线");
alarmList.add(alarmMsgBean);
}
if(!boxStatusMap.isEmpty()){
BoxStatusBean boxStatusBean = boxStatusMap.values().iterator().next();
String boxMsg = boxStatusBean.getMsg();
if(Strings.isNotBlank(boxMsg)){
String msgKey = "box." + storage.getCid();
DeviceAlarmMsgBean alarmMsgBean = new DeviceAlarmMsgBean(storage.getName(),msgKey,boxMsg);
alarmList.add(alarmMsgBean);
}
}
}
return alarmList;
}
} }
...@@ -82,7 +82,7 @@ public class StatusController extends BaseController{ ...@@ -82,7 +82,7 @@ public class StatusController extends BaseController{
@RequestMapping(value = "/latestStatus") @RequestMapping(value = "/latestStatus")
@ResponseBody @ResponseBody
public List<Humiture> latestStatus(@RequestParam String cid){ public List<Humiture> latestStatus(@RequestParam String cid){
int days = 300; int days = 30;
List<Humiture> result = humitureManager.latest(cid, days); List<Humiture> result = humitureManager.latest(cid, days);
return result; return result;
} }
......
...@@ -616,15 +616,16 @@ public class StorageDataController extends BaseController { ...@@ -616,15 +616,16 @@ public class StorageDataController extends BaseController {
if(oldLockInfo != null){ if(oldLockInfo != null){
if(!oldLockInfo.getBarcode().equals(barcode.getBarcode())){ if(!oldLockInfo.getBarcode().equals(barcode.getBarcode())){
String result = "-1"; String result = "-1";
okMsg = "["+rfid+"]["+barcode.getBarcode()+"]锁定库位["+pos.getPosName()+"],清理旧有锁定库位"; okMsg = rfid+"["+ rfidLoc +"]["+barcode.getBarcode()+"]锁定库位["+pos.getPosName()+"],清理旧有锁定信息"+oldLockInfo;
resultMap.put("result",result); resultMap.put("result",result);
resultMap.put("msg",okMsg); resultMap.put("msg",okMsg);
//已经锁定过库位,但不是同一个条码,需要把对应位置的锁定信息清理掉 //已经锁定过库位,但不是同一个条码,需要把对应位置的锁定信息清理掉
List<ReelLockPosInfo> lockPosInfoList = QisdaCache.getShelfLockPosInfo(rfid); QisdaCache.removeReelLockPosInfo(barcode.getBarcode());
for (ReelLockPosInfo reelLockPosInfo : lockPosInfoList) { // List<ReelLockPosInfo> lockPosInfoList = QisdaCache.getShelfLockPosInfo(rfid);
QisdaCache.removeReelLockPosInfo(reelLockPosInfo.getBarcode()); // for (ReelLockPosInfo reelLockPosInfo : lockPosInfoList) {
log.info("清理料架"+reelLockPosInfo.getRfid()+"["+reelLockPosInfo.getRfidLoc()+"]上物料["+reelLockPosInfo.getBarcode()+"]锁定的库位"); // QisdaCache.removeReelLockPosInfo(reelLockPosInfo.getBarcode());
} // log.info("清理料架"+reelLockPosInfo.getRfid()+"["+reelLockPosInfo.getRfidLoc()+"]上物料["+reelLockPosInfo.getBarcode()+"]锁定的库位");
// }
} }
} }
......
...@@ -1496,8 +1496,8 @@ public class TaskService implements ITaskService { ...@@ -1496,8 +1496,8 @@ public class TaskService implements ITaskService {
} }
DataLog task = newTask(pos); DataLog task = newTask(pos);
//手动出库的当做是紧急料,放到料串 //手动出库的当做是工单料,放到皮带线
task.setUrgentReel(true); task.setUrgentReel(false);
AppendInfo appendInfo = task.getAppendInfo(); AppendInfo appendInfo = task.getAppendInfo();
appendInfo.setShelfType(StorageConstants.SHEFL_TYPE.B); appendInfo.setShelfType(StorageConstants.SHEFL_TYPE.B);
......
...@@ -503,16 +503,19 @@ ...@@ -503,16 +503,19 @@
var position = 'bottom right'; var position = 'bottom right';
var showClass = 'label-'+status; var showClass = 'label-'+status;
if(!data[item].wait){ // if(!data[item].wait){
//非等待任务超过5分钟还未完成,变红 // //非等待任务超过5分钟还未完成,变红
var updateDate = new Date(data[item].updateDate); // var updateDate = new Date(data[item].updateDate);
var now = new Date(); // var now = new Date();
var minutes = (now.getTime() - updateDate.getTime())/(1000*60) ; //时间差的分钟数 // var minutes = (now.getTime() - updateDate.getTime())/(1000*60) ; //时间差的分钟数
if(minutes > 10){ // if(minutes > 10){
//超过10分钟变红,放左边 // //超过10分钟变红,放左边
//showClass="label-pause"; // //showClass="label-pause";
position = 'bottom left'; // position = 'bottom left';
} // }
// }
if(data[item].timeout){
position = 'bottom left';
} }
options['position']= position; options['position']= position;
......
...@@ -30,6 +30,11 @@ ...@@ -30,6 +30,11 @@
<security:authorize ifAnyGranted="ROLE_MANAGE_DATALOG"> <security:authorize ifAnyGranted="ROLE_MANAGE_DATALOG">
<ul class="hor-menu-qisda nav navbar-nav hide"> <ul class="hor-menu-qisda nav navbar-nav hide">
<li class="classic-menu-dropdown"> <li class="classic-menu-dropdown">
<a href="${ctx}/qisda/alarmMsg.html" name="qisda">
<fmt:message key="异常看板"/><span class="selected"></span>
</a>
</li>
<li class="classic-menu-dropdown">
<a href="${ctx}/qisda/dnInfoSearch.html" name="qisda"> <a href="${ctx}/qisda/dnInfoSearch.html" name="qisda">
<fmt:message key="DN单"/><span class="selected"></span> <fmt:message key="DN单"/><span class="selected"></span>
</a> </a>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!