Commit a7812229 sunke

包装料出库锁定架位,双层线获取位置时增加realRfid

1 个父辈 78ae0bd5
......@@ -291,7 +291,7 @@ public class AppendInfo {
if(action == null){
return false;
}
return action.equals("补料");
return action.equals("补料");
}
public String getDnOrFacility(){
......@@ -337,6 +337,14 @@ public class AppendInfo {
this.cisIn = cisIn;
}
public boolean isCShelfTask(){
return StorageConstants.SHEFL_TYPE.isCShelf(getShelfType());
}
public boolean isDShelfTask(){
return StorageConstants.SHEFL_TYPE.isDShelf(getShelfType());
}
@Override
public String toString() {
return "AppendInfo{" +
......
......@@ -145,14 +145,16 @@ public class InquiryShelfBean {
if(emptyShelfInfo != null){
if(task != null){
int loc = -1;
AppendInfo appendInfo = task.getAppendInfo();
if(task.isPackageReel()){
//包装料,固定库位
loc = emptyShelfInfo.addLimitLoc(task.getBarcode(),task.getReelType());
appendInfo.setRfidLoc(loc);
}else{
loc = emptyShelfInfo.addLimitLoc(barcode,task.getReelType());
}
log.info("工单"+outItem.getSo()+"["+outItem.getSlotlocation()+"]"+outItem.getPn()+"添加架位["+emptyShelfInfo.tempRfid() + "]["+ loc +"]=" + barcode);
AppendInfo appendInfo = task.getAppendInfo();
log.info("工单"+outItem.getSo()+"["+outItem.getSlotlocation()+"]"+outItem.getPn()+"为["+task.getBarcode()+"]添加架位["+emptyShelfInfo.tempRfid() + "]["+ loc +"]=" + barcode);
appendInfo.setRfidIndex(emptyShelfInfo.getRfidIndex());
appendInfo.setShelfType(shelfType);
appendInfo.sethSerial(hSerial);
......@@ -185,7 +187,7 @@ public class InquiryShelfBean {
Map<String, ShelfInfo> shelfMap = hSerialShelfMap.get(hSerial);
if(shelfMap != null){
for (ShelfInfo shelf : shelfMap.values()) {
String shelfRFID = shelf.getRfid();
String shelfRFID = shelf.getRealRfid();
log.info(shelf.tempRfid() + "判断料架["+shelfRFID+"] = " + rfid);
if(shelfRFID != null && rfid != null){
if(shelfRFID.equals(rfid)){
......@@ -213,7 +215,7 @@ public class InquiryShelfBean {
ShelfInfo maxLocShelf = null;
for (Map<String, ShelfInfo> shelfInfoMap : hSerialShelfMap.values()) {
for (ShelfInfo shelf : shelfInfoMap.values()) {
String shelfRFID = shelf.getRfid();
String shelfRFID = shelf.getRealRfid();
if(StorageConstants.SHEFL_TYPE.judgeType(bigRfid, shelf.getShelfType())){
if(shelfRFID != null){
if(shelfRFID.equals(bigRfid)){
......@@ -245,7 +247,7 @@ public class InquiryShelfBean {
}
for (Map<String, ShelfInfo> shelfInfoMap : hSerialShelfMap.values()) {
for (ShelfInfo shelf : shelfInfoMap.values()) {
String shelfRFID = shelf.getRfid();
String shelfRFID = shelf.getRealRfid();
if(shelfRFID != null){
if(shelfRFID.equals(packageRfid)){
//已经绑定过该Temp料架
......@@ -272,8 +274,9 @@ public class InquiryShelfBean {
if(loc != -1){
ShelfLoc shelfLoc = new ShelfLoc();
shelfLoc.setLoc(loc);
shelfLoc.setRfid(shelfInfo.tempRfid());
log.info("查找到["+barcode+"]分配的库位" + shelfInfo.tempRfid()+"["+loc+"]");
shelfLoc.setTempRfid(shelfInfo.tempRfid());
shelfLoc.setRealRfid(shelfInfo.getRealRfid());
log.info("查找到["+barcode+"]分配的库位" + shelfInfo.tempRfid()+"["+loc+"] Task库位"+appendInfo.getRfid()+"["+appendInfo.getRfidLoc()+"]");
return shelfLoc;
}
}
......@@ -302,7 +305,7 @@ public class InquiryShelfBean {
if(shelfInfo != null){
//找到与实际料架相同的料架,但料架上已经满了,查找其他同类型料架
if(shelfInfo.isFull()){
log.info("料架["+shelfInfo.getRfid()+"]已满,查找新的料架");
log.info("料架["+shelfInfo.getRealRfid()+"]="+shelfInfo.tempRfid()+"已满,查找新的料架");
shelfInfo = null;
}
}
......@@ -324,7 +327,7 @@ public class InquiryShelfBean {
}
shelfInfo = maxLocShelf;
if(shelfInfo != null){
log.info(task.getBarcode() + "未找到rfid=["+rfid+"]的空料架,使用库位最多的同种料架["+shelfInfo.tempRfid()+"]");
log.info(task.getBarcode() + "["+ appendInfo.getTempRfid()+"]未找到rfid=["+rfid+"]的空料架,使用库位最多的同种料架["+shelfInfo.tempRfid()+"]");
}else{
log.info("已没有与["+rfid+"]类型相同的料架");;
}
......@@ -340,16 +343,19 @@ public class InquiryShelfBean {
ShelfLoc lockLoc = shelfInfo.lockOneEmptyLoc(task.getBarcode(), task.getReelType(), robotIndex);
if(lockLoc != null){
log.info("为["+task.getBarcode()+"]锁定架位:" + shelfInfo.tempRfid() + "[" +shelfInfo.getRfid()+"]["+lockLoc.getLoc()+"]原来分配架位:" + appendInfo.getTempRfid() + "[" + appendInfo.getRfidLoc() + "]");
log.info("为["+task.getBarcode()+"]锁定架位:" + shelfInfo.tempRfid() + "[" +shelfInfo.getRealRfid()+"]["+lockLoc.getLoc()+"]原来分配架位:" + appendInfo.getTempRfid() + "[" + appendInfo.getRfidLoc() + "]");
// ShelfLoc shelfLoc = new ShelfLoc();
// shelfLoc.setLoc(lockLoc);
// shelfLoc.setRfid(rfid);
if(shelfInfo.getRfid() == null || shelfInfo.getRfid().isEmpty()){
if(shelfInfo.getRealRfid() == null || shelfInfo.getRealRfid().isEmpty()){
//未绑定过的,使用TempRFID
lockLoc.setRfid(shelfInfo.tempRfid());
lockLoc.setTempRfid(shelfInfo.tempRfid());
lockLoc.setRealRfid("");
}else{
lockLoc.setRfid(shelfInfo.getRfid());
//绑定过的使用RealRfid
lockLoc.setRealRfid(shelfInfo.getRealRfid());
lockLoc.setTempRfid("");
}
updateShelfInfo(shelfInfo);
return lockLoc;
......@@ -388,7 +394,7 @@ public class InquiryShelfBean {
}else{
log.info("未找到["+hSerial+"]相关料架");
}
log.error("物料["+task.getBarcode()+"]更新料架" + rfid +"["+loc+"]缓存失败");
log.error("物料["+task.getBarcode()+"]("+task.getAppendInfo().getTempRfid()+"["+task.getAppendInfo().getRfidLoc()+"])更新料架" + rfid +"["+loc+"]缓存失败");
return false;
}
......
......@@ -49,7 +49,7 @@ public class ShelfInfo {
/**
* 实际编号
*/
private String rfid;
private String realRfid;
/**
* 料架类型
......@@ -86,12 +86,15 @@ public class ShelfInfo {
this.locMap = locMap;
}
public String getRfid() {
return rfid;
public String getRealRfid() {
if(realRfid == null){
return "";
}
return realRfid;
}
public void setRfid(String rfid) {
this.rfid = rfid;
public void setRealRfid(String realRfid) {
this.realRfid = realRfid;
}
public int getRfidIndex() {
......@@ -127,9 +130,9 @@ public class ShelfInfo {
* @param barcode
*/
public boolean putInLoc(String rfid, int loc, String barcode){
if(this.rfid != null && !this.rfid.isEmpty()){
if(this.realRfid != null && !this.realRfid.isEmpty()){
//已绑定过真实料架,必须一致才能放入
if(!this.rfid.equals(rfid)){
if(!this.realRfid.equals(rfid)){
return false;
}
}
......@@ -157,7 +160,7 @@ public class ShelfInfo {
log.error(barcode + "放置位置["+loc+"]与锁定位置["+lockLocation+"]不一致");
return false;
}
this.setRfid(rfid);
this.setRealRfid(rfid);
ShelfLoc shelfLoc = locMap.get(loc);
if(shelfLoc == null){
log.error("未找到["+loc+"]的位置信息,当前料架位置信息:"+ locMap);
......@@ -175,7 +178,7 @@ public class ShelfInfo {
if(shelfLoc.isInThisLoc(barcode)){
shelfLoc.putIn(barcode);
locMap.put(rfidLoc, shelfLoc);
this.setRfid(rfid);
this.setRealRfid(rfid);
return true;
}
......
......@@ -7,11 +7,15 @@ import com.myproject.util.StorageConstants;
*/
public class ShelfLoc {
/**
* 真实料架
*/
private String realRfid;
/**
* 料架号
* 虚拟料架号
*/
private String rfid;
private String tempRfid;
/**
* 架位号
......@@ -111,12 +115,12 @@ public class ShelfLoc {
return this.barcode != null && !this.barcode.isEmpty();
}
public String getRfid() {
return rfid;
public String getTempRfid() {
return tempRfid;
}
public void setRfid(String rfid) {
this.rfid = rfid;
public void setTempRfid(String tempRfid) {
this.tempRfid = tempRfid;
}
/**
......@@ -130,4 +134,12 @@ public class ShelfLoc {
}
return false;
}
public String getRealRfid() {
return realRfid;
}
public void setRealRfid(String realRfid) {
this.realRfid = realRfid;
}
}
......@@ -308,6 +308,34 @@ public class OutItem extends BaseMongoBean {
}
/**
* 是否满足
* @return
*/
public boolean isOutOk(){
//首盘料,只要有出料就算完成
if(isFirstReelAction()){
//发料完成才算
return getOutQty() > 0;
}else if(isReelCutAction()){
//分盘需求,分盘料出库数量+真实绑定数量大于需求数量才算出库完成
if(isCutMaterial()){
return getOutQty() + getRealLockQty() >= getQty();
}else{
//非分盘料
return true;
}
}else if(isUrgentAction()){
//紧急料,出库数量大于需求数量
return outLessQty() <=0;
}else if(isTailAction()){
//发料完成
return sendLessQty() <= 0;
}
return false;
}
/**
* 首盘需求单
*/
public boolean isFirstReelAction(){
......
......@@ -672,7 +672,7 @@ public class QisdaApiController extends BaseController {
}else{
log.info(barcode.getBarcode() + " ["+dnOrFacility+"]收料判定: NG" + resultStr);
if(resultStr.startsWith("0")){
throw new ValidateException(" ["+dnOrFacility+"]收料判定NG:" + resultStr.substring(1));
throw new ValidateException(" ["+dnOrFacility+"]收料判定NG:" + resultStr);
}else{
throw new ValidateException(" ["+dnOrFacility+"]收料判定NG: 内部异常");
}
......@@ -840,6 +840,12 @@ public class QisdaApiController extends BaseController {
* @param latest 本次工单第几盘料(F 第一次,L 最后一次, M 中间)
*/
public static void OutFinished(DataLog task, Barcode barcode, String latest){
AppendInfo appendInfo = task.getAppendInfo();
if(appendInfo.isFirstReelAction() || appendInfo.isTailAction()){
log.info("工单料任务,出库时发送空的FML状态");
latest = "";
}
Map<String, Object> materialInfoMap = getOutMaterialInfoMap(task, latest);
List<Map<String, Object>> cutItems = barcode.getCutItems();
if(cutItems != null){
......
......@@ -2,11 +2,13 @@ package com.myproject.webapp.controller.webService;
import com.myproject.bean.CodeBean;
import com.myproject.bean.qisda.*;
import com.myproject.bean.update.AlarmInfo;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.DataLog;
import com.myproject.bean.update.Storage;
import com.myproject.bean.update.qisda.OutInfo;
import com.myproject.bean.update.qisda.OutItem;
import com.myproject.dao.mongo.IAlarmInfoDao;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao;
......@@ -60,6 +62,9 @@ public class QisdaDeviceController extends BaseController {
@Autowired
private OutInfoCache outInfoCache;
@Autowired
private IAlarmInfoDao alarmInfoDao;
protected final static Logger log = LogManager.getLogger(QisdaDeviceController.class);
/**
......@@ -196,6 +201,7 @@ public class QisdaDeviceController extends BaseController {
String packageRfid = request.getParameter("packageRfid");
log.info("收到包装料摆放位置信息请求:[packageRfid=" + packageRfid + "]bigRfid=" + bigRfid);
ShelfInfo packageShelf = inquiryShelfBean.findPackageShelf(packageRfid);
ShelfInfo bigShelf = inquiryShelfBean.findBigShelf(bigRfid);
if(bigShelf != null){
Collection<DataLog> queueTasks = taskService.getQueueTasks();
......@@ -357,7 +363,13 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newErrorResult(202, msg);
}
appendInfo.setRfid(shelfLoc.getRfid());
String rfidToSave = shelfLoc.getRealRfid();
if(rfidToSave == null || rfidToSave.isEmpty()){
//料架上放的第一盘料,没绑定,使用tempRfid
rfidToSave = shelfLoc.getTempRfid();
}
appendInfo.setRfid(rfidToSave);
appendInfo.setRfidLoc(shelfLoc.getLoc());
task.setAppendInfo(appendInfo);
......@@ -371,10 +383,11 @@ public class QisdaDeviceController extends BaseController {
resultMap.put("barcode", task.getBarcode());
resultMap.put("w", task.getW()+ "");
resultMap.put("h", task.getH() +"");
resultMap.put("rfid", shelfLoc.getRfid());
resultMap.put("realRfid", shelfLoc.getRealRfid());
resultMap.put("rfid", shelfLoc.getTempRfid());
resultMap.put("rfidLoc", shelfLoc.getLoc() + "");
log.info("机器人["+robotIndex+"]位置信息返回:[rfid=" + shelfLoc.getRfid() + "["+shelfLoc.getLoc()+"] barcode=["+task.getBarcode()+"]尺寸"+task.getW()+"x"+task.getH());
log.info("机器人["+robotIndex+"]位置信息返回:[realRfid="+shelfLoc.getRealRfid()+",rfid=" + shelfLoc.getTempRfid() + "["+shelfLoc.getLoc()+"] barcode=["+task.getBarcode()+"]尺寸"+task.getW()+"x"+task.getH());
return ResultBean.newOkResult(resultMap);
}catch(Exception e){
......@@ -416,7 +429,6 @@ public class QisdaDeviceController extends BaseController {
String[] infos = locInfo.split("@");
String rfid = infos[0];
String rfidLoc = infos[1];
inquiryShelfBean.lockShelfLoc(task, rfid, "0");
inquiryShelfBean.putInShelf(task,rfid, Integer.valueOf(rfidLoc));
//剩余任务数
......@@ -447,14 +459,30 @@ public class QisdaDeviceController extends BaseController {
*/
private void reelPutInFinished(DataLog cacheTask, String rfid, String rfidLoc){
if(cacheTask != null){
cacheTask.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
AppendInfo appendInfo = cacheTask.getAppendInfo();
boolean putResult = inquiryShelfBean.putInShelf(cacheTask,rfid, Integer.valueOf(rfidLoc));
if(!putResult){
//记录日志
String errorMsg = "料盘["+cacheTask.getBarcode()+"]放入位置"+rfid+"["+rfidLoc+"],原分配位置"+appendInfo.getTempRfid()+"["+appendInfo.getRfidLoc()+"],不更改状态,不进行发料";
log.error(errorMsg);
AlarmInfo alarmInfo = new AlarmInfo();
alarmInfo.setBoxId("0");
alarmInfo.setStorageName(cacheTask.getStorageName());
alarmInfo.setInOutStatus("1");
alarmInfo.setAlarmType("放料失败");
Date date = new Date();
alarmInfo.setStartTime(date);
alarmInfo.setEndTime(date);
alarmInfo.setAlarmMsg(errorMsg);
alarmInfoDao.save(alarmInfo);
return;
}
cacheTask.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
appendInfo.setRfid(rfid);
appendInfo.setRfidLoc(Integer.valueOf(rfidLoc));
cacheTask.setAppendInfo(appendInfo);
cacheTask = dataLogDao.save(cacheTask);
taskService.updateFinishedTask(cacheTask);
inquiryShelfBean.putInShelf(cacheTask,rfid, Integer.valueOf(rfidLoc));
......@@ -564,7 +592,7 @@ public class QisdaDeviceController extends BaseController {
//1号位机器人
firstRobotTask = null;
}else{
log.info("机器人["+robotIndex+"]将料盘["+barcode+"]放入料架["+rfid+"]["+rfidLoc+"]完成,与当前任务["+firstScanTask.getBarcode()+"]不一致,不清空");
log.info("机器人["+robotIndex+"]将料盘["+barcode+"]放入料架["+rfid+"]["+rfidLoc+"]完成,与当前任务["+firstRobotTask.getBarcode()+"]不一致,不清空");
}
}else if(robotIndex.equals("2") && secondRobotTask != null){
if(secondRobotTask.getBarcode().equals(barcode)){
......
......@@ -624,7 +624,7 @@ public class StorageDataController extends BaseController {
Date date = new Date();
alarmInfo.setStartTime(date);
alarmInfo.setEndTime(date);
String msg = "["+code+"]"+lineMsg;
String msg = "["+code+"]"+errorMsg;
alarmInfo.setAlarmMsg(msg);
alarmInfoDao.save(alarmInfo);
lineMsg = errorMsg;
......
......@@ -206,7 +206,7 @@ public class TaskService implements ITaskService {
*/
@Override
public void updateFinishedTask(DataLog task){
DataLog cacheTask = finishedTaskMap.get(task.getBarcode());
//DataLog cacheTask = finishedTaskMap.get(task.getBarcode());
if(task == null){
log.error("更新["+task.getBarcode()+"]任务时,任务不存在");
}else{
......@@ -1005,6 +1005,34 @@ public class TaskService implements ITaskService {
log.info("出库首盘料任务"+storageTask.getBarcode()+"["+storageTask.getPosName()+"]" + storageTask.getAppendInfo());
}
//如果当前任务(执行中或已完成出库但未放到料架上的任务)的C或D料架数量大于2个,不允许出库
List<String> shelfNameList = new ArrayList<>();
for (DataLog waitTask : waitTasks) {
AppendInfo appendInfo = waitTask.getAppendInfo();
if(waitTask.isExecuting() && waitTask.isCheckOutTask()){
//待执行队列中正在执行的出库任务
if(appendInfo.isDShelfTask() || appendInfo.isCShelfTask()){
shelfNameList.add(appendInfo.getTempRfid());
}
}
}
for (DataLog finishedTask : finishedTaskMap.values()) {
AppendInfo appendInfo = finishedTask.getAppendInfo();
if(!finishedTask.isCancel() && !finishedTask.isFinished() && finishedTask.isCheckOutTask()){
//未完成的出库工单任务
if(appendInfo.isDShelfTask() || appendInfo.isCShelfTask()){
shelfNameList.add(appendInfo.getTempRfid());
}
}
}
if(!shelfNameList.contains(storageTask.getAppendInfo().getTempRfid())){
//未完成的工单任务料架数量>2,且未包含此任务,任务先不出,等到只有一个料架时再说
if(shelfNameList.size() >= 2){
log.info("未完成的工单任务料架为:["+String.join(",",shelfNameList)+ "]任务"+storageTask.getBarcode()+"暂停出库");
return null;
}
}
return storageTask;
......@@ -1013,6 +1041,7 @@ public class TaskService implements ITaskService {
if(storage.isPackage()){
for (DataLog task : waitTasks) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
log.info("出库包装料任务"+task.getBarcode()+"["+task.getPosName()+"]" + task.getAppendInfo());
return task;
}
......
......@@ -137,7 +137,7 @@
<display:column titleKey="来源" property="sourceName" sortable="true" sortProperty="sourceName"/>
<display:column titleKey="料架" sortable="true" sortProperty="appendInfo.tempRfid">
<display:column titleKey="料架" sortable="true" sortProperty="appendInfo.rfidIndex">
<c:if test="${dataLog.type == 2}">
${dataLog.appendInfo.tempRfid}(${dataLog.appendInfo.rfid})
</c:if>
......
......@@ -125,13 +125,13 @@
<fmt:message key="数量"/>
</th>
<th>
<fmt:message key="已出库"/>
<fmt:message key="已绑定"/>
</th>
<th>
<fmt:message key="已绑定"/>
<fmt:message key="已出库"/>
</th>
<th>
<fmt:message key="预绑定"/>
<fmt:message key="已发料"/>
</th>
</tr>
</thead>
......@@ -160,13 +160,27 @@
for(var i in data){
//var index = parseInt(i) + 1;
var color = "bg-red";
var isFirstReelAction = data[i].firstReelAction;
var outColor = "bg-red";
if(data[i].outQty >= data[i].qty){
color = "bg-green";
outColor = "bg-green";
}
var outQty = "<span class='"+color+" td-item'>"+data[i].outQty+"</span>";
var outQty = "<span class='"+outColor+" td-item'>"+data[i].outQty+"</span>";
var sendColor = "bg-red";
if(data[i].itemEnd){
sendColor = "bg-green";
}
var sendQty = "<span class='"+sendColor+" td-item'>"+data[i].sendQty+"</span>";
var realLockColor = "bg-red";
if(data[i].bindOk){
realLockColor = "bg-green";
}
var realLockQty = "<span class='"+realLockColor+" td-item'>"+data[i].realLockQty+"</span>";
table.row.add( [ /*index,*/ data[i].slotlocation, data[i].slotStr, data[i].pn, data[i].facility,data[i].reelID,data[i].reelcut,data[i].qty,outQty,data[i].realLockQty,data[i].lockQty] );
table.row.add( [ /*index,*/ data[i].slotlocation, data[i].slotStr, data[i].pn, data[i].facility,data[i].reelID,data[i].reelcut,data[i].qty,realLockQty,outQty,sendQty] );
}
table.order( [ 0, 'asc' ] ).draw();
......
......@@ -64,15 +64,13 @@
font-size: 18px;
}
.statusMsg{
background-color: #FFFFFF;
margin: 0px 10px;
/*background-color: #FFFFFF;
margin: 0px 10px;*/
padding: 10px;
/*height: 200px;*/
}
.clientMsg{
/*margin-left: 30px;*/
/*font-size: 30px;*/
font-size: 20px;
font-size: 16px;
color: #ff5500;
}
.smdstatus{
......
......@@ -58,15 +58,16 @@
background-color: #FFFFFF;
margin: 0px 10px;
padding: 10px;
height: 200px;
text-align: center;
}
#clientMsg{
margin-left: 30px;
font-size: 30px;
font-size: 18px;
color: #ff5500;
text-align: center;
}
#smdstatus{
line-height: 200px;
line-height: 80px;
font-size: 30px;
}
.barheight{
......@@ -122,7 +123,7 @@
</div>
<div class="statusMsg">
<span id="smdstatus"></span><span id="clientMsg"></span>
<div id="smdstatus"></div><div id="clientMsg"></div>
</div>
</div>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!