Commit e4bcab5d sunke

报警看板页面增加吞吐量报表

吞吐量统计修正
补料与缺料重发同一盘料会有两个任务BUG
包装仓返回同一个料架还有几个任务
1 个父辈 d4259566
...@@ -24,6 +24,16 @@ C:\Windows\system32>mongod --storageEngine=mmapv1 --logappend --directoryperdb - ...@@ -24,6 +24,16 @@ C:\Windows\system32>mongod --storageEngine=mmapv1 --logappend --directoryperdb -
--disable-print-preview --disable-print-preview
#添加索引
db.barcode.ensureIndex({"barcode":1},{"unique":true})
db.outItem.ensureIndex({"soseq":1})
db.outItem.createIndex({hSerial:-1,slotlocation:1})
###安装Mongodb服务 ###安装Mongodb服务
1、创建 D:\MongoDB 及 D:\MongoDB\data 和 D:\MongoDB\logs 目录 1、创建 D:\MongoDB 及 D:\MongoDB\data 和 D:\MongoDB\logs 目录
......
...@@ -71,7 +71,7 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao { ...@@ -71,7 +71,7 @@ public class DataLogDaoImpl extends AbstractMongoDao implements IDataLogDao {
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime); Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime), Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type); Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type);
c.and("status").in(StorageConstants.OP_STATUS.END.name(),StorageConstants.OP_STATUS.FINISHED.name()); c.and("status").nin(StorageConstants.OP_STATUS.EXECUTING.name(),StorageConstants.OP_STATUS.WAIT.name(),StorageConstants.OP_STATUS.CANCEL.name());
if(Strings.isNotBlank(partNumber)){ if(Strings.isNotBlank(partNumber)){
c.and("partNumber").is(partNumber); c.and("partNumber").is(partNumber);
} }
......
...@@ -27,9 +27,9 @@ public class OutItemDaoImpl extends AbstractMongoDao implements IOutItemDao { ...@@ -27,9 +27,9 @@ public class OutItemDaoImpl extends AbstractMongoDao implements IOutItemDao {
public List<OutItem> findCutItemList(List<String> soseqList, String pn, String facility){ public List<OutItem> findCutItemList(List<String> soseqList, String pn, String facility){
Criteria c = new Criteria(); Criteria c = new Criteria();
c.and("soseq").in(soseqList); c.and("soseq").in(soseqList);
c.and("action").is("分盘");
c.and("pn").is(pn); c.and("pn").is(pn);
c.and("facility").is(facility); c.and("facility").is(facility);
c.and("action").is("分盘");
Query query = new Query(c); Query query = new Query(c);
query.with(new Sort(Sort.Direction.ASC,"createDate")); query.with(new Sort(Sort.Direction.ASC,"createDate"));
return findByQuery(query); return findByQuery(query);
......
...@@ -882,11 +882,18 @@ public class OutInfoCache { ...@@ -882,11 +882,18 @@ public class OutInfoCache {
//没有顺序 //没有顺序
int sendQty = outItem.getSendQty(); int sendQty = outItem.getSendQty();
int fixQty = outItem.getFixedQty(); int fixQty = outItem.getFixedQty();
Collection<String> excludePosIds = taskService.excludePosIds();
for (StoragePos pos : bindPosList) { for (StoragePos pos : bindPosList) {
if(sendQty >= fixQty){ if(sendQty >= fixQty){
break; break;
} }
if(excludePosIds.contains(pos.getId())){
log.info("任务列表中已有库位["+pos.getPosName()+"]的任务,忽略当前库位,继续查找下一个");
continue;
}
if(maxQtyReelPos != null && maxQtyReelPos.getId().equals(pos.getId())){ if(maxQtyReelPos != null && maxQtyReelPos.getId().equals(pos.getId())){
if(totalOutInfo.getFixedQty() == totalOutInfo.getQty()){ if(totalOutInfo.getFixedQty() == totalOutInfo.getQty()){
//未修正过 //未修正过
...@@ -929,7 +936,13 @@ public class OutInfoCache { ...@@ -929,7 +936,13 @@ public class OutInfoCache {
List<StoragePos> bindPosList = storagePosDao.findBindList(outItem.getSoseq(), outItem.getSlotlocation()); List<StoragePos> bindPosList = storagePosDao.findBindList(outItem.getSoseq(), outItem.getSlotlocation());
//首盘料,出到双层线上,按站位顺序,只出最大的一盘 //首盘料,出到双层线上,按站位顺序,只出最大的一盘
StoragePos maxQtyPos = null; StoragePos maxQtyPos = null;
Collection<String> excludePosIds = taskService.excludePosIds();
for (StoragePos pos : bindPosList) { for (StoragePos pos : bindPosList) {
if(excludePosIds.contains(pos.getId())){
log.info("任务列表中已有库位["+pos.getPosName()+"]的任务,忽略当前库位,继续查找下一个");
continue;
}
//不是需要分盘但未分盘的料 //不是需要分盘但未分盘的料
Barcode posBarcode = pos.getBarcode(); Barcode posBarcode = pos.getBarcode();
if(!posBarcode.hasCutInfo()){ if(!posBarcode.hasCutInfo()){
......
...@@ -522,42 +522,42 @@ public class QisdaBindService { ...@@ -522,42 +522,42 @@ public class QisdaBindService {
} }
private OutItem updateRealLockQty(OutItem outItem){ // private OutItem updateRealLockQty(OutItem outItem){
//查找真实绑定 // //查找真实绑定
List<StoragePos> bindPosList = storagePosDao.findBindList(outItem.getSoseq(), outItem.getSlotlocation()); // List<StoragePos> bindPosList = storagePosDao.findBindList(outItem.getSoseq(), outItem.getSlotlocation());
int realBindQty = 0; // int realBindQty = 0;
for (StoragePos bindPos : bindPosList) { // for (StoragePos bindPos : bindPosList) {
realBindQty = realBindQty + bindPos.getBarcode().getAmount(); // realBindQty = realBindQty + bindPos.getBarcode().getAmount();
} // }
outItem.setRealLockQty(realBindQty); // outItem.setRealLockQty(realBindQty);
int lockQty = outItem.getLockQty(); // int lockQty = outItem.getLockQty();
if(lockQty < realBindQty){ // if(lockQty < realBindQty){
lockQty = realBindQty; // lockQty = realBindQty;
outItem.setLockQty(lockQty); // outItem.setLockQty(lockQty);
} // }
if(outItem.isCutMaterial()){ // if(outItem.isCutMaterial()){
//分盘料,需要将已绑定未出库的物料也计算进去 // //分盘料,需要将已绑定未出库的物料也计算进去
List<StoragePos> cutReels = storagePosDao.findCutList(outItem.getSo(), outItem.getSlotlocation(), outItem.getSoseq()); // List<StoragePos> cutReels = storagePosDao.findCutList(outItem.getSo(), outItem.getSlotlocation(), outItem.getSoseq());
//
for (StoragePos cutReel : cutReels) { // for (StoragePos cutReel : cutReels) {
List<Map<String, Object>> cutItems = cutReel.getBarcode().getCutItems(); // List<Map<String, Object>> cutItems = cutReel.getBarcode().getCutItems();
for (Map<String, Object> cutItem : cutItems) { // for (Map<String, Object> cutItem : cutItems) {
String so = cutItem.get("so").toString(); // String so = cutItem.get("so").toString();
String soseqStr = cutItem.get("soseq").toString(); // String soseqStr = cutItem.get("soseq").toString();
String slotlocation = cutItem.get("slotlocation").toString(); // String slotlocation = cutItem.get("slotlocation").toString();
if(outItem.getSo().equals(so) && outItem.getSoseq().equals(soseqStr) && outItem.getSlotlocation() == Integer.valueOf(slotlocation)){ // if(outItem.getSo().equals(so) && outItem.getSoseq().equals(soseqStr) && outItem.getSlotlocation() == Integer.valueOf(slotlocation)){
log.info("查找到未出库的分盘料信息["+cutItem+"],更新预绑定数量"); // log.info("查找到未出库的分盘料信息["+cutItem+"],更新预绑定数量");
String qty = cutItem.get("qty").toString(); // String qty = cutItem.get("qty").toString();
lockQty = outItem.getLockQty() + Integer.valueOf(qty); // lockQty = outItem.getLockQty() + Integer.valueOf(qty);
outItem.setLockQty(lockQty); // outItem.setLockQty(lockQty);
} // }
} // }
} // }
} // }
outItem = outItemDao.save(outItem); // outItem = outItemDao.save(outItem);
log.info("更新["+outItem.getSlotlocation()+"]"+outItem.getPn()+"真实绑定数量为["+realBindQty+"/"+outItem.getQty()+"]"); // log.info("更新["+outItem.getSlotlocation()+"]"+outItem.getPn()+"真实绑定数量为["+realBindQty+"/"+outItem.getQty()+"]");
return outItem; // return outItem;
} // }
/** /**
* 检查首盘料中不同Slot上相同的PN, 如果缺料,出首盘时要保证每一个Slot上都有料 * 检查首盘料中不同Slot上相同的PN, 如果缺料,出首盘时要保证每一个Slot上都有料
......
...@@ -609,6 +609,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -609,6 +609,7 @@ public class QisdaDeviceController extends BaseController {
String rfidLoc = request.getParameter("rfidLoc"); String rfidLoc = request.getParameter("rfidLoc");
log.debug("收到["+cid+"]紧急/分盘料[" + barcode + "]放入"+rfid+"[" + rfidLoc + "]指令"); log.debug("收到["+cid+"]紧急/分盘料[" + barcode + "]放入"+rfid+"[" + rfidLoc + "]指令");
DataLog task = findFinishedTask(barcode); DataLog task = findFinishedTask(barcode);
String tempRfid = "";
if(task != null && !task.isCancel()){ if(task != null && !task.isCancel()){
ShelfLoc shelfLoc = InquiryShelfBean.putInCutReel(task,rfid, Integer.valueOf(rfidLoc)); ShelfLoc shelfLoc = InquiryShelfBean.putInCutReel(task,rfid, Integer.valueOf(rfidLoc));
if(shelfLoc != null){ if(shelfLoc != null){
...@@ -637,7 +638,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -637,7 +638,7 @@ public class QisdaDeviceController extends BaseController {
task.setAppendInfo(appendInfo); task.setAppendInfo(appendInfo);
task = dataLogDao.save(task); task = dataLogDao.save(task);
taskService.updateFinishedTask(task); taskService.updateFinishedTask(task);
tempRfid = task.getTempRfid();
} }
...@@ -660,9 +661,11 @@ public class QisdaDeviceController extends BaseController { ...@@ -660,9 +661,11 @@ public class QisdaDeviceController extends BaseController {
if(unFinishedTask.isPackageReel()){ if(unFinishedTask.isPackageReel()){
totalPackageCutTask = totalPackageCutTask + 1; totalPackageCutTask = totalPackageCutTask + 1;
if(unFinishedTask.getCid().equals(cid)){ if(unFinishedTask.getCid().equals(cid)){
//当前包装料仓的分盘任务 //当前包装料仓中当前料架的分盘任务
if(tempRfid.equals(unFinishedTask.getTempRfid())){
cutPackageTask = cutPackageTask + 1; cutPackageTask = cutPackageTask + 1;
} }
}
}else{ }else{
cutTask = cutTask + 1; cutTask = cutTask + 1;
} }
...@@ -672,8 +675,10 @@ public class QisdaDeviceController extends BaseController { ...@@ -672,8 +675,10 @@ public class QisdaDeviceController extends BaseController {
if(unFinishedTask.isPackageReel()) { if(unFinishedTask.isPackageReel()) {
totalPackageUrgentTask = totalPackageUrgentTask + 1; totalPackageUrgentTask = totalPackageUrgentTask + 1;
if (unFinishedTask.getCid().equals(cid)) { if (unFinishedTask.getCid().equals(cid)) {
if(tempRfid.equals(unFinishedTask.getTempRfid())){
urgentPackageTask = urgentPackageTask + 1; urgentPackageTask = urgentPackageTask + 1;
} }
}
}else{ }else{
urgentTask = urgentTask + 1; urgentTask = urgentTask + 1;
} }
......
...@@ -362,7 +362,7 @@ ...@@ -362,7 +362,7 @@
flushInOutChart(); flushInOutChart();
setInterval(function(){ setInterval(function(){
flushInOutChart(); flushInOutChart();
}, 60000); }, 5 * 60000);
}); });
</script> </script>
</c:set> </c:set>
\ No newline at end of file \ No newline at end of file
...@@ -222,6 +222,7 @@ ...@@ -222,6 +222,7 @@
}, },
toolbox: { toolbox: {
feature: { feature: {
magicType: {show: true, type: ['stack', 'tiled']},
dataView: {show: true, readOnly: true}, dataView: {show: true, readOnly: true},
saveAsImage: {show: true} saveAsImage: {show: true}
} }
......
...@@ -12,6 +12,35 @@ ...@@ -12,6 +12,35 @@
<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-yellow">
<div class="timeline-time">
<span class="date">2020 </span>
<span class="time">08-26 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020082610</h2>
<div class="timeline-content">
<ul>
<li>移远料号两种规格处理</li>
<li>料仓温湿度单独页面展示</li>
<li>确认尺寸有误时,重新获取刷新</li>
<li>需求单中包装料架清理</li>
<li>3天前工单自动关闭</li>
<li>发送Qisda时,状态为0和-1都进行重发</li>
<li>大于7寸的盘使用完全兼容,7寸盘使用同尺寸兼容</li>
<li>包装料仓优先放入当前仓中</li>
<li>包装料出库按生成时间顺序</li>
报警看板页面增加吞吐量报表
吞吐量统计修正
补料与缺料重发同一盘料会有两个任务BUG
包装仓返回同一个料架还有几个任务
</ul>
</div>
</div>
</li>
<li class="timeline-grey"> <li class="timeline-grey">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2020 </span> <span class="date">2020 </span>
...@@ -21,7 +50,7 @@ ...@@ -21,7 +50,7 @@
<i class="fa fa-clock-o"></i> <i class="fa fa-clock-o"></i>
</div> </div>
<div class="timeline-body"> <div class="timeline-body">
<h2>版本: V2020080824</h2> <h2>版本: V2020082410</h2>
<div class="timeline-content"> <div class="timeline-content">
<ul> <ul>
<li>移远料号两种规格处理</li> <li>移远料号两种规格处理</li>
......
...@@ -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: 2020.08.24</span> <span class="right" style="color: #a3a3a3;">Version: 2020.08.26</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>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!