Commit 7efbc373 zshaohui

PCB,MCL,Line Prep出库

1 个父辈 33e5cc0f
......@@ -25,11 +25,16 @@ import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
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.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.micron1053.api.MicronApi;
import com.neotel.smfcore.custom.micron1053.task.enums.OrderItemStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.*;
......@@ -59,6 +64,9 @@ public class LiteOrderCache {
@Autowired
private SmfApi smfApi;
@Autowired
private IDataLogManager dataLogManager;
/**
* 正在执行的liteOrderMap, key 为orderNo,value 为order
*/
......@@ -256,10 +264,20 @@ public class LiteOrderCache {
//任务是取消的,需要将总待出库数量-1
if (task.isCancel()) {
order.setTaskReelCount(order.getTaskReelCount() - 1);
order.setTotalTaskReelCount(order.getTotalTaskReelCount()-1);
order.setTotalTaskReelCount(order.getTotalTaskReelCount() - 1);
log.info("工单[" + orderNo + "]的任务" + task.getPartNumber() + "[" + task.getBarcode() + "]已取消,任务数-1=" + order.getFinishedReelCount() + "/" + order.getTaskReelCount());
checkoutAgain(task,order);
List<LiteOrderItem> items = new ArrayList<>();
for (LiteOrderItem orderItem : order.getOrderItems()) {
if (orderItem.getId().equals(task.getSubSourceId())) {
orderItem.setStatus(OrderItemStatus.cancel);
}
items.add(orderItem);
}
order.setOrderItems(items);
liteOrderManager.save(order);
liteOrderMap.put(orderNo, order);
checkoutAgain(task, order);
}
else if (task.isFinished()) {
order.setFinishedReelCount(order.getFinishedReelCount() + 1);
......@@ -274,6 +292,15 @@ public class LiteOrderCache {
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum()+task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount()+1);
liteOrderItem.setStatus(task.getStatus());
liteOrderItem.setLocInfo(task.getLocInfo());
liteOrderItem.setStatus(OrderItemStatus.finish);
//通知micron
/*boolean isSuccess = MicronApi.Api007(order.getOrderNo(), task.getId(), Arrays.asList(task));
if (!isSuccess){
liteOrderItem.setNotifySuccess(false);
}*/
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
// Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
// if (barcode != null) {
......@@ -294,6 +321,35 @@ public class LiteOrderCache {
items.add(liteOrderItem);
}
order.setOrderItems(items);
//判断位置信息是否以"-"开头,如果是,则获取相同位置的orderItemId,进行通知
if (StringUtils.isNotBlank(task.getLocInfo()) && task.getLocInfo().startsWith("-")) {
String locInfo = task.getLocInfo();
List<String> itemIdList = new ArrayList<>();
for (LiteOrderItem item : items) {
if (locInfo.contains(item.getLocInfo())) {
itemIdList.add(item.getId());
}
}
List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").in(itemIdList)));
if (dataLogList != null && !dataLogList.isEmpty()) {
boolean isSuccess = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList);
for (LiteOrderItem item : items) {
if (itemIdList.contains(item.getId())) {
if (isSuccess) {
item.setStatus(OrderItemStatus.notify_success);
} else {
item.setStatus(OrderItemStatus.notify_fail);
}
}
liteOrderItemManager.save(item);
}
order.setOrderItems(items);
}
}
if (!order.isClosed()) {
//工单未关闭的话,检查状态,全部都出完进行关闭
boolean closed = true;
......@@ -737,4 +793,8 @@ public class LiteOrderCache {
return count;
}
public Collection<LiteOrder> getAllLiteOrder() {
return liteOrderMap.values();
}
}
......@@ -99,6 +99,9 @@ public class LiteOrder extends BasePo implements Serializable {
*/
private Date sdate=new Date();
private String mode;
public void setClosed(boolean value){
this.closed=value;
if(value){
......
......@@ -91,6 +91,20 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
*/
private String mpn = "";
/**
* 工单明细出库状态
*/
private String status;
/**
* 位置信息
*/
private String locInfo = "";
/**
* 类型
*/
private String mode = "";
/**
* 自定义的附加字段,key=字段名,value=值
......
......@@ -243,6 +243,9 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
*/
private Boolean emptyOperate;
private String operationId;
public String getBarcode() {
if(barcode == null){
return "";
......
package com.neotel.smfcore.custom.micron1053.api;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.micron1053.api.bean.DispatchId;
import com.neotel.smfcore.custom.micron1053.api.bean.Material;
import com.neotel.smfcore.custom.micron1053.api.bean.TrackStatus;
import com.neotel.smfcore.custom.micron1053.bean.MaterialInfo;
import com.neotel.smfcore.custom.micron1053.bean.MicronResult;
import lombok.extern.slf4j.Slf4j;
......@@ -38,6 +44,13 @@ public class MicronApi extends BaseSmfApiListener {
MicronApi.dataCache = cache;
}
public static IBarcodeManager barcodeManager;
@Autowired
public void setBarcodeManager(IBarcodeManager manager){
MicronApi.barcodeManager = manager;
}
@Override
public boolean isForThisApi(String apiName) {
......@@ -127,32 +140,36 @@ public class MicronApi extends BaseSmfApiListener {
}
public static boolean Api004(String operationId){
public static List<DispatchId> Api004(String operationId) {
String url = config.getUrl(config.api_name_004);
url = MessageFormat.format(url,operationId);
url = MessageFormat.format(url, operationId);
try {
log.info("调用MES接口 API004: url=[" + url + "]");
MicronResult result = HttpHelper.getMicronJson(url);
}catch (Exception e){
return result.getResult("dispatchIds");
} catch (Exception e) {
log.error(url + "出错", e);
}
return false;
return null;
}
public static boolean Api005(String linePrepOrderId) {
public static List<Material> Api005(String operationId,String linePrepOrderId) {
String url = config.getUrl(config.api_name_005);
url = MessageFormat.format(url,linePrepOrderId);
url = MessageFormat.format(url,operationId,linePrepOrderId);
List<Material> materialList = new ArrayList<>();
try {
log.info("调用MES接口 API005: url=[" + url + "]");
MicronResult result = HttpHelper.getMicronJson(url);
materialList = result.getResult("materials");
} catch (Exception e) {
log.error(url + "出错", e);
}
return false;
return materialList;
}
public static boolean Api006(String operationId,List<String> pretasks) {
public static List<Material> Api006(String operationId, List<String> pretasks) {
/**
* {
* "operationId": <operationId>
......@@ -164,24 +181,30 @@ public class MicronApi extends BaseSmfApiListener {
* ]
* }
*/
List<Material> materialList = new ArrayList<>();
String url = config.getUrl(config.api_name_006);
try {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("operationId",operationId);
paramMap.put("pretasks",pretasks);
paramMap.put("operationId", operationId);
paramMap.put("pretasks", pretasks);
String paramStr = JsonUtil.toJsonStr(paramMap);
log.info("调用MES接口 API006: url=[" + url + "],body=[" + paramStr + "]");
MicronResult micronResult = HttpHelper.postMicronJson(url, paramMap);
}catch (Exception e){
String responseData = micronResult.getResponseData();
JSONObject jsonObject = JSONObject.parseObject(responseData);
String materials = jsonObject.getString("materials");
materialList = JSONObject.parseArray(materials,Material.class);
} catch (Exception e) {
log.error(url + "出错", e);
}
return false;
return materialList;
}
public static boolean Api007(String operationId, String jobId, List<StoragePos> storagePosList) {
public static boolean Api007(String operationId, String jobId, List<DataLog> dataLogList) {
String url = config.getUrl(config.api_name_007);
try {
......@@ -190,12 +213,16 @@ public class MicronApi extends BaseSmfApiListener {
paramMap.put("operationId", operationId);
List<Map<String, Object>> materialList = new ArrayList<>();
for (StoragePos storagePos : storagePosList) {
for (DataLog dataLog : dataLogList) {
Map<String, Object> materialsMap = new HashMap<>();
materialsMap.put("location", storagePos.getPosName());
materialsMap.put("towerId", storagePos.getStorageId());
materialsMap.put("location", dataLog.getPosName());
materialsMap.put("towerId", dataLog.getStorageId());
materialsMap.put("materialStatus", "Available");
materialsMap.put("material", AMaterialBean.toBean(storagePos.getBarcode()).toMap());
Barcode barcode = barcodeManager.findByBarcode(dataLog.getBarcode());
if (barcode != null) {
materialsMap.put("material", AMaterialBean.toBean(barcode).toMap());
}
materialList.add(materialsMap);
}
......@@ -205,7 +232,7 @@ public class MicronApi extends BaseSmfApiListener {
log.info("调用MES接口 API007: url=[" + url + "],body=[" + paramStr + "]");
MicronResult micronResult = HttpHelper.postMicronJson(url, paramMap);
return true;
return micronResult.getStatus().equals("Success");
} catch (ApiException e) {
log.error(url + "出错", e);
}
......@@ -261,31 +288,28 @@ public class MicronApi extends BaseSmfApiListener {
}
public static boolean Api010(String operationId, List<Barcode> barcodeList) {
public static List<TrackStatus> Api010(String operationId, List<Material> materialList) {
List<TrackStatus> statusList = new ArrayList<>();
String url = config.getUrl(config.api_name_010);
try {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("operationId", operationId);
List<Map<String, Object>> materialList = new ArrayList<>();
for (Barcode barcode : barcodeList) {
Map<String, Object> materialMap = new HashMap<>();
materialMap.put("serialNum", barcode.getBarcode());
materialMap.put("partNumber", barcode.getPartNumber());
materialList.add(materialMap);
}
paramMap.put("materials", materialList);
String paramStr = JsonUtil.toJsonStr(paramMap);
log.info("调用MES接口 API010: url=[" + url + "],body=[" + paramStr + "]");
MicronResult micronResult = HttpHelper.postMicronJson(url, paramMap);
return true;
} catch (ApiException e) {
JSONObject jsonObject = JSONObject.parseObject(micronResult.getResponseData());
String trackStatus = jsonObject.getString("trackStatus");
statusList = JSONObject.parseArray(trackStatus,TrackStatus.class);
//statusList = micronResult.getResult("trackStatus");
} catch (Exception e) {
log.error(url + "出错", e);
}
return false;
return statusList;
}
......@@ -555,9 +579,4 @@ public class MicronApi extends BaseSmfApiListener {
return null;
}
}
......@@ -30,7 +30,7 @@ public class MicronConfig {
* 根据API011返回的 operationId,从MES获取出库的Pretask/linePrepOrder
*Get ready Pretask/linePrepOrder list from Auto Kitting System
*/
public String api_name_004="operation/dispatchIds?operationId={operationId}";
public String api_name_004="operation/dispatchIds?operationId={0}";
/**
* 出库勾选一个ID(API004返回的ID)后,从MES获取出库的RI
*Get dispatch Material list from Autokitting system to fullfil the LinePrepOrder
......@@ -64,7 +64,7 @@ public class MicronConfig {
/**
* 获取OperationID ,Get operationId for Loading or Dispatching of material
*/
public String api_name_011="operation?mode={Mode}&username={Username}&source={Source}";
public String api_name_011="operation?mode={0}&username={1}&source={2}";
/**
* Validate if MBR (From Warehouse ) is valid
......
package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.Data;
import java.util.List;
@Data
public class DispatchId {
private String lineId;
private List<Id> ids;
@Data
static class Id {
private String Id;
private List<Object> Attribute;
}
}
package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.Data;
@Data
public class Material {
private String serialNum;
private String partNumber;
}
package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.Data;
@Data
public class TrackStatus {
private String serialNum;
private String partNumber;
private String materialStatus;
private String Success;
private String description;
}
package com.neotel.smfcore.custom.micron1053.task.bean;
import lombok.Data;
import java.util.List;
@Data
public class PreTask {
private String mode;
private String operationId;
private List<String> pretasks;
}
package com.neotel.smfcore.custom.micron1053.task.bean.dto;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.micron1053.api.bean.DispatchId;
import lombok.Data;
import java.util.List;
@Data
public class TaskDto {
private int type;
private String operationId;
private List<LiteOrderItem> itemList;
private List<DispatchId> dispatchIdList;
}
package com.neotel.smfcore.custom.micron1053.task.enums;
public class OrderItemStatus {
//缺料
public static final String shortage = "1";
//正在执行
public static final String executing = "2";
//通知成功
public static final String notify_success = "3";
//通知失败
public static final String notify_fail = "4";
public static final String finish = "5";
public static final String cancel = "6";
}
......@@ -2,14 +2,14 @@ micron:
apiAddr: https://testapigtwy.micron.com/t/app.mfg/mmsil/v1/DEVL/SINGAPORE/
api_name_001: material/validation/label
api_name_002: material/transfer-in
api_name_004: operation/dispatchIds?operationId={operationId}
api_name_004: operation/dispatchIds?operationId={0}
api_name_005: material/lineprep/{LinePrepOrderId}
api_name_006: material/pretasks
api_name_007: material/transfer-out
api_name_008: material/xray/{serialNum}/{qty}
api_name_009: material/status
api_name_010: material/track-out
api_name_011: operation?mode={Mode}&username={Username}&source={Source}
api_name_011: operation?mode={0}&username={1}&source={2}
api_name_101: operation/validation/mbr?id={Id}&operationId={operationId}&skipSap={SkipSap}
api_name_102: operation/validation/req?id={Id}&operationId={operationId}
api_name_103: operation/validation/gr?purchaseOrder={PurchaseOrder}&packagingSlip={PackagingSlip}&operationId={operationId}&skipSap={SkipSap}
......@@ -27,7 +27,7 @@ spring:
auto-index-creation: true # 默认为false,即不会自动创建索引
host: localhost # 主机地址
port: 27017 # 端口
database: smf # 数据库
database: 5f # 数据库
#备份数据库配置
backup-mongodb:
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!