Commit 465cb7f2 LN

出库功能

1 个父辈 1139993a
...@@ -175,4 +175,10 @@ public class Constants { ...@@ -175,4 +175,10 @@ public class Constants {
*/ */
public static final String CACHE_LOADING ="CACHE_LOADING_INFO"; public static final String CACHE_LOADING ="CACHE_LOADING_INFO";
/**
* 当前出库信息:
*/
public static final String CACHE_DISPATCH ="CACHE_DISPATCH_INFO_";
} }
...@@ -170,6 +170,8 @@ public class HttpHelper { ...@@ -170,6 +170,8 @@ public class HttpHelper {
CloseableHttpResponse response = httpClient.execute(httpPost); CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity(); HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET); String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET);
int code = response.getStatusLine().getStatusCode();
log.info("Request to [" + url + "] response: code="+code+",responseContent="+responseContent);
response.close(); response.close();
httpClient.close(); httpClient.close();
return responseContent; return responseContent;
...@@ -290,6 +292,7 @@ public class HttpHelper { ...@@ -290,6 +292,7 @@ public class HttpHelper {
//System.out.println(response.getStatusLine().getStatusCode() + "\n"); //System.out.println(response.getStatusLine().getStatusCode() + "\n");
HttpEntity entity = response.getEntity(); HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET); String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET);
log.info("Request to [" + url + "] response: code="+code+",responseContent="+responseContent);
MicronResult result = JsonUtil.toObj(responseContent, MicronResult.class); MicronResult result = JsonUtil.toObj(responseContent, MicronResult.class);
if (result == null) { if (result == null) {
result = new MicronResult(); result = new MicronResult();
......
...@@ -425,6 +425,17 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -425,6 +425,17 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} }
log.info("preCid="+preCid+",["+barcode.getBarcode()+"]清除锁定库位"); log.info("preCid="+preCid+",["+barcode.getBarcode()+"]清除锁定库位");
ReelLockPosUtil.removeReelLockPosInfo(barcode.getBarcode()); ReelLockPosUtil.removeReelLockPosInfo(barcode.getBarcode());
if(ObjectUtil.isEmpty(rfid)){
//从缓存获取是否有rfid
String nrfid= loadingUtil.getRfidByBarcode(barcode.getBarcode() );
if(ObjectUtil.isNotEmpty(nrfid)){
log.info("rfid为空,第二次获取库位号,从入库单中查找到rfid:"+nrfid);
rfid=nrfid;
}
}
} }
} catch (Exception e) { } catch (Exception e) {
log.error("取消上个入库任务出错:" + e.toString()); log.error("取消上个入库任务出错:" + e.toString());
......
...@@ -277,8 +277,12 @@ public class LiteOrderCache { ...@@ -277,8 +277,12 @@ public class LiteOrderCache {
order.setOrderItems(items); order.setOrderItems(items);
liteOrderManager.save(order); liteOrderManager.save(order);
liteOrderMap.put(orderNo, order); liteOrderMap.put(orderNo, order);
//如果是preTask,不需要重新出库
if(ObjectUtil.isNotEmpty(order.getMode())) {
checkoutAgain(task, order); checkoutAgain(task, order);
} }
}
else if (task.isFinished()) { else if (task.isFinished()) {
order.setFinishedReelCount(order.getFinishedReelCount() + 1); order.setFinishedReelCount(order.getFinishedReelCount() + 1);
order.setTotalFinishedReelCount(order.getTotalFinishedReelCount()+1); order.setTotalFinishedReelCount(order.getTotalFinishedReelCount()+1);
...@@ -323,14 +327,19 @@ public class LiteOrderCache { ...@@ -323,14 +327,19 @@ public class LiteOrderCache {
order.setOrderItems(items); order.setOrderItems(items);
//判断位置信息是否以"-"开头,如果是,则获取相同位置的orderItemId,进行通知 //判断位置信息是否以"-"开头,如果是,则获取相同位置的orderItemId,进行通知
if (StringUtils.isNotBlank(task.getLocInfo()) && task.getLocInfo().startsWith("-")) { // if (StringUtils.isNotBlank(task.getLocInfo()) && task.getLocInfo().startsWith("-")) {
if ( ObjectUtil.isNotEmpty(order.getMode())&& StringUtils.isNotBlank(task.getLocInfo()) ) {
String locInfo = task.getLocInfo(); String locInfo = task.getLocInfo();
List<String> itemIdList = new ArrayList<>(); List<String> itemIdList = new ArrayList<>();
for (LiteOrderItem item : items) { itemIdList.add(task.getSubSourceId());
if (locInfo.contains(item.getLocInfo())) { // for (LiteOrderItem item : items) {
itemIdList.add(item.getId()); // if (locInfo.contains(item.getLocInfo())) {
} // itemIdList.add(item.getId());
} // }
// }
//先改为单盘上传
List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").in(itemIdList))); List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").in(itemIdList)));
if (dataLogList != null && !dataLogList.isEmpty()) { if (dataLogList != null && !dataLogList.isEmpty()) {
boolean isSuccess = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList); boolean isSuccess = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList);
...@@ -366,9 +375,21 @@ public class LiteOrderCache { ...@@ -366,9 +375,21 @@ public class LiteOrderCache {
} }
} }
} }
//判断是否发送成功
if(ObjectUtil.isNotEmpty(order.getMode())){
if(liteOrderItem.getStatus()==OrderItemStatus.notify_fail){
closed=false;
break;
}
}
} }
if(closed){ if(closed){
order.setClosed(closed); order.setClosed(closed);
if(ObjectUtil.isNotEmpty(order.getMode())){
String key=Constants.CACHE_DISPATCH+order.getMode();
log.info(" mode="+order.getMode()+"的出库已结束,清空 key="+key+" 的cache");
dataCache.updateCache(key,"");
}
} }
} }
} else { } else {
......
...@@ -102,6 +102,8 @@ public class LiteOrder extends BasePo implements Serializable { ...@@ -102,6 +102,8 @@ public class LiteOrder extends BasePo implements Serializable {
private String mode; private String mode;
private String operationId;
public void setClosed(boolean value){ public void setClosed(boolean value){
this.closed=value; this.closed=value;
if(value){ if(value){
......
...@@ -12,16 +12,14 @@ import com.neotel.smfcore.core.device.util.DataCache; ...@@ -12,16 +12,14 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.po.Storage; 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.service.po.DataLog; 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.*;
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.bean.MaterialInfo; import com.neotel.smfcore.custom.micron1053.bean.MaterialInfo;
import com.neotel.smfcore.custom.micron1053.bean.MicronResult; import com.neotel.smfcore.custom.micron1053.bean.MicronResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import java.text.DecimalFormat;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
...@@ -60,7 +58,7 @@ public class MicronApi { ...@@ -60,7 +58,7 @@ public class MicronApi {
} }
public static boolean Debug=true;
public static Barcode API001(String operationId, Barcode barcode) throws ApiException { public static Barcode API001(String operationId, Barcode barcode) throws ApiException {
...@@ -226,9 +224,82 @@ public class MicronApi { ...@@ -226,9 +224,82 @@ public class MicronApi {
public static List<DispatchId> Api004(String operationId) { public static List<DispatchId> Api004(String operationId) {
String url = config.getUrl(config.api_name_004); String url = config.getUrl(config.api_name_004);
url = MessageFormat.format(url, operationId); url = MessageFormat.format(url, operationId);
if(ObjectUtil.isEmpty(url)&& Debug){
List<DispatchId> list=new ArrayList<>();
DispatchId id1=new DispatchId("dispatchIds1",new ArrayList<>());
List<Object> atts=new ArrayList<>();
if(operationId.contains(APIMODE.MCLPRETASK)) {
atts.add("PPID1");
atts.add("PPID2");
atts.add("PPID3");
}
id1.getIds().add(new IdInfo("dispatchIds1-LineId1",atts));
id1.getIds().add(new IdInfo("dispatchIds1-LineId2",atts));
DispatchId id2=new DispatchId("dispatchIds2",new ArrayList<>());
id2.getIds().add(new IdInfo("dispatchIds2-LineId1",atts));
id2.getIds().add(new IdInfo("dispatchIds2-LineId2",atts));
list.add(id1);
list.add(id2);
return list;
}
try { try {
log.info("调用MES接口 API004: url=[" + url + "]"); log.info("调用MES接口 API004: url=[" + url + "]");
MicronResult result = HttpHelper.getMicronJson(url); MicronResult result = HttpHelper.getMicronJson(url);
// dispatchMode: MCLPRETASK|PCBPRETASK|LINEPREP
// Http Status code:
// 200 - Success
// {
// "trasactionId": <TransactionId>,
// "tag":
// [
// <tagKey1> : <tagValue1>,
// <tagKey2> : <tagValue2>,
// ...
// ],
// "dispatchMode": "MCLPRETASK",
// "dispatchIds" :
// [
// {
// lineId: <LineId>,
// Ids:
// [
// {
// "Id": <MCLPRETASK>,
// "Attribute":
// [ <PPID>,<PPID2>,<PPID3>]
// },
// ...
// ]
// }
// ]
// }
//
// Http Status code:
// 200 - Success
// {
// "trasactionId": <TransactionId>,
// "tag":
// [
// <tagKey1> : <tagValue1>,
// <tagKey2> : <tagValue2>,
// ...
// ],
// "dispatchMode": "PCBPRETASK",
// "dispatchIds" :
// [
// {
// lineId: <LineId>,
// Ids:
// [
// {
// "Id": <PCBPRETASK>,
// "Attribute":[<PCB DID><PCB REV>]
// },
// ...
// ]
// }
// ]
// }
return result.getResult("dispatchIds"); return result.getResult("dispatchIds");
} catch (Exception e) { } catch (Exception e) {
log.error(url + "出错", e); log.error(url + "出错", e);
...@@ -239,9 +310,14 @@ public class MicronApi { ...@@ -239,9 +310,14 @@ public class MicronApi {
public static List<Material> Api005(String operationId,String linePrepOrderId) { public static List<Material> Api005(String operationId,String linePrepOrderId) {
String url = config.getUrl(config.api_name_005); String url = config.getUrl(config.api_name_005);
url = MessageFormat.format(url,operationId,linePrepOrderId);
List<Material> materialList = new ArrayList<>(); List<Material> materialList = new ArrayList<>();
if(ObjectUtil.isEmpty(url)&& Debug){
materialList.add(new Material("serialNum1","partNumber1"));
return materialList;
}
url = MessageFormat.format(url,operationId,linePrepOrderId);
try { try {
log.info("调用MES接口 API005: url=[" + url + "]"); log.info("调用MES接口 API005: url=[" + url + "]");
MicronResult result = HttpHelper.getMicronJson(url); MicronResult result = HttpHelper.getMicronJson(url);
...@@ -266,6 +342,12 @@ public class MicronApi { ...@@ -266,6 +342,12 @@ public class MicronApi {
*/ */
List<Material> materialList = new ArrayList<>(); List<Material> materialList = new ArrayList<>();
String url = config.getUrl(config.api_name_006); String url = config.getUrl(config.api_name_006);
if(ObjectUtil.isEmpty(url)&& Debug){
materialList.add(new Material("serialNum1","partNumber1"));
materialList.add(new Material("serialNum2","partNumber2"));
return materialList;
}
try { try {
Map<String, Object> paramMap = new HashMap<>(); Map<String, Object> paramMap = new HashMap<>();
paramMap.put("operationId", operationId); paramMap.put("operationId", operationId);
...@@ -313,7 +395,6 @@ public class MicronApi { ...@@ -313,7 +395,6 @@ public class MicronApi {
String paramStr = JsonUtil.toJsonStr(paramMap); String paramStr = JsonUtil.toJsonStr(paramMap);
log.info("调用MES接口 API007: url=[" + url + "],body=[" + paramStr + "]"); log.info("调用MES接口 API007: url=[" + url + "],body=[" + paramStr + "]");
MicronResult micronResult = HttpHelper.postMicronJson(url, paramMap); MicronResult micronResult = HttpHelper.postMicronJson(url, paramMap);
return micronResult.getStatus().equals("Success"); return micronResult.getStatus().equals("Success");
} catch (ApiException e) { } catch (ApiException e) {
...@@ -414,12 +495,19 @@ public class MicronApi { ...@@ -414,12 +495,19 @@ public class MicronApi {
// Mode = "MBR|REQ|MCL|GR|MATRET|RET|NPI|RACK|PCBPRETASK|MCLPRETASK|LINEPREP|CTRLDISPATCH" // Mode = "MBR|REQ|MCL|GR|MATRET|RET|NPI|RACK|PCBPRETASK|MCLPRETASK|LINEPREP|CTRLDISPATCH"
// Source = toolId, Facility+area for UI // Source = toolId, Facility+area for UI
String url = config.getUrl(config.api_name_011); String url = config.getUrl(config.api_name_011);
if(ObjectUtil.isEmpty(source)){
source=config.api_011_Source;
}
if(ObjectUtil.isEmpty(url)&&Debug){
return mode+"_test_operationId";
}
url = MessageFormat.format(url,mode,userName,source); url = MessageFormat.format(url,mode,userName,source);
try { try {
MicronResult result = HttpHelper.getMicronJson(url); MicronResult result = HttpHelper.getMicronJson(url);
String operationId=result.getResult("operationId"); String operationId=result.getResult("operationId");
return operationId; return operationId;
} catch (ApiException e) { } catch (Exception e) {
log.error(url + "出错", e); log.error(url + "出错", e);
} }
......
package com.neotel.smfcore.custom.micron1053.api.bean; package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List; import java.util.List;
@Data @Data
public class DispatchId { @AllArgsConstructor
@NoArgsConstructor
public class DispatchId implements Serializable {
private String lineId; private String lineId;
private List<Id> ids; private List<IdInfo> ids;
@Data
static class Id {
private String Id;
private List<Object> Attribute;
}
} }
package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class IdInfo implements Serializable {
private String IdStr;
private List<Object> Attribute;
}
\ No newline at end of file \ No newline at end of file
package com.neotel.smfcore.custom.micron1053.api.bean; package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data @Data
public class Material { @AllArgsConstructor
@NoArgsConstructor
public class Material implements Serializable {
private String serialNum; private String serialNum;
private String partNumber; private String partNumber;
} }
...@@ -2,11 +2,29 @@ package com.neotel.smfcore.custom.micron1053.api.bean; ...@@ -2,11 +2,29 @@ package com.neotel.smfcore.custom.micron1053.api.bean;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
@Data @Data
public class TrackStatus {
public class TrackStatus implements Serializable {
//
// "trackStatus":
// [
// {
// "serialNum": <SerialNum>,
// "partNumber": <PartNumber>
// "materialStatus": "Loading","Available","Reserved","Dispatching","Dispatched",
// "Success": true|False,
// "description": <description>
// },
// {
// ...
// }
// ]
private String serialNum; private String serialNum;
private String partNumber; private String partNumber;
private String materialStatus; private String materialStatus;
private String Success; private boolean Success;
private String description; private String description;
} }
...@@ -84,7 +84,7 @@ public class LoadingController { ...@@ -84,7 +84,7 @@ public class LoadingController {
resultList.add(dto); resultList.add(dto);
} }
if(resultList.size()<=0){ if(resultList.size()<=0 &&MicronApi.Debug) {
resultList.add(new MaterialLoadingDto(MicronDataCache.PIZZABOX, 2, 5, 6)); resultList.add(new MaterialLoadingDto(MicronDataCache.PIZZABOX, 2, 5, 6));
resultList.add(new MaterialLoadingDto(MicronDataCache.REEL, 23, 54, 6)); resultList.add(new MaterialLoadingDto(MicronDataCache.REEL, 23, 54, 6));
resultList.add(new MaterialLoadingDto(MicronDataCache.PCB, 22, 52, 65)); resultList.add(new MaterialLoadingDto(MicronDataCache.PCB, 22, 52, 65));
......
...@@ -216,4 +216,23 @@ public class LoadingUtil { ...@@ -216,4 +216,23 @@ public class LoadingUtil {
} }
return PushToMes(inList, posList); return PushToMes(inList, posList);
} }
public String getRfidByBarcode(String barcode) {
InList inList = getInlist();
if (inList == null) {
return "";
}
List<StoragePos> posList = new ArrayList<>();
//查找所有失败的重新推送
for (InListItem item : inList.getInListItems()) {
if (item.getState() <= INITEM_STATUS.Success && item.getRi().equals(barcode)) {
return item.getRfid();
}
}
return "";
}
} }
package com.neotel.smfcore.custom.micron1053.task; package com.neotel.smfcore.custom.micron1053.task;
import com.neotel.smfcore.common.bean.ResultBean; 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.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils; import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.enums.OP; import com.neotel.smfcore.core.device.enums.OP;
...@@ -17,12 +19,14 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos; ...@@ -17,12 +19,14 @@ 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.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.micron1053.api.APIMODE;
import com.neotel.smfcore.custom.micron1053.api.MicronApi; import com.neotel.smfcore.custom.micron1053.api.MicronApi;
import com.neotel.smfcore.custom.micron1053.api.MicronConfig; import com.neotel.smfcore.custom.micron1053.api.MicronConfig;
import com.neotel.smfcore.custom.micron1053.api.bean.DispatchId; 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.Material;
import com.neotel.smfcore.custom.micron1053.api.bean.TrackStatus; import com.neotel.smfcore.custom.micron1053.api.bean.TrackStatus;
import com.neotel.smfcore.custom.micron1053.task.bean.PreTask; import com.neotel.smfcore.custom.micron1053.task.bean.PreTask;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.MaterialDispatchStatus;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.TaskDto; 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.task.enums.OrderItemStatus;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
...@@ -30,11 +34,10 @@ import io.swagger.annotations.Api; ...@@ -30,11 +34,10 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
...@@ -68,8 +71,8 @@ public class MicronPreTaskController { ...@@ -68,8 +71,8 @@ public class MicronPreTaskController {
@Autowired @Autowired
private IDataLogManager dataLogManager; private IDataLogManager dataLogManager;
@Autowired // @Autowired
private MicronConfig micronConfig; // private MicronConfig micronConfig;
/** /**
* 1.判断是否生成同类型的工单信息,如果没执行成功,则返回列表 * 1.判断是否生成同类型的工单信息,如果没执行成功,则返回列表
...@@ -83,43 +86,73 @@ public class MicronPreTaskController { ...@@ -83,43 +86,73 @@ public class MicronPreTaskController {
@ApiOperation("出库页面展示") @ApiOperation("出库页面展示")
@AnonymousAccess @AnonymousAccess
@RequestMapping("/getTaskId") @GetMapping("/getTaskId")
public ResultBean task(String mode) { public ResultBean task(String mode) {
//判断是否生成,未关闭的工单 //判断是否生成,未关闭的工单
TaskDto dto = new TaskDto(); TaskDto dto = getTaskDtoByMode(mode);
String key = Constants.CACHE_DISPATCH + mode;
List<LiteOrderItem> itemList = getLiteOrderItemList(mode); List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
if (itemList != null && !itemList.isEmpty()) { if (dto != null && itemList != null && !itemList.isEmpty()) {
dto.setType(1); dto.setType(2);
dto.setItemList(itemList); dto.setItemList(itemList);
List<MaterialDispatchStatus> statusList = getStatusList(itemList);
dto.setStatusList(statusList);
} else if (dto != null ) {
return ResultBean.newOkResult(dto);
} else { } else {
dto = new TaskDto();
//获取operatorationId //获取operatorationId
String source = micronConfig.api_011_Source; // String source = micronConfig.api_011_Source;
String operationId = MicronApi.Api011(mode, SecurityUtils.getLoginUsername(), source); String operationId = MicronApi.Api011(mode, SecurityUtils.getLoginUsername(), "");
if (StringUtils.isNotBlank(operationId)) { if (StringUtils.isNotBlank(operationId)) {
//获取Pre Task ID //获取Pre Task ID
List<DispatchId> dispatchIdList = MicronApi.Api004(operationId); List<DispatchId> dispatchIdList = MicronApi.Api004(operationId);
if (dispatchIdList != null && !dispatchIdList.isEmpty()) { if (dispatchIdList != null && !dispatchIdList.isEmpty()) {
dto.setMode(mode);
dto.setOperationId(operationId); dto.setOperationId(operationId);
dto.setType(2); dto.setType(1);
dto.setDispatchIdList(dispatchIdList); dto.setDispatchIdList(dispatchIdList);
dataCache.updateCache(key, dto);
log.info("mode=" + mode + ",获取到数据:operationId=" + operationId + ",保存数据到cache " + key);
} else {
throw new ValidateException("smfcore.api.fail", "{0} Failed to get data");
} }
} else {
throw new ValidateException("smfcore.api011.fail", "Api011 获取数据失败");
} }
} }
return ResultBean.newOkResult(dto); return ResultBean.newOkResult(dto);
} }
@ApiOperation("根据勾选的taskId,创建工单任务") private TaskDto getTaskDtoByMode(String mode){
TaskDto dto = new TaskDto();
//记录
String key = Constants.CACHE_DISPATCH + mode;
//先从缓存中获取数据
dto = dataCache.getCache(key);
return dto;
}
@ApiOperation("根据勾选的ID,提交后 创建工单任务")
@AnonymousAccess @AnonymousAccess
@RequestMapping("/createOrder") @PostMapping("/submit")
public ResultBean createOrder(@RequestBody PreTask preTask) { public ResultBean submit(@RequestBody PreTask preTask) {
String mode = preTask.getMode(); String mode = preTask.getMode();
String operationId = preTask.getOperationId(); TaskDto dto = getTaskDtoByMode(mode);
if (dto == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
String operationId = dto.getOperationId();
List<String> pretasks = preTask.getPretasks(); List<String> pretasks = preTask.getPretasks();
List<Material> materialList = new ArrayList<>(); List<Material> materialList = new ArrayList<>();
if ("Line Prep Dispatch".equals(mode)){ if (APIMODE.LINEPREP.equals(mode)) {
materialList = MicronApi.Api005(operationId,pretasks.get(0)); materialList = MicronApi.Api005(operationId, pretasks.get(0));
} else { } else {
materialList = MicronApi.Api006(operationId, pretasks); materialList = MicronApi.Api006(operationId, pretasks);
} }
...@@ -134,14 +167,26 @@ public class MicronPreTaskController { ...@@ -134,14 +167,26 @@ public class MicronPreTaskController {
item.setRi(material.getSerialNum()); item.setRi(material.getSerialNum());
item.setNeedReelCount(1); item.setNeedReelCount(1);
item.setMode(mode); item.setMode(mode);
// //验证是否有料,无料直接显示缺料
// StoragePos pos = storagePosManager.getByBarcode(item.getRi());
// if (pos == null) {
// item.setStatus(OrderItemStatus.shortage);
// } else {
item.setStatus(OrderItemStatus.wait);
// }
itemList.add(item); itemList.add(item);
} }
LiteOrder liteOrder = new LiteOrder(); LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(operationId); liteOrder.setOrderNo(operationId);
liteOrder.setMode(mode); liteOrder.setMode(mode);
liteOrder.setOperationId(operationId);
liteOrder.setOrderItems(itemList); liteOrder.setOrderItems(itemList);
liteOrder.setStatus(LITEORDER_STATUS.NEW);
liteOrder = liteOrderManager.createWithItems(liteOrder); liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder); liteOrderCache.addOrderToMap(liteOrder);
log.info("submit 勾选后,生成工单:[" + operationId + "][" + mode + "]");
//开始查询是否可以出库 //开始查询是否可以出库
checkOut(liteOrder, operationId, materialList); checkOut(liteOrder, operationId, materialList);
} }
...@@ -153,62 +198,143 @@ public class MicronPreTaskController { ...@@ -153,62 +198,143 @@ public class MicronPreTaskController {
@RequestMapping("/itemList") @RequestMapping("/itemList")
@AnonymousAccess @AnonymousAccess
public ResultBean itemListByMode(String mode){ public ResultBean itemListByMode(String mode){
TaskDto dto = getTaskDtoByMode(mode);
if (dto == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
String key = Constants.CACHE_DISPATCH + mode;
List<LiteOrderItem> itemList = getLiteOrderItemList(mode); List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
return ResultBean.newOkResult(itemList); if (dto != null && itemList != null && !itemList.isEmpty()) {
dto.setType(2);
dto.setItemList(itemList);
List<MaterialDispatchStatus> statusList = getStatusList(itemList);
dto.setStatusList(statusList);
}
// List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
return ResultBean.newOkResult(dto);
} }
@ApiOperation("重试") @ApiOperation("重试")
@RequestMapping("/retry") @PostMapping("/retry")
@AnonymousAccess @AnonymousAccess
public ResultBean retry(String orderItemId) { public ResultBean retry(@RequestBody String mode) {
TaskDto dto = getTaskDtoByMode(mode);
if (dto == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
log.info(" retry :mode=" + mode + ",入库完成发送失败的,重新发送,其他状态暂不处理");
//判断有没有生成任务 //判断有没有生成任务
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId); LiteOrder order=getOrderByMode(mode);
if (orderItem != null) { 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(); String id = orderItem.getId();
List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").is(id))); List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").is(id)));
if (dataLogList != null && !dataLogList.isEmpty()) { if (dataLogList != null && !dataLogList.isEmpty()) {
LiteOrder order = liteOrderManager.get(orderItem.getId());
log.info("retry: [" + order.getOrderNo() + "] [" + orderItem.getRi() + "] 重发API007 ");
boolean isSuccess = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList); boolean isSuccess = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList);
for (LiteOrderItem item : order.getOrderItems()) {
if (item.getId().equals(orderItem.getId())) {
if (isSuccess) { if (isSuccess) {
item.setStatus(OrderItemStatus.notify_success); orderItem.setStatus(OrderItemStatus.notify_success);
} else { } else {
item.setStatus(OrderItemStatus.notify_fail); orderItem.setStatus(OrderItemStatus.notify_fail);
canClose=false;
} }
liteOrderItemManager.save(item); liteOrderItemManager.save(orderItem);
} }
}else if(orderItem.getStatus()==OrderItemStatus.executing){
canClose=false;
} }
liteOrderCache.addOrderToMap(order); orderItems.add(orderItem);
} }
order.setOrderItems(orderItems);
if(canClose){
//可以关闭工单
CloseOrder(order);
}else{
liteOrderCache.addOrderToMap(order);
} }
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
@ApiOperation("放弃出库") @ApiOperation("放弃出库")
@RequestMapping("/abort") @PostMapping("/abort")
@AnonymousAccess @AnonymousAccess
public ResultBean abort(String orderItemId) { public ResultBean abort(@RequestBody String mode) {
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId); TaskDto dto = getTaskDtoByMode(mode);
if (orderItem != null) { if (dto == null) {
String orderId = orderItem.getOrderId(); return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
LiteOrder liteOrder = liteOrderManager.get(orderId);
DataLog dataLog = new DataLog();
dataLog.setBarcode(orderItem.getRi());
dataLog.setPartNumber(orderItem.getPn());
dataLog.setStatus(OP_STATUS.CANCEL.name());
dataLog.setType(OP.CHECKOUT);
dataLog.setSourceId(liteOrder.getId());
dataLog.setSourceName(liteOrder.getOrderNo());
dataLog.setSubSourceId(orderItem.getId());
dataLog.setOperationId(liteOrder.getOrderNo());
taskService.updateFinishedTask(dataLog);
} }
log.info(" abort :mode=" + mode);
LiteOrder order = getOrderByMode(mode);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
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
) {
if (dataLog.isExecuting()) {
taskService.cancelTask(dataLog.getId());
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:barcode=" + dataLog.getBarcode() + ",posName=" + dataLog.getPosName());
}
}
orderItem.setStatus(OrderItemStatus.cancel);
orderItem = liteOrderItemManager.save(orderItem);
newList.add(orderItem);
// String orderId = orderItem.getOrderId();
// LiteOrder liteOrder = liteOrderManager.get(orderId);
// DataLog dataLog = new DataLog();
// dataLog.setBarcode(orderItem.getRi());
// dataLog.setPartNumber(orderItem.getPn());
// dataLog.setStatus(OP_STATUS.CANCEL.name());
// dataLog.setType(OP.CHECKOUT);
// dataLog.setSourceId(liteOrder.getId());
// dataLog.setSourceName(liteOrder.getOrderNo());
// dataLog.setSubSourceId(orderItem.getId());
// dataLog.setOperationId(liteOrder.getOrderNo());
// taskService.updateFinishedTask(dataLog);
log.info(" abort :barcode=[" + orderItem.getPn() + "] 取消出库任务");
}
}
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:关闭工单=" + order.getOrderNo());
CloseOrder(order);
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
private void CloseOrder(LiteOrder order){
order.setStatus(LITEORDER_STATUS.CLOSED);
order.setClosed(true);
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
//清空配置
String key=Constants.CACHE_DISPATCH+order.getMode();
log.info(" mode="+order.getMode()+"工单已关闭,清空 key="+key+" 的cache");
dataCache.updateCache(key,"");
}
public synchronized void checkOut(LiteOrder order, String operationId, List<Material> materialList) { public synchronized void checkOut(LiteOrder order, String operationId, List<Material> materialList) {
order.setStatus(LITEORDER_STATUS.TAILS); order.setStatus(LITEORDER_STATUS.TAILS);
order.setTaskReelCount(0); order.setTaskReelCount(0);
...@@ -226,19 +352,28 @@ public class MicronPreTaskController { ...@@ -226,19 +352,28 @@ public class MicronPreTaskController {
material.setPartNumber(item.getBarcode().getPartNumber()); material.setPartNumber(item.getBarcode().getPartNumber());
return material; return material;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
//mes提前扣除,扣除成功的直接出库,失败的标记状态
List<TrackStatus> trackStatusList = MicronApi.Api010(operationId, materialList); List<TrackStatus> trackStatusList = MicronApi.Api010(operationId, materialList);
if (trackStatusList != null && !trackStatusList.isEmpty()) { if (trackStatusList != null && !trackStatusList.isEmpty()) {
for (LiteOrderItem orderItem : order.getOrderItems()) { for (LiteOrderItem orderItem : order.getOrderItems()) {
String ri = orderItem.getRi(); String ri = orderItem.getRi();
//判断是否缺料
StoragePos storagePos = storagePosList.stream().filter(pos -> pos.getBarcode().equals(ri)).findFirst().orElse(null);
if (storagePos == null) {
//缺料
orderItem.setStatus(OrderItemStatus.shortage);
} else {
TrackStatus trackStatus = trackStatusList.stream().filter(item -> ri.equals(item.getSerialNum())).findAny().orElse(null); TrackStatus trackStatus = trackStatusList.stream().filter(item -> ri.equals(item.getSerialNum())).findAny().orElse(null);
if (trackStatus != null) { if (trackStatus != null) {
StoragePos pos = storagePosManager.getByBarcode(ri); if (trackStatus.isSuccess()) {
// StoragePos pos = storagePosManager.getByBarcode(ri);
/*if (pos == null) { /*if (pos == null) {
orderItem.setStatus(OrderItemStatus.shortage); orderItem.setStatus(OrderItemStatus.shortage);
continue; continue;
}*/ }*/
//生成任务 //生成任务
DataLog dataLog = new DataLog(dataCache.getStorageById(pos.getStorageId()), pos.getBarcode(), pos); DataLog dataLog = new DataLog(dataCache.getStorageById(storagePos.getStorageId()), storagePos.getBarcode(), storagePos);
dataLog.setType(OP.CHECKOUT); dataLog.setType(OP.CHECKOUT);
dataLog.setSourceId(order.getId()); dataLog.setSourceId(order.getId());
dataLog.setSourceName(order.getOrderNo()); dataLog.setSourceName(order.getOrderNo());
...@@ -246,9 +381,17 @@ public class MicronPreTaskController { ...@@ -246,9 +381,17 @@ public class MicronPreTaskController {
dataLog.setStatus(OP_STATUS.WAIT.name()); dataLog.setStatus(OP_STATUS.WAIT.name());
dataLog.setOperationId(operationId); dataLog.setOperationId(operationId);
taskService.addTaskToExecute(dataLog); taskService.addTaskToExecute(dataLog);
taskReelCount ++; taskReelCount++;
//设置状态.正在出库 //设置状态.正在出库
orderItem.setStatus(OrderItemStatus.executing); orderItem.setStatus(OrderItemStatus.executing);
} else {
//标记状态为mes扣除失败
orderItem.setStatus(OrderItemStatus.executFail);
}
}
} }
liteOrderItemManager.save(orderItem); liteOrderItemManager.save(orderItem);
} }
...@@ -257,7 +400,7 @@ public class MicronPreTaskController { ...@@ -257,7 +400,7 @@ public class MicronPreTaskController {
order.setTaskReelCount(taskReelCount); order.setTaskReelCount(taskReelCount);
order.setTotalTaskReelCount(order.getTotalTaskReelCount() + taskReelCount); order.setTotalTaskReelCount(order.getTotalTaskReelCount() + taskReelCount);
if (taskReelCount <= 0) { if (taskReelCount <= 0) {
if (order.isOutTails()){ if (order.isOutTails()) {
order.setStatus(LITEORDER_STATUS.TAILS_FINISHED); order.setStatus(LITEORDER_STATUS.TAILS_FINISHED);
} }
//liteOrderCache.finishedOrderTasks(order); //liteOrderCache.finishedOrderTasks(order);
...@@ -266,6 +409,17 @@ public class MicronPreTaskController { ...@@ -266,6 +409,17 @@ public class MicronPreTaskController {
liteOrderCache.addOrderToMap(order); liteOrderCache.addOrderToMap(order);
} }
public LiteOrder getOrderByMode(String mode) {
List<LiteOrderItem> itemList = new ArrayList<>();
Collection<LiteOrder> liteOrder = liteOrderCache.getAllLiteOrder();
for (LiteOrder order : liteOrder) {
if (mode.equals(order.getMode()) && !order.isClosed()) {
return order;
}
}
return null;
}
public List<LiteOrderItem> getLiteOrderItemList(String mode) { public List<LiteOrderItem> getLiteOrderItemList(String mode) {
List<LiteOrderItem> itemList = new ArrayList<>(); List<LiteOrderItem> itemList = new ArrayList<>();
...@@ -278,4 +432,25 @@ public class MicronPreTaskController { ...@@ -278,4 +432,25 @@ public class MicronPreTaskController {
} }
return itemList; return itemList;
} }
public List<MaterialDispatchStatus> getStatusList(List<LiteOrderItem> items){
List<MaterialDispatchStatus> result=new ArrayList<>();
for (LiteOrderItem item :
items) {
int ngQty=0;
int tranFailQty=0;
int successQty=0;
if(item.getStatus()==OrderItemStatus.notify_fail){
ngQty=item.getNeedReelCount();
}else if(item.getStatus()==OrderItemStatus.executFail)
{
tranFailQty=item.getNeedReelCount();
}else{
successQty=item.getNeedReelCount();
}
MaterialDispatchStatus s=new MaterialDispatchStatus(item.getPn(),item.getNeedNum(),item.getNeedReelCount(),successQty,ngQty,tranFailQty);
result.add(s);
}
return result;
}
} }
...@@ -2,10 +2,11 @@ package com.neotel.smfcore.custom.micron1053.task.bean; ...@@ -2,10 +2,11 @@ package com.neotel.smfcore.custom.micron1053.task.bean;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
import java.util.List; import java.util.List;
@Data @Data
public class PreTask { public class PreTask implements Serializable {
private String mode; private String mode;
private String operationId; private String operationId;
private List<String> pretasks; private List<String> pretasks;
......
package com.neotel.smfcore.custom.micron1053.task.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MaterialDispatchStatus implements Serializable {
@ApiModelProperty("PN")
private String pn;
@ApiModelProperty("Required Qty(Units)需求数量(单位:Units)")
private int requiredCount;
@ApiModelProperty("Required Qty(S/N)需求数量(按序列号)")
private int requiredQty;
@ApiModelProperty("Success Qty(S/N)成功数量(按序列号)")
private int successQty;
@ApiModelProperty("NG Qty(S/N)NG数量(按序列号)")
private int ngQty;
@ApiModelProperty(" 提交失败数量。Count of Transaction Failure Transaction")
private int tranFailQty;
}
...@@ -8,8 +8,10 @@ import java.util.List; ...@@ -8,8 +8,10 @@ import java.util.List;
@Data @Data
public class TaskDto { public class TaskDto {
private int type; private int type=1;//1=勾选页面勾选数据,2=已开始出库
private String mode;
private String operationId; private String operationId;
private List<LiteOrderItem> itemList; private List<LiteOrderItem> itemList;
private List<DispatchId> dispatchIdList; private List<DispatchId> dispatchIdList;
private List<MaterialDispatchStatus> statusList;
} }
...@@ -4,19 +4,24 @@ package com.neotel.smfcore.custom.micron1053.task.enums; ...@@ -4,19 +4,24 @@ package com.neotel.smfcore.custom.micron1053.task.enums;
public class OrderItemStatus { public class OrderItemStatus {
//缺料 //缺料
public static final String shortage = "1"; public static final String wait = "WAIT";
//缺料
public static final String shortage = "SHORTAGE";
//MES扣除失败
public static final String executFail = "EXECUTFAIL";
//正在执行 //正在执行
public static final String executing = "2"; public static final String executing = "EXECUTING";
//通知成功 //通知成功
public static final String notify_success = "3"; public static final String notify_success = "SUCCESS";
//通知失败 //通知失败
public static final String notify_fail = "4"; public static final String notify_fail = "FAIL";
public static final String finish = "5"; public static final String finish = "FINISH";
public static final String cancel = "6"; public static final String cancel = "CANCEL";
} }
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%file:%line] - %msg%n"/> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%file:%line] - %msg%n"/>
</Console> </Console>
<RollingFile name="log" fileName="${LOG_HOME}/${LOG_NAME}.txt" filePattern="${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.txt" append="true"> <RollingFile name="log" fileName="${LOG_HOME}/${LOG_NAME}.txt" filePattern="${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.txt" append="true">
<PatternLayout charset="GB18030" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%file:%line] - %msg%n" /> <PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%file:%line] - %msg%n" />
<Policies> <Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1" /> <TimeBasedTriggeringPolicy modulate="true" interval="1" />
</Policies> </Policies>
......
...@@ -351,6 +351,7 @@ smfcore.expiration.ameExists=\u8FC7\u671F\u914D\u7F6E[{0}]\u5DF2\u5B58\u5728 ...@@ -351,6 +351,7 @@ smfcore.expiration.ameExists=\u8FC7\u671F\u914D\u7F6E[{0}]\u5DF2\u5B58\u5728
smfcore.expiration.notExist=\u8FC7\u671F\u914D\u7F6E[{0}]\u4E0D\u5B58\u5728 smfcore.expiration.notExist=\u8FC7\u671F\u914D\u7F6E[{0}]\u4E0D\u5B58\u5728
smfcore.micron.xray.offline={0}\u9700\u8981\u70B9\u6599\uFF0C\u70B9\u6599\u673A\u4E0D\u5728\u7EBF smfcore.micron.xray.offline={0}\u9700\u8981\u70B9\u6599\uFF0C\u70B9\u6599\u673A\u4E0D\u5728\u7EBF
smfcore.micron.nodata=\u672A\u627E\u5230\u4FE1\u606F smfcore.micron.nodata=\u672A\u627E\u5230\u4FE1\u606F
smfcore.api.fail={0} Failed to get data
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0} #smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1} #smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F #smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
...@@ -30,3 +30,28 @@ ...@@ -30,3 +30,28 @@
20220318: 20220318:
安全库存和 呆滞物料功能 安全库存和 呆滞物料功能
20230809
1053接口修改
1,以下两个获取库位号接口增加参数:rfid
返回增加:返回110=接口验证失败,需要去XRay重新点料
/service/store/robotBox/renewPosForPutin
第二次重新获取新入库库位
POST
/service/store/robotBox/emptyPosForPutin
扫码后获取库位号
2.新增加点料完成接口
POST
/rest/micron/device/updateReelQty
X-Ray点料完成,更新数量,参数:barcode ,qty
3.新增加rfid入库完成接口,料串入库完成时调用
POST
/rest/micron/device/rfidPutInEnd
RFID入库完成,参数:rfid
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!