Commit 98625c67 zshaohui

1.对接agv功能开发

2.亮灯灭灯功能开发
1 个父辈 35497123
......@@ -89,6 +89,7 @@ public class DateUtil {
SimpleDateFormat df;
Date date;
df = new SimpleDateFormat(aMask);
df.setLenient(false);
if (log.isDebugEnabled()) {
log.debug("converting '" + strDate + "' to date with mask '" + aMask + "'");
......
......@@ -253,4 +253,7 @@ public class BarcodeDto implements Serializable {
@ApiModelProperty("制造商物料编号")
private String mpn;
@ApiModelProperty("是否忽略点料")
private boolean isPoint = false;
}
......@@ -233,6 +233,8 @@ public class Barcode extends BasePo implements Serializable {
private String countType;
private boolean isPoint = false;
/**
* 自定义的附加信息
*/
......
......@@ -751,6 +751,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
barcode.setCheckOutDate(null, "");
barcode.setPosName(task.getPosName());
barcode.setCountType("");
barcode.setPoint(false);
if (barcode.isSolder()) {
if (storagePos.isWarmPos()) {
//回温仓位
......
......@@ -190,6 +190,8 @@ public class NLPShelfHandler extends BaseDeviceHandler {
dataLog.setPartNumber(pn);
dataLog.setType(OP.PUT_IN);
barcode.setCountType("");
barcode.setPoint(false);
barcode.setPutInTime(System.currentTimeMillis());
barcode.updateSluggishTime(dataCache.getPNsluggishDay(barcode.getPartNumber()));
barcodeManager.saveBarcode(barcode);
......
......@@ -59,6 +59,11 @@ public class ShelfInfo {
private int status;
/**
* 当前线体位置
*/
private String currentLine;
/**
* key为barcode信息,value为货架具体信息
*/
private Map<String, ShelfLocInfo> shelfLocInfoMap = Maps.newConcurrentMap();
......
......@@ -57,6 +57,11 @@ public class ShelfController {
String shelfNo = paramMap.get("shelfNo");
String shelfLoc = paramMap.get("shelfLoc");
log.info("物料:" + code + "放到对应的料架:" + shelfNo + "上,库位为:" + shelfLoc);
shelfLoc = shelfLoc
.replaceAll("A_","")
.replaceAll("B_","")
.replaceAll("C_","")
.replaceAll("D_","");
Barcode barcode = codeResolve.resolveOneValideBarcode(code);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.error.barcode.invalid", "未找到有效的条码");
......@@ -102,78 +107,4 @@ public class ShelfController {
return ResultBean.newOkResult("");
}
@ApiOperation("货架拉走")
@RequestMapping("/shelfToLine")
@AnonymousAccess
public ResultBean shelfToLine(@RequestBody Map<String, String> paramMap) {
String shelfNo = paramMap.get("shelfNo");
String lastShelfStr = paramMap.get("lastShelf");
log.info("货架:" + shelfNo + "准备拉走,是否为最后一个货架:"+lastShelfStr);
Boolean lastShelf = Boolean.valueOf(lastShelfStr);
if (StringUtils.isEmpty(shelfNo)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"shelfNo"});
}
//判断货架是否存在
boolean exist = shelfInfoUtil.isExistShelf(shelfNo);
if (!exist) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"货架信息", shelfNo});
}
ShelfInfo shelfInfo = shelfInfoUtil.getShelfInfoByShelfNo(shelfNo);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("shelfNo", shelfInfo.getShelfNo());
resultMap.put("orderNo", shelfInfo.getOrderNo());
resultMap.put("line", shelfInfo.getLine());
//查找有没有料架任务
boolean hasShelfTask = false;
if (StringUtils.isNotEmpty(shelfInfo.getOrderNo())) {
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && !dataLog.isCancel() && !dataLog.isFinished()) {
if (shelfInfo.getOrderNo().equals(dataLog.getSourceName())) {
Storage storage = dataCache.getStorage(dataLog.getCid());
if (storage.isNLShelf() || storage.isNLPShelf() || storage.isNLMShelf() || storage.isShelf()){
hasShelfTask = true;
}
}
}
}
}
resultMap.put("hasShelfTask", hasShelfTask);
//同时更改任务信息
shelfInfoUtil.updateShelfLoc(shelfNo, ShelfStatus.outLetToLine);
ShelfInfo info = shelfInfoUtil.getShelfInfoByShelfNo(shelfNo);
//通知wms
zhongcheApi.shelfFullNotification(info,lastShelf);
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("货架到达线体")
@RequestMapping("/shelfReachLine")
@ResponseBody
@AnonymousAccess
public ResultBean shelfReachLine(@RequestBody Map<String, String> paramMap) {
String shelfNo = paramMap.get("shelfNo");
String shelfLoc = paramMap.get("shelfLoc");
log.info("货架:" + shelfNo + "到达线体位置:"+shelfLoc);
if (StringUtils.isEmpty(shelfNo)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"shelfNo"});
}
//判断货架是否存在
boolean exist = shelfInfoUtil.isExistShelf(shelfNo);
if (!exist) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"货架信息", shelfNo});
}
shelfInfoUtil.updateShelfLoc(shelfNo, ShelfStatus.reachLine);
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.zhongche1568.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.zhongche1568.ZhongcheApi;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfInfo;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfLocInfo;
import com.neotel.smfcore.custom.zhongche1568.enums.ShelfStatus;
import com.neotel.smfcore.custom.zhongche1568.util.ShelfInfoUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* 与agv对接
*/
@Slf4j
@RestController
@RequestMapping("/rest/api/agv")
public class ZhongCheAgvController {
@Autowired
private ShelfInfoUtil shelfInfoUtil;
@Autowired
private ZhongcheApi zhongcheApi;
@Autowired
private TaskService taskService;
@ApiOperation("agv获取指定料架的目标位置")
@RequestMapping(value = "/getShelfTargetLoc")
@AnonymousAccess
public ResultBean getShelfTargetLoc(HttpServletRequest request) {
String rfid = request.getParameter("rfid");
ShelfInfo shelfInfo = shelfInfoUtil.getShelfInfoByShelfNo(rfid);
if (shelfInfo != null) {
String line = shelfInfo.getLine();
//同时修改料架状态为正在运输中
shelfInfoUtil.updateShelfStatus(rfid, ShelfStatus.outLetToLine);
if (line.lastIndexOf("_") != -1) {
line = line.substring(0,line.lastIndexOf("_"));
}
if (line.lastIndexOf("-") != -1) {
line = line.substring(0,line.lastIndexOf("-"));
}
//判断是否还有任务
/*boolean hasLastShelf = hasLastShelf(shelfInfo.getOrderNo());
try {
zhongcheApi.shelfFullNotification(shelfInfo, hasLastShelf);
}catch (ValidateException e){
return ResultBean.newErrorResult(-1,e.getMsgKey(),e.getMessage(),e.getMsgParam());
}*/
log.info("getShelfTargetLoc 料架 ,rfid=[" + rfid + "],目标位置:[" + line + "]");
return ResultBean.newOkResult(line);
} else {
log.info("getShelfTargetLoc 未找到料架 ,rfid=[" + rfid + "]");
}
return ResultBean.newErrorResult(-1, "smfcore.agvShelf.noLoc", "未找到料架{0}目标位置", new String[]{rfid});
}
@ApiOperation("获取产线可以拉回的空料架")
@RequestMapping(value = "/emptyShelfList")
@AnonymousAccess
public ResultBean emptyShelfList(HttpServletRequest request) {
List<Map<String, String>> result = new ArrayList<>();
Collection<ShelfInfo> allShelfInfo = shelfInfoUtil.getAllShelfInfo();
if (allShelfInfo != null && !allShelfInfo.isEmpty()) {
for (ShelfInfo shelfInfo : allShelfInfo) {
int status = shelfInfo.getStatus();
if (ShelfStatus.reachLine == status) {
//缓存的料架信息
Map<String, ShelfLocInfo> shelfLocInfoMap = shelfInfo.getShelfLocInfoMap();
if (shelfLocInfoMap == null || shelfLocInfoMap.isEmpty()) {
Map<String, String> shelfMap = new HashMap<>();
shelfMap.put("realRfid", shelfInfo.getShelfNo());
shelfMap.put("orderNo", shelfInfo.getOrderNo());
//shelfMap.put("rfidIndex", shelf.getRfidIndex() + "");
shelfMap.put("line", shelfInfo.getCurrentLine());
result.add(shelfMap);
}
}
}
}
return ResultBean.newOkResult(result);
}
@ApiOperation("料架到达产线位置")
@RequestMapping(value = "/shelfArriveLine")
@AnonymousAccess
public ResultBean shelfArriveLine(HttpServletRequest request) {
String rfid = request.getParameter("rfid");
String loc = request.getParameter("loc");
log.info("料架:" + rfid + "到达产线位" + loc + "置");
//判断料架是否存在
ShelfInfo shelfInfo = shelfInfoUtil.getShelfInfoByShelfNo(rfid);
if (shelfInfo != null) {
shelfInfoUtil.updateShelfStatus(rfid, ShelfStatus.reachLine);
shelfInfoUtil.updateShelfCurrentLine(rfid, loc);
return ResultBean.newOkResult("");
}
return ResultBean.newErrorResult(-1, "smfcore.agvShelf.noLoc", "未找到料架{0}目标位置", new String[]{rfid});
}
@ApiOperation("根据rfid清空料架信息")
@RequestMapping(value = "/clearRfid")
@AnonymousAccess
public ResultBean clearRfid(HttpServletRequest request) {
String rfid = request.getParameter("rfid");
log.info("收到清空料架信息,rfid=[" + rfid + "]");
ShelfInfo shelfInfo = shelfInfoUtil.getShelfInfoByShelfNo(rfid);
if (shelfInfo != null) {
shelfInfoUtil.clearShelfNo(rfid);
return ResultBean.newOkResult("");
}
return ResultBean.newOkResult("未找到可清除的料架");
}
private boolean hasLastShelf(String orderNo) {
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && StringUtils.isNotEmpty(task.getSourceName())) {
if (!task.isFinished() && !task.isCancel()) {
if (task.getSourceName().equals(orderNo)) {
return false;
}
}
}
}
return true;
}
}
......@@ -3,16 +3,32 @@ package com.neotel.smfcore.custom.zhongche1568.controller;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
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.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
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.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.zhongche1568.bean.api.CreateOrderItem;
import com.neotel.smfcore.custom.zhongche1568.bean.api.CreateOrderRequest;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfInfo;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfLocInfo;
import com.neotel.smfcore.custom.zhongche1568.enums.ShelfStatus;
import com.neotel.smfcore.custom.zhongche1568.enums.ZhongCheOrderType;
import com.neotel.smfcore.custom.zhongche1568.util.ShelfInfoUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -34,6 +50,21 @@ public class ZhongCheController {
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ShelfInfoUtil shelfInfoUtil;
@Autowired
private TaskService taskService;
@Autowired
private DataCache dataCache;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IStoragePosManager storagePosManager;
@ApiOperation("创建需求单")
@AnonymousAccess
@PostMapping("/zhongChe/createOrder")
......@@ -97,30 +128,92 @@ public class ZhongCheController {
@ApiOperation("亮灯接口")
@AnonymousAccess
@PostMapping("/rest/crrc/api/openLed")
public ResultBean openLed(@RequestBody Map<String, String> paramMap) {
public synchronized ResultBean openLed(@RequestBody Map<String, String> paramMap) {
String line = paramMap.get("line");
String partNum = paramMap.get("partNum");
log.info("收到亮灯指令,线体为:" + line + ",partNum为:" + partNum);
Collection<ShelfInfo> allShelfInfo = shelfInfoUtil.getAllShelfInfo();
for (ShelfInfo shelfInfo : allShelfInfo) {
if (ShelfStatus.reachLine == shelfInfo.getStatus()) {
String currentLine = shelfInfo.getCurrentLine();
if (StringUtils.isNotEmpty(currentLine) && currentLine.startsWith(line)) {
for (ShelfLocInfo info : shelfInfo.getShelfLocInfoMap().values()) {
if (info.getPartNumber().equals(partNum)) {
//根据reelId判断有没有任务
boolean hasTask = hasTask(info.getBarcode());
if (!hasTask) {
currentLine = currentLine.replaceAll("_A", "").replaceAll("_B", "");
Barcode barcode = barcodeManager.findByBarcode(info.getBarcode());
Storage storage = dataCache.getStorage(currentLine);
String posName = "";
posName = currentLine + "_A_" + info.getLoc();
log.info("重新生成新的库位信息为:" + posName);
StoragePos pos = storagePosManager.getByPosName(posName);
DataLog dataLog = new DataLog(storage,barcode,pos);
dataLog.setType(OP.CHECKOUT);
dataLog.setOperator("mes");
taskService.addTaskToExecute(dataLog);
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("reelId","test01");
resultMap.put("partNum","pn");
resultMap.put("qty",500);
resultMap.put("posName","posName");
resultMap.put("line","line1");
resultMap.put("hSerial","1234");
return ResultBean.newOkResult(resultMap);
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("reelId",barcode.getBarcode());
resultMap.put("partNum",barcode.getPartNumber());
resultMap.put("qty",barcode.getAmount());
resultMap.put("posName",posName);
resultMap.put("line",currentLine);
resultMap.put("hSerial",shelfInfo.getOrderNo());
return ResultBean.newOkResult(resultMap);
}
}
}
}
}
}
return ResultBean.newErrorResult(-1,"smfcore.label.noReel","未找到可出库的物料");
}
@ApiOperation("灭灯接口")
@AnonymousAccess
@PostMapping("/rest/crrc/api/closeLed")
public ResultBean closeLed(@RequestBody Map<String,String> paramMap) {
public ResultBean closeLed(@RequestBody Map<String, String> paramMap) {
String reelId = paramMap.get("reelId");
log.info("收到亮灯指令,reelId为" + reelId);
//根据reelId获取到对应的料架和库位号,进行灭灯
ShelfLocInfo info = shelfInfoUtil.getShelfLocByBarcode(reelId);
if (info != null) {
String shelfNo = info.getShelfNo();
String loc = info.getLoc();
shelfInfoUtil.removeByShelfNoAndBarcode(shelfNo, reelId);
}
//判断有没有对应的任务,直接完成,发送灭灯指令
DataLog dataLog = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && !task.isCancel() && !task.isFinished()) {
if (task.getBarcode().equals(reelId)) {
dataLog = task;
break;
}
}
}
if (dataLog != null) {
dataLog.setStatus(OP_STATUS.FINISHED.name());
taskService.moveTaskToFinished(dataLog);
taskService.updateFinishedTask(dataLog);
//同时灭灯
DevicesStatusUtil.addOp(dataLog.getCid(), "close", dataLog.getPosName() + "=");
}
return ResultBean.newOkResult("");
}
private boolean hasTask(String reelId) {
for (DataLog task : taskService.getAllTasks()) {
if (task.isCheckOutTask() && !task.isCancel() && !task.isFinished()) {
if (task.getBarcode().equals(reelId)) {
return true;
}
}
}
return false;
}
}
......@@ -96,6 +96,16 @@ public class ZhongCheDeviceController {
log.info(code + "重新设置物料的完整条码信息:" + fullCode);
barcode.setFullCode(fullCode);
barcodeManager.save(barcode);
//如果默认是不需要点料的,直接返回ok
if (barcode.isPoint()){
MaterialCountResult result = new MaterialCountResult();
result.setQty(barcode.getAmount());
result.setMaterialType("NOT_COUNT_IN");
result.setReelId(barcode.getBarcode());
return ResultBean.newOkResult(result);
}
try {
MaterialCountResult count = zhongcheApi.materialCount(barcode.getBarcode(), barcode.getFullCode());
int qty = count.getQty();
......
......@@ -5,13 +5,13 @@ import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfInfo;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfLocInfo;
import com.neotel.smfcore.custom.zhongche1568.enums.ShelfStatus;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.Map;
@Api(tags = "虚拟货架工具类")
......@@ -93,7 +93,7 @@ public class ShelfInfoUtil {
return false;
}
public void updateShelfLoc(String shelfNo, int status) {
public void updateShelfStatus(String shelfNo, int status) {
if (shelfInfoMap != null && !shelfInfoMap.isEmpty()) {
ShelfInfo shelfInfo = shelfInfoMap.get(shelfNo);
if (shelfInfo != null) {
......@@ -107,4 +107,38 @@ public class ShelfInfoUtil {
public ShelfInfo getShelfInfoByShelfNo(String shelfNo) {
return shelfInfoMap.get(shelfNo);
}
public void updateShelfCurrentLine(String shelfNo, String loc) {
if (shelfInfoMap != null && !shelfInfoMap.isEmpty()) {
ShelfInfo shelfInfo = shelfInfoMap.get(shelfNo);
if (shelfInfo != null) {
shelfInfo.setCurrentLine(loc);
shelfInfoMap.put(shelfNo, shelfInfo);
dataCache.updateCache(Constants.Cache_ShelfInfo, shelfInfoMap);
}
}
}
public void clearShelfNo(String rfid) {
if (shelfInfoMap != null && !shelfInfoMap.isEmpty()) {
shelfInfoMap.remove(rfid);
dataCache.updateCache(Constants.Cache_ShelfInfo, shelfInfoMap);
}
}
public Collection<ShelfInfo> getAllShelfInfo() {
return shelfInfoMap.values();
}
public void removeByShelfNoAndBarcode(String shelfNo, String reelId) {
if (shelfInfoMap != null && !shelfInfoMap.isEmpty()) {
ShelfInfo shelfInfo = shelfInfoMap.get(shelfNo);
if (shelfInfo != null) {
Map<String, ShelfLocInfo> shelfLocInfoMap = shelfInfo.getShelfLocInfoMap();
shelfLocInfoMap.remove(reelId);
shelfInfoMap.put(shelfNo, shelfInfo);
dataCache.updateCache(Constants.Cache_ShelfInfo, shelfInfoMap);
}
}
}
}
......@@ -430,4 +430,5 @@ smfcore.barcode.checkError=[{0}]
smfcore.barcode.noSizeStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u7B26\u5408[{0}]\u7684\u5E93\u4F4D,\u6599\u76D8\u4FE1\u606F\u4E3A[{1}]
smfcore.nlp.materialCountNull=\u8BF7\u5148\u70B9\u6599\u518D\u8FDB\u884C\u5165\u5E93
smfcore.nlp.materialCountTypeErroe=\u70B9\u6599\u7C7B\u578B\u4E3A[{0}],\u4E0D\u5141\u8BB8\u5165\u5E93
smfcore.barcode.fullCode=\u5B8C\u6574\u6761\u7801
\ No newline at end of file
smfcore.barcode.fullCode=\u5B8C\u6574\u6761\u7801
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
\ No newline at end of file
......@@ -417,4 +417,5 @@ smfcore.message.critical=Kritischer Fehler
smfcore.barcode.inShelf=[{0}] befindet sich bereits im Regal [{1}], Lagerplatz [{2}]
smfcore.barcode.noSizeStorage=Im Lagerlisten wurde kein Lagerplatz gefunden, der [{0}] entspricht, die Tray-Information lautet [{1}]
smfcore.nlp.materialCountNull=Bitte z\u00E4hlen Sie die Materialien zuerst, bevor Sie sie einlagern
smfcore.nlp.materialCountTypeErroe=Der Z\u00E4hltyp ist [{0}], Einlagerung ist nicht erlaubt
\ No newline at end of file
smfcore.nlp.materialCountTypeErroe=Der Z\u00E4hltyp ist [{0}], Einlagerung ist nicht erlaubt
smfcore.agvShelf.noLoc=Zielposition des Regals {0} nicht gefunden
\ No newline at end of file
......@@ -418,4 +418,5 @@ smfcore.message.critical=Critical
smfcore.barcode.inShelf=[{0}] is already on shelf [{1}], location [{2}]
smfcore.barcode.noSizeStorage=No storage location matching [{0}] was found in the warehouse list, tray information is [{1}]
smfcore.nlp.materialCountNull=Please count the materials first before proceeding with storage
smfcore.nlp.materialCountTypeErroe=The material counting type is [{0}], storage is not allowed
\ No newline at end of file
smfcore.nlp.materialCountTypeErroe=The material counting type is [{0}], storage is not allowed
smfcore.agvShelf.noLoc=Target location of shelf {0} not found
\ No newline at end of file
......@@ -417,4 +417,5 @@ smfcore.message.critical=Erreur Critique
smfcore.barcode.inShelf=[{0}] est d\u00E9j\u00E0 sur l'\u00E9tag\u00E8re [{1}], emplacement [{2}]
smfcore.barcode.noSizeStorage=Aucun emplacement correspondant \u00E0 [{0}] n'a \u00E9t\u00E9 trouv\u00E9 dans la liste des entrep\u00F4ts, les informations du plateau sont [{1}]
smfcore.nlp.materialCountNull=Veuillez d\u2019abord compter les mat\u00E9riaux avant de proc\u00E9der \u00E0 l\u2019entr\u00E9e en stock
smfcore.nlp.materialCountTypeErroe=Le type de comptage des mat\u00E9riaux est [{0}], l\u2019entr\u00E9e en stock n\u2019est pas autoris\u00E9e
\ No newline at end of file
smfcore.nlp.materialCountTypeErroe=Le type de comptage des mat\u00E9riaux est [{0}], l\u2019entr\u00E9e en stock n\u2019est pas autoris\u00E9e
smfcore.agvShelf.noLoc=Emplacement cible du support {0} introuvable
\ No newline at end of file
......@@ -414,4 +414,5 @@ smfcore.message.critical=\u91CD\u5927\u30A8\u30E9\u30FC
smfcore.barcode.inShelf=[{0}]\u306F\u3059\u3067\u306B\u30E9\u30C3\u30AF[{1}]\u3001\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3[{2}]\u306B\u3042\u308A\u307E\u3059
smfcore.barcode.noSizeStorage=\u5009\u5EAB\u30EA\u30B9\u30C8\u306B[{0}]\u306B\u8A72\u5F53\u3059\u308B\u30ED\u30B1\u30FC\u30B7\u30E7\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3001\u30C8\u30EC\u30A4\u60C5\u5831\u306F[{1}]\u3067\u3059
smfcore.nlp.materialCountNull = \u307E\u305A\u6750\u6599\u306E\u70B9\u691C\u3092\u5B9F\u65BD\u3057\u3066\u304B\u3089\u5165\u5EAB\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044
smfcore.nlp.materialCountTypeErroe = \u70B9\u691C\u30BF\u30A4\u30D7\u304C [{0}] \u3067\u3059\u3002\u5165\u5EAB\u306F\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093
\ No newline at end of file
smfcore.nlp.materialCountTypeErroe = \u70B9\u691C\u30BF\u30A4\u30D7\u304C [{0}] \u3067\u3059\u3002\u5165\u5EAB\u306F\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093
smfcore.agvShelf.noLoc = \u68DA {0} \u306E\u76EE\u6A19\u4F4D\u7F6E\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
\ No newline at end of file
......@@ -414,4 +414,5 @@ smfcore.message.critical=\u4E25\u91CD\u9519\u8BEF
smfcore.barcode.inShelf=[{0}]\u5DF2\u5728\u6599\u67B6[{1}],\u5E93\u4F4D[{2}]\u4E2D
smfcore.barcode.noSizeStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u7B26\u5408[{0}]\u7684\u5E93\u4F4D,\u6599\u76D8\u4FE1\u606F\u4E3A[{1}]
smfcore.nlp.materialCountNull=\u8BF7\u5148\u70B9\u6599\u518D\u8FDB\u884C\u5165\u5E93
smfcore.nlp.materialCountTypeErroe=\u70B9\u6599\u7C7B\u578B\u4E3A[{0}],\u4E0D\u5141\u8BB8\u5165\u5E93
\ No newline at end of file
smfcore.nlp.materialCountTypeErroe=\u70B9\u6599\u7C7B\u578B\u4E3A[{0}],\u4E0D\u5141\u8BB8\u5165\u5E93
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
\ No newline at end of file
......@@ -414,4 +414,5 @@ smfcore.message.critical=\u56B4\u91CD\u932F\u8AA4
smfcore.barcode.inShelf=[{0}]\u5DF2\u5728\u6599\u67B6[{1}]\uFF0C\u5EAB\u4F4D[{2}]\u4E2D
smfcore.barcode.noSizeStorage=\u6599\u5009\u5217\u8868\u4E2D\u672A\u627E\u5230\u7B26\u5408[{0}]\u7684\u5EAB\u4F4D,\u6599\u76E4\u4FE1\u606F\u70BA[{1}]
smfcore.nlp.materialCountNull = \u8ACB\u5148\u9EDE\u6599\u518D\u9032\u884C\u5165\u5EAB
smfcore.nlp.materialCountTypeErroe = \u9EDE\u6599\u985E\u578B\u70BA [{0}], \u4E0D\u5141\u8A31\u5165\u5EAB
\ No newline at end of file
smfcore.nlp.materialCountTypeErroe = \u9EDE\u6599\u985E\u578B\u70BA [{0}], \u4E0D\u5141\u8A31\u5165\u5EAB
smfcore.agvShelf.noLoc = \u672A\u627E\u5230\u6599\u67B6 {0} \u76EE\u6A19\u4F4D\u7F6E
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!