Commit 69eb8af4 sunke

线外发料

精简日志
报警看板修改
1 个父辈 613d64a2
To get started, please complete the following steps:
1. Download and install a MySQL 5.x database from
http://dev.mysql.com/downloads/mysql/5.0.html#downloads.
2. Install maven 3.x, and configure it.
3. Modify the jdbc property in the pom.xml of myproject, make sure the
jdbc url, username and password is correct.
4. Run "mvn install" to install the parent pom.xml to your local repository.
5. Run "mvn jetty:run" under myproject, and view the application at http://localhost:8080.
It takes long time to download jars at the first time, so be patient.
By the way, there wasn't data in your database, so you need run "mvn dbunit:operation"
to insert the basic data to your DB. Use admin/admin to login the system.
6. If you want to make a war file, just run "mvn package -DskipTests" under myproject,
it will generate a war file under myproject/target.
C:\Windows\system32>mongod --storageEngine=mmapv1 --logappend --directoryperdb --serviceName MongoDB --install C:\Windows\system32>mongod --storageEngine=mmapv1 --logappend --directoryperdb --serviceName MongoDB --install
......
...@@ -736,7 +736,7 @@ public class OutInfoCache { ...@@ -736,7 +736,7 @@ public class OutInfoCache {
} }
} }
String msg = "";
int outReelNum = tasks.size(); int outReelNum = tasks.size();
if(outReelNum > 0){ if(outReelNum > 0){
log.info("需求单"+outInfo.gethSerial()+"已出("+outInfo.getOutReelNum()+")/已发("+outInfo.getTaskFinishNum()+") 本次出库料盘数量:" + outReelNum); log.info("需求单"+outInfo.gethSerial()+"已出("+outInfo.getOutReelNum()+")/已发("+outInfo.getTaskFinishNum()+") 本次出库料盘数量:" + outReelNum);
...@@ -759,9 +759,11 @@ public class OutInfoCache { ...@@ -759,9 +759,11 @@ public class OutInfoCache {
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
} }
} }
msg = "需求单"+hSerial+"任务分配完成,共["+outReelNum+"]盘任务";
log.info(msg);
}else{ }else{
log.info("需求单"+outInfo.gethSerial()+"本次出库料盘数量为0"); msg = "需求单"+outInfo.gethSerial()+"本次出库料盘数量为0";
} }
if(outInfo.isReelCutAction() || outInfo.isFirstReelAction()){ if(outInfo.isReelCutAction() || outInfo.isFirstReelAction()){
...@@ -771,8 +773,6 @@ public class OutInfoCache { ...@@ -771,8 +773,6 @@ public class OutInfoCache {
QisdaApi.VMILocationOutFeedback(outItemList, lessBind); QisdaApi.VMILocationOutFeedback(outItemList, lessBind);
} }
} }
String msg = "需求单"+hSerial+"任务分配完成,共["+outReelNum+"]盘任务";
log.info(msg);
return ResultBean.newOkResult(msg,"ok"); return ResultBean.newOkResult(msg,"ok");
} }
......
...@@ -86,7 +86,7 @@ public class SoseqCache { ...@@ -86,7 +86,7 @@ public class SoseqCache {
} }
} }
public void addToTotalSendQty(OutItem outItem, int sendQty){ public synchronized void addToTotalSendQty(OutItem outItem, int sendQty){
OutInfo outInfo = getCutActionInfoFromCache(outItem.getSoseq()); OutInfo outInfo = getCutActionInfoFromCache(outItem.getSoseq());
if(outInfo != null){ if(outInfo != null){
OutItem cutOutItem = getCutOutItem(outItem.getSoseq(), outItem.getSlotlocation()); OutItem cutOutItem = getCutOutItem(outItem.getSoseq(), outItem.getSlotlocation());
......
...@@ -76,6 +76,7 @@ public class StoragePosUpdateController extends BaseUpdateController { ...@@ -76,6 +76,7 @@ public class StoragePosUpdateController extends BaseUpdateController {
storagePos.setBarcode(null); storagePos.setBarcode(null);
storagePos.setUsed(false); storagePos.setUsed(false);
storagePosManager.save(storagePos); storagePosManager.save(storagePos);
dataCache.updateInventory(storagePos,barcode);
} }
return ""; return "";
......
...@@ -8,10 +8,13 @@ import com.myproject.bean.update.*; ...@@ -8,10 +8,13 @@ import com.myproject.bean.update.*;
import com.myproject.bean.update.qisda.DNInfo; import com.myproject.bean.update.qisda.DNInfo;
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.update.qisda.OutItem;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.dao.mongo.IStoragePosDao; import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao; import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao; 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.IStoragePosManager;
import com.myproject.util.*; import com.myproject.util.*;
import com.myproject.webapp.controller.qisda.util.OutInfoCache; import com.myproject.webapp.controller.qisda.util.OutInfoCache;
import com.myproject.webapp.controller.qisda.util.SoseqCache; import com.myproject.webapp.controller.qisda.util.SoseqCache;
...@@ -52,10 +55,20 @@ public class QisdaApiController extends BaseController { ...@@ -52,10 +55,20 @@ public class QisdaApiController extends BaseController {
@Autowired @Autowired
private SoseqCache soseqCache; private SoseqCache soseqCache;
@Autowired @Autowired
private QisdaBindService qisdaBindService; private QisdaBindService qisdaBindService;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private DataCache dataCache;
@Autowired
private IDataLogDao dataLogDao;
protected final static Logger log = LogManager.getLogger(QisdaApiController.class); protected final static Logger log = LogManager.getLogger(QisdaApiController.class);
/** /**
* 基础数据同步 * 基础数据同步
...@@ -268,6 +281,45 @@ public class QisdaApiController extends BaseController { ...@@ -268,6 +281,45 @@ public class QisdaApiController extends BaseController {
} }
/** /**
* 线外发料接口
*/
@RequestMapping(value = "/outLineSend")
@ResponseBody
public ResultBean outLineSend(HttpServletRequest request){
try {
String soseq = receiveParamInfo(request,"soseq");
String slotserial = receiveParamInfo(request,"slotserial");
String reelid = receiveParamInfo(request,"reelid");
String pn = receiveParamInfo(request,"pn");
String amount = receiveParamInfo(request,"amount");
log.info("收到线外发料请求soseq="+soseq +" slotserial="+slotserial+" reelid="+reelid +" pn="+pn + " amount="+amount);
if(soseq == null || slotserial == null || amount == null){
return ResultBean.newErrorResult(-1,"参数错误:soseq,slotserial,amount为必须参数");
}
int outSendQty = Integer.valueOf(amount);
OutItem cutOutItem = soseqCache.getCutOutItem(soseq, Integer.valueOf(slotserial));
if(cutOutItem != null){
//更新发料数量,更新真实绑定数量
soseqCache.addToTotalSendQty(cutOutItem,outSendQty);
int realBindQty = cutOutItem.getRealLockQty() + outSendQty;
soseqCache.updateTotalRealLockQty(cutOutItem, realBindQty);
//记录出入库日志
saveOutLineTask(cutOutItem,reelid,pn,outSendQty);
ResultBean resultBean = ResultBean.newOkResult("");
return resultBean;
}else{
return ResultBean.newErrorResult(-1,"未找到soseq="+soseq+" slotserial="+slotserial+"的需求单");
}
} catch (Exception e) {
log.error("需求单请求处理出错", e);
return ResultBean.newErrorResult(1001,"内部错误:" + e.getMessage());
}
}
/**
* 出库 * 出库
*/ */
@RequestMapping(value = "/out",method = RequestMethod.POST) @RequestMapping(value = "/out",method = RequestMethod.POST)
...@@ -488,6 +540,64 @@ public class QisdaApiController extends BaseController { ...@@ -488,6 +540,64 @@ public class QisdaApiController extends BaseController {
return paramMap; return paramMap;
} }
private void saveOutLineTask(OutItem outItem, String reelId, String pn, int outSendQty){
try{
DataLog task = new DataLog();
task.setType(StorageConstants.OP.CHECKOUT);
task.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
task.setSourceName("线外_"+ outItem.getSo() + "_" + outItem.getSlotlocation());
StoragePos pos = storagePosDao.findByBarcode(reelId);
AppendInfo appendInfo = new AppendInfo();
if(pos != null){
task.setCid("");
task.setStorageId(pos.getStorageId());
task.setStorageName("");
task.setPosId(pos.getId());
task.setPosName(pos.getPosName());
Barcode barcode = pos.getBarcode();
if(barcode != null){
task.setPartNumber(barcode.getPartNumber());
task.setBarcode(barcode.getBarcode());
task.setNum(barcode.getInitialAmount());
task.setW(barcode.getPlateSize());
task.setH(barcode.getHeight());
appendInfo = barcode.getAppendInfo();
log.info("线外发料["+outItem.getSoseq()+"]时,清理库位["+pos.getPosName()+"]中的库存"+barcode.getBarcode());
barcode.setPosName("");
barcodeManager.save(barcode);
pos.setBarcode(null);
pos.setUsed(false);
storagePosManager.save(pos);
dataCache.updateInventory(pos,barcode);
}
}else{
task.setPartNumber(pn);
task.setBarcode(reelId);
task.setNum(outSendQty);
}
appendInfo.setSo(outItem.getSo());
appendInfo.setSoseq(outItem.getSoseq());
appendInfo.setRefno(outItem.getRefno());
appendInfo.sethSerial(outItem.gethSerial());
appendInfo.setSlotStr(outItem.getSlotStr());
appendInfo.setSlotIndex(outItem.getSlotlocation());
appendInfo.setAction(outItem.getAction());
appendInfo.setOutItemId(outItem.getId());
task.setAppendInfo(appendInfo);
dataLogDao.save(task);
}catch (Exception ex){
log.info("线外发料出错",ex);
}
}
} }
...@@ -581,7 +581,7 @@ public class TaskService implements ITaskService { ...@@ -581,7 +581,7 @@ public class TaskService implements ITaskService {
Collection<String> operatingPosIds = excludePosIds(); Collection<String> operatingPosIds = excludePosIds();
for (Storage storage : availbleStorageList) { for (Storage storage : availbleStorageList) {
try{ try{
log.info("尝试从["+storage.getCid()+"]中为["+barcode.getBarcode()+"]查找空位"); log.debug("尝试从["+storage.getCid()+"]中为["+barcode.getBarcode()+"]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode , operatingPosIds); StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode , operatingPosIds);
if(pos != null){ if(pos != null){
return pos; return pos;
......
...@@ -10,22 +10,28 @@ ...@@ -10,22 +10,28 @@
height: 360px; height: 360px;
overflow-y: scroll; overflow-y: scroll;
} }
.label{
color: #000000;
}
.label-alarm{ .label-alarm{
color: white; color: #FF0000 !important;
background-color: #df4441 !important; /*background-color: #df4441 !important;*/
border-color: #df6821 !important; /*border-color: #df6821 !important;*/
} }
.task-content{ .task-content{
/*width: 800px;*/ /*width: 800px;*/
} }
.feeds li {
background-color: white;
}
</style> </style>
<!-- BEGIN PAGE HEADER--> <!-- BEGIN PAGE HEADER-->
<%--<h3 class="page-title">--%> <%--<h3 class="page-title">--%>
<%--<fmt:message key="异常看板"/>--%> <%--<fmt:message key="异常看板"/>--%>
<%--</h3>--%> <%--</h3>--%>
...@@ -45,113 +51,116 @@ ...@@ -45,113 +51,116 @@
</div> </div>
</div> </div>
<div class="portlet-body"> <div class="portlet-body">
<div id="inOutChart" class="chart" style="height: 350px; overflow: hidden;"> <div id="inOutChart" class="chart" style="height: 300px; overflow: hidden;">
</div> </div>
</div> </div>
</div> </div>
<!-- END CHART PORTLET--> <!-- END CHART PORTLET-->
</div> </div>
<!--任务 -->
<!--AGV-->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-list"></i>任务 <i class="fa fa-list"></i>料仓AGV
</div> </div>
</div> </div>
<div class="portlet-body" style="height:300px;overflow: auto;">
<div class="portlet-body" style="height:200px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="task"> <ul class="feeds" id="agv">
</ul> </ul>
</div> </div>
<%--<div class="task-footer">--%>
<%--<div class="btn-arrow-link pull-right">--%>
<%--<a href="${ctx}/workOrder/feederSearch.html">more</a>--%>
<%--<i class="icon-arrow-right"></i>--%>
<%--</div>--%>
<%--</div>--%>
</div> </div>
</div> </div>
</div> </div>
<!--温度 --> <!--双层线-->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-list"></i>料仓 <i class="fa fa-list"></i>双层线
</div> </div>
</div> </div>
<div class="portlet-body" style="height:300px;overflow: auto;">
<div class="portlet-body" style="height:200px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="box"> <ul class="feeds" id="doubleLine">
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!--流水线-->
<!--产线 AGV-->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-list"></i>流水线 <i class="fa fa-list"></i>产线 AGV
</div> </div>
</div> </div>
<div class="portlet-body" style="height:300px;overflow: auto;"> <div class="portlet-body" style="height:200px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="line"> <ul class="feeds" id="lineAgv">
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!--双层线-->
<!--任务 -->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-list"></i>双层线 <i class="fa fa-list"></i>任务
</div> </div>
</div> </div>
<div class="portlet-body" style="height:200px;overflow: auto;">
<div class="portlet-body" style="height:300px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="doubleLine"> <ul class="feeds" id="task">
</ul> </ul>
</div> </div>
<%--<div class="task-footer">--%>
<%--<div class="btn-arrow-link pull-right">--%>
<%--<a href="${ctx}/workOrder/feederSearch.html">more</a>--%>
<%--<i class="icon-arrow-right"></i>--%>
<%--</div>--%>
<%--</div>--%>
</div> </div>
</div> </div>
</div> </div>
<!--AGV--> <!--温度 -->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-list"></i>AGV <i class="fa fa-list"></i>料仓
</div> </div>
</div> </div>
<div class="portlet-body" style="height:200px;overflow: auto;">
<div class="portlet-body" style="height:300px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="agv"> <ul class="feeds" id="box">
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!--产线 AGV--> <!--流水线-->
<div class="col-md-4 col-sm-4"> <div class="col-md-4 col-sm-4">
<div class="portlet light bordered"> <div class="portlet light bordered">
<div class="portlet-title"> <div class="portlet-title">
<div class="caption"> <div class="caption">
<i class="fa fa-list"></i>产线 AGV <i class="fa fa-list"></i>流水线
</div> </div>
</div> </div>
<div class="portlet-body" style="height:300px;overflow: auto;"> <div class="portlet-body" style="height:200px;overflow: auto;">
<div class="task-content"> <div class="task-content">
<ul class="feeds" id="lineAgv"> <ul class="feeds" id="line">
</ul> </ul>
</div> </div>
</div> </div>
...@@ -187,10 +196,14 @@ ...@@ -187,10 +196,14 @@
for(var i in list){ for(var i in list){
var msgBean = list[i]; var msgBean = list[i];
var msgKey = msgBean.msgKey; var msgKey = msgBean.msgKey;
var alarmClass = "label-alarm";
if(msgBean.type == 1){
alarmClass = "";
}
var documentId = msgKey.split(".")[0]; var documentId = msgKey.split(".")[0];
var msgItem = "<li>" + var msgItem = "<li>" +
"<span class='task-title-sp'>["+msgBean.name+"]</span>" + "<span class='task-title-sp '>["+msgBean.name+"]</span>" +
"<span class='label label-sm label-alarm'>" + "<span class='label label-sm "+alarmClass+"'>" +
msgBean.msgValue +"</span>" + msgBean.msgValue +"</span>" +
"</li>"; "</li>";
var html = msgMap[documentId]; var html = msgMap[documentId];
...@@ -222,7 +235,7 @@ ...@@ -222,7 +235,7 @@
$.post("${ctx}/service/store/tasks", {}, function (data) { $.post("${ctx}/service/store/tasks", {}, function (data) {
var html = ""; var html = "";
for(var item in data){ for(var item in data){
if(!data[item].timeout){ if(!data[item].timeout || !data[item].executing){
continue; continue;
} }
var partNumber = data[item].partNumber; var partNumber = data[item].partNumber;
......
...@@ -12,6 +12,24 @@ ...@@ -12,6 +12,24 @@
<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">2020</span>
<span class="time">09-02</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020090218</h2>
<div class="timeline-content">
<ul>
<li>线外发料接口</li>
<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">2020 </span> <span class="date">2020 </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: 2020.08.28</span> <span class="right" style="color: #a3a3a3;">Version: 2020.09.02</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,6 +29,10 @@ ...@@ -29,6 +29,10 @@
</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!