Commit c48be333 孙克

多个工单同时提交时,分盘料合单

无需求单包装仓任务与有紧急料和分盘料任务分配到相同的料架
包装料架如果已放满,使用新的料架
分配库位时,清理入库时使用的RFID信息
1 个父辈 07f40731
...@@ -283,10 +283,15 @@ public class InquiryShelfBean { ...@@ -283,10 +283,15 @@ public class InquiryShelfBean {
//工单料 //工单料
return shelfInfo; return shelfInfo;
}else{ }else{
//不是包装仓的分盘料或紧急料,使用同一个料架;包装料架按需求单号进行区分 if(shelfInfo.isAShelf()){
//if(!shelfInfo.isAShelf()){ //包装料架, 如果已经放满,那么使用新的料架
if(!shelfInfo.isFull()){
//未放满,可以继续使用此料架
return shelfInfo; return shelfInfo;
//} }
}else{
return shelfInfo;
}
} }
} }
} }
...@@ -356,6 +361,7 @@ public class InquiryShelfBean { ...@@ -356,6 +361,7 @@ public class InquiryShelfBean {
if(task.isPackageReel()){ if(task.isPackageReel()){
//包装料,固定库位 //包装料,固定库位
loc = emptyShelfInfo.addLimitLoc(task.getBarcode(),task.getReelType()); loc = emptyShelfInfo.addLimitLoc(task.getBarcode(),task.getReelType());
appendInfo.setRfid("");
appendInfo.setRfidLoc(loc); appendInfo.setRfidLoc(loc);
}else{ }else{
loc = emptyShelfInfo.addLimitLoc(barcode,task.getReelType()); loc = emptyShelfInfo.addLimitLoc(barcode,task.getReelType());
...@@ -366,6 +372,7 @@ public class InquiryShelfBean { ...@@ -366,6 +372,7 @@ public class InquiryShelfBean {
appendInfo.setShelfType(shelfType); appendInfo.setShelfType(shelfType);
appendInfo.sethSerial(outItem.gethSerial()); appendInfo.sethSerial(outItem.gethSerial());
if(barcode != null && !barcode.isEmpty()){ if(barcode != null && !barcode.isEmpty()){
appendInfo.setRfid("");
appendInfo.setRfidLoc(loc); appendInfo.setRfidLoc(loc);
} }
String location = shelfType; String location = shelfType;
......
...@@ -42,6 +42,8 @@ public interface IStoragePosDao extends IMongoDao { ...@@ -42,6 +42,8 @@ public interface IStoragePosDao extends IMongoDao {
Map<String, Integer> availableInventory(); Map<String, Integer> availableInventory();
List<StoragePos> listPnFacility(String pn, String facility);
/** /**
* 根据pn和facility获取未锁定的数量最小的盘 * 根据pn和facility获取未锁定的数量最小的盘
*/ */
......
package com.myproject.dao.mongo.impl; package com.myproject.dao.mongo.impl;
import com.google.common.base.Function;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.mongodb.DBObject; import com.mongodb.DBObject;
...@@ -8,14 +7,11 @@ import com.myproject.bean.json.ChartData; ...@@ -8,14 +7,11 @@ import com.myproject.bean.json.ChartData;
import com.myproject.bean.json.ChartItem; import com.myproject.bean.json.ChartItem;
import com.myproject.bean.json.InventoryItem; import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.json.PlateSizeBean; import com.myproject.bean.json.PlateSizeBean;
import com.myproject.bean.qisda.AppendInfo;
import com.myproject.bean.qisda.AvailableInventoryBean;
import com.myproject.bean.update.Barcode; import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.StoragePos; import com.myproject.bean.update.StoragePos;
import com.myproject.dao.mongo.AbstractMongoDao; import com.myproject.dao.mongo.AbstractMongoDao;
import com.myproject.dao.mongo.IBarcodeDao; import com.myproject.dao.mongo.IBarcodeDao;
import com.myproject.dao.mongo.IStoragePosDao; import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.exception.ValidateException;
import com.myproject.util.PLATE_SIZE; import com.myproject.util.PLATE_SIZE;
import com.myproject.util.StorageConstants; import com.myproject.util.StorageConstants;
import com.myproject.util.StringHelper; import com.myproject.util.StringHelper;
...@@ -273,6 +269,20 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa ...@@ -273,6 +269,20 @@ public class StoragePosDaoImpl extends AbstractMongoDao implements IStoragePosDa
return resultMap; return resultMap;
} }
/**
* 获取绑定和未绑定的所有物料, 按生产日期和数量排序
* @param pn
* @param facility
* @return
*/
@Override
public List<StoragePos> listPnFacility(String pn, String facility){
//PN和Facility一样
Criteria c = Criteria.where("barcode.partNumber").is(pn).and("barcode.appendInfo.facility").is(facility);
Query q = new Query(c);
q.with(new Sort(Sort.Direction.ASC, "barcode.produceDateStr").and(new Sort(Sort.Direction.ASC, "barcode.amount")));
return findByQuery(q);
}
/** /**
* 根据pn和facility获取未锁定的数量最小的盘 * 根据pn和facility获取未锁定的数量最小的盘
......
...@@ -52,7 +52,7 @@ public class QisdaBindService { ...@@ -52,7 +52,7 @@ public class QisdaBindService {
log.info("需求单["+outInfo+"]开始进行真实绑定"); log.info("需求单["+outInfo+"]开始进行真实绑定");
for (OutItem outItem : outInfo.getOutItems()) { for (OutItem outItem : outInfo.getOutItems()) {
firstBindCutReel(outItem); firstBindCutReel(outItem);
secondBindCutReel(outItem); secondBindCutReel(outItem, null);
realBindNoCutReel(outItem); realBindNoCutReel(outItem);
bindSamePnFromOtherSlotForFirstAction(outItem,new ArrayList<String>()); bindSamePnFromOtherSlotForFirstAction(outItem,new ArrayList<String>());
} }
...@@ -64,8 +64,10 @@ public class QisdaBindService { ...@@ -64,8 +64,10 @@ public class QisdaBindService {
* 预绑定分盘料 * 预绑定分盘料
*/ */
public void preBindCutOutInfoList(Collection<OutInfo> outInfoList){ public void preBindCutOutInfoList(Collection<OutInfo> outInfoList){
List<String> soList = new ArrayList<>();
for (OutInfo outInfo : outInfoList) { for (OutInfo outInfo : outInfoList) {
if(outInfo.isReelCutAction()){ if(outInfo.isReelCutAction()){
soList.add(outInfo.getSo());
//分盘需求单进行预绑定 //分盘需求单进行预绑定
log.info("需求单["+outInfo+"]开始进行预绑定"); log.info("需求单["+outInfo+"]开始进行预绑定");
for (OutItem outItem : outInfo.getOutItems()) { for (OutItem outItem : outInfo.getOutItems()) {
...@@ -83,7 +85,7 @@ public class QisdaBindService { ...@@ -83,7 +85,7 @@ public class QisdaBindService {
log.info("分盘需求单["+outInfo+"]开始进行二次分盘绑定"); log.info("分盘需求单["+outInfo+"]开始进行二次分盘绑定");
for (OutItem outItem : outInfo.getOutItems()) { for (OutItem outItem : outInfo.getOutItems()) {
if(outItem.isReelCutAction()){//分盘 if(outItem.isReelCutAction()){//分盘
secondBindCutReel(outItem); secondBindCutReel(outItem, soList);
} }
} }
} }
...@@ -208,15 +210,39 @@ public class QisdaBindService { ...@@ -208,15 +210,39 @@ public class QisdaBindService {
2.By SO逐一挑选,料卷数量,从小到大去挑选 2.By SO逐一挑选,料卷数量,从小到大去挑选
* @param outItem * @param outItem
*/ */
private void secondBindCutReel(OutItem outItem){ private void secondBindCutReel(OutItem outItem,List<String> shareCutSoList){
if(outItem.isCutMaterial()){ if(outItem.isCutMaterial()){
log.info("第二轮绑定分盘料:So=["+outItem.getSo()+"]hSerial=["+outItem.gethSerial()+"]+refno=["+outItem.getRefno()+"]的slot"+outItem.getSlotlocation()+"]pn=["+outItem.getPn()+"]当前预绑定数量["+outItem.getLockQty()+"/"+outItem.getQty()+"]"); log.info("第二轮绑定分盘料:So=["+outItem.getSo()+"]hSerial=["+outItem.gethSerial()+"]+refno=["+outItem.getRefno()+"]的slot"+outItem.getSlotlocation()+"]pn=["+outItem.getPn()+"]当前预绑定数量["+outItem.getLockQty()+"/"+outItem.getQty()+"]");
//剩余需求数量 //剩余需求数量
int needNum = outItem.getQty() - outItem.getLockQty(); int needNum = outItem.getQty() - outItem.getLockQty();
while(needNum > 0){ while(needNum > 0){
//分盘料 //分盘料
//TODO: 第二轮应该查找未绑定过或者有分盘信息的物料 StoragePos pos = null;
StoragePos pos = storagePosDao.findNoBindMinQty(outItem.getPn(), outItem.getFacility()); if(shareCutSoList != null){
//第二轮应该查找未绑定过或者有分盘信息的物料
List<StoragePos> posList = storagePosDao.listPnFacility(outItem.getPn(), outItem.getFacility());
for (StoragePos storagePos : posList) {
Barcode barcode = storagePos.getBarcode();
boolean hasCutInfo = barcode.hasCutInfo();
if(barcode.getAmount() > 0 && hasCutInfo){
//优先查找同批需求单中有分盘的物料
AppendInfo appendInfo = storagePos.getBarcode().getAppendInfo();
String bindSo = appendInfo.getSo();
if(bindSo != null && shareCutSoList.contains(bindSo)){
//同批需求单已经有绑定
pos = storagePos;
break;
}
}
}
}
if(pos == null){
//未找到已经绑定过有分盘信息的物料
pos = storagePosDao.findNoBindMinQty(outItem.getPn(), outItem.getFacility());
}
if(pos == null){ if(pos == null){
log.info("\t第二轮分盘料绑定"+outItem.getSlotlocation() + "的pn=["+outItem.getPn()+"]facility = "+outItem.getFacility()+"时无库存,跳出绑定"); log.info("\t第二轮分盘料绑定"+outItem.getSlotlocation() + "的pn=["+outItem.getPn()+"]facility = "+outItem.getFacility()+"时无库存,跳出绑定");
break; break;
......
...@@ -1665,13 +1665,23 @@ public class TaskService implements ITaskService { ...@@ -1665,13 +1665,23 @@ public class TaskService implements ITaskService {
//手动出库的当做是工单料,放到皮带线上 //手动出库的当做是工单料,放到皮带线上
task.setUrgentReel(true); task.setUrgentReel(true);
task.setType(StorageConstants.OP.CHECKOUT);
task.setStatus(StorageConstants.OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
if(task.isPackageReel()){
//包装料需要出到包装料架上, 其他料出到料串上
OutItem outItem = new OutItem();
outItem.sethSerial("0");
task = InquiryShelfBean.addLimitLoc(task,outItem);
}else{
AppendInfo appendInfo = task.getAppendInfo(); AppendInfo appendInfo = task.getAppendInfo();
appendInfo.setShelfType(StorageConstants.SHEFL_TYPE.B); appendInfo.setShelfType(StorageConstants.SHEFL_TYPE.B);
task.setAppendInfo(appendInfo); task.setAppendInfo(appendInfo);
}
task.setType(StorageConstants.OP.CHECKOUT);
task.setStatus(StorageConstants.OP_STATUS.WAIT.name());
task.setSingleOut(isSingleOut);
//task.setAppendInfo(pos.getBarcode().getAppendInfo()); //task.setAppendInfo(pos.getBarcode().getAppendInfo());
//工单出库任务 //工单出库任务
if(!Strings.isNullOrEmpty(subSourceId)){ if(!Strings.isNullOrEmpty(subSourceId)){
......
...@@ -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-purple">
<div class="timeline-time">
<span class="date">2023</span>
<span class="time">08-14</span>
</div>
<div class="timeline-icon">
<i class="fa fa-clock-o"></i>
</div>
<div class="timeline-body">
<h2>版本: V2023081413</h2>
<div class="timeline-content">
<ul>
<li>多个工单同时提交时,分盘料合单</li>
<li>无需求单包装仓任务与有紧急料和分盘料任务分配到相同的料架</li>
</ul>
</div>
</div>
</li>
<li class="timeline-green"> <li class="timeline-green">
<div class="timeline-time"> <div class="timeline-time">
<span class="date">2023</span> <span class="date">2023</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: V2023071310</span> <span class="right" style="color: #a3a3a3;">Version: V2023081413</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!