Commit 37ea7b66 LN

1.既是首盘又是截料出库时,设置为截料出库

1 个父辈 d5ccf8cb
...@@ -19,7 +19,6 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder; ...@@ -19,7 +19,6 @@ import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem; import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper; import com.neotel.smfcore.core.storage.rest.mapstruct.SafetyInventoryMapper;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.listener.ITaskListener; import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
...@@ -344,20 +343,30 @@ public class LiteOrderCache implements ITaskListener { ...@@ -344,20 +343,30 @@ public class LiteOrderCache implements ITaskListener {
@Autowired @Autowired
private SafetyInventoryMapper safetyInventoryMapper; private SafetyInventoryMapper safetyInventoryMapper;
public synchronized String checkOutLiteOrder(String userName, String orderNo) {
return checkOutLiteOrder(userName,orderNo,false,false);
}
/** /**
* 锁定物料 * 工单出库
* @param userName 操作人
* @param orderNo 工单号
* @param isShortageOut 是否缺料继续出库
* @param addOutbound 是否补料出库
* @return
*/ */
public synchronized String checkOutLiteOrder(String userName, String orderNo) { public synchronized String checkOutLiteOrder(String userName, String orderNo,boolean isShortageOut,boolean addOutbound) {
LiteOrder cacheOrder = findOrderByNo(orderNo); LiteOrder cacheOrder = findOrderByNo(orderNo);
if (cacheOrder == null) { if (cacheOrder == null) {
return "smfcore.order.out.notFound"; return "smfcore.order.out.notFound";
} }
if(!addOutbound) {
if ( cacheOrder.isExecuting()) { if (cacheOrder.isExecuting()) {
log.info("工单[" + orderNo + "]正在执行"); log.info("工单[" + orderNo + "]正在执行");
return "smfcore.order.out.executing"; return "smfcore.order.out.executing";
}
} }
if(cacheOrder.isClosed()) { if(cacheOrder.isClosed()) {
log.info("工单[" + orderNo + "]已关闭,无法出库"); log.info("工单[" + orderNo + "]已关闭,无法出库");
return "smfcore.order.hasClose"; return "smfcore.order.hasClose";
...@@ -410,6 +419,7 @@ public class LiteOrderCache implements ITaskListener { ...@@ -410,6 +419,7 @@ public class LiteOrderCache implements ITaskListener {
//②③④筛选锁定料盘中的最大料盘 //②③④筛选锁定料盘中的最大料盘
log.info("开始为工单[" + orderNo + "]挑选出库物料 "); log.info("开始为工单[" + orderNo + "]挑选出库物料 ");
boolean shortage=false;
List<String> availableStorageIds = dataCache.getAvailableStorageIds(); List<String> availableStorageIds = dataCache.getAvailableStorageIds();
...@@ -422,16 +432,15 @@ public class LiteOrderCache implements ITaskListener { ...@@ -422,16 +432,15 @@ public class LiteOrderCache implements ITaskListener {
String pn = orderItem.getMaterialNo(); String pn = orderItem.getMaterialNo();
//需求数量 //需求数量
int needNum = orderItem.getQty() + orderItem.getIncrement(); int needNum = orderItem.getQty() + orderItem.getIncrement()-orderItem.getOutNum();
if (needNum <= 0) {
continue;
}
////②贵重物料,不允许超发,按实际需求发料; ////②贵重物料,不允许超发,按实际需求发料;
boolean isGuizhong = orderItem.getOverFlag()==1; boolean isGuizhong = orderItem.getOverFlag()==1;
//判断是否需要截料 //判断是否需要截料
boolean needJieliao =false; boolean needJieliao =false;
if (needNum <= 0) {
continue;
}
List<StoragePos> itemPosList = new ArrayList<>(); List<StoragePos> itemPosList = new ArrayList<>();
List<String> itemPosNameList = new ArrayList<>(); List<String> itemPosNameList = new ArrayList<>();
...@@ -447,8 +456,13 @@ public class LiteOrderCache implements ITaskListener { ...@@ -447,8 +456,13 @@ public class LiteOrderCache implements ITaskListener {
Component component = componentManager.findOneByPN(pn); Component component = componentManager.findOneByPN(pn);
if(component==null){ if(component==null){
log.info("工单[" + cacheOrder.getOrderNo() + "] 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 未找到元器件信息, 缺料 "); if(isShortageOut) {
return materialShortPro(userName,cacheOrder); log.info("工单[" + cacheOrder.getOrderNo() + "]缺料出库: 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 未找到元器件信息 ");
shortage = true;
}else {
log.info("工单[" + cacheOrder.getOrderNo() + "] 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 未找到元器件信息, 缺料 ");
return materialShortPro(userName, cacheOrder);
}
} }
//判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料 //判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料
if(reelNum<=component.getMinStoreNum()){ if(reelNum<=component.getMinStoreNum()){
...@@ -456,9 +470,15 @@ public class LiteOrderCache implements ITaskListener { ...@@ -456,9 +470,15 @@ public class LiteOrderCache implements ITaskListener {
} }
//判断库存数量是否小于需求数量,小于直接返回缺料 //判断库存数量是否小于需求数量,小于直接返回缺料
if(storageNum<orderItem.getQty()){ if(storageNum<orderItem.getQty()){
//不满足实际需求,不发,报缺料 if(isShortageOut){
log.info("工单[" + cacheOrder.getOrderNo() + "] 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 库存总数量[" + storageNum + "], 不满足实际需求,缺料 "); shortage=true;
return materialShortPro(userName,cacheOrder); log.info("工单[" + cacheOrder.getOrderNo() + "]缺料出库: 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 库存总数量[" + storageNum + "] ");
}
else {
//不满足实际需求,不发,报缺料
log.info("工单[" + cacheOrder.getOrderNo() + "] 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 库存总数量[" + storageNum + "], 不满足实际需求,缺料 ");
return materialShortPro(userName, cacheOrder);
}
} }
int wholeReelCount = 0; int wholeReelCount = 0;
...@@ -588,9 +608,15 @@ public class LiteOrderCache implements ITaskListener { ...@@ -588,9 +608,15 @@ public class LiteOrderCache implements ITaskListener {
if (targetNum > 0) { if (targetNum > 0) {
int outNum = needNum - targetNum; int outNum = needNum - targetNum;
if (outNum < orderItem.getQty()) { if (outNum < orderItem.getQty()) {
//不满足实际需求,不发,报缺料 if(isShortageOut){
log.info("工单[" + cacheOrder.getOrderNo() + "] 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 库存可发数量[" + outNum + "], 不满足实际需求,缺料 "); shortage=true;
return materialShortPro(userName,cacheOrder); log.info("工单[" + cacheOrder.getOrderNo() + "]缺料出库: 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 库存可发数量[" + outNum + "], 不满足实际需求 ");
}
else {
//不满足实际需求,不发,报缺料
log.info("工单[" + cacheOrder.getOrderNo() + "] 物料号[" + pn + "] ,需求数量[" + orderItem.getWemng() + "], 库存可发数量[" + outNum + "], 不满足实际需求,缺料 ");
return materialShortPro(userName, cacheOrder);
}
} }
} }
//可以出库 //可以出库
...@@ -598,9 +624,11 @@ public class LiteOrderCache implements ITaskListener { ...@@ -598,9 +624,11 @@ public class LiteOrderCache implements ITaskListener {
} }
log.info("开始执行工单[" + orderNo + "] "); log.info("开始执行工单[" + orderNo + "] ");
cacheOrder.setTaskReelCount(0); if(!addOutbound){
cacheOrder.setTaskFinishedTime(-1); cacheOrder.setTaskReelCount(0);
cacheOrder.setFinishedReelCount(0); cacheOrder.setTaskFinishedTime(-1);
cacheOrder.setFinishedReelCount(0);
}
cacheOrder.setStatus(LITEORDER_STATUS.EXECUTING); cacheOrder.setStatus(LITEORDER_STATUS.EXECUTING);
//设置出库操作人 //设置出库操作人
cacheOrder.setOperateUser(userName); cacheOrder.setOperateUser(userName);
...@@ -627,23 +655,26 @@ public class LiteOrderCache implements ITaskListener { ...@@ -627,23 +655,26 @@ public class LiteOrderCache implements ITaskListener {
task.setOperator(userName); task.setOperator(userName);
task.setOutType(10);//工单出库类型为10 task.setOutType(10);//工单出库类型为10
if(itemReelCount==0){ if(jieliaoPosMap.containsKey(pos.getPosName())){
task.setFirstReel(true);
task.setLightColor(ORDER_COLOR.CYAN.getRgb());//首盘料 颜色:CYAN
}
else if(jieliaoPosMap.containsKey(pos.getPosName())){
//需要截料 //需要截料
int count=jieliaoPosMap.get(pos.getPosName()); int count=jieliaoPosMap.get(pos.getPosName());
task.setNeedSplitting(true); task.setNeedSplitting(true);
task.setNeedQty(count); task.setNeedQty(count);
task.setLightColor(ORDER_COLOR.PURPLE.getRgb());//截料料 颜色:PURPLE task.setLightColor(ORDER_COLOR.PURPLE.getRgb());//截料料 颜色:PURPLE
}else{ }
else if(itemReelCount==0){
task.setFirstReel(true);
task.setLightColor(ORDER_COLOR.CYAN.getRgb());//首盘料 颜色:CYAN
} else{
task.setLightColor(ORDER_COLOR.SKYBLUE.getRgb());//普通工单 颜色:SKYBLUE task.setLightColor(ORDER_COLOR.SKYBLUE.getRgb());//普通工单 颜色:SKYBLUE
} }
if(addOutbound){
task.setAddOutbound(true);
task.setLightColor(ORDER_COLOR.PINK.getRgb());//补料出库 颜色:PINK
}
taskService.addTaskToExecute(task); taskService.addTaskToExecute(task);
log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + orderItem.getMaterialNo() + "] Amount[" + pos.getBarcode().getAmount()+ log.info("工单[" + orderNo + "],任务数[" + taskReelCount + "]仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + orderItem.getMaterialNo() + "] Amount[" + pos.getBarcode().getAmount()+
"] 首盘["+task.isFirstReel()+"] 截料["+task.isNeedSplitting()+"]["+task.getNeedQty()+"]"); "] 首盘["+task.isFirstReel()+"] 截料["+task.isNeedSplitting()+"]["+task.getNeedQty()+"] 补料出库["+task.isAddOutbound()+"]");
taskReelCount++; taskReelCount++;
itemReelCount++; itemReelCount++;
...@@ -661,6 +692,12 @@ public class LiteOrderCache implements ITaskListener { ...@@ -661,6 +692,12 @@ public class LiteOrderCache implements ITaskListener {
cacheOrder.setTaskReelCount(taskReelCount); cacheOrder.setTaskReelCount(taskReelCount);
cacheOrder.setTotalFinishedReelCount(0); cacheOrder.setTotalFinishedReelCount(0);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount()+taskReelCount); cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount()+taskReelCount);
if(addOutbound){
}
else if(shortage) {
cacheOrder.setShortageOut(true);
}
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]"); log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]");
//有需要出库的 //有需要出库的
if (taskReelCount <= 0) { if (taskReelCount <= 0) {
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!