Commit b67b4d3c zshaohui

1.尾料柜功能开发

1 个父辈 39024213
package com.neotel.smfcore.core.device.handler.impl;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.ReelLockPosInfo;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.NLShelfOperateBean;
import com.neotel.smfcore.core.device.bean.StatusBean;
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.util.InListCache;
import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.storage.enums.DeviceType;
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.bean.OrderSetting;
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.security.TokenProvider;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Api(tags = "尾料仓")
@RestController
@Slf4j
@RequestMapping("/tailingMaterialBox")
public class TailingMaterialBoxHandler extends BaseDeviceHandler {
private final String putInColor = "green";
@Autowired
private CodeResolve codeResolve;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@ApiOperation("寻找柜体")
@RequestMapping("/findPosByCode")
@AnonymousAccess
public ResultBean findPosByCode(@RequestBody Map<String, String> paramMap) {
String id = paramMap.get("id");
String code = paramMap.get("code");
log.info("入库寻找有料的柜体,条码信息为:" + code);
Barcode codeBarcode = codeResolve.resolveOneValideBarcode("=2x2=" + code);
List<StoragePos> storagePosList = getStoragePosListByPn(codeBarcode.getPartNumber(), id);
if (storagePosList == null || storagePosList.isEmpty()) {
Storage storage = dataCache.getStorageById(id);
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, codeBarcode, taskService.excludePosIds());
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.tailingmaterial.noPos", "未找到可用的柜体");
}
storagePosList = new ArrayList<>();
storagePosList.add(pos);
}
//开始寻找最晚入库的库位
StoragePos pos = null;
Barcode barcode = null;
int amount = 0;
for (StoragePos storagePos : storagePosList) {
if (pos == null) {
pos = storagePos;
}
Barcode posBarcode = storagePos.getBarcode();
if (posBarcode == null) {
continue;
}
List<Barcode> subCodeList = posBarcode.getSubCodeList();
if (subCodeList == null) {
subCodeList = new ArrayList<>();
}
for (Barcode subCode : subCodeList) {
amount = subCode.getAmount() + amount;
if (barcode == null) {
barcode = subCode;
}
if (barcode.getPutInDate().getTime() <= subCode.getPutInDate().getTime()) {
barcode = subCode;
pos = storagePos;
}
}
}
log.info("找到最晚入库的库位为:" + pos.getPosName() + "开始亮灯");
opPosLight("open", pos, putInColor);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("posName", pos.getPosName());
resultMap.put("partNumber", codeBarcode.getPartNumber());
resultMap.put("posReelNum", amount);
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("寻找空柜体")
@RequestMapping("/findEmptyPosByCode")
@AnonymousAccess
public ResultBean findEmptyPosByCode(@RequestBody Map<String, String> paramMap) {
String id = paramMap.get("id");
//判断是不是有效的条码
String code = paramMap.get("code");
log.info("入库寻找新柜体,条码信息为:" + code + ",");
Barcode barcode = codeResolve.resolveOneValideBarcode("=2x2=" + code);
Storage storage = dataCache.getStorageById(id);
//开始查询空库位
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, taskService.excludePosIds());
if (pos == null) {
//smfcore.tailingmaterial.noPos=未找到可用的柜体
return ResultBean.newErrorResult(-1, "smfcore.tailingmaterial.noPos", "未找到可用的柜体");
}
//添加到绑定里边
//addLockPos(pos, cid);
//同时亮灯
opPosLight("open", pos, putInColor);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("posName", pos.getPosName());
resultMap.put("partNumber", barcode.getPartNumber());
resultMap.put("posReelNum", 0);
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("物料放入柜体中")
@RequestMapping("/putInPos")
@AnonymousAccess
public ResultBean putInPos(@RequestBody Map<String, String> paramMap) {
String posName = paramMap.get("posName");
String code = paramMap.get("code");
String num = paramMap.get("num");
log.info("物料放入柜体中,库位为:" + posName + ",条码为:" + code + ",数量为:" + num);
//解析条码,同时设置数量
Barcode barcode = codeResolve.resolveOneValideBarcode("=2x2=" + code);
barcode.setBarcode(barcode.getPartNumber()+"_"+barcode.getBatch()+"_"+System.currentTimeMillis());
barcode.setAmount(Integer.parseInt(num));
//判断库位中的物料是否一样
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"柜体", posName});
}
Barcode posBarcode = getPosBarcode(pos);
//判断和放入的是否一样
List<Barcode> subCodeList = posBarcode.getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()) {
for (Barcode subCode : subCodeList) {
if (!barcode.getPartNumber().equals(subCode.getPartNumber())) {
return ResultBean.newErrorResult(-1, "smfcore.tailingmaterial.pnError", "入库的物料[{0}]与柜体中[{1}]不同", new String[]{barcode.getPartNumber(), subCode.getPartNumber()});
}
}
}
barcode.setPosName(pos.getPosName());
barcode.setPutInTime(System.currentTimeMillis());
barcodeManager.saveBarcode(barcode);
posBarcode.UpdateSubCode(barcode);
int amount = 0;
for (Barcode subCode : posBarcode.getSubCodeList()) {
amount = amount + subCode.getAmount();
}
posBarcode.setAmount(amount);
posBarcode.setPartNumber(barcode.getPartNumber());
barcodeManager.saveBarcode(posBarcode);
pos.setBarcode(posBarcode);
pos.setUsed(true);
storagePosManager.save(pos);
//生成入库任务
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog dataLog = new DataLog(storage, posBarcode, pos);
dataLog.setType(OP.PUT_IN);
dataLog.setNum(Integer.parseInt(num));
dataLog.setOperator(SecurityUtils.getLoginUsername());
dataLog.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(dataLog);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("posName", pos.getPosName());
resultMap.put("partNumber", barcode.getPartNumber());
resultMap.put("posReelNum", amount);
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("需要要出库的柜体")
@RequestMapping("/findOutPosByCode")
@AnonymousAccess
public ResultBean findOutPosByCode(@RequestBody Map<String, String> paramMap) {
String partNumber = paramMap.get("partNumber");
String id = paramMap.get("id");
log.info("收到物料出库请求,partNumber为:" + partNumber + "id为:" + id);
List<StoragePos> storagePosList = getStoragePosListByPn(partNumber, id);
if (storagePosList == null || storagePosList.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.label.noReel", "未找到可出库的物料");
}
//找到最早入库的物料信息
StoragePos pos = null;
Barcode barcode = null;
int amount = 0;
for (StoragePos storagePos : storagePosList) {
if (pos == null) {
pos = storagePos;
}
Barcode posBarcode = storagePos.getBarcode();
List<Barcode> subCodeList = posBarcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
amount = subCode.getAmount() + amount;
if (barcode == null) {
barcode = subCode;
}
if (barcode.getPutInDate().getTime() >= subCode.getPutInDate().getTime()) {
barcode = subCode;
pos = storagePos;
}
}
}
log.info("找到最早入库的库位为:" + pos.getPosName() + ",入库日期为:" + barcode.getPutInDate(), "开始亮灯");
opPosLight("open", pos, putInColor);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("posName", pos.getPosName());
resultMap.put("partNumber", partNumber);
resultMap.put("posReelNum", amount);
return ResultBean.newOkResult(resultMap);
}
@ApiOperation("物料从柜体中出库")
@AnonymousAccess
@RequestMapping("/outFromPos")
public ResultBean outFromPos(@RequestBody Map<String, String> paramMap) {
String posName = paramMap.get("posName");
String partNumber = paramMap.get("partNumber");
String numStr = paramMap.get("num");
log.info("物料从柜体出库,库位为:" + posName + ",条码为:" + posName + ",数量为:" + numStr + ",partNumber为:" + partNumber);
//判断库位中的物料是否一样
StoragePos pos = storagePosManager.getByPosName(posName);
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"柜体", posName});
}
Barcode posBarcode = getPosBarcode(pos);
//直到出库物料位置
int outNum = 0;
int num = Integer.parseInt(numStr);
while (outNum < num) {
int remainNum = num - outNum;
Barcode barcode = null;
List<Barcode> subCodeList = posBarcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
if (barcode == null) {
barcode = subCode;
}
if (barcode.getPutInDate().getTime() >= subCode.getPutInDate().getTime()) {
barcode = subCode;
}
}
if (barcode == null){
break;
}
log.info("寻找到对应的料盘信息为:" + barcode.getBarcode() + ",对应的入库时间为:" + barcode.getPutInDate());
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog dataLog = new DataLog(storage, barcode, pos);
dataLog.setType(OP.CHECKOUT);
dataLog.setNum(remainNum);
if (remainNum >= barcode.getAmount()) {
dataLog.setNum(barcode.getAmount());
outNum = outNum + barcode.getAmount();
barcode.setAmount(0);
barcode.setPosName("");
barcodeManager.save(barcode);
} else {
outNum = outNum + remainNum;
barcode.setAmount(barcode.getAmount() - remainNum);
barcodeManager.saveBarcode(barcode);
}
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setOperator(SecurityUtils.getLoginUsername());
taskService.updateFinishedTask(dataLog);
posBarcode.UpdateSubCode(barcode);
}
int amount = 0;
List<Barcode> subCodeList = posBarcode.getSubCodeList();
if (subCodeList == null || subCodeList.isEmpty()) {
posBarcode.setAmount(0);
pos.setBarcode(null);
pos.setUsed(false);
} else {
for (Barcode barcode : posBarcode.getSubCodeList()) {
amount = amount + barcode.getAmount();
}
posBarcode.setAmount(amount);
pos.setBarcode(posBarcode);
}
barcodeManager.save(posBarcode);
storagePosManager.save(pos);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("posName", pos.getPosName());
resultMap.put("partNumber", partNumber);
resultMap.put("posReelNum", amount);
return ResultBean.newOkResult(resultMap);
}
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost());
handleMsg(statusBean);
statusBean = saveAlarmAndHumidity(statusBean);
if (statusBean != null) {
Map<String, String> opMap = DevicesStatusUtil.getAndRemoveOp(statusBean.getCid());
statusBean.addOp(opMap);
}
return statusBean;
}
private List<StoragePos> getStoragePosListByPn(String partNumber, String id) {
Storage storage = dataCache.getStorageById(id);
//查询信息
Criteria criteria = Criteria.where("barcode").exists(true)
.and("enabled").is(true)
.and("storageId").is(storage.getId())
.and("barcode.partNumber").is(partNumber);
Query query = new Query(criteria);
return storagePosManager.findByQuery(query);
}
private Barcode getPosBarcode(StoragePos pos) {
Barcode barcode = pos.getBarcode();
if (barcode == null) {
barcode = barcodeManager.findByBarcode(pos.getPosName());
}
if (barcode == null) {
barcode = new Barcode();
barcode.setBarcode(pos.getPosName());
barcode.setAmount(0);
barcodeManager.save(barcode);
}
return barcode;
}
/**
* 操作库位灯(开灯,或关灯)
*
* @param opKey
* @param pos
* @param colorStr
*/
private void opPosLight(String opKey, StoragePos pos, String colorStr) {
String opStr = pos.getPosName();
if (!Strings.isNullOrEmpty(colorStr)) {
opStr = opStr + "=" + colorStr;
}
Storage storage = dataCache.getStorageById(pos.getStorageId());
DevicesStatusUtil.appendOp(storage.getCid(), opKey, opStr);
log.info("操作库位[" + pos.getPosName() + "]" + opKey + " : " + opStr);
}
}
...@@ -159,6 +159,11 @@ public enum DeviceType { ...@@ -159,6 +159,11 @@ public enum DeviceType {
* 26 smdOne * 26 smdOne
*/ */
SMD_ONE("storage.type.smdOne"), SMD_ONE("storage.type.smdOne"),
/**
* 尾料柜
*/
TAILING_MATERIAL("storage.type.tailingMaterial"),
; ;
private String key; private String key;
...@@ -180,6 +185,6 @@ public enum DeviceType { ...@@ -180,6 +185,6 @@ public enum DeviceType {
} }
public static List<DeviceType> availableTypeList(){ public static List<DeviceType> availableTypeList(){
return Lists.newArrayList(AUTO,LINE,BATCH,SOLDERPASTE,VERTICALBOX,SMD_XL,SMD_DUO,SMD_XLC,SMD_XLR,SMD_ONE,VIRTUAL,NL,NLP,NLM,NLL,NLS,NLSM,SMDBOX_THIRD,SMD_MIMO_G2,SMD_MIMO_G3); return Lists.newArrayList(AUTO,LINE,BATCH,SOLDERPASTE,VERTICALBOX,SMD_XL,SMD_DUO,SMD_XLC,SMD_XLR,SMD_ONE,VIRTUAL,NL,NLP,NLM,NLL,NLS,NLSM,SMDBOX_THIRD,SMD_MIMO_G2,SMD_MIMO_G3,TAILING_MATERIAL);
} }
} }
...@@ -443,3 +443,5 @@ smf.nexim.getInventoryFaile=\u83B7\u53D6did\u4FE1\u606F\u5931\u8D25:[{0}] ...@@ -443,3 +443,5 @@ smf.nexim.getInventoryFaile=\u83B7\u53D6did\u4FE1\u606F\u5931\u8D25:[{0}]
smfcore.registerdid.false=[{0}]\u6CE8\u518Cdid\u5931\u8D25:[{1}] smfcore.registerdid.false=[{0}]\u6CE8\u518Cdid\u5931\u8D25:[{1}]
smfcore.accessToken.ng=\u83B7\u53D6AccessToken\u5931\u8D25 smfcore.accessToken.ng=\u83B7\u53D6AccessToken\u5931\u8D25
smfcore.barcode.hasOutTask=\u7269\u6599[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1,\u9700\u7EE7\u7EED\u6267\u884C\u51FA\u5E93\u52A8\u4F5C smfcore.barcode.hasOutTask=\u7269\u6599[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1,\u9700\u7EE7\u7EED\u6267\u884C\u51FA\u5E93\u52A8\u4F5C
smfcore.tailingmaterial.noPos=\u672A\u627E\u5230\u53EF\u7528\u7684\u67DC\u4F53
smfcore.tailingmaterial.pnError=\u5165\u5E93\u7684\u7269\u6599[{0}]\u4E0E\u67DC\u4F53\u4E2D[{1}]\u4E0D\u540C
...@@ -430,4 +430,6 @@ smfcore.order.slotNum=Standnummer ...@@ -430,4 +430,6 @@ smfcore.order.slotNum=Standnummer
smf.nexim.getInventoryFaile=Fehler beim Abrufen der did-Information: [{0}] smf.nexim.getInventoryFaile=Fehler beim Abrufen der did-Information: [{0}]
smfcore.registerdid.false=[{0}] Registrierung von did fehlgeschlagen:[{1}] smfcore.registerdid.false=[{0}] Registrierung von did fehlgeschlagen:[{1}]
smfcore.accessToken.ng=Fehler beim Abrufen des AccessToken smfcore.accessToken.ng=Fehler beim Abrufen des AccessToken
smfcore.barcode.hasOutTask=Material [{0}] hat bereits einen Ausgangsauftrag; die Ausgangsaktion muss fortgesetzt werden
\ No newline at end of file \ No newline at end of file
smfcore.barcode.hasOutTask=Material [{0}] hat bereits einen Ausgangsauftrag; die Ausgangsaktion muss fortgesetzt werden
smfcore.tailingmaterial.noPos=Kein verf\u00FCgbarer Schrank gefunden
smfcore.tailingmaterial.pnError=Das eingelagerte Material [{0}] unterscheidet sich von dem im Schrank [{1}]
\ No newline at end of file \ No newline at end of file
...@@ -431,4 +431,6 @@ smfcore.order.slotNum=Station Number ...@@ -431,4 +431,6 @@ smfcore.order.slotNum=Station Number
smf.nexim.getInventoryFaile=Failed to retrieve did information: [{0}] smf.nexim.getInventoryFaile=Failed to retrieve did information: [{0}]
smfcore.registerdid.false=[{0}] Failed to register did:[{1}] smfcore.registerdid.false=[{0}] Failed to register did:[{1}]
smfcore.accessToken.ng=Failed to obtain AccessToken smfcore.accessToken.ng=Failed to obtain AccessToken
smfcore.barcode.hasOutTask=Material [{0}] already has an outbound task; the outbound action needs to be continued.
\ No newline at end of file \ No newline at end of file
smfcore.barcode.hasOutTask=Material [{0}] already has an outbound task; the outbound action needs to be continued.
smfcore.tailingmaterial.noPos=No available cabinet found
smfcore.tailingmaterial.pnError=The material [{0}] put in is different from the one in the cabinet [{1}]
\ No newline at end of file \ No newline at end of file
...@@ -430,4 +430,6 @@ smfcore.order.slotNum=num\u00E9ro de position ...@@ -430,4 +430,6 @@ smfcore.order.slotNum=num\u00E9ro de position
smf.nexim.getInventoryFaile=\u00C9chec de r\u00E9cup\u00E9ration des informations did:[{0}] smf.nexim.getInventoryFaile=\u00C9chec de r\u00E9cup\u00E9ration des informations did:[{0}]
smfcore.registerdid.false=[{0}] \u00C9chec de l'enregistrement de did:[{1}] smfcore.registerdid.false=[{0}] \u00C9chec de l'enregistrement de did:[{1}]
smfcore.accessToken.ng=\u00C9chec de l'obtention de l'AccessToken smfcore.accessToken.ng=\u00C9chec de l'obtention de l'AccessToken
smfcore.barcode.hasOutTask=La mati\u00E8re [{0}] a d\u00E9j\u00E0 une t\u00E2che de sortie ; l'action de sortie doit \u00EAtre poursuivie
\ No newline at end of file \ No newline at end of file
smfcore.barcode.hasOutTask=La mati\u00E8re [{0}] a d\u00E9j\u00E0 une t\u00E2che de sortie ; l'action de sortie doit \u00EAtre poursuivie
smfcore.tailingmaterial.noPos=Aucun cabinet disponible trouv\u00E9
smfcore.tailingmaterial.pnError=Le mat\u00E9riau [{0}] mis en stock est diff\u00E9rent de celui dans le cabinet [{1}]
\ No newline at end of file \ No newline at end of file
...@@ -427,4 +427,6 @@ smfcore.order.slotNum=\u30B9\u30BF\u30F3\u30C9\u756A\u53F7 ...@@ -427,4 +427,6 @@ smfcore.order.slotNum=\u30B9\u30BF\u30F3\u30C9\u756A\u53F7
smf.nexim.getInventoryFaile=did \u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F: [{0}] smf.nexim.getInventoryFaile=did \u60C5\u5831\u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F: [{0}]
smfcore.registerdid.false=[{0}] did \u306E\u767B\u9332\u306B\u5931\u6557\u3057\u307E\u3057\u305F:[{1}] smfcore.registerdid.false=[{0}] did \u306E\u767B\u9332\u306B\u5931\u6557\u3057\u307E\u3057\u305F:[{1}]
smfcore.accessToken.ng=AccessToken \u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F smfcore.accessToken.ng=AccessToken \u306E\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F
smfcore.barcode.hasOutTask=\u8CC7\u6750 [{0}] \u306B\u306F\u65E2\u306B\u51FA\u5EAB\u30BF\u30B9\u30AF\u304C\u3042\u308A\u3001\u51FA\u5EAB\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u7D9A\u884C\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059
\ No newline at end of file \ No newline at end of file
smfcore.barcode.hasOutTask=\u8CC7\u6750 [{0}] \u306B\u306F\u65E2\u306B\u51FA\u5EAB\u30BF\u30B9\u30AF\u304C\u3042\u308A\u3001\u51FA\u5EAB\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u7D9A\u884C\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059
smfcore.tailingmaterial.noPos=\u5229\u7528\u53EF\u80FD\u306A\u30AD\u30E3\u30D3\u30CD\u30C3\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
smfcore.tailingmaterial.pnError=\u5165\u5E93\u3055\u308C\u305F\u6750\u6599[{0}]\u306F\u30AD\u30E3\u30D3\u30CD\u30C3\u30C8\u5185\u306E[{1}]\u3068\u7570\u306A\u308A\u307E\u3059
\ No newline at end of file \ No newline at end of file
...@@ -427,4 +427,6 @@ smfcore.order.slotNum=\u7AD9\u4F4D\u7F16\u53F7 ...@@ -427,4 +427,6 @@ smfcore.order.slotNum=\u7AD9\u4F4D\u7F16\u53F7
smf.nexim.getInventoryFaile=\u83B7\u53D6did\u4FE1\u606F\u5931\u8D25:[{0}] smf.nexim.getInventoryFaile=\u83B7\u53D6did\u4FE1\u606F\u5931\u8D25:[{0}]
smfcore.registerdid.false=[{0}]\u6CE8\u518Cdid\u5931\u8D25:[{1}] smfcore.registerdid.false=[{0}]\u6CE8\u518Cdid\u5931\u8D25:[{1}]
smfcore.accessToken.ng=\u83B7\u53D6AccessToken\u5931\u8D25 smfcore.accessToken.ng=\u83B7\u53D6AccessToken\u5931\u8D25
smfcore.barcode.hasOutTask=\u7269\u6599[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1,\u9700\u7EE7\u7EED\u6267\u884C\u51FA\u5E93\u52A8\u4F5C
\ No newline at end of file \ No newline at end of file
smfcore.barcode.hasOutTask=\u7269\u6599[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1,\u9700\u7EE7\u7EED\u6267\u884C\u51FA\u5E93\u52A8\u4F5C
smfcore.tailingmaterial.noPos=\u672A\u627E\u5230\u53EF\u7528\u7684\u67DC\u4F53
smfcore.tailingmaterial.pnError=\u5165\u5E93\u7684\u7269\u6599[{0}]\u4E0E\u67DC\u4F53\u4E2D[{1}]\u4E0D\u540C
\ No newline at end of file \ No newline at end of file
...@@ -427,4 +427,6 @@ smfcore.order.slotNum = \u7AD9\u4F4D\u7DE8\u865F ...@@ -427,4 +427,6 @@ smfcore.order.slotNum = \u7AD9\u4F4D\u7DE8\u865F
smf.nexim.getInventoryFaile=\u53D6\u5F97 did \u8CC7\u8A0A\u5931\u6557:[{0}] smf.nexim.getInventoryFaile=\u53D6\u5F97 did \u8CC7\u8A0A\u5931\u6557:[{0}]
smfcore.registerdid.false=[{0}]\u8A3B\u518Adid\u5931\u6557:[{1}] smfcore.registerdid.false=[{0}]\u8A3B\u518Adid\u5931\u6557:[{1}]
smfcore.accessToken.ng=\u7372\u53D6AccessToken\u5931\u6557 smfcore.accessToken.ng=\u7372\u53D6AccessToken\u5931\u6557
smfcore.barcode.hasOutTask=\u7269\u6599[{0}]\u5DF2\u6709\u51FA\u5EAB\u4EFB\u52D9\uFF0C\u9700\u7E7C\u7E8C\u57F7\u884C\u51FA\u5EAB\u52D5\u4F5C
\ No newline at end of file \ No newline at end of file
smfcore.barcode.hasOutTask=\u7269\u6599[{0}]\u5DF2\u6709\u51FA\u5EAB\u4EFB\u52D9\uFF0C\u9700\u7E7C\u7E8C\u57F7\u884C\u51FA\u5EAB\u52D5\u4F5C
smfcore.tailingmaterial.noPos=\u672A\u627E\u5230\u53EF\u7528\u7684\u6AC3\u9AD4
smfcore.tailingmaterial.pnError=\u5165\u5EAB\u7684\u7269\u6599[{0}]\u8207\u6AC3\u9AD4\u4E2D[{1}]\u4E0D\u540C
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!