Commit 057147e6 sunke

分盘料二次绑定问题

1 个父辈 269a0b0d
......@@ -549,7 +549,7 @@ public class Barcode extends BaseMongoBean {
/**
* 分盘,返回母盘上的剩余数量,返回值小于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){
appendInfo = new AppendInfo();
}
......@@ -565,7 +565,7 @@ public class Barcode extends BaseMongoBean {
//小于分盘数量,剩下的将全部分给此站位
if(hasCutInfo()){
//已经有分盘信息,需要添加分盘信息,分盘数量为amount
String outItemKey = so + "@" + slotlocation;
String outItemKey = so + "@" + slotlocation + "@" + soseq;
String qtyInfo = amount + "=M="+ hSerial +"="+ slot;
cutMap.put(outItemKey, qtyInfo);
amount = 0;
......@@ -573,7 +573,7 @@ public class Barcode extends BaseMongoBean {
//cutMap.put(outItemId, amount);
}else{
//母盘下还剩下的有
String outItemKey = so + "@" + slotlocation;
String outItemKey = so + "@" + slotlocation + "@" + soseq;
String qtyInfo = cutCount + "=L="+ hSerial +"=" + slot;
cutMap.put(outItemKey, qtyInfo);
amount = remainQty;
......@@ -592,6 +592,9 @@ public class Barcode extends BaseMongoBean {
String[] soInfo = key.split("@");
cutItem.put("so",soInfo[0]);
cutItem.put("slotlocation",soInfo[1]);
if(soInfo.length == 3){
cutItem.put("soseq",soInfo[2]);
}
String[] qtyInfo = cutMap.get(key).split("=");
cutItem.put("qty",qtyInfo[0]);
cutItem.put("flag",qtyInfo[1]);
......
......@@ -291,7 +291,7 @@ public class OutItem extends BaseMongoBean {
}else if(isReelCutAction()){
//分盘需求,分盘料真实绑定与需求数相同,即认为完成
if(isCutMaterial()){
return realBindLessQty() >= 0;
return realBindLessQty() <= 0;
}else{
//非分盘料
return true;
......
......@@ -10,4 +10,6 @@ public interface IOutItemDao extends IMongoDao {
List<OutItem> findByHSerial(String hSerial);
OutItem findItem(String hSerial, int slotSeq);
OutItem findCutItem(String soseq, int slotSeq);
}
......@@ -32,6 +32,21 @@ public class OutItemDaoImpl extends AbstractMongoDao implements IOutItemDao {
}
@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() {
return OutItem.class;
}
......
......@@ -423,6 +423,11 @@ public class QisdaApiController extends BaseController {
realBindQty = realBindQty + bindPos.getBarcode().getAmount();
}
outItem.setRealLockQty(realBindQty);
int lockQty = outItem.getLockQty();
if(lockQty < realBindQty){
lockQty = realBindQty;
outItem.setLockQty(lockQty);
}
outItem = outItemDao.save(outItem);
log.info("更新["+outItem.getSlotlocation()+"]"+outItem.getPn()+"真实绑定数量为["+realBindQty+"/"+outItem.getQty()+"]");
return outItem;
......@@ -598,7 +603,7 @@ public class QisdaApiController extends BaseController {
int lockQty = outItem.getLockQty();
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){
//母盘还有剩余,说明该需求slot已经满足
lockQty = outItem.getQty();
......@@ -606,7 +611,7 @@ public class QisdaApiController extends BaseController {
//母盘正好用完或全部用完也达不到需求量,此母盘绑定slot后,继续寻找其他盘进行绑定
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()){
//没有分盘信息,可以直接绑定
AppendInfo appendInfo = barcode.getAppendInfo();
......
......@@ -127,7 +127,16 @@ public class QisdaDeviceController extends BaseController {
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());
......@@ -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")
......@@ -269,7 +289,7 @@ public class QisdaDeviceController extends BaseController {
//包装料架上有料,且大料架有空位,从大料架上查找空位
DataLog task = taskService.getFinishedTask(barcode);
if(task == null){
String msg = "机器人[3]获取包装料摆放位置信息,未找到待包装料架上条码["+barcode+"]的任务";
String msg = "机器人[3]获取包装料摆放位置信息,未找到包装料架[]上条码["+barcode+"]的任务";
log.error(msg);
return ResultBean.newErrorResult(103, msg);
}
......@@ -441,6 +461,10 @@ public class QisdaDeviceController extends BaseController {
log.error("料盘["+barcode+"]的任务不存在");
return ResultBean.newErrorResult(301, "任务不存在");
}
if(task.isFinished()){
log.error("料盘["+barcode+"]的任务已完成");
return ResultBean.newErrorResult(302, "料盘["+barcode+"]的任务已完成");
}
statusStr = statusStr.toUpperCase();
log.info("更新料盘的任务状态["+task.getStatus()+"=" + task.getLocInfo() + "]为["+statusStr+"="+locInfo+"]");
task.setStatus(statusStr);
......
......@@ -1087,8 +1087,8 @@ public class TaskService implements ITaskService {
}
for (DataLog dataLog : finishedTaskMap.values()) {
if(!dataLog.isPackageReel()){
if(dataLog.isSmallReel() && !dataLog.isFinished()){
//非包装料料任务还未完成(未放入料架),暂时不出大料
if(!dataLog.isSmallReel() && !dataLog.isFinished()){
//非包装料料任务还未完成(未放入料架),暂时不出大料
unFinishedBigTaskCount = unFinishedBigTaskCount + 1;
}
}
......@@ -1870,6 +1870,21 @@ public class TaskService implements ITaskService {
dnItem.setInNum(dnItem.getInNum() + 1);
dnItem.setFirstReelDate(new Date());
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)){
//通知VMI入库完成
......@@ -1939,7 +1954,7 @@ public class TaskService implements ITaskService {
//dataCache.updateStorage(task.getCid());
finishedOrderTask(task);
//finishedOrderTask(task);
//checkTaskSetFinished(task);
updateOutInfo(outItemId, task, barcode);
......@@ -1952,16 +1967,38 @@ public class TaskService implements ITaskService {
if(!Strings.isNullOrEmpty(outItemId)){
OutItem outItem = outItemDao.findOneById(outItemId);
if(outItem != null){
int outQty = outItem.getOutQty() + task.getNum();
outItem.setOutQty(outQty);
if(outItem.isUrgentAction()){
log.info("紧急料设置发料数量与出库数量一致");
//紧急料发料数量与出库数量一致
outItem.setSendQty(outQty);
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();
outItem.setOutQty(outQty);
if(outItem.isUrgentAction()){
log.info("紧急料设置发料数量与出库数量一致");
//紧急料发料数量与出库数量一致
outItem.setSendQty(outQty);
}
outItem = outItemDao.save(outItem);
outInfoCache.updateOutItem(outItem.getId());
}
outItem = outItemDao.save(outItem);
outInfoCache.updateOutItem(outItem.getId());
outInfo = outInfoDao.findByHSerial(outItem.gethSerial());
int outReelNum = outInfo.getOutReelNum();
......
......@@ -162,7 +162,7 @@
//var index = parseInt(i) + 1;
var isFirstReelAction = data[i].firstReelAction;
var outColor = "bg-red";
if(data[i].outQty >= data[i].qty){
if(data[i].outOk){
outColor = "bg-green";
}
var outQty = "<span class='"+outColor+" td-item'>"+data[i].outQty+"</span>";
......@@ -177,7 +177,12 @@
if(data[i].bindOk){
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] );
......
......@@ -8,6 +8,7 @@
padding: 10px;
font-size: 30px;
margin-bottom: 10px;
min-height: 50px;
}
.row{
margin:0px;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!