Commit 3fa4b128 sunke

需求单增加预补料需求单类型,对现有程序逻辑进行修改

根据需求单类型,将预补料需求单映射到新的补料需求单,关闭预补料需求单,并对其进行出库,如果未找到对应的补料需求单,仅关闭预补料需求单
修改: 根据ITS要求,修改获取工单小料盘绑定数量接口参数为soseqList,接收多个工单序号
预补料需求单,验证产线上未解绑料架不是4个就可以出库
1 个父辈 4871c3ad
...@@ -253,6 +253,14 @@ public class OutInfo extends BaseMongoBean { ...@@ -253,6 +253,14 @@ public class OutInfo extends BaseMongoBean {
} }
/** /**
* 是否是预补料需求单
* @return
*/
public boolean isPreTailAction(){
return getAction().contains("预补料");
}
/**
* 盘点出库需求单 * 盘点出库需求单
*/ */
public boolean isCheckAction(){ public boolean isCheckAction(){
......
package com.myproject.util; package com.myproject.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.myproject.bean.qisda.RequestOutItemBean;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -135,12 +133,16 @@ public class JsonUtil { ...@@ -135,12 +133,16 @@ public class JsonUtil {
// System.out.println(System.currentTimeMillis()); // System.out.println(System.currentTimeMillis());
// System.out.println(System.currentTimeMillis()); // System.out.println(System.currentTimeMillis());
jsonStr = "{\"state\":\"0\",\"msg\":\"鏂欏嵎浣嶆暟涓嶅尮閰??\",\"info\":{\"so\":\"\",\"facility\":\"12334\",\"company\":\"\",\"qty\":\"\",\"soseq\":\"\"}}"; jsonStr = "{\"state\":\"0\",\"msg\":\"鏂欏嵎浣嶆暟涓嶅尮閰??\",\"info\":{\"so\":\"\",\"facility\":\"12334\",\"company\":\"\",\"qty\":\"\",\"soseq\":\"\"}}";
jsonStr = "{\"data\":[{\"Serial\":\"58890\",\"VehicleID\":\"D15\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D44\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D83\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D90\",\"Status\":\"\"},{\"Serial\":\"58890\",\"VehicleID\":\"D98\",\"Status\":\"\"}]}";
Map<String, Object> map = JsonUtil.toMap(jsonStr); Map<String, Object> map = JsonUtil.toMap(jsonStr);
for (String key : map.keySet()) { Object data = map.get("data");
System.out.println(key + " = " + map.get(key).toString()); if(data != null){
List<Object> dataList = (List)data;
for (Object info : dataList) {
Map<String,String> infoMap = (Map)info;
System.out.println(infoMap.get("Serial"));
}
} }
Map infoMap = (Map) map.get("info");
System.out.println(infoMap.get("facility"));
} }
} }
...@@ -647,7 +647,7 @@ public class QisdaApi { ...@@ -647,7 +647,7 @@ public class QisdaApi {
} }
/** /**
* 检查工单料架是否解绑 * 检查工单料架是否解绑 [{"data":[{"Serial":"58890","VehicleID":"D15","Status":""},{"Serial":"58890","VehicleID":"D44","Status":""},{"Serial":"58890","VehicleID":"D83","Status":""},{"Serial":"58890","VehicleID":"D90","Status":""},{"Serial":"58890","VehicleID":"D98","Status":""}]}]
*/ */
public static String GetSerialData(String line, String hserial){ public static String GetSerialData(String line, String hserial){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/GetSerialData"; String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/GetSerialData";
...@@ -662,7 +662,7 @@ public class QisdaApi { ...@@ -662,7 +662,7 @@ public class QisdaApi {
} }
return ""; return "";
} catch (Exception e) { } catch (Exception e) {
log.error("从Qisda检查工单料架是否解绑["+line+"])接口(GetSerialData)出错",e); log.error("从Qisda检查工单料架是否解绑"+hserial+"["+line+"])接口(GetSerialData)出错",e);
return "检查出错:" + e.getMessage(); return "检查出错:" + e.getMessage();
} }
} }
......
...@@ -6,6 +6,7 @@ import com.google.common.collect.Multimap; ...@@ -6,6 +6,7 @@ import com.google.common.collect.Multimap;
import com.myproject.bean.qisda.AppendInfo; import com.myproject.bean.qisda.AppendInfo;
import com.myproject.bean.qisda.InquiryShelfBean; import com.myproject.bean.qisda.InquiryShelfBean;
import com.myproject.bean.qisda.ResultBean; import com.myproject.bean.qisda.ResultBean;
import com.myproject.bean.qisda.ShelfInfo;
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.update.qisda.OutItem;
...@@ -16,6 +17,7 @@ import com.myproject.dao.mongo.qisda.IOutInfoDao; ...@@ -16,6 +17,7 @@ import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao; import com.myproject.dao.mongo.qisda.IOutItemDao;
import com.myproject.manager.IComponentManager; import com.myproject.manager.IComponentManager;
import com.myproject.util.DateUtil; import com.myproject.util.DateUtil;
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.webService.DataCache; import com.myproject.webapp.controller.webService.DataCache;
...@@ -158,6 +160,17 @@ public class OutInfoCache { ...@@ -158,6 +160,17 @@ public class OutInfoCache {
log.info("需求单["+firstOutInfoToExecute.gethSerial()+"]产线有未解绑料架["+lineHasBindShelf+"]需要进行等待"); log.info("需求单["+firstOutInfoToExecute.gethSerial()+"]产线有未解绑料架["+lineHasBindShelf+"]需要进行等待");
return; return;
}else{ }else{
if(firstOutInfoToExecute.isPreTailAction()){
//预补料,检查是否是同一个工单未解绑的料架
boolean preTailCanOut = isPreTailCanOut(firstOutInfoToExecute.getSoseq(),lineHasBindShelf);
if(preTailCanOut){
log.info("预补料需求单["+firstOutInfoToExecute.gethSerial()+"]对应产线的料架数量小于4个,可以进行出库");
outInfoToExecute = firstOutInfoToExecute;
break;
}else{
log.info("预补料需求单["+firstOutInfoToExecute.gethSerial()+"]对应产线的料架数量大于4个,暂不进行出库");
}
}
//不需要等待,跳过验证下一个 //不需要等待,跳过验证下一个
log.info("需求单["+firstOutInfoToExecute.gethSerial()+"]产线有未解绑料架["+lineHasBindShelf+"]跳过等待,验证下一个需求单"); log.info("需求单["+firstOutInfoToExecute.gethSerial()+"]产线有未解绑料架["+lineHasBindShelf+"]跳过等待,验证下一个需求单");
continue; continue;
...@@ -194,6 +207,29 @@ public class OutInfoCache { ...@@ -194,6 +207,29 @@ public class OutInfoCache {
} }
private boolean isPreTailCanOut(String soseq, String lineHasBindShelfJsonStr){
Map<String, Object> map = JsonUtil.toMap(lineHasBindShelfJsonStr);
Object data = map.get("data");
if(data != null){
List<Object> dataList = (List)data;
int remainShelfCount = 0;
for (Object info : dataList) {
Map<String,String> infoMap = (Map)info;
String hSerial = infoMap.get("Serial");
OutInfo outInfo = getOutInfoFromCache(hSerial);
if(outInfo != null && outInfo.getSoseq().equals(soseq)){
remainShelfCount ++;
}else{
//有不是同一个需求单的未解绑料架,不允许出库
return false;
}
}
//必须小于4个(即有空位)才可以出料
return remainShelfCount < 4;
}
return false;
}
private OutInfo findExecuteOrderHSerial(List<OutInfo> cachedOutInfos,List<String> excludeSerialList){ private OutInfo findExecuteOrderHSerial(List<OutInfo> cachedOutInfos,List<String> excludeSerialList){
OutInfo mustOutInfo = null; OutInfo mustOutInfo = null;
//已到达建议时间的需求单 //已到达建议时间的需求单
...@@ -839,13 +875,37 @@ public class OutInfoCache { ...@@ -839,13 +875,37 @@ 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 outInfo = getOutInfoFromCache(hSerial); OutInfo outInfoToExecute = getOutInfoFromCache(hSerial);
ResultBean resultBean = checkOutInfoCanOut(outInfo); ResultBean resultBean = checkOutInfoCanOut(outInfoToExecute);
if(resultBean != null){ if(resultBean != null){
return resultBean; return resultBean;
} }
OutInfo outInfo = null;
if(outInfoToExecute.isPreTailAction()){
//预补料需求单,查找对应的未执行过的补料需求单
for (OutInfo info : outInfoMap.values()) {
if(info.getSoseq().equals(outInfoToExecute.getSoseq()) && info.getFirstExecuteTime() <=0){
outInfo = info;
break;
}
}
if(outInfo == null){
String msg = "未查找到预补料需求单"+hSerial+"["+outInfoToExecute.getSo()+"]对应的补料需求单,关闭预补料需求单";
log.info(msg);
closeHSerial(hSerial);
return ResultBean.newErrorResult(5001,msg);
}else{
log.info("查找到预补料需求单"+hSerial+"["+outInfoToExecute.getSo()+"]对应的补料需求单["+outInfo.gethSerial()+"],关闭预补料需求单,开始出库补料需求单");
closeHSerial(hSerial);
}
}else{
outInfo = outInfoToExecute;
}
//非分盘料才进行真实绑定 //非分盘料才进行真实绑定
if(!outInfo.isReelCutAction()){ if(!outInfo.isReelCutAction()){
OutInfo cutOutInfo = soseqCache.getCutActionInfoFromCache(outInfo.getSoseq()); OutInfo cutOutInfo = soseqCache.getCutActionInfoFromCache(outInfo.getSoseq());
...@@ -931,15 +991,29 @@ public class OutInfoCache { ...@@ -931,15 +991,29 @@ public class OutInfoCache {
String msg = ""; 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);
boolean needAddToTotal = true;
resetTaskNum(hSerial, outReelNum,outInfoExecuted,needAddToTotal);
//补料出库,且不是缺料重发,需要重新排序,按站位序号循环出,每次出最大的盘 //补料出库,且不是缺料重发,需要重新排序,按站位序号循环出,每次出最大的盘
if(outInfo.isTailAction() && !outInfoExecuted){ if(outInfo.isTailAction() && !outInfoExecuted){
//是否满料架,没满需补满
// ShelfInfo maxDShelf = InquiryShelfBean.findMaxUsedShelf(outInfo.gethSerial(), StorageConstants.SHEFL_TYPE.D);
// if(!maxDShelf.reachMaxLoc()){
// //是否已放满,未放满的话,每个站别补一盘补满
// List<StoragePos> allBindPosList = storagePosDao.listSoSeqBindPos(outInfo.getSoseq());
// for (StoragePos storagePos : allBindPosList) {
// int slotIndex = storagePos.getBarcode().getAppendInfo().getSlotIndex();
//
// }
//
// }
tasks = sortTailTasks(tasks); tasks = sortTailTasks(tasks);
} }
log.info("需求单"+outInfo.gethSerial()+"已出("+outInfo.getOutReelNum()+")/已发("+outInfo.getTaskFinishNum()+") 本次出库料盘数量:" + outReelNum);
boolean needAddToTotal = true;
resetTaskNum(hSerial, outReelNum,outInfoExecuted,needAddToTotal);
//先出小料盘,再出大料盘 //先出小料盘,再出大料盘
for (DataLog task : tasks) { for (DataLog task : tasks) {
if(task.isSmallReel()){ if(task.isSmallReel()){
......
...@@ -224,20 +224,26 @@ public class QisdaApiController extends BaseController { ...@@ -224,20 +224,26 @@ public class QisdaApiController extends BaseController {
@RequestMapping(value = "/getSmallBindCount") @RequestMapping(value = "/getSmallBindCount")
@ResponseBody @ResponseBody
public ResultBean smallBindCount(HttpServletRequest request){ public ResultBean smallBindCount(HttpServletRequest request){
String soseqStr = receiveParamInfo(request,"soseq"); String soseqListStr = receiveParamInfo(request,"soseqList");
log.info("收到获取工单的小料盘绑定数量 soseq="+soseqStr); log.info("收到获取工单的小料盘绑定数量 soseqList="+soseqListStr);
int smallBindCount = 0; int smallBindCount = 0;
List<StoragePos> bindPosList = storagePosDao.listSoSeqBindPos(soseqStr); String[] soseqList = soseqListStr.split(",");
List<Map<String,String>> resultList = new ArrayList<>();
for (String soseq : soseqList) {
List<StoragePos> bindPosList = storagePosDao.listSoSeqBindPos(soseq);
for (StoragePos storagePos : bindPosList) { for (StoragePos storagePos : bindPosList) {
Barcode reel = storagePos.getBarcode(); Barcode reel = storagePos.getBarcode();
if(reel.isSmallReel()){ if(reel.isSmallReel()){
smallBindCount++; smallBindCount++;
} }
} }
Map<String,String> resultMap = new HashMap<>(); Map<String,String> itemMap = new HashMap<>();
resultMap.put("soseq", soseqStr); itemMap.put("soseq", soseq);
resultMap.put("smallCount", "" + smallBindCount); itemMap.put("smallCount", "" + smallBindCount);
return ResultBean.newOkResult(resultMap); resultList.add(itemMap);
}
return ResultBean.newOkResult(resultList);
} }
/** /**
......
...@@ -142,7 +142,7 @@ ...@@ -142,7 +142,7 @@
'<div class="panel-heading">' + '<div class="panel-heading">' +
'<h4 class="panel-title">' + '<h4 class="panel-title">' +
'<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">建议时间: '+sdate+'</span>' + '<span class="right">建议时间: '+sdate+'</span>' +
'<span class="right">必须时间: '+mdate+'</span>' + '<span class="right">必须时间: '+mdate+'</span>' +
......
...@@ -12,6 +12,43 @@ ...@@ -12,6 +12,43 @@
<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-purple">
<div class="timeline-time">
<span class="date">2020 </span>
<span class="time">11-27 </span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020112712</h2>
<div class="timeline-content">
<ul>
<li>预补料需求单,验证产线上未解绑料架不是4个就可以出库</li>
</ul>
</div>
</div>
</li>
<li class="timeline-green">
<div class="timeline-time">
<span class="date">2020</span>
<span class="time">11-26</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2020112610</h2>
<div class="timeline-content">
<ul>
<li>需求单增加预补料需求单类型,对现有程序逻辑进行修改</li>
<li>根据需求单类型,将预补料需求单映射到新的补料需求单,关闭预补料需求单,并对其进行出库,如果未找到对应的补料需求单,仅关闭预补料需求单</li>
<li>修改: 根据ITS要求,修改获取工单小料盘绑定数量接口参数为soseqList,接收多个工单序号</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.11.20</span> <span class="right" style="color: #a3a3a3;">Version: 2020.11.27</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!