Commit a67e51bc LN

Outside Shelf Dispatch 和ControlledDispatch 新界面接口调整

1 个父辈 2ff2619c
package com.neotel.smfcore.common.bean;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.language.util.MessageUtils;
......@@ -32,8 +33,11 @@ public class ResultBean<T> {
result.setMsgKey(msgKey);
result.setParams(params);
result.setMsg(MessageUtils.getText(msgKey, params, new Locale(SecurityUtils.getCurrentUserLanguage()), msg));
if (writeLog) {
log.info(result.getMsg());
if (writeLog ) {
String showmsg=result.getMsg();
if(ObjectUtil.isNotEmpty(showmsg)){
log.info(showmsg);
}
}
return result;
}
......
......@@ -35,6 +35,7 @@ import com.neotel.smfcore.custom.micron1053.api.bean.Material;
import com.neotel.smfcore.custom.micron1053.api.bean.MaterialStatus;
import com.neotel.smfcore.custom.micron1053.api.bean.TrackStatus;
import com.neotel.smfcore.custom.micron1053.task.enums.OrderItemStatus;
import com.neotel.smfcore.custom.micron1053.util.MicronDataCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
......@@ -90,7 +91,7 @@ public class LiteOrderCache {
if (now - order.getCreateDate().getTime() > 7 * 24 * 60 * 60 * 1000) {
//7天前的需求单,关闭,并解绑
log.info("需求单 =[" + order.getOrderNo() + "]为7天前,关闭并解绑工单");
closeOrder(order.getOrderNo());
closeLiteOrder(order);
} else {
addOrderToMap(order);
......@@ -272,6 +273,20 @@ public class LiteOrderCache {
}
}
}
else{
Query query2 = new Query(Criteria.where("barcode.lockId").is(order.getOrderNo()));
List<StoragePos> posList = storagePosManager.findByQuery(query2);
for (StoragePos pos:
posList) {
if(pos.getBarcode()==null){
continue;
}
pos.getBarcode().setLockId(null);
pos.getBarcode().setLockName(null);
storagePosManager.save(pos);
log.info("工单" + order.getOrderNo() + "已关闭,解除物料锁定:" + pos.getBarcode().getBarcode() + ",所在库位:" + pos.getPosName());
}
}
} catch (Exception exception) {
log.error("工单" + order.getOrderNo() + "关闭时,解除锁定物料出错:", exception);
......@@ -312,10 +327,10 @@ public class LiteOrderCache {
List<LiteOrderItem> items = new ArrayList<>();
for (LiteOrderItem orderItem : order.getOrderItems()) {
if (orderItem.getId().equals(task.getSubSourceId())) {
if (orderItem.getSelectItems().size() >= 0) {
orderItem.updateSelItemS(task.getBarcode(), OrderItemStatus.cancel, "Cancel");
} else if (orderItem.getId().equals(task.getSubSourceId())) {
orderItem.setStatus(OrderItemStatus.cancel);
} else if (orderItem.getSelectItems().size() >= 0) {
orderItem.updateSelItemS(task.getSubSourceId(), OrderItemStatus.cancel, "Cancel");
}
items.add(orderItem);
}
......@@ -324,7 +339,8 @@ public class LiteOrderCache {
liteOrderMap.put(orderNo, order);
//如果是preTask,不需要重新出库
if (ObjectUtil.isNotEmpty(order.getMode())) {
//普通工单需要自动补发出库。
if (ObjectUtil.isEmpty(order.getMode())) {
checkoutAgain(task, order);
}
} else if (task.isFinished()) {
......@@ -334,11 +350,8 @@ public class LiteOrderCache {
List<LiteOrderItem> items = new ArrayList<>();
for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
boolean isItemTask = false;
if (liteOrderItem.getId().equals(orderItemId)) {
isItemTask = true;
liteOrderItem.setStatus(OrderItemStatus.finish);
} else {
boolean result = liteOrderItem.updateSelItemS(task.getSubSourceId(), OrderItemStatus.finish, "");
if(liteOrderItem.getSelectItems().size()>0) {
boolean result = liteOrderItem.updateSelItemS(task.getBarcode(), OrderItemStatus.finish, "");
if (result) {
isItemTask = true;
//如果全部完成,更改任务状态为完成
......@@ -347,6 +360,9 @@ public class LiteOrderCache {
liteOrderItem.setStatus(OrderItemStatus.finish);
}
}
}else if (liteOrderItem.getId().equals(orderItemId)) {
isItemTask = true;
liteOrderItem.setStatus(OrderItemStatus.finish);
}
if (isItemTask) {
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]出库完成,已完成数量+1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
......@@ -372,12 +388,8 @@ public class LiteOrderCache {
items = new ArrayList<>();
for (LiteOrderItem liteOrderItem : order.getOrderItems()) {
boolean isItemTask = false;
if (liteOrderItem.getId().equals(orderItemId)) {
isItemTask = true;
liteOrderItem.setStatus(newS);
liteOrderItem.setExecutFailReason(msg);
} else {
boolean result = liteOrderItem.updateSelItemS(task.getSubSourceId(), newS, msg);
if(liteOrderItem.getSelectItems().size()>0) {
boolean result = liteOrderItem.updateSelItemS(task.getBarcode(), newS, msg);
if (result) {
isItemTask = true;
//如果全部完成,更改任务状态为完成
......@@ -386,6 +398,10 @@ public class LiteOrderCache {
liteOrderItem.setStatus(OrderItemStatus.notify_success);
}
}
}else if (liteOrderItem.getId().equals(orderItemId)) {
isItemTask = true;
liteOrderItem.setStatus(newS);
liteOrderItem.setExecutFailReason(msg);
}
if (isItemTask) {
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]完成,API007结果:" + msg + ",更新状态=" + newS);
......@@ -725,19 +741,8 @@ public class LiteOrderCache {
return task;
}
/**
* 关闭工单
*
* @param orderNo
*/
public String closeOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) {
return "smfcore.order.out.notFound";
}
}
public String closeLiteOrder(LiteOrder liteOrder) {
String orderNo=liteOrder.getOrderNo();
//有任务的工单不能关闭
List<DataLog> allTask = taskService.getAllTasks();
for (DataLog task : allTask
......@@ -756,11 +761,27 @@ public class LiteOrderCache {
log.info("关闭工单[" + orderNo + "]成功");
liteOrder.setClosed(true);
liteOrder.setStatus(LITEORDER_STATUS.CLOSED);
liteOrderManager.save(liteOrder);
smfApi.onOrderStatusChange(liteOrder);
clearOrderLock(liteOrder);
return "smfcore.order.close.success";
}
/**
* 关闭工单
*
* @param orderNo
*/
public String closeOrder(String orderNo) {
LiteOrder liteOrder = liteOrderMap.get(orderNo);
if (liteOrder == null) {
liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder == null) {
return "smfcore.order.out.notFound";
}
}
return closeLiteOrder(liteOrder);
}
/**
* 工单详情补料出库
......@@ -1031,24 +1052,14 @@ public class LiteOrderCache {
return "smfcore.order.hasClose";
}
//先查找是否已经锁定过库位,如果已经锁定过,出锁定的库位
List<StoragePos> lockPosList = storagePosManager.findLockPos(cacheOrder.getOrderNo());
if (lockPosList != null && lockPosList.size() > 0) {
return checkOutOrder(cacheOrder).getMsgKey();
}
// //先查找是否已经锁定过库位,如果已经锁定过,出锁定的库位
// List<StoragePos> lockPosList = storagePosManager.findLockPos(cacheOrder.getOrderNo());
// if (lockPosList != null && lockPosList.size() > 0) {
// return checkOutOrder(cacheOrder).getMsgKey();
// }
boolean outBom = false;
log.info("开始为工单挑料[" + orderNo + "] ");
// cacheOrder.setTaskReelCount(0);
// cacheOrder.setTaskFinishedTime(-1);
// cacheOrder.setFinishedReelCount(0);
//不需要更改工单状态
// if (outBom) {
// cacheOrder.setStatus(LITEORDER_STATUS.BOM);
// } else {
// cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
// }
//liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
int taskReelCount = 0;
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
......@@ -1098,6 +1109,7 @@ public class LiteOrderCache {
log.info("工单[" + orderNo + "]RI出库,任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "]已在操作队列中,跳过不处理");
break;
}
orderItem.setPn(pos.getBarcode().getPartNumber());
} else {
log.info("工单[" + orderNo + "]RI出库时,库存中未找到料盘[" + reelId + "]");
}
......@@ -1114,24 +1126,17 @@ public class LiteOrderCache {
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) ;
//
// task.setSourceId(cacheOrder.getId());
// task.setSourceName(cacheOrder.getOrderNo());
// task.setSubSourceId(orderItem.getId());
// task.setSubSourceInfo(orderItem.getFeederInfo());
// task.setType(OP.CHECKOUT);
// task.setLightColor(nextColor.getRgb());
// task.setStatus(OP_STATUS.WAIT.name());
// task.setSingleOut(singleOut);
//// task = dataLogDao.save(task);
// taskService.addTaskToExecute(task);
log.info("工单[" + orderNo + "],挑料盘数[" + taskReelCount + "]挑料信息:【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "] PN=[" + partNumber + "] num:" + pos.getBarcode().getAmount());
LiteOrderItem selItem = new LiteOrderItem();
selItem.setRi(pos.getBarcode().getBarcode());
selItem.setPn(pos.getBarcode().getPartNumber());
selItem.setStatus(OrderItemStatus.wait);
selItem.setNeedNum(pos.getBarcode().getAmount());
selItem.setOutNum(pos.getBarcode().getAmount());
//物料类型
String mtype = MicronDataCache.GetReelType(pos.getBarcode().getPlateSize(), pos.getBarcode().getHeight());
selItem.updateAppendData("mtype",mtype);
selectReelItems.add(selItem);
allBarcodes.add(pos.getBarcode());
findPosList.add(pos.getId() );
......@@ -1154,20 +1159,23 @@ public class LiteOrderCache {
Map<String, MaterialStatus> apiResultMap = MicronApi.Api009(cacheOrder.getOperationId(), lineId, allBarcodes);
List<LiteOrderItem> finItem=new ArrayList<>();
List<StoragePos> lockPos = new ArrayList<>();
taskReelCount=0;
for (LiteOrderItem item :
newItems) {
item.setOutNum(0);
item.setOutReelCount(0);
int outNum = 0;
int outReelCount = 0;
List<LiteOrderItem> selItemList=new ArrayList<>();
for (LiteOrderItem reelItem :
item.getSelectItems()) {
MaterialStatus s = apiResultMap.get(reelItem.getRi());
if (s != null && s.isAvailable()) {
reelItem.setStatus(OrderItemStatus.CheckOk);
StoragePos pos = storagePosManager.getByBarcode(s.getSerialNum());
log.info("工单【" + orderNo + "】PN [" + item.getPn() + "] RI [" + item.getRi() + "] API009 验证成功,更改状态为 CheckOk ,锁定库位【" + pos.getPosName() + "】");
log.info("工单【" + orderNo + "】PN [" + reelItem.getPn() + "] RI [" + reelItem.getRi() + "] API009 验证成功,更改状态为 CheckOk ,锁定库位【" + pos.getPosName() + "】");
pos.getBarcode().setLockId(cacheOrder.getOrderNo());
......@@ -1175,6 +1183,7 @@ public class LiteOrderCache {
storagePosManager.save(pos);
outNum += pos.getBarcode().getAmount();
outReelCount += 1;
taskReelCount+=1;
}
else if(s!=null && s.isReserved()){
String str=s.getDescription();
......@@ -1188,7 +1197,7 @@ public class LiteOrderCache {
reelItem.setExecutFailReason("no result ");
reelItem.setStatus(OrderItemStatus.CheckFail);
log.info("工单【" + orderNo + "】PN [" + item.getPn() + "] RI [" + item.getRi() + "] API009 验证失败,更改状态为 CheckFail");
log.info("工单【" + orderNo + "】PN [" + reelItem.getPn() + "] RI [" + reelItem.getRi() + "] API009 验证失败,更改状态为 CheckFail");
}
else {
String str= s.getDescription();
......@@ -1197,30 +1206,33 @@ public class LiteOrderCache {
}
reelItem.setExecutFailReason(str);
reelItem.setStatus(OrderItemStatus.CheckFail);
log.info("工单【" + orderNo + "】PN [" + item.getPn() + "] RI [" + item.getRi() + "] API009 验证失败,更改状态为 CheckFail");
log.info("工单【" + orderNo + "】PN [" + reelItem.getPn() + "] RI [" + reelItem.getRi() + "] API009 验证失败,更改状态为 CheckFail");
}
selItemList.add(reelItem);
}
item.setSelectItems(selItemList);
item.setOutNum(outNum);
item.setOutReelCount(outReelCount);
//判断是否缺料
if(outNum>=item.getNeedNum()&&outReelCount>=item.getNeedReelCount()){
//已有足够物料
item.setStatus(OrderItemStatus.CheckOk);
}else{
//缺料
item.setStatus(OrderItemStatus.shortage);
}
liteOrderItemManager.save(item);
finItem.add(item);
}
//锁定库位
cacheOrder.setOrderItems(newItems);
cacheOrder.setOrderItems(finItem);
cacheOrder.setTaskReelCount(taskReelCount);
cacheOrder.setTotalTaskReelCount(cacheOrder.getTotalTaskReelCount() + taskReelCount);
log.info("工单[" + orderNo + "]任务分配结束,任务数[" + taskReelCount + "]");
// smfApi.onOrderStatusChange(cacheOrder);
// //有需要出库的
// if (taskReelCount <= 0) {
// finishedOrderTasks(cacheOrder);
// }
//
// liteOrderManager.save(cacheOrder);
//
// liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
liteOrderManager.save(cacheOrder);
addOrderToMap(cacheOrder);
log.info("工单[" + orderNo + "]物料验证结束,验证成功盘数[" + taskReelCount + "]");
if (taskReelCount <= 0) {
//return "工单无可执行的任务";
return "smfcore.order.out.noTask";
......@@ -1228,13 +1240,44 @@ public class LiteOrderCache {
return "";
}
public LiteOrderItem NewSelItem(StoragePos pos){
LiteOrderItem selItem = new LiteOrderItem();
selItem.setRi(pos.getBarcode().getBarcode());
selItem.setPn(pos.getBarcode().getPartNumber());
selItem.setStatus(OrderItemStatus.wait);
selItem.setNeedNum(pos.getBarcode().getAmount());
selItem.setOutNum(pos.getBarcode().getAmount());
//物料类型
String mtype = MicronDataCache.GetReelType(pos.getBarcode().getPlateSize(), pos.getBarcode().getHeight());
selItem.updateAppendData("mtype",mtype);
return selItem;
}
public boolean dispatchOrderIsCheckOk(LiteOrder liteOrder) {
//判断是否所有pn都已经有足够的物料
boolean isCheckOk = true;
for (LiteOrderItem item :
liteOrder.getOrderItems()) {
if (item.getStatus().equalsIgnoreCase(OrderItemStatus.shortage)) {
isCheckOk = false;
break;
}
}
return isCheckOk;
}
public synchronized String dispatchCheckOut(LiteOrder order, boolean isRetry,boolean isOver) {
ORDER_COLOR nextColor = getNextColor();
if (nextColor == null) {
log.info("执行工单[" + order.getOrderNo() + "] 时,已达最大可执行工单数");
throw new ValidateException("order.out.maxOrder", "已达最大可执行工单数");
}
String resultMsg="smfcore.label.noReel";
log.info("dispatchCheckOut 出库单[" + order.getOrderNo() + "] operatetionId [" + order.getOperationId() + "]开始出库,isRetry="+isRetry+",isOver="+isOver);
int taskReelCount = 0;
List<String> needOutBarcode = new ArrayList<>();
for (LiteOrderItem item :
......@@ -1264,8 +1307,14 @@ public class LiteOrderCache {
return resultMsg;
}
order.setStatus(LITEORDER_STATUS.TAILS);
int taskReelCount = 0;
if(isRetry){
taskReelCount=order.getTaskReelCount();
log.info("dispatchCheckOut 出库单[" + order.getOrderNo() + "] operatetionId [" + order.getOperationId() + "] retry出库,原来任务数=" + taskReelCount);
}else{
order.setTaskReelCount(0);
order.setFinishedReelCount(0);
}
List<StoragePos> storagePosList = storagePosManager.findByQuery(new Query(Criteria.where("barcode.barcode").in(needOutBarcode)));
List<Material> materialList = new ArrayList<>();
......@@ -1283,8 +1332,13 @@ public class LiteOrderCache {
for (LiteOrderItem orderItem : order.getOrderItems()) {
int outNum = 0;
int outReelCount = 0;
if(isRetry){
outNum=orderItem.getOutNum();
outReelCount=orderItem.getOutReelCount();
}
List<LiteOrderItem> newSelItems = new ArrayList<>();
for (LiteOrderItem selItem :
orderItem.getSelectItems()) {
......
......@@ -123,12 +123,15 @@ public class DefaultOrderFileListener implements IOrderFileListener {
itemMap = readExcelFile(fileName, orderFile.getAbsolutePath());
}
//新增为一个工单
String orderName = reason;
if(ObjectUtil.isEmpty(reason)) {
List<LiteOrder> orders = liteOrderManager.findByQuery(new Query(Criteria.where("mode").is(mode)));
orderName = mode + (orders.size() + 1);
if(ObjectUtil.isEmpty(reason)){
reason="";
}
//新增为一个工单
String orderName = mode+"_"+reason+"_"+operId;
// if(ObjectUtil.isEmpty(reason)) {
// List<LiteOrder> orders = liteOrderManager.findByQuery(new Query(Criteria.where("mode").is(mode)));
// orderName = mode + (orders.size() + 1);
// }
LiteOrder dbOrder = liteOrderManager.findByOrderNo(orderName);
if (dbOrder != null) {
......@@ -137,7 +140,7 @@ public class DefaultOrderFileListener implements IOrderFileListener {
String newOrderNo = orderName + "-" + format.format(new Date());
dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
if (dbOrder == null) {
orderName=newOrderNo;
} else {
log.info("watchOrderDir,mode=[" + mode + "],reason=[" + reason + "]:数据库中已存在工单号为[" + orderName + "],忽略文件:" + orderFile.getAbsolutePath());
//resultFile = new File(localDir+File.separator + "error",backupFileName);
......
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.core.order.service.po;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.custom.micron1053.task.enums.OrderItemStatus;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.annotation.Transient;
......@@ -9,6 +10,7 @@ import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -120,16 +122,46 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
* 自定义的附加字段,key=字段名,value=值
*/
public Map<String,String> appendData = new HashMap<>();
/**
* 添加或更新自定义附加信息
* @param appendKey
* @param appendValue
*/
public void updateAppendData(String appendKey, String appendValue){
appendData.put(appendKey, appendValue);
}
/**
* 获取自定义附加信息
* @param appendKey
* @param <T>
* @return
*/
public <T> T getAppendData(String appendKey){
Object value = appendData.get(appendKey);
if(value != null){
return (T)value;
}
return null;
}
public List<LiteOrderItem> selectItems;
public boolean updateSelItemS(String subItemId,String selItemStatus,String reason) {
public List<LiteOrderItem> getSelectItems(){
if(selectItems==null){
return new ArrayList<>();
}
return selectItems;
}
public boolean updateSelItemS(String barcode,String selItemStatus,String reason) {
try {
if (selectItems == null || selectItems.size() <= 0) {
return false;
}
for (int i = 0; i < selectItems.size(); i++) {
if (selectItems.get(i).getId().equals(subItemId)) {
if (selectItems.get(i).getRi().equals(barcode)) {
selectItems.get(i).setStatus(selItemStatus);
if (ObjectUtil.isNotEmpty(reason)) {
selectItems.get(i).setExecutFailReason(reason);
......@@ -161,4 +193,24 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
}
return this.getId().compareTo(o.getId());
}
public boolean isSuccess(){
return status.equalsIgnoreCase(OrderItemStatus.executing)||
status.equalsIgnoreCase(OrderItemStatus.wait)||
status.equalsIgnoreCase(OrderItemStatus.notify_success)||
status.equalsIgnoreCase(OrderItemStatus.finish)
||status.equalsIgnoreCase(OrderItemStatus.CheckOk);
}
public boolean isNg() {
return status.equalsIgnoreCase(OrderItemStatus.executFail)||
status.equalsIgnoreCase(OrderItemStatus.CheckFail)||
status.equalsIgnoreCase(OrderItemStatus.cancel)
||status.equalsIgnoreCase(OrderItemStatus.Reserved);
}
public boolean isTranFail() {
return status.equalsIgnoreCase(OrderItemStatus.notify_fail);
}
}
......@@ -1004,6 +1004,9 @@ public class MicronApi {
public static boolean Api012(String operationId, String action) {
if(Debug){
return true;
}
String url = config.getUrl(config.api_name_012);
url = MessageFormat.format(url, operationId);
......
package com.neotel.smfcore.custom.micron1053.loading.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MaterialDispatchDto implements Serializable {
@ApiModelProperty("物料类型")
private String materialType;
@ApiModelProperty("成功盘数")
private int successQty;
@ApiModelProperty("NG盘数")
private int ng;
@ApiModelProperty("失败盘数")
private int failure;
}
package com.neotel.smfcore.custom.micron1053.loading.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SelReelDetialDto implements Serializable {
@ApiModelProperty("PN")
private String pn;
@ApiModelProperty("RI")
private String ri;
@ApiModelProperty("qty")
private int qty;
@ApiModelProperty("状态,CheckOK的不可勾选,Reserved 和CheckFail 的可勾选")
private String status;
@ApiModelProperty("执行失败原因")
private String executFailReason;
}
package com.neotel.smfcore.custom.micron1053.task;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
......@@ -8,9 +9,9 @@ import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
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_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.inList.service.po.InListItem;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
......@@ -27,11 +28,14 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.micron1053.api.MicronApi;
import com.neotel.smfcore.custom.micron1053.api.bean.MaterialStatus;
import com.neotel.smfcore.custom.micron1053.loading.dto.MaterialDispatchDto;
import com.neotel.smfcore.custom.micron1053.loading.dto.MaterialDtialDto;
import com.neotel.smfcore.custom.micron1053.loading.dto.SelReelDetialDto;
import com.neotel.smfcore.custom.micron1053.task.bean.DispatchItemMapper;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.DispatchItemDto;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.ItemDetialDto;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.TaskDto;
import com.neotel.smfcore.custom.micron1053.task.enums.OrderItemStatus;
import com.neotel.smfcore.custom.micron1053.util.MicronDataCache;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import io.swagger.annotations.Api;
......@@ -55,32 +59,11 @@ import java.util.stream.Collectors;
@RequestMapping("/rest/micron/dispatch")
@RequiredArgsConstructor
public class MicronDispatchController {
//
// @ApiOperation("上传工单")
// @PostMapping(value = "/upload")
// @AnonymousAccess
// public ResultBean updateAvatar(@RequestParam MultipartFile orderFile) {
//
// String csv = "csv";
// String excel="xlsx";
// String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
// String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
// if (fileType != null &&(!csv.contains(fileType))&&(!excel.contains(fileType)) ) {
// throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{csv+","+excel});
// }
// File folder = new File(properties.getPath(), "pos");
// File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
// boolean result = orderFileWatch.handleOrderFile(localFile);
// if (result) {
// return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功");
// } else {
// return ResultBean.newErrorResult(-1,"smfcore.order.uploadFailure","上传失败");
// }
// }
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private DataCache dataCache;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private DataCache dataCache;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
......@@ -99,23 +82,32 @@ private DataCache dataCache;
private TaskService taskService;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IStoragePosManager storagePosManager;
private String Mode_RACK="RACK";
private TaskDto getTaskDtoByMode(String mode){
private TaskDto getTaskDtoByMode(String mode) {
TaskDto dto = new TaskDto();
//记录
String key = Constants.CACHE_DISPATCH + mode;
//先从缓存中获取数据
try{
try {
dto = dataCache.getCache(key);
return dto;
}catch (Exception ex){
} catch (Exception ex) {
return null;
}
}
private boolean NeedInputLineId(String mode){
if(mode.equalsIgnoreCase(Mode_RACK)){
return false;
}
return true;
}
@ApiOperation("点 Outside Shelf Dispatch 或 Controlled Dispatch 按钮,调用此接口获取出库页详情")
@AnonymousAccess
@GetMapping("/getList")
......@@ -129,26 +121,29 @@ private IStoragePosManager storagePosManager;
}//判断是否生成,未关闭的工单
TaskDto dto = getTaskDtoByMode(mode);
//获取是否有此类型的工单信息
//code=0,,如果已经存在,直接返回列表页面
//code=0,,如果已经存在,调用获取页面数据接口获取列表数据
//code=1,没有数据,OutSide按钮进入上传工单页面 ,ControlledDispatch 按钮进入选择Pn或上传工单页面
//code=2,ControlledDispatch 进入输入lineID页面
List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
if (dto!=null &&ObjectUtil.isNotEmpty(dto.getOperationId()) && ObjectUtil.isNotEmpty(dto.getLineId()) && itemList != null && !itemList.isEmpty()) {
//已存在,直接返回列表页面
List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
return ResultBean.newOkResult(list);
// List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
// if (dto!=null &&ObjectUtil.isNotEmpty(dto.getOperationId()) && ObjectUtil.isNotEmpty(dto.getLineId()) && itemList != null && !itemList.isEmpty()) {
// //已存在,直接返回列表页面
// List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
// return ResultBean.newOkResult(list);
LiteOrder order = getOrderByMode(mode);
if (dto != null && ObjectUtil.isNotEmpty(dto.getOperationId()) && ObjectUtil.isNotEmpty(dto.getLineId()) && order != null) {
return getTaskInfo(order);
} else {
if (dto != null && ObjectUtil.isNotEmpty(dto.getOperationId())) {
if(ObjectUtil.isNotEmpty(dto.getLineId())||(mode.equals("RACK"))){
if (ObjectUtil.isNotEmpty(dto.getLineId()) || (!NeedInputLineId(mode))) {
//已有 operationId ,需要进入上传工单页面
return ResultBean.newErrorResult(1, "", "");
}else {
return ResultBean.newErrorResult(1, "", "", new String[]{}, false);
} else {
//已有 operationId ,没有lineID,需要输入lineID
return ResultBean.newErrorResult(2, "", "");
return ResultBean.newErrorResult(2, "", "", new String[]{}, false);
}
} else {
......@@ -162,11 +157,21 @@ private IStoragePosManager storagePosManager;
if (StringUtils.isNotBlank(operationId)) {
dto.setOperationId(operationId);
dto.setLineId("");
dataCache.updateCache(Constants.CACHE_DISPATCH + mode, dto);
MicronApi.ActionUpdate(operationId,MicronApi.START);
//需要输入lineID
return ResultBean.newErrorResult(2, "", "");
MicronApi.ActionUpdate(operationId, MicronApi.START);
//判断是否是RACK
if (ObjectUtil.isNotEmpty(dto.getLineId()) || (!NeedInputLineId(mode))) {
//已有 operationId ,需要进入上传工单页面
return ResultBean.newErrorResult(1, "", "", new String[]{}, false);
} else {
//已有 operationId ,没有lineID,需要输入lineID
return ResultBean.newErrorResult(2, "", "", new String[]{}, false);
}
} else {
return ResultBean.newErrorResult(-1, "smfcore.api.fail", "Api011 获取数据失败", new String[]{"API011"});
}
......@@ -176,11 +181,120 @@ private IStoragePosManager storagePosManager;
}
private ResultBean getTaskInfo(LiteOrder order) {
//如果工单还未出库
if (order.isNew()) {
//返回可以勾选的物料及已验证成功的物料列表
List<SelReelDetialDto> reelDetialDtos = getReelDetialList(order);
ResultBean resultBean = ResultBean.newErrorResult(3, "", "", new String[]{}, false);
resultBean.setData(reelDetialDtos);
return resultBean;
} else {
//返回出库信息
List<MaterialDispatchDto> materialDispatchDtos = getOrderMaterialList(order);
ResultBean resultBean = ResultBean.newErrorResult(4, "", "", new String[]{}, false);
resultBean.setData(materialDispatchDtos);
return resultBean;
}
}
private List<SelReelDetialDto> getReelDetialList(LiteOrder order) {
List<SelReelDetialDto> reelDetialDtos = new ArrayList<>();
//先取已验证过的数据
for (LiteOrderItem item :
order.getOrderItems()) {
for (LiteOrderItem selItem :
item.getSelectItems()) {
SelReelDetialDto dto = new SelReelDetialDto(selItem.getPn(), selItem.getRi(), selItem.getOutNum(), selItem.getStatus(), selItem.getExecutFailReason());
reelDetialDtos.add(dto);
}
}
for (LiteOrderItem item :
order.getOrderItems()) {
if(ObjectUtil.isNotEmpty(item.getRi())){
}
//判断是否需要勾选其他物料
else if (item.getOutNum() < item.getNeedNum()|| item.getNeedReelCount()<item.getSelectItems().size()) {
//需要勾选
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
Collection<String> excludePosIds = liteOrderCache.excludeOutPosIds();
List<StoragePos> otherPosList = storagePosManager.findInStoragesByPN(excludePosIds, item.getPn(), checkoutType);
for (StoragePos pos :
otherPosList) {
SelReelDetialDto dto = new SelReelDetialDto(pos.getBarcode().getPartNumber(), pos.getBarcode().getBarcode(), pos.getBarcode().getAmount(), "", "");
reelDetialDtos.add(dto);
}
}
}
// if (MicronApi.Debug) {
// if (reelDetialDtos.size() <= 0) {
// for (int i = 0; i < 5; i++) {
// String ok = (i <= 1) ? "CheckOk" : "CheckFail";
// SelReelDetialDto dto = new SelReelDetialDto("PN" + i, "barcode" + i, i * 100, ok, "msg" + i);
// reelDetialDtos.add(dto);
// }
// for (int i = 6; i < 9; i++) {
// SelReelDetialDto dto = new SelReelDetialDto("PN" + i, "barcode" + i, i * 100, "", "");
// reelDetialDtos.add(dto);
// }
// }
// }
return reelDetialDtos;
}
private List<MaterialDispatchDto> getOrderMaterialList(LiteOrder order) {
Map<String, MaterialDispatchDto> dtoMap = new HashMap<>();
for (LiteOrderItem item :
order.getOrderItems()) {
for (LiteOrderItem selItem : item.getSelectItems()) {
String mtype = selItem.getAppendData("mtype");
MaterialDispatchDto dto = dtoMap.getOrDefault(mtype, new MaterialDispatchDto(mtype, 0, 0, 0));
// if (item.isSuccess()) {
// } else
if (selItem.isNg()) {
dto.setNg(dto.getNg() + 1);
} else if (selItem.isTranFail()) {
dto.setFailure(dto.getFailure() + 1);
} else {
dto.setSuccessQty(dto.getSuccessQty() + 1);
}
dtoMap.put(dto.getMaterialType(), dto);
}
}
List<MaterialDispatchDto> resultList = new ArrayList<>();
for (MaterialDispatchDto dto : dtoMap.values()) {
resultList.add(dto);
}
// if (resultList.size() <= 0 && MicronApi.Debug) {
// resultList.add(new MaterialDispatchDto(MicronDataCache.PIZZABOX, 2, 3, 9));
// resultList.add(new MaterialDispatchDto(MicronDataCache.REEL, 23, 2, 54));
// resultList.add(new MaterialDispatchDto(MicronDataCache.PCB, 22, 2, 52));
// }
return resultList;
}
@ApiOperation("Submit 选择工单文件后确认上传 mode=RACK时需要输入reason,mode=CTRLDISPATCH时reason传空字符串 ")
@AnonymousAccess
@PostMapping("/submit")
public ResultBean outSideSubmit( @RequestParam MultipartFile orderFile,@RequestParam String mode,@RequestParam String reason ) {
public ResultBean outSideSubmit(@RequestParam MultipartFile orderFile, @RequestParam String mode, @RequestParam String reason) {
try {
// public ResultBean outSideSubmit(@RequestBody String mode,@RequestBody String reason ,@RequestBody MultipartFile orderFile) {
......@@ -197,7 +311,7 @@ private IStoragePosManager storagePosManager;
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
//判断是否生成,未关闭的工单
if (ObjectUtil.isEmpty(dto.getOperationId()) || ObjectUtil.isEmpty(dto.getLineId())) {
if (ObjectUtil.isEmpty(dto.getOperationId()) ||(NeedInputLineId(dto.getMode()) && ObjectUtil.isEmpty(dto.getLineId()))) {
log.info("outSideSubmit 操作失败,taskDto数据不完整");
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
......@@ -218,18 +332,8 @@ private IStoragePosManager storagePosManager;
dto.setLineId(reason);
}
String lineId = dto.getLineId();
dataCache.updateCache(Constants.CACHE_DISPATCH + mode, dto);
//工单上传成功,开始挑料
LiteOrder order = getOrderByMode(mode);
liteOrderCache.OrderReady(order.getOrderNo(), lineId);
// ,直接返回列表页面
List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
return ResultBean.newOkResult(list);
return NewOrderProcess(mode, lineId);
} else {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
......@@ -242,11 +346,27 @@ private IStoragePosManager storagePosManager;
}
}
private ResultBean NewOrderProcess(String mode, String lineId ) {
//工单上传成功,开始挑料
LiteOrder order = getOrderByMode(mode);
liteOrderCache.OrderReady(order.getOrderNo(), lineId);
if (liteOrderCache.dispatchOrderIsCheckOk(order)) {
log.info(order.getOrderNo() + "工单已备料完成,直接出料");
//直接开始出库
liteOrderCache.dispatchCheckOut(order, false, false);
}
return getTaskInfo(order);
}
@ApiOperation("Controlled Dispatch 输入lineID后调用此方法")
@AnonymousAccess
@PostMapping("/controlledDisSure")
public ResultBean controlledDisSure( @RequestParam String mode,@RequestParam String lineId ) {
public ResultBean controlledDisSure(@RequestParam String mode, @RequestParam String lineId) {
//判断是否验证
if (!MicronApi.isEnable()) {
return ResultBean.newErrorResult(9, "smfcore.micron.apiClose", " Not yet open");
......@@ -259,11 +379,13 @@ private IStoragePosManager storagePosManager;
//code=1,没有数据,OutSide按钮进入上传工单页面 ,ControlledDispatch 按钮进入选择Pn或上传工单页面
//code=2,ControlledDispatch 进入输入lineID页面
//code=-1:出错提示信息
List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
if (itemList != null && !itemList.isEmpty()) {
//已存在,直接返回列表页面
List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
return ResultBean.newOkResult(list);
// List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
LiteOrder order = getOrderByMode(mode);
if (order != null && !order.getOrderItems().isEmpty()) {
// //已存在,直接返回列表页面
// List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
// return ResultBean.newOkResult(list);
return getTaskInfo(order);
} else {
......@@ -274,7 +396,7 @@ private IStoragePosManager storagePosManager;
dto.setLineId(lineId);
//调用API201
String result = MicronApi.Api201(lineId, dto.getOperationId());
if (ObjectUtil.isEmpty( result)) {
if (ObjectUtil.isEmpty(result)) {
//成功
dto.setLineId(lineId);
dataCache.updateCache(Constants.CACHE_DISPATCH + mode, dto);
......@@ -296,7 +418,7 @@ private IStoragePosManager storagePosManager;
if (StringUtils.isNotBlank(operationId)) {
dto.setOperationId(operationId);
dataCache.updateCache(Constants.CACHE_DISPATCH + mode, dto);
MicronApi.ActionUpdate(operationId,MicronApi.START);
MicronApi.ActionUpdate(operationId, MicronApi.START);
} else {
return ResultBean.newErrorResult(-1, "smfcore.api.fail", "Api011 获取数据失败", new String[]{"API011"});
}
......@@ -308,7 +430,7 @@ private IStoragePosManager storagePosManager;
@ApiOperation("Controlled Dispatch ,勾选Pn出库提交")
@AnonymousAccess
@PostMapping("/pnSubmit")
public ResultBean pnSubmit(@RequestBody Set< TacticsOutDto > outDtoSet) {
public ResultBean pnSubmit(@RequestBody Set<TacticsOutDto> outDtoSet) {
try {
//判断是否验证
if (!MicronApi.isEnable()) {
......@@ -370,17 +492,7 @@ private IStoragePosManager storagePosManager;
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
//开始挑料
LiteOrder order = getOrderByMode(mode);
liteOrderCache.OrderReady(order.getOrderNo(), taskDto.getLineId());
// ,直接返回列表页面
List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
return ResultBean.newOkResult(list);
return NewOrderProcess(mode, taskDto.getLineId());
} catch (Exception exception) {
log.error(exception.toString());
return ResultBean.newErrorResult(-1, exception.toString(), exception.toString());
......@@ -388,87 +500,92 @@ private IStoragePosManager storagePosManager;
}
@ApiOperation("可用列表详情,点详情时,发送itemId,获取详细信息")
@PostMapping("/itemDetial")
@AnonymousAccess
public ResultBean itemDetial(@RequestBody Map<String,Object> params) {
String mode = params.get("mode").toString();
String itemId = params.get("itemId").toString();
log.info(" itemDetial :mode=" + mode + ", itemId=" + itemId);
//判断有没有生成任务
LiteOrder order = getOrderByMode(mode);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
List<LiteOrderItem> items = order.getOrderItems().stream()
.filter(item -> (item.getId().equals(itemId)))
.collect(Collectors.toList());
if (items.size() <= 0) {
return ResultBean.newErrorResult(-1, "smfcore.micron.notFound", "未找到数据");
}
LiteOrderItem selItem = items.get(0);
List<ItemDetialDto> detialDtos = new ArrayList<>();
for (LiteOrderItem item : selItem.getSelectItems()
) {
ItemDetialDto dto = new ItemDetialDto(item.getRi(), item.getNeedNum(), item.getStatus(),item.getExecutFailReason());
detialDtos.add(dto);
}
//判断是否需要勾选其他物料
if (selItem.getOutNum() < selItem.getNeedNum()) {
//需要勾选
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> availableStorageIds = dataCache.getAvailableStorageIds();
Collection<String> excludePosIds = liteOrderCache.excludeOutPosIds();
List<StoragePos> otherPosList = storagePosManager.findInStoragesByPN(excludePosIds, selItem.getPn(), checkoutType);
for (StoragePos pos :
otherPosList) {
ItemDetialDto dto = new ItemDetialDto(pos.getBarcode().getBarcode(), pos.getBarcode().getAmount(), "","");
detialDtos.add(dto);
}
}
if(MicronApi.Debug){
if(detialDtos.size()<=0){
for (int i=0;i<5;i++) {
String ok = (i <= 1) ? "CheckOk" : "CheckFail";
ItemDetialDto dto = new ItemDetialDto("barcode" + i, i * 100, ok, "msg" + i);
detialDtos.add(dto);
}
for (int i=6;i<9;i++) {
ItemDetialDto dto = new ItemDetialDto("barcode" + i, i * 100, "", "");
detialDtos.add(dto);
}
}
}
//判断是否需要勾选
return ResultBean.newOkResult(detialDtos);
}
// @ApiOperation("可用列表详情,点详情时,发送itemId,获取详细信息")
// @PostMapping("/itemDetial")
// @AnonymousAccess
// public ResultBean itemDetial(@RequestBody Map<String,Object> params) {
//
// String mode = params.get("mode").toString();
// String itemId = params.get("itemId").toString();
// log.info(" itemDetial :mode=" + mode + ", itemId=" + itemId);
// //判断有没有生成任务
// LiteOrder order = getOrderByMode(mode);
// if (order == null) {
// return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
// }
//
// List<LiteOrderItem> items = order.getOrderItems().stream()
// .filter(item -> (item.getId().equals(itemId)))
// .collect(Collectors.toList());
//
// if (items.size() <= 0) {
// return ResultBean.newErrorResult(-1, "smfcore.micron.notFound", "未找到数据");
// }
//
// LiteOrderItem selItem = items.get(0);
//
// List<ItemDetialDto> detialDtos = new ArrayList<>();
//
// for (LiteOrderItem item : selItem.getSelectItems()
// ) {
// ItemDetialDto dto = new ItemDetialDto(item.getRi(), item.getNeedNum(), item.getStatus(),item.getExecutFailReason());
// detialDtos.add(dto);
// }
//
// //判断是否需要勾选其他物料
// if (selItem.getOutNum() < selItem.getNeedNum()) {
// //需要勾选
//
// CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
// List<String> availableStorageIds = dataCache.getAvailableStorageIds();
// Collection<String> excludePosIds = liteOrderCache.excludeOutPosIds();
// List<StoragePos> otherPosList = storagePosManager.findInStoragesByPN(excludePosIds, selItem.getPn(), checkoutType);
//
// for (StoragePos pos :
// otherPosList) {
//
// ItemDetialDto dto = new ItemDetialDto(pos.getBarcode().getBarcode(), pos.getBarcode().getAmount(), "","");
// detialDtos.add(dto);
// }
// }
//
// if(MicronApi.Debug){
// if(detialDtos.size()<=0){
// for (int i=0;i<5;i++) {
// String ok = (i <= 1) ? "CheckOk" : "CheckFail";
// ItemDetialDto dto = new ItemDetialDto("barcode" + i, i * 100, ok, "msg" + i);
// detialDtos.add(dto);
// }
// for (int i=6;i<9;i++) {
// ItemDetialDto dto = new ItemDetialDto("barcode" + i, i * 100, "", "");
// detialDtos.add(dto);
// }
// }
// }
//
// //判断是否需要勾选
//
// return ResultBean.newOkResult(detialDtos);
// }
@ApiOperation("勾选列表中的Ri,确认提交")
@PostMapping("/itemSubmit")
@AnonymousAccess
public ResultBean itemSubmit(@RequestBody Map<String,Object> params) {
public ResultBean itemSubmit(@RequestBody Map<String, Object> params) {
try {
String mode = params.get("mode").toString();
String itemId = params.get("itemId").toString();
String itemId = "";
if (params.containsKey("itemId")) {
itemId = params.get("itemId").toString();
}
Object overrideOut = params.get("isOverride");
boolean isOver = false;
if (ObjectUtil.isNotEmpty(overrideOut) && overrideOut.toString().equalsIgnoreCase("true")) {
isOver = true;
}
List<Object> selectRiList = (List<Object>) params.get("submitRIS");
log.info(" itemDetial :mode=" + mode + ", itemId=" + itemId);
log.info(" itemDetial :mode=" + mode + ", itemId=" + itemId+"");
//判断有没有生成任务
LiteOrder order = getOrderByMode(mode);
if (order == null) {
......@@ -479,17 +596,6 @@ private IStoragePosManager storagePosManager;
log.info("pnSubmit 操作失败,taskDto数据不完整");
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
List<LiteOrderItem> items = order.getOrderItems().stream()
.filter(item -> (item.getId().equals(itemId)))
.collect(Collectors.toList());
if (items.size() <= 0) {
return ResultBean.newErrorResult(-1, "smfcore.micron.notFound", "未找到数据");
}
for (LiteOrderItem item :
items) {
if (item.getId().equals(itemId)) {
List<Barcode> allBarcodes = new ArrayList<>();
//查找到详情,循环RI,生成API009数据
for (Object ri :
......@@ -499,18 +605,33 @@ private IStoragePosManager storagePosManager;
allBarcodes.add(pos.getBarcode());
}
}
//调用API009
Map<String, MaterialStatus> apiResultMap = MicronApi.Api009(order.getOperationId(), taskDto.getLineId(), allBarcodes);
List<LiteOrderItem> newItems = new ArrayList<>();
for (LiteOrderItem item :
order.getOrderItems()) {
List<Barcode> itemBarcode = allBarcodes.stream()
.filter(barcode -> (barcode.getPartNumber().equals(item.getPn())))
.collect(Collectors.toList());
List<LiteOrderItem> selectReelItems = item.selectItems;
for (Barcode barcode :
allBarcodes) {
itemBarcode) {
LiteOrderItem reelItem = new LiteOrderItem();
StoragePos pos = storagePosManager.getByBarcode(barcode.getBarcode());
reelItem.setRi(pos.getBarcode().getBarcode());
reelItem.setNeedNum(pos.getBarcode().getAmount());
LiteOrderItem reelItem = null;
List<LiteOrderItem> findes = selectReelItems.stream()
.filter(obj -> (obj.getRi().equals(barcode.getBarcode()))).collect(Collectors.toList());
if (findes.size() > 0) {
reelItem = findes.get(0);
}
//如果是之前验证成功的,直接跳过
if (reelItem == null) {
reelItem = liteOrderCache.NewSelItem(pos);
} else if (reelItem.isSuccess() && (!reelItem.getStatus().equalsIgnoreCase(OrderItemStatus.wait))) {
continue;
}
MaterialStatus s = apiResultMap.get(barcode.getBarcode());
if (s != null && s.isAvailable()) {
......@@ -523,6 +644,8 @@ private IStoragePosManager storagePosManager;
pos.getBarcode().setLockName(item.getPn());
storagePosManager.save(pos);
item.setOutNum(item.getOutNum() + pos.getBarcode().getAmount());
item.setOutReelCount(item.getOutReelCount() + 1);
order.setTaskReelCount(order.getTaskReelCount() + 1);
} else if (s != null && s.isReserved()) {
String str = s.getDescription();
......@@ -545,15 +668,21 @@ private IStoragePosManager storagePosManager;
selectReelItems.add(reelItem);
}
item.setSelectItems(selectReelItems);
liteOrderItemManager.save(item);
newItems.add(item);
}
}
order.setOrderItems(newItems);
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
//返回新增列表
log.info(order.getOrderNo() + "已勾选物料完成,直接出料");
//直接开始出库
liteOrderCache.dispatchCheckOut(order, false, isOver);
return getTaskInfo(order);
//判断是否需要勾选
return ResultBean.newOkResult("");
// return ResultBean.newOkResult("");
} catch (Exception exception) {
......@@ -563,11 +692,10 @@ private IStoragePosManager storagePosManager;
}
@ApiOperation("工单确认出库")
@PostMapping("/checkOut")
@AnonymousAccess
public ResultBean checkOut(@RequestBody Map<String,Object> params) {
public ResultBean checkOut(@RequestBody Map<String, Object> params) {
try {
String mode = params.get("mode").toString();
Object overrideOut = params.get("isOverride");
......@@ -602,72 +730,31 @@ private IStoragePosManager storagePosManager;
@ApiOperation("重试按钮")
@PostMapping("/retry")
@AnonymousAccess
public ResultBean retry(@RequestBody Map<String,Object> params) {
public ResultBean retry(@RequestBody Map<String, Object> params) {
String mode = params.get("mode").toString();
Object overrideOut=params.get("isOverride");
boolean isOver=false;
if(ObjectUtil.isNotEmpty(overrideOut)&&overrideOut.toString().equalsIgnoreCase("true")) {
Object overrideOut = params.get("isOverride");
boolean isOver = false;
if (ObjectUtil.isNotEmpty(overrideOut) && overrideOut.toString().equalsIgnoreCase("true")) {
isOver = true;
}
log.info(" retry :mode=" + mode + ",重新出库, isOver="+isOver);
log.info(" retry :mode=" + mode + ",重新出库, isOver=" + isOver);
//判断有没有生成任务
LiteOrder order = getOrderByMode(mode);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
String msg= liteOrderCache.dispatchCheckOut(order,true,isOver);
if(ObjectUtil.isNotEmpty(msg)){
return ResultBean.newErrorResult(-1,msg,msg);
String msg = liteOrderCache.dispatchCheckOut(order, true, isOver);
if (ObjectUtil.isNotEmpty(msg)) {
return ResultBean.newErrorResult(-1, msg, msg);
}
return ResultBean.newOkResult("");
// //判断有没有生成任务
// LiteOrder order=getOrderByMode(mode);
// if (order == null) {
// return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
// }
// List<LiteOrderItem> liteOrderItemList=order.getOrderItems();
// List<LiteOrderItem> orderItems = new ArrayList<>();
// boolean canClose=true;
// for (LiteOrderItem orderItem :
// liteOrderItemList) {
// if (orderItem.getStatus() == OrderItemStatus.notify_fail) {
// String id = orderItem.getId();
// List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").is(id)));
// if (dataLogList != null && !dataLogList.isEmpty()) {
//
// log.info("retry: [" + order.getOrderNo() + "] [" + orderItem.getRi() + "] 重发API007 ");
// String msg = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList);
// if (ObjectUtil.isEmpty(msg)) {
// orderItem.setStatus(OrderItemStatus.notify_success);
// } else {
// orderItem.setExecutFailReason(msg);
// orderItem.setStatus(OrderItemStatus.notify_fail);
// canClose=false;
// }
// liteOrderItemManager.save(orderItem);
//
// }
// }else if(orderItem.getStatus()==OrderItemStatus.executing){
// canClose=false;
// }
// orderItems.add(orderItem);
// }
// order.setOrderItems(orderItems);
// if(canClose){
// //可以关闭工单
// CloseOrder(order);
// }else{
//
// liteOrderCache.addOrderToMap(order);
// }
// return ResultBean.newOkResult("");
}
private void CloseOrder(LiteOrder order) {
private String CloseOrder(LiteOrder order) {
try {
......@@ -684,7 +771,10 @@ private IStoragePosManager storagePosManager;
if (sItem.getStatus() == OrderItemStatus.notify_fail || sItem.getStatus() == OrderItemStatus.cancel || sItem.getStatus() == OrderItemStatus.executing) {
List<DataLog> dataLogList = dataLogManager.findByQuery(new
Query(Criteria.where("subSourceId").is(sItem.getId())).addCriteria(Criteria.where("status").is(OP_STATUS.FINISHED.name())));
Query(
Criteria.where("subSourceId").is(orderItem.getId())).
addCriteria(Criteria.where("status").is(OP_STATUS.FINISHED.name())).
addCriteria(Criteria.where("barcode").is(sItem.getRi())));
if (dataLogList.size() > 0) {
needSendList.addAll(dataLogList);
......@@ -717,12 +807,13 @@ private IStoragePosManager storagePosManager;
MicronApi.ActionUpdate(order.getOperationId(), MicronApi.ABORT);
}
liteOrderCache.clearOrderLock(order);
return "";
}
@ApiOperation("放弃出库")
@PostMapping("/abort")
@AnonymousAccess
public ResultBean abort(@RequestBody Map<String,Object> params) {
public ResultBean abort(@RequestBody Map<String, Object> params) {
String mode = params.get("mode").toString();
log.info(" abort :mode=" + mode);
......@@ -734,38 +825,33 @@ private IStoragePosManager storagePosManager;
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
if (order != null) {
List<LiteOrderItem> liteOrderItemList = order.getOrderItems();
List<LiteOrderItem> newList = new ArrayList<>();
for (LiteOrderItem orderItem :
liteOrderItemList) {
if (orderItem.getStatus() == OrderItemStatus.notify_fail) {
List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").is(orderItem.getId())));
//如果任务未结束,结束任务
for (DataLog dataLog : dataLogList
//有任务的工单不能关闭
List<DataLog> allTask = taskService.getAllTasks();
for (DataLog task : allTask
) {
if (dataLog.isExecuting()) {
if (OP.CHECKOUT == task.getType() && (!task.isEnd())) {
//更新工单状态
String taskSourceName = task.getSourceName();
if (!Strings.isNullOrEmpty(taskSourceName) && order.getOrderNo().equals(taskSourceName)) {
if (task.isExecuting()||task.isWait()) {
taskService.cancelTask(dataLog.getId());
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:barcode=" + dataLog.getBarcode() + ",posName=" + dataLog.getPosName());
log.info("abort 终止出库,mode=" + mode + ",还有正在执行的任务:barcode=" + task.getBarcode() + ",posName=" + task.getPosName());
// taskService.cancelTask(task.getId());
return ResultBean.newErrorResult(-1, "smfcore.order.close.taskNotEnd", "操作失败,工单还有未完成的任务");
}
}
orderItem.setStatus(OrderItemStatus.cancel);
orderItem = liteOrderItemManager.save(orderItem);
newList.add(orderItem);
log.info(" abort :barcode=[" + orderItem.getPn() + "] 取消出库任务");
}
}
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:关闭工单=" + order.getOrderNo());
CloseOrder(order);
}else {
String key = Constants.CACHE_DISPATCH +mode;
String msg = CloseOrder(order);
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:关闭工单=" + order.getOrderNo() + ",结果=" + msg);
} else {
String key = Constants.CACHE_DISPATCH + mode;
log.info("abort mode=" + mode + " 清空 key=" + key + " 的cache,更改action=ABORT");
MicronApi.ActionUpdate(order.getOperationId(),MicronApi.ABORT );
MicronApi.ActionUpdate(taskDto.getOperationId(), MicronApi.ABORT);
dataCache.updateCache(key, "");
}
return ResultBean.newOkResult("");
......@@ -774,7 +860,7 @@ private IStoragePosManager storagePosManager;
public LiteOrder getOrderByMode(String mode) {
Collection<LiteOrder> liteOrder = liteOrderCache.getAllLiteOrder();
for (LiteOrder order : liteOrder) {
if (ObjectUtil.isNotEmpty(order.getMode())&& mode.equals(order.getMode()) && !order.isClosed()) {
if (ObjectUtil.isNotEmpty(order.getMode()) && mode.equals(order.getMode()) && !order.isClosed()) {
return order;
}
......@@ -782,11 +868,62 @@ private IStoragePosManager storagePosManager;
return null;
}
public List<LiteOrderItem> getLiteOrderItemList(String mode) {
LiteOrder order=getOrderByMode(mode);
if(order!=null){
return order.getOrderItems();
@ApiOperation("点击对应物料的数量, 获取料盘详细数据")
@GetMapping("/reelDetial")
@AnonymousAccess
public ResultBean reelDetial(@RequestParam Map<String, Object> params) {
//参数:mType 物料类型:pcb/shoebox/pizzaBox/reel/tray
//参数:state 状态: success/failure/ng
//参数:mode (点大按钮时的mode)
String mType = params.get("mType").toString();
String state = params.get("state").toString();
String mode = params.get("mode").toString();
LiteOrder order = getOrderByMode(mode);
List<MaterialDtialDto> dtos = new ArrayList<>();
for (LiteOrderItem item :
order.getOrderItems()) {
if (item.getSelectItems() == null) {
continue;
}
return null;
for (LiteOrderItem selItem :
item.getSelectItems()) {
try {
String mtype = selItem.getAppendData("mtype");
if (mtype.equalsIgnoreCase(mType)) {
boolean is = false;
if (selItem.isSuccess() && state.equalsIgnoreCase("success")) {
is = true;
} else if (selItem.isNg() && state.equalsIgnoreCase("ng")) {
is = true;
} else if (selItem.isTranFail() && state.equalsIgnoreCase("failure")) {
is = true;
}
if (is) {
MaterialDtialDto dto = new MaterialDtialDto(selItem.getRi(), selItem.getPn(), new Date(), "",
selItem.getOutNum(), 0, 0, "", "", "", "", selItem.getExecutFailReason(), selItem.getStatus());
dtos.add(dto);
}
}
} catch (Exception exception) {
log.error("error :" + exception.toString());
}
}
}
return ResultBean.newOkResult(dtos);
}
// public List<LiteOrderItem> getLiteOrderItemList(String mode) {
// LiteOrder order=getOrderByMode(mode);
// if(order!=null){
// return order.getOrderItems();
// }
// return null;
// }
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!