Commit 057147e6 sunke

分盘料二次绑定问题

1 个父辈 269a0b0d
...@@ -549,7 +549,7 @@ public class Barcode extends BaseMongoBean { ...@@ -549,7 +549,7 @@ public class Barcode extends BaseMongoBean {
/** /**
* 分盘,返回母盘上的剩余数量,返回值小于0时,需要分另一盘 * 分盘,返回母盘上的剩余数量,返回值小于0时,需要分另一盘
*/ */
public int cutCount(String so, int slotlocation, String slot, String hSerial, int cutCount){ public int cutCount(String soseq, String so, int slotlocation, String slot, String hSerial, int cutCount){
if(appendInfo == null){ if(appendInfo == null){
appendInfo = new AppendInfo(); appendInfo = new AppendInfo();
} }
...@@ -565,7 +565,7 @@ public class Barcode extends BaseMongoBean { ...@@ -565,7 +565,7 @@ public class Barcode extends BaseMongoBean {
//小于分盘数量,剩下的将全部分给此站位 //小于分盘数量,剩下的将全部分给此站位
if(hasCutInfo()){ if(hasCutInfo()){
//已经有分盘信息,需要添加分盘信息,分盘数量为amount //已经有分盘信息,需要添加分盘信息,分盘数量为amount
String outItemKey = so + "@" + slotlocation; String outItemKey = so + "@" + slotlocation + "@" + soseq;
String qtyInfo = amount + "=M="+ hSerial +"="+ slot; String qtyInfo = amount + "=M="+ hSerial +"="+ slot;
cutMap.put(outItemKey, qtyInfo); cutMap.put(outItemKey, qtyInfo);
amount = 0; amount = 0;
...@@ -573,7 +573,7 @@ public class Barcode extends BaseMongoBean { ...@@ -573,7 +573,7 @@ public class Barcode extends BaseMongoBean {
//cutMap.put(outItemId, amount); //cutMap.put(outItemId, amount);
}else{ }else{
//母盘下还剩下的有 //母盘下还剩下的有
String outItemKey = so + "@" + slotlocation; String outItemKey = so + "@" + slotlocation + "@" + soseq;
String qtyInfo = cutCount + "=L="+ hSerial +"=" + slot; String qtyInfo = cutCount + "=L="+ hSerial +"=" + slot;
cutMap.put(outItemKey, qtyInfo); cutMap.put(outItemKey, qtyInfo);
amount = remainQty; amount = remainQty;
...@@ -592,6 +592,9 @@ public class Barcode extends BaseMongoBean { ...@@ -592,6 +592,9 @@ public class Barcode extends BaseMongoBean {
String[] soInfo = key.split("@"); String[] soInfo = key.split("@");
cutItem.put("so",soInfo[0]); cutItem.put("so",soInfo[0]);
cutItem.put("slotlocation",soInfo[1]); cutItem.put("slotlocation",soInfo[1]);
if(soInfo.length == 3){
cutItem.put("soseq",soInfo[2]);
}
String[] qtyInfo = cutMap.get(key).split("="); String[] qtyInfo = cutMap.get(key).split("=");
cutItem.put("qty",qtyInfo[0]); cutItem.put("qty",qtyInfo[0]);
cutItem.put("flag",qtyInfo[1]); cutItem.put("flag",qtyInfo[1]);
......
...@@ -291,7 +291,7 @@ public class OutItem extends BaseMongoBean { ...@@ -291,7 +291,7 @@ public class OutItem extends BaseMongoBean {
}else if(isReelCutAction()){ }else if(isReelCutAction()){
//分盘需求,分盘料真实绑定与需求数相同,即认为完成 //分盘需求,分盘料真实绑定与需求数相同,即认为完成
if(isCutMaterial()){ if(isCutMaterial()){
return realBindLessQty() >= 0; return realBindLessQty() <= 0;
}else{ }else{
//非分盘料 //非分盘料
return true; return true;
......
...@@ -10,4 +10,6 @@ public interface IOutItemDao extends IMongoDao { ...@@ -10,4 +10,6 @@ public interface IOutItemDao extends IMongoDao {
List<OutItem> findByHSerial(String hSerial); List<OutItem> findByHSerial(String hSerial);
OutItem findItem(String hSerial, int slotSeq); OutItem findItem(String hSerial, int slotSeq);
OutItem findCutItem(String soseq, int slotSeq);
} }
...@@ -32,6 +32,21 @@ public class OutItemDaoImpl extends AbstractMongoDao implements IOutItemDao { ...@@ -32,6 +32,21 @@ public class OutItemDaoImpl extends AbstractMongoDao implements IOutItemDao {
} }
@Override @Override
public OutItem findCutItem(String soseq, int slotSeq){
return findActionItem("分盘",soseq,slotSeq);
}
private OutItem findActionItem(String action, String soseq, int slotSeq){
Criteria c = new Criteria();
c.and("action").is(action);
c.and("soseq").is(soseq);
c.and("slotlocation").is(slotSeq);
Query query = new Query(c);
return findOne(query);
}
@Override
public Class getEntityClass() { public Class getEntityClass() {
return OutItem.class; return OutItem.class;
} }
......
...@@ -423,6 +423,11 @@ public class QisdaApiController extends BaseController { ...@@ -423,6 +423,11 @@ public class QisdaApiController extends BaseController {
realBindQty = realBindQty + bindPos.getBarcode().getAmount(); realBindQty = realBindQty + bindPos.getBarcode().getAmount();
} }
outItem.setRealLockQty(realBindQty); outItem.setRealLockQty(realBindQty);
int lockQty = outItem.getLockQty();
if(lockQty < realBindQty){
lockQty = realBindQty;
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;
...@@ -598,7 +603,7 @@ public class QisdaApiController extends BaseController { ...@@ -598,7 +603,7 @@ public class QisdaApiController extends BaseController {
int lockQty = outItem.getLockQty(); int lockQty = outItem.getLockQty();
int remainQty = outItem.getQty() - lockQty; int remainQty = outItem.getQty() - lockQty;
//还有未绑定的需求 //还有未绑定的需求
int reelRemainNum = barcode.cutCount(outItem.getSo(), outItem.getSlotlocation(), outItem.getSlotStr(), outItem.gethSerial(), remainQty); int reelRemainNum = barcode.cutCount(outItem.getSoseq(), outItem.getSo(), outItem.getSlotlocation(), outItem.getSlotStr(), outItem.gethSerial(), remainQty);
if(reelRemainNum > 0){ if(reelRemainNum > 0){
//母盘还有剩余,说明该需求slot已经满足 //母盘还有剩余,说明该需求slot已经满足
lockQty = outItem.getQty(); lockQty = outItem.getQty();
...@@ -606,7 +611,7 @@ public class QisdaApiController extends BaseController { ...@@ -606,7 +611,7 @@ public class QisdaApiController extends BaseController {
//母盘正好用完或全部用完也达不到需求量,此母盘绑定slot后,继续寻找其他盘进行绑定 //母盘正好用完或全部用完也达不到需求量,此母盘绑定slot后,继续寻找其他盘进行绑定
lockQty = lockQty + barcode.getAmount(); lockQty = lockQty + barcode.getAmount();
} }
log.info("\t分盘料["+barcode.getBarcode()+"]绑定到So=["+outItem.getSo()+"]hSerial=["+outItem.gethSerial()+"]refno=["+outItem.getRefno()+"]的["+outItem.getSlotlocation()+"] 数量:" + lockQty +"/" + outItem.getQty()); log.info("\t分盘料["+barcode.getBarcode()+"]绑定到Soseq=["+outItem.getSoseq()+"]So=["+outItem.getSo()+"]hSerial=["+outItem.gethSerial()+"]refno=["+outItem.getRefno()+"]的["+outItem.getSlotlocation()+"] 数量:" + lockQty +"/" + outItem.getQty());
if(!barcode.hasCutInfo()){ if(!barcode.hasCutInfo()){
//没有分盘信息,可以直接绑定 //没有分盘信息,可以直接绑定
AppendInfo appendInfo = barcode.getAppendInfo(); AppendInfo appendInfo = barcode.getAppendInfo();
......
...@@ -127,7 +127,16 @@ public class QisdaDeviceController extends BaseController { ...@@ -127,7 +127,16 @@ public class QisdaDeviceController extends BaseController {
return ResultBean.newErrorResult(102, msg); return ResultBean.newErrorResult(102, msg);
} }
boolean firstScanSame = isSameTask(barcode,firstScanTask);
boolean firstRobtoSame = isSameTask(barcode,firstRobotTask);
boolean secondScanSame = isSameTask(barcode,secondScanTask);
boolean secondRobtoSame = isSameTask(barcode,secondRobotTask);
if(firstScanSame || firstRobtoSame || secondScanSame || secondRobtoSame){
String msg = "条码["+barcode.getBarcode()+"]与已有任务重复,获取尺寸信息失败";
log.error(msg);
return ResultBean.newErrorResult(105, msg);
}
DataLog task = taskService.getFinishedTask(barcode.getBarcode()); DataLog task = taskService.getFinishedTask(barcode.getBarcode());
...@@ -170,6 +179,17 @@ public class QisdaDeviceController extends BaseController { ...@@ -170,6 +179,17 @@ public class QisdaDeviceController extends BaseController {
} }
/** /**
* 判断条码是否与扫码和机器人工位的条码一致
* @return
*/
private boolean isSameTask(Barcode barcode, DataLog robotTask){
if(barcode != null && robotTask != null){
return barcode.getBarcode().equals(robotTask.getBarcode());
}
return false;
}
/**
* 相机扫码获取完尺寸后,料盘到达机器人取料位置 * 相机扫码获取完尺寸后,料盘到达机器人取料位置
*/ */
@RequestMapping(value = "/arriveRobotLocation") @RequestMapping(value = "/arriveRobotLocation")
...@@ -269,7 +289,7 @@ public class QisdaDeviceController extends BaseController { ...@@ -269,7 +289,7 @@ public class QisdaDeviceController extends BaseController {
//包装料架上有料,且大料架有空位,从大料架上查找空位 //包装料架上有料,且大料架有空位,从大料架上查找空位
DataLog task = taskService.getFinishedTask(barcode); DataLog task = taskService.getFinishedTask(barcode);
if(task == null){ if(task == null){
String msg = "机器人[3]获取包装料摆放位置信息,未找到待包装料架上条码["+barcode+"]的任务"; String msg = "机器人[3]获取包装料摆放位置信息,未找到包装料架[]上条码["+barcode+"]的任务";
log.error(msg); log.error(msg);
return ResultBean.newErrorResult(103, msg); return ResultBean.newErrorResult(103, msg);
} }
...@@ -441,6 +461,10 @@ public class QisdaDeviceController extends BaseController { ...@@ -441,6 +461,10 @@ public class QisdaDeviceController extends BaseController {
log.error("料盘["+barcode+"]的任务不存在"); log.error("料盘["+barcode+"]的任务不存在");
return ResultBean.newErrorResult(301, "任务不存在"); return ResultBean.newErrorResult(301, "任务不存在");
} }
if(task.isFinished()){
log.error("料盘["+barcode+"]的任务已完成");
return ResultBean.newErrorResult(302, "料盘["+barcode+"]的任务已完成");
}
statusStr = statusStr.toUpperCase(); statusStr = statusStr.toUpperCase();
log.info("更新料盘的任务状态["+task.getStatus()+"=" + task.getLocInfo() + "]为["+statusStr+"="+locInfo+"]"); log.info("更新料盘的任务状态["+task.getStatus()+"=" + task.getLocInfo() + "]为["+statusStr+"="+locInfo+"]");
task.setStatus(statusStr); task.setStatus(statusStr);
......
...@@ -1087,8 +1087,8 @@ public class TaskService implements ITaskService { ...@@ -1087,8 +1087,8 @@ public class TaskService implements ITaskService {
} }
for (DataLog dataLog : finishedTaskMap.values()) { for (DataLog dataLog : finishedTaskMap.values()) {
if(!dataLog.isPackageReel()){ if(!dataLog.isPackageReel()){
if(dataLog.isSmallReel() && !dataLog.isFinished()){ if(!dataLog.isSmallReel() && !dataLog.isFinished()){
//非包装料料任务还未完成(未放入料架),暂时不出大料 //非包装料料任务还未完成(未放入料架),暂时不出大料
unFinishedBigTaskCount = unFinishedBigTaskCount + 1; unFinishedBigTaskCount = unFinishedBigTaskCount + 1;
} }
} }
...@@ -1870,6 +1870,21 @@ public class TaskService implements ITaskService { ...@@ -1870,6 +1870,21 @@ public class TaskService implements ITaskService {
dnItem.setInNum(dnItem.getInNum() + 1); dnItem.setInNum(dnItem.getInNum() + 1);
dnItem.setFirstReelDate(new Date()); dnItem.setFirstReelDate(new Date());
dnItem = dNItemDao.save(dnItem); dnItem = dNItemDao.save(dnItem);
}else{
//纯入库,更新绑定数量
String soseq = appendInfo.getSoseq();
if(soseq != null && !soseq.isEmpty()){
int slotIndex = appendInfo.getSlotIndex();
OutItem cutItem = outItemDao.findCutItem(soseq, slotIndex);
if(cutItem != null){
int realBindQty = cutItem.getRealLockQty() + barcode.getAmount();
log.info(barcode.getBarcode() + "纯入库完成,分盘需求单soseq=["+soseq+"]slotSeq=["+slotIndex+"]绑定数量增加"+barcode.getAmount()+"="+ realBindQty);
cutItem.setRealLockQty(realBindQty);
outItemDao.save(cutItem);
outInfoCache.updateOutItem(cutItem.getId());
}
}
} }
if(DataCache.isProductionFor(DataCache.CUSTOMER.QISDA)){ if(DataCache.isProductionFor(DataCache.CUSTOMER.QISDA)){
//通知VMI入库完成 //通知VMI入库完成
...@@ -1939,7 +1954,7 @@ public class TaskService implements ITaskService { ...@@ -1939,7 +1954,7 @@ public class TaskService implements ITaskService {
//dataCache.updateStorage(task.getCid()); //dataCache.updateStorage(task.getCid());
finishedOrderTask(task); //finishedOrderTask(task);
//checkTaskSetFinished(task); //checkTaskSetFinished(task);
updateOutInfo(outItemId, task, barcode); updateOutInfo(outItemId, task, barcode);
...@@ -1952,6 +1967,27 @@ public class TaskService implements ITaskService { ...@@ -1952,6 +1967,27 @@ public class TaskService implements ITaskService {
if(!Strings.isNullOrEmpty(outItemId)){ if(!Strings.isNullOrEmpty(outItemId)){
OutItem outItem = outItemDao.findOneById(outItemId); OutItem outItem = outItemDao.findOneById(outItemId);
if(outItem != null){ if(outItem != null){
if(barcode.hasCutInfo()){
log.info("分盘料出库,更新需求单出库数量");
//分盘料,需要更新对应的需求单出库数量
final List<Map<String, Object>> cutItems = barcode.getCutItems();
for (Map<String, Object> cutItem : cutItems) {
String soseqStr = cutItem.get("soseq").toString();
String slotlocation = cutItem.get("slotlocation").toString();
String qty = cutItem.get("qty").toString();
OutItem cutInfoItem = outItemDao.findCutItem(soseqStr, Integer.valueOf(slotlocation));
if(cutInfoItem == null){
log.error("未找到soseq=["+soseqStr+"]slotseq=["+slotlocation+"]的需求信息");
continue;
}
int outQty = outItem.getOutQty() + Integer.valueOf(qty);
log.info("分盘需求单["+cutInfoItem.gethSerial()+"]["+slotlocation+"]的出库数量增加"+qty+"="+outQty);
outItem.setOutQty(outQty);
outItem = outItemDao.save(outItem);
outInfoCache.updateOutItem(outItem.getId());
}
}else{
int outQty = outItem.getOutQty() + task.getNum(); int outQty = outItem.getOutQty() + task.getNum();
outItem.setOutQty(outQty); outItem.setOutQty(outQty);
...@@ -1962,6 +1998,7 @@ public class TaskService implements ITaskService { ...@@ -1962,6 +1998,7 @@ public class TaskService implements ITaskService {
} }
outItem = outItemDao.save(outItem); outItem = outItemDao.save(outItem);
outInfoCache.updateOutItem(outItem.getId()); outInfoCache.updateOutItem(outItem.getId());
}
outInfo = outInfoDao.findByHSerial(outItem.gethSerial()); outInfo = outInfoDao.findByHSerial(outItem.gethSerial());
int outReelNum = outInfo.getOutReelNum(); int outReelNum = outInfo.getOutReelNum();
......
...@@ -162,7 +162,7 @@ ...@@ -162,7 +162,7 @@
//var index = parseInt(i) + 1; //var index = parseInt(i) + 1;
var isFirstReelAction = data[i].firstReelAction; var isFirstReelAction = data[i].firstReelAction;
var outColor = "bg-red"; var outColor = "bg-red";
if(data[i].outQty >= data[i].qty){ if(data[i].outOk){
outColor = "bg-green"; outColor = "bg-green";
} }
var outQty = "<span class='"+outColor+" td-item'>"+data[i].outQty+"</span>"; var outQty = "<span class='"+outColor+" td-item'>"+data[i].outQty+"</span>";
...@@ -177,7 +177,12 @@ ...@@ -177,7 +177,12 @@
if(data[i].bindOk){ if(data[i].bindOk){
realLockColor = "bg-green"; realLockColor = "bg-green";
} }
var realLockQty = "<span class='"+realLockColor+" td-item'>"+data[i].realLockQty+"</span>"; var lockQty = data[i].realLockQty;
if(data[i].reelCutAction){
//分盘料,展示绑定/预绑定
lockQty = lockQty + "/" + data[i].lockQty;
}
var realLockQty = "<span class='"+realLockColor+" td-item'>"+lockQty+"</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,realLockQty,outQty,sendQty] ); 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] );
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
padding: 10px; padding: 10px;
font-size: 30px; font-size: 30px;
margin-bottom: 10px; margin-bottom: 10px;
min-height: 50px;
} }
.row{ .row{
margin:0px; margin:0px;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!