Commit 23e813cc zshaohui

1.工单模板增加NUM和MPN字段

2.工单出库PN和MPN同时满足数量与盘数
1 个父辈 4e1d8062
...@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.bean.ResultBean; ...@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.SmfApi; import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
...@@ -297,6 +298,14 @@ public class LiteOrderCache { ...@@ -297,6 +298,14 @@ public class LiteOrderCache {
closed = false; closed = false;
break; break;
} }
if (closed) {
if (StringUtils.isBlank(liteOrderItem.getRi()) && (StringUtils.isNotBlank(liteOrderItem.getPn()) || StringUtils.isNotBlank(liteOrderItem.getMpn()))) {
if (!liteOrderItem.isOutReelFinished()) {
closed = false;
break;
}
}
}
} }
if(closed){ if(closed){
order.setClosed(closed); order.setClosed(closed);
...@@ -394,20 +403,25 @@ public class LiteOrderCache { ...@@ -394,20 +403,25 @@ public class LiteOrderCache {
//剩余未出数量 //剩余未出数量
Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes(); Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes();
int remainNum = totalNum.intValue() - orderItem.getOutNum(); int remainNum = totalNum.intValue() - orderItem.getTotalOutNum();
//剩余未出盘数
int remainReelCount = orderItem.getNeedReelCount() - orderItem.getTotalOutReelCount();
//此PN未完成 //此PN未完成
if (remainNum > 0) { if (remainNum > 0) {
if (outBom) { if (outBom) {
//套料出库,设置剩余数量为1,这样就只会出一盘 //套料出库,设置剩余数量为1,这样就只会出一盘
remainNum = 1; remainNum = 1;
remainReelCount = 0;
} }
int assignNum = 0; int assignNum = 0;
while (assignNum < remainNum) { int assignReelCount = 0;
while (assignNum < remainNum || assignReelCount < remainReelCount) {
Collection<String> excludePosIds = excludeOutPosIds(); Collection<String> excludePosIds = excludeOutPosIds();
String partNumber = orderItem.getPn(); String partNumber = orderItem.getPn();
String reelId = orderItem.getRi(); String reelId = orderItem.getRi();
String mpn = orderItem.getMpn();
StoragePos pos = null; StoragePos pos = null;
if(!Strings.isNullOrEmpty(reelId)){ if(!Strings.isNullOrEmpty(reelId)){
//RI //RI
...@@ -420,15 +434,18 @@ public class LiteOrderCache { ...@@ -420,15 +434,18 @@ public class LiteOrderCache {
}else{ }else{
log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]"); log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]");
} }
}else{ }else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
//PN //PN
pos=storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType); pos=storagePosManager.findPartNumberInStorages(availableStorageIds, partNumber, excludePosIds, checkoutType);
} else if (Strings.isNullOrEmpty(reelId) && Strings.isNullOrEmpty(partNumber) && !Strings.isNullOrEmpty(mpn)){
pos=storagePosManager.findMpnInStorages(availableStorageIds, mpn, excludePosIds, checkoutType);
} }
if (pos == null) { if (pos == null) {
// log.error("未找到可以出库的物料[" + partNumber + "]"); // log.error("未找到可以出库的物料[" + partNumber + "]");
break; break;
} else { } else {
assignNum = assignNum + pos.getBarcode().getAmount(); assignNum = assignNum + pos.getBarcode().getAmount();
assignReelCount = assignReelCount + 1;
taskReelCount = taskReelCount + 1; taskReelCount = taskReelCount + 1;
log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount()); log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos) ; DataLog task = newTask(pos) ;
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader; import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.excel.ExcelReader; import com.neotel.smfcore.common.excel.ExcelReader;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
...@@ -114,6 +115,8 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -114,6 +115,8 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = csvRead.getIndex("FEEDER", orderSetting.getFeeder()); int feederIndex = csvRead.getIndex("FEEDER", orderSetting.getFeeder());
int riIndex = csvRead.getIndex("RI",orderSetting.getRi()); int riIndex = csvRead.getIndex("RI",orderSetting.getRi());
int soIndex = csvRead.getIndex("SO", orderSetting.getSo()); int soIndex = csvRead.getIndex("SO", orderSetting.getSo());
int numIndex = csvRead.getIndex("NUM", orderSetting.getNum());
int mpnIndex = csvRead.getIndex("MPN", orderSetting.getMpn());
int row = 1; int row = 1;
int newRowCount = 0; int newRowCount = 0;
...@@ -127,8 +130,12 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -127,8 +130,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if(riIndex!=-1){ if(riIndex!=-1){
ri=lineValues[riIndex]; ri=lineValues[riIndex];
} }
if (partNumber.isEmpty()&&ri.isEmpty()) { String mpn="";
log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略"); if (mpnIndex!=-1){
mpn=lineValues[mpnIndex];
}
if (partNumber.isEmpty()&&ri.isEmpty()&&mpn.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI,MPN都为空,此行忽略");
} else { } else {
int num = 1; int num = 1;
if (qtyIndex != -1) { if (qtyIndex != -1) {
...@@ -153,8 +160,21 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -153,8 +160,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if(!ObjectUtil.isNotEmpty(so)){ if(!ObjectUtil.isNotEmpty(so)){
so=fileName; so=fileName;
} }
int count=1;
if (numIndex != -1){
String countStr = lineValues[numIndex];
if (StringUtils.isNotBlank(countStr)){
try {
count = Integer.valueOf(countStr);
} catch (Exception e) {
log.error(partNumber + "的数量:" + countStr + " 不是数字,使用1");
}
}
}
LiteOrderItem item = new LiteOrderItem(); LiteOrderItem item = new LiteOrderItem();
item.setPn(partNumber); item.setPn(partNumber);
item.setNeedReelCount(count);
if(partNumber.isEmpty()){ if(partNumber.isEmpty()){
item.setNeedReelCount(1); item.setNeedReelCount(1);
} }
...@@ -162,12 +182,12 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -162,12 +182,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder); item.setFeederInfo(feeder);
item.setRi(ri); item.setRi(ri);
item.setMpn(mpn);
if(!itemMap.containsKey(so)){ if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>()); itemMap.put(so,new ArrayList<LiteOrderItem>());
} }
itemMap.get(so).add(item); itemMap.get(so).add(item);
items.add(item); items.add(item);
} }
} }
...@@ -206,15 +226,22 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -206,15 +226,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = headerMap.getOrDefault( orderSetting.getFeeder(),-1); int feederIndex = headerMap.getOrDefault( orderSetting.getFeeder(),-1);
int riIndex = headerMap.getOrDefault( orderSetting.getRi(),-1); int riIndex = headerMap.getOrDefault( orderSetting.getRi(),-1);
int soIndex = headerMap.getOrDefault( orderSetting.getSo(),-1); int soIndex = headerMap.getOrDefault( orderSetting.getSo(),-1);
for(int i=1;i<data.size();i++){ int numIndex = headerMap.getOrDefault( orderSetting.getNum(),-1);
int mpnIndex = headerMap.getOrDefault( orderSetting.getMpn(),-1);
for(int i=1;i<data.size();i++){
Map<Integer, String> lineValues = data.get(i); Map<Integer, String> lineValues = data.get(i);
String partNumber = lineValues.get(partNumberIndex); String partNumber = lineValues.get(partNumberIndex);
String ri=""; String ri="";
String mpn="";
if(riIndex!=-1){ if(riIndex!=-1){
ri=lineValues.get(riIndex); ri=lineValues.get(riIndex);
} }
if (partNumber.isEmpty()&&ri.isEmpty()) { if (mpnIndex!=-1){
log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略"); mpn=lineValues.get(mpnIndex);
}
if (partNumber.isEmpty()&&ri.isEmpty()&&mpn.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI,MPN都 为空,此行忽略");
} else { } else {
int num = 1; int num = 1;
if (qtyIndex != -1) { if (qtyIndex != -1) {
...@@ -239,8 +266,21 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -239,8 +266,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if(!ObjectUtil.isNotEmpty(so)){ if(!ObjectUtil.isNotEmpty(so)){
so=fileName; so=fileName;
} }
int count=1;
if (numIndex != -1){
String countStr = lineValues.get(numIndex);
if (StringUtils.isNotBlank(countStr)){
try {
count = Integer.valueOf(countStr);
} catch (Exception e) {
log.error(partNumber + "的数量:" + countStr + " 不是数字,使用1");
}
}
}
LiteOrderItem item = new LiteOrderItem(); LiteOrderItem item = new LiteOrderItem();
item.setPn(partNumber); item.setPn(partNumber);
item.setNeedReelCount(count);
if(partNumber.isEmpty()){ if(partNumber.isEmpty()){
item.setNeedReelCount(1); item.setNeedReelCount(1);
} }
...@@ -248,6 +288,7 @@ public class DefaultOrderFileListener implements IOrderFileListener { ...@@ -248,6 +288,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder); item.setFeederInfo(feeder);
item.setRi(ri); item.setRi(ri);
item.setMpn(mpn);
if(!itemMap.containsKey(so)){ if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>()); itemMap.put(so,new ArrayList<LiteOrderItem>());
} }
......
...@@ -51,4 +51,6 @@ public class OrderItemDto { ...@@ -51,4 +51,6 @@ public class OrderItemDto {
@Transient @Transient
private int inventoryNum = 0; private int inventoryNum = 0;
@ApiModelProperty("制造商物料编号")
private String mpn = "";
} }
...@@ -82,11 +82,21 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li ...@@ -82,11 +82,21 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/ */
private String side = ""; private String side = "";
/**
* 制造商物料编号
*/
private String mpn = "";
/** /**
* 出库是否满足要求,已出库数量大于需求数量 * 出库是否满足要求,已出库数量大于需求数量
*/ */
public boolean isOutFinished(){ public boolean isOutFinished(){
return outNum - needNum >=0; return totalOutNum - needNum >=0;
}
public boolean isOutReelFinished(){
return totalOutReelCount - needReelCount >= 0;
} }
@Override @Override
......
...@@ -80,4 +80,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> { ...@@ -80,4 +80,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void batchUpdatePosEnabled(List<String> idList, boolean enabled); void batchUpdatePosEnabled(List<String> idList, boolean enabled);
List<StoragePos> findPosByIdList(List<String> idList); List<StoragePos> findPosByIdList(List<String> idList);
StoragePos findMpnInStorages(List<String> availableStorageIds, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkoutType);
} }
...@@ -676,4 +676,25 @@ public class StoragePosManagerImpl implements IStoragePosManager { ...@@ -676,4 +676,25 @@ public class StoragePosManagerImpl implements IStoragePosManager {
return storagePosDao.findByQuery(query); return storagePosDao.findByQuery(query);
} }
@Override
public StoragePos findMpnInStorages(List<String> storageIdList, String mpn, Collection<String> excludePosIds, CHECKOUT_TYPE checkOutType) {
Criteria c = Criteria.where("barcode.mpn").is(mpn)
.and("id").nin(excludePosIds)
.and("enabled").is(true)//可用
.and("barcode.lockId").is(null);//没有被锁定的仓位;
if (storageIdList != null) {
c = c.and("storageId").in(storageIdList);
}
Query q = new Query(c);
Sort sort = getSortByCheckOutType(checkOutType);
q.with(sort);
StoragePos pos = storagePosDao.findOne(q);
if (pos == null) {
log.info("使用" + checkOutType + " 策略出库 mpn=" + mpn + ",未找到可以出库的物料 ");
} else {
log.info("使用" + checkOutType + " 策略出库 mpn=" + mpn + ",找到出仓位置【" + pos.getPosName() + "】,RI【" + pos.getBarcode().getBarcode() + "】 ");
}
return pos;
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!