Commit 23e813cc zshaohui

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

2.工单出库PN和MPN同时满足数量与盘数
1 个父辈 4e1d8062
......@@ -7,6 +7,7 @@ import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
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.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.enums.OP;
......@@ -297,6 +298,14 @@ public class LiteOrderCache {
closed = false;
break;
}
if (closed) {
if (StringUtils.isBlank(liteOrderItem.getRi()) && (StringUtils.isNotBlank(liteOrderItem.getPn()) || StringUtils.isNotBlank(liteOrderItem.getMpn()))) {
if (!liteOrderItem.isOutReelFinished()) {
closed = false;
break;
}
}
}
}
if(closed){
order.setClosed(closed);
......@@ -394,20 +403,25 @@ public class LiteOrderCache {
//剩余未出数量
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未完成
if (remainNum > 0) {
if (outBom) {
//套料出库,设置剩余数量为1,这样就只会出一盘
remainNum = 1;
remainReelCount = 0;
}
int assignNum = 0;
while (assignNum < remainNum) {
int assignReelCount = 0;
while (assignNum < remainNum || assignReelCount < remainReelCount) {
Collection<String> excludePosIds = excludeOutPosIds();
String partNumber = orderItem.getPn();
String reelId = orderItem.getRi();
String mpn = orderItem.getMpn();
StoragePos pos = null;
if(!Strings.isNullOrEmpty(reelId)){
//RI
......@@ -420,15 +434,18 @@ public class LiteOrderCache {
}else{
log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘["+reelId+"]");
}
}else{
}else if (Strings.isNullOrEmpty(reelId) && !Strings.isNullOrEmpty(partNumber)){
//PN
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) {
// log.error("未找到可以出库的物料[" + partNumber + "]");
break;
} else {
assignNum = assignNum + pos.getBarcode().getAmount();
assignReelCount = assignReelCount + 1;
taskReelCount = taskReelCount + 1;
log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
DataLog task = newTask(pos) ;
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.csv.CsvReader;
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.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
......@@ -114,6 +115,8 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = csvRead.getIndex("FEEDER", orderSetting.getFeeder());
int riIndex = csvRead.getIndex("RI",orderSetting.getRi());
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 newRowCount = 0;
......@@ -127,8 +130,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if(riIndex!=-1){
ri=lineValues[riIndex];
}
if (partNumber.isEmpty()&&ri.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略");
String mpn="";
if (mpnIndex!=-1){
mpn=lineValues[mpnIndex];
}
if (partNumber.isEmpty()&&ri.isEmpty()&&mpn.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI,MPN都为空,此行忽略");
} else {
int num = 1;
if (qtyIndex != -1) {
......@@ -153,8 +160,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if(!ObjectUtil.isNotEmpty(so)){
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();
item.setPn(partNumber);
item.setNeedReelCount(count);
if(partNumber.isEmpty()){
item.setNeedReelCount(1);
}
......@@ -162,12 +182,12 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder);
item.setRi(ri);
item.setMpn(mpn);
if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>());
}
itemMap.get(so).add(item);
items.add(item);
}
}
......@@ -206,15 +226,22 @@ public class DefaultOrderFileListener implements IOrderFileListener {
int feederIndex = headerMap.getOrDefault( orderSetting.getFeeder(),-1);
int riIndex = headerMap.getOrDefault( orderSetting.getRi(),-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);
String partNumber = lineValues.get(partNumberIndex);
String ri="";
String mpn="";
if(riIndex!=-1){
ri=lineValues.get(riIndex);
}
if (partNumber.isEmpty()&&ri.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI都 为空,此行忽略");
if (mpnIndex!=-1){
mpn=lineValues.get(mpnIndex);
}
if (partNumber.isEmpty()&&ri.isEmpty()&&mpn.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN和RI,MPN都 为空,此行忽略");
} else {
int num = 1;
if (qtyIndex != -1) {
......@@ -239,8 +266,21 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if(!ObjectUtil.isNotEmpty(so)){
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();
item.setPn(partNumber);
item.setNeedReelCount(count);
if(partNumber.isEmpty()){
item.setNeedReelCount(1);
}
......@@ -248,6 +288,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
item.setFeederInfo(feeder);
item.setRi(ri);
item.setMpn(mpn);
if(!itemMap.containsKey(so)){
itemMap.put(so,new ArrayList<LiteOrderItem>());
}
......
......@@ -51,4 +51,6 @@ public class OrderItemDto {
@Transient
private int inventoryNum = 0;
@ApiModelProperty("制造商物料编号")
private String mpn = "";
}
......@@ -82,11 +82,21 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
private String side = "";
/**
* 制造商物料编号
*/
private String mpn = "";
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
public boolean isOutFinished(){
return outNum - needNum >=0;
return totalOutNum - needNum >=0;
}
public boolean isOutReelFinished(){
return totalOutReelCount - needReelCount >= 0;
}
@Override
......
......@@ -80,4 +80,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
void batchUpdatePosEnabled(List<String> idList, boolean enabled);
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 {
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!