Commit ab1e95f6 LN

增加getBoxDoorStatus接口

1 个父辈 ee5cac00
...@@ -73,20 +73,27 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -73,20 +73,27 @@ public class RobotBoxHandler extends BaseDeviceHandler {
return statusBean; return statusBean;
} }
@ApiOperation("机器人料仓查找空的料格") @ApiOperation("扫码后获取库位号")
@PostMapping(value = "/service/store/robotBox/emptyPosForPutin") @PostMapping(value = "/service/store/robotBox/emptyPosForPutin")
@ResponseBody @ResponseBody
@AnonymousAccess @AnonymousAccess
public Map<String, Object> emptyPosForPutin(HttpServletRequest request) { public Map<String, Object> emptyPosForPutin(HttpServletRequest request) {
String code = request.getParameter("code"); String code = request.getParameter("code");
String cids = request.getParameter("cids"); String cids = request.getParameter("cids");
String rfid = request.getParameter("rfid");
String rfidLoc = request.getParameter("rfidLoc"); String lastPosId="";
String lastPosId = request.getParameter("lastPosId");
String lineMsg = ""; String lineMsg = "";
log.info("流水线[" + cids + "]获取[" + rfid + "][" + code + "]的入库库位"); log.info("流水线[" + cids + "]获取[" + code + "]的入库库位");
Map<String, Object> resultMap = Maps.newHashMap(); Map<String, Object> resultMap = Maps.newHashMap();
//返回值说明:
// =0:获取库位号成功
// result= 99:暂时不能入库,需要重新获取库位。
// result= 100:服务器需要更新,需要重新获取库位
// result=105:查找空库位失败
// result=98:物料已有出库任务,需继续执行出库动作
//
//
if (dataCache.getCache(Constants.CACHE_StopOut)) { if (dataCache.getCache(Constants.CACHE_StopOut)) {
lineMsg = "系统更新中,暂停出入库"; lineMsg = "系统更新中,暂停出入库";
...@@ -98,12 +105,16 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -98,12 +105,16 @@ public class RobotBoxHandler extends BaseDeviceHandler {
String okMsg = ""; String okMsg = "";
String errorMsg = ""; String errorMsg = "";
List<Storage> storageList = Lists.newArrayList();
List<String> cidList=new ArrayList<>();
if (Strings.isNullOrEmpty(cids)) { if (Strings.isNullOrEmpty(cids)) {
resultMap.put("result", "101"); //自动获取在线的料仓列表
resultMap.put("msg", "未指定料仓 cids "); cidList=dataCache.getAvailableStorageIds(this.getDeviceType());
// resultMap.put("result", "101");
// resultMap.put("msg", "未指定料仓 cids ");
} else { } else {
List<Storage> storageList = Lists.newArrayList(); cidList = Lists.newArrayList();
List<String> cidList = Lists.newArrayList(); }
for (String cid : cids.split(",")) { for (String cid : cids.split(",")) {
String notIntoCids = dataCache.getSettings().getNotIntoCids(); String notIntoCids = dataCache.getSettings().getNotIntoCids();
if (notIntoCids != null) { if (notIntoCids != null) {
...@@ -120,7 +131,7 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -120,7 +131,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
Collection<DataLog> tasks = taskService.getQueueTasks(); Collection<DataLog> tasks = taskService.getQueueTasks();
for (DataLog task : tasks) { for (DataLog task : tasks) {
if (task.isCheckOutTask() && task.getStorageId().equals(storage.getId())) { if (task.isCheckOutTask() && task.getStorageId().equals(storage.getId())) {
if (task.isExecuting() || task.isBoxdoor() || task.isInRobot()) { if (task.isExecuting() || task.isBoxdoor() ) {
hasOutTask = true; hasOutTask = true;
break; break;
} }
...@@ -182,7 +193,7 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -182,7 +193,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} }
} }
StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode, rfid, lastPosId); StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode, "", lastPosId);
if (pos != null) { if (pos != null) {
...@@ -192,14 +203,14 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -192,14 +203,14 @@ public class RobotBoxHandler extends BaseDeviceHandler {
resultMap.put("msg", ""); resultMap.put("msg", "");
okMsg = "[" + rfid + "][" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "]优先级[" + pos.getPriority() + "] 上个库位号[" + lastPosId + "]"; okMsg = "[" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "]优先级[" + pos.getPriority() + "] 上个库位号[" + lastPosId + "]";
ReelLockPosInfo oldLockInfo = ReelLockPosUtil.getLockPosInfoByCode(barcode.getBarcode()); ReelLockPosInfo oldLockInfo = ReelLockPosUtil.getLockPosInfoByCode(barcode.getBarcode());
if (oldLockInfo != null) { if (oldLockInfo != null) {
if (!oldLockInfo.getBarcode().equals(barcode.getBarcode())) { if (!oldLockInfo.getBarcode().equals(barcode.getBarcode())) {
String result = "-1"; String result = "-1";
okMsg = rfid + "[" + rfidLoc + "][" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "],清理旧有锁定信息"; okMsg = "[" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "],清理旧有锁定信息";
resultMap.put("result", result); resultMap.put("result", result);
resultMap.put("msg", okMsg); resultMap.put("msg", okMsg);
//已经锁定过库位,但不是同一个条码,需要把对应位置的锁定信息清理掉 //已经锁定过库位,但不是同一个条码,需要把对应位置的锁定信息清理掉
...@@ -256,7 +267,7 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -256,7 +267,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
resultMap.put("msg", errorMsg); resultMap.put("msg", errorMsg);
} }
} }
} // }
//没入成功 //没入成功
if (!errorMsg.isEmpty()) { if (!errorMsg.isEmpty()) {
...@@ -281,7 +292,7 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -281,7 +292,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
return resultMap; return resultMap;
} }
@ApiOperation("机器人料仓更新任务状态") @ApiOperation("机器人更新任务状态")
@PostMapping(value = "/service/store/robotBox/updateLocInfo") @PostMapping(value = "/service/store/robotBox/updateLocInfo")
@ResponseBody @ResponseBody
@AnonymousAccess @AnonymousAccess
...@@ -335,29 +346,30 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -335,29 +346,30 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} }
@ApiOperation("机器人定时获取出入库任务") @ApiOperation("机器人定时获取任务")
@PostMapping(value = "/service/store/robotBox/getRobotTask") @PostMapping(value = "/service/store/robotBox/getRobotTask")
@ResponseBody @ResponseBody
@AnonymousAccess @AnonymousAccess
public ResultBean getRobotTask(HttpServletRequest request) { public ResultBean getRobotTask(HttpServletRequest request) {
//TODO 先查找是否有出库任务,在查找入库任务 //TODO 先查找是否有出库任务
Collection<DataLog> datalogs = taskService.getQueueTasks(); Collection<DataLog> datalogs = taskService.getQueueTasks();
//先查找已在机器人的 //先查找已在机器人的
for (DataLog task : datalogs) { for (DataLog task : datalogs) {
if (task.isInRobot()) { if (task.isInRobot()) {
//获取任务失败,还有未完成的任务 //获取任务失败,还有未完成的任务
return ResultBean.newErrorResult(301, "smfcore.task.lastNotEnd", "上个任务未结束{0}{1}", new String[]{task.getPosName(), task.getBarcode()}); return ResultBean.newErrorResult(1, "smfcore.task.lastNotEnd", "上个任务未结束{0}{1}", new String[]{task.getPosName(), task.getBarcode()});
} }
} }
//查找出库已经到门口的 //查找出库已经到门口的
for (DataLog task : datalogs) { for (DataLog task : datalogs) {
if (OP.CHECKOUT == task.getType()) { if (task.isCheckOutTask()) {
if (task.isBoxdoor()) { if (task.isBoxdoor()) {
Map<String, String> taskMap = new HashMap<>(); Map<String, String> taskMap = new HashMap<>();
taskMap.put("cid", task.getCid());//取料位置 taskMap.put("cid", task.getCid());//取料位置
taskMap.put("targetPos", "out");//放料位置 // taskMap.put("targetPos", "out");//放料位置
taskMap.put("type",task.getType()+"");//类型,1=入库,2=出库
taskMap.put("posId", task.getPosName()); taskMap.put("posId", task.getPosName());
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode()); Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
...@@ -381,6 +393,37 @@ public class RobotBoxHandler extends BaseDeviceHandler { ...@@ -381,6 +393,37 @@ public class RobotBoxHandler extends BaseDeviceHandler {
} }
@ApiOperation("料仓判断仓门口是否可以放料")
@PostMapping(value = "/service/store/robotBox/getBoxDoorStatus")
@ResponseBody
@AnonymousAccess
public ResultBean getBoxDoorStatus(HttpServletRequest request) {
String cid = request.getParameter("cid");
//判断仓门口状态,0=空闲,返回其他表示仓门口有料或机器人正在取料
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
return ResultBean.newErrorResult(99, "smfcore.robotBox.notFound", "未找到机器人料仓[{0}]", new String[]{cid});
}
if (!storage.isRobotBox()) {
return ResultBean.newErrorResult(99, "smfcore.robotBox.notFound", "未找到机器人料仓[{0}]", new String[]{cid});
}
Collection<DataLog> tasks = taskService.getQueueTasks();
for (DataLog task : tasks) {
if (task.getStorageId().equals(storage.getId())) {
if (task.isBoxdoor()) {
return ResultBean.newErrorResult(-1, "smfcore.robotBox.boxHasTask", "任务[{0}][{1}]类型{2}状态{3}", new String[]{task.getPosName(), task.getBarcode(),task.getType()+"", task.getStatus()});
}
else if(task.isPutInTask()&&task.isInRobot()){
return ResultBean.newErrorResult(-1, "smfcore.robotBox.boxHasTask", "任务[{0}][{1}]类型{2}状态{3}", new String[]{task.getPosName(), task.getBarcode(),task.getType()+"", task.getStatus()});
}
}
}
return ResultBean.newOkResult("");
}
@Override @Override
public DeviceType getDeviceType() { public DeviceType getDeviceType() {
return DeviceType.ROBOT_BOX; return DeviceType.ROBOT_BOX;
......
...@@ -11,6 +11,7 @@ import com.neotel.smfcore.common.utils.StringUtils; ...@@ -11,6 +11,7 @@ import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.common.utils.YmlUpdateUtil; import com.neotel.smfcore.common.utils.YmlUpdateUtil;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve; import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.inList.util.InListCache; import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.language.service.bean.LanguageInfo; import com.neotel.smfcore.core.language.service.bean.LanguageInfo;
import com.neotel.smfcore.core.language.service.po.LanguageMsg; import com.neotel.smfcore.core.language.service.po.LanguageMsg;
...@@ -29,6 +30,7 @@ import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; ...@@ -29,6 +30,7 @@ import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.system.service.po.CacheItem; import com.neotel.smfcore.core.system.service.po.CacheItem;
import com.neotel.smfcore.core.system.service.po.Settings; import com.neotel.smfcore.core.system.service.po.Settings;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -658,7 +660,23 @@ public class DataCache { ...@@ -658,7 +660,23 @@ public class DataCache {
} }
return availableStorageIds; return availableStorageIds;
} }
public List<String> getAvailableStorageIds(DeviceType deviceType){
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
if(storage.getType().equals(deviceType.name())) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut()) {
continue;
}
if (bean.getStatus() == 1) {
availableStorageIds.add(storage.getId());
}
}
}
return availableStorageIds;
}
public Storage AutoCreateStorage(String cid) { public Storage AutoCreateStorage(String cid) {
//判断cid存在 //判断cid存在
Storage storage = null; Storage storage = null;
......
...@@ -325,18 +325,51 @@ public class TaskService { ...@@ -325,18 +325,51 @@ public class TaskService {
return false; return false;
} }
private DataLog findPutInBoxTask(Storage storage){ private StatusBean findPutInBoxTask(Storage storage, StatusBean statusBean) {
if(storage.isRobotBox()){ DataLog putInTask = null;
//如果是机器人料仓,需要查找入库任务发给料仓
if (storage.isRobotBox()) {
for (DataLog task : taskMap.values()) { for (DataLog task : taskMap.values()) {
if (OP.PUT_IN == task.getType() && task.getCid().equals(storage.getCid())) { if (OP.PUT_IN == task.getType() && task.getCid().equals(storage.getCid())) {
if(task.isBoxdoor()){ if (task.isBoxdoor()) {
return task; //仓门口的料需要直接发给料仓入库
} putInTask = task;
}
//如果有正在执行中,还未结束的入库,也不能执行出库任务
else if (task.isExecuting() || task.isInRobot()) {
putInTask = task;
}
} }
} }
} }
return null;
if (putInTask != null) {
if (putInTask.isInRobot()) {
//发送入库任务到BOX
putInTask.setStatus(OP_STATUS.EXECUTING.name());
taskMap.put(putInTask.getId(), putInTask);
putInTask = dataLogDao.save(putInTask);
String posName = putInTask.getPosName();
Barcode codeObj = barcodeManager.findByBarcode(putInTask.getBarcode());
int plateW = 0;
int plateH = 0;
if (codeObj != null) {
plateW = codeObj.getPlateSize();
plateH = codeObj.getHeight();
} else {
log.warn("入库未找到条码" + storage.getName() + "[" + posName + "],条码[" + putInTask.getBarcode() + "]");
}
statusBean.setOp(OP.PUT_IN);
statusBean.addPosInfo(putInTask.getBarcode(), posName, plateW, plateH, true);
log.info("入库" + storage.getName() + "[" + posName + "]物料[" + putInTask.getBarcode() + "][" + putInTask.getStatus() + "]到 " + storage.getCid());
}
return statusBean;
}
return null;
} }
...@@ -408,28 +441,9 @@ public class TaskService { ...@@ -408,28 +441,9 @@ public class TaskService {
*/ */
public StatusBean checkOut(Storage storage, StatusBean statusBean) { public StatusBean checkOut(Storage storage, StatusBean statusBean) {
try { try {
DataLog putInTask=findPutInBoxTask(storage); StatusBean statusBean1=findPutInBoxTask(storage,statusBean);
if(putInTask!=null){ if(statusBean1!=null){
//发送入库任务到BOX return statusBean1;
putInTask.setStatus(OP_STATUS.EXECUTING.name());
taskMap.put(putInTask.getId(), putInTask);
putInTask = dataLogDao.save(putInTask);
String posName = putInTask.getPosName();
Barcode codeObj = barcodeManager.findByBarcode(putInTask.getBarcode());
int plateW = 0;
int plateH = 0;
if (codeObj != null) {
plateW = codeObj.getPlateSize();
plateH = codeObj.getHeight();
} else {
log.warn("入库未找到条码" + storage.getName() + "[" + posName + "],条码["+putInTask.getBarcode()+"]");
}
statusBean.setOp(OP.PUT_IN);
statusBean.addPosInfo(putInTask.getBarcode(), posName, plateW, plateH, true);
log.info("入库" + storage.getName() + "[" + posName + "]物料[" + putInTask.getBarcode() + "]["+putInTask.getStatus()+"]到 " + storage.getCid());
return statusBean;
} }
//准备更新暂停出入库 //准备更新暂停出入库
......
...@@ -227,4 +227,6 @@ smfcore.linemsg.update=\u7CFB\u7EDF\u66F4\u65B0\u4E2D,\u6682\u505C\u51FA\u5165\u ...@@ -227,4 +227,6 @@ smfcore.linemsg.update=\u7CFB\u7EDF\u66F4\u65B0\u4E2D,\u6682\u505C\u51FA\u5165\u
smfcore.linemsg.posLock=[{0}]\u5E93\u4F4D[{1}]\u5DF2\u88AB\u9501\u5B9A,\u6682\u505C\u5165\u5E93 smfcore.linemsg.posLock=[{0}]\u5E93\u4F4D[{1}]\u5DF2\u88AB\u9501\u5B9A,\u6682\u505C\u5165\u5E93
smfcore.task.notExist=\u4EFB\u52A1\u4E0D\u5B58\u5728 smfcore.task.notExist=\u4EFB\u52A1\u4E0D\u5B58\u5728
smfcore.task.hasEnd=\u4EFB\u52A1\u5DF2\u5B8C\u6210 smfcore.task.hasEnd=\u4EFB\u52A1\u5DF2\u5B8C\u6210
smfcore.task.hasCancel=\u66F4\u65B0\u72B6\u6001\u65F6{0}\u7684\u51FA\u5E93\u4EFB\u52A1[{1}]\u5DF2\u88AB\u53D6\u6D88
\ No newline at end of file \ No newline at end of file
smfcore.task.hasCancel=\u66F4\u65B0\u72B6\u6001\u65F6{0}\u7684\u51FA\u5E93\u4EFB\u52A1[{1}]\u5DF2\u88AB\u53D6\u6D88
smfcore.robotBox.notFound=\u672A\u627E\u5230\u673A\u5668\u4EBA\u6599\u4ED3[{0}]
smfcore.robotBox.boxHasTask=\u4EFB\u52A1[{0}][{1}]\u7C7B\u578B{2}\u72B6\u6001{3}
\ No newline at end of file \ No newline at end of file
...@@ -228,4 +228,6 @@ smfcore.linemsg.posLock=The [{0}] storage space [{1}] has been locked, suspend s ...@@ -228,4 +228,6 @@ smfcore.linemsg.posLock=The [{0}] storage space [{1}] has been locked, suspend s
smfcore.task.notExist=Task does not exist smfcore.task.notExist=Task does not exist
smfcore.task.hasEnd=Mission completed smfcore.task.hasEnd=Mission completed
smfcore.task.hasCancel={0}'s outgoing task [{1}] has been cancelled smfcore.task.hasCancel={0}'s outgoing task [{1}] has been cancelled
smfcore.robotBox.notFound=ROBOT BOX{0} does not exist
smfcore.robotBox.boxHasTask=\u30BF\u30B9\u30AF [{0}][{1}] \u30BF\u30A4\u30D7 {2} \u72B6\u614B {3\uFF5D
...@@ -228,4 +228,6 @@ smfcore.linemsg.posLock=[{0}] \u30B9\u30C8\u30EC\u30FC\u30B8\u30B9\u30DA\u30FC\u ...@@ -228,4 +228,6 @@ smfcore.linemsg.posLock=[{0}] \u30B9\u30C8\u30EC\u30FC\u30B8\u30B9\u30DA\u30FC\u
smfcore.task.notExist=\u30DF\u30C3\u30B7\u30E7\u30F3\u304C\u5B58\u5728\u3057\u306A\u3044 smfcore.task.notExist=\u30DF\u30C3\u30B7\u30E7\u30F3\u304C\u5B58\u5728\u3057\u306A\u3044
smfcore.task.hasEnd=\u30DF\u30C3\u30B7\u30E7\u30F3\u9054\u6210 smfcore.task.hasEnd=\u30DF\u30C3\u30B7\u30E7\u30F3\u9054\u6210
smfcore.task.hasCancel={0}\u306E\u9001\u4FE1\u30BF\u30B9\u30AF[{1}]\u306F\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F smfcore.task.hasCancel={0}\u306E\u9001\u4FE1\u30BF\u30B9\u30AF[{1}]\u306F\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F
smfcore.robotBox.notFound=\u30D3\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F{0}
smfcore.robotBox.boxHasTask=Task [{0}][{1}] Type {2} Status {3}
...@@ -228,3 +228,5 @@ smfcore.linemsg.posLock=[{0}]\u5E93\u4F4D[{1}]\u5DF2\u88AB\u9501\u5B9A,\u6682\u5 ...@@ -228,3 +228,5 @@ smfcore.linemsg.posLock=[{0}]\u5E93\u4F4D[{1}]\u5DF2\u88AB\u9501\u5B9A,\u6682\u5
smfcore.task.notExist=\u4EFB\u52A1\u4E0D\u5B58\u5728 smfcore.task.notExist=\u4EFB\u52A1\u4E0D\u5B58\u5728
smfcore.task.hasEnd=\u4EFB\u52A1\u5DF2\u5B8C\u6210 smfcore.task.hasEnd=\u4EFB\u52A1\u5DF2\u5B8C\u6210
smfcore.task.hasCancel=\u66F4\u65B0\u72B6\u6001\u65F6{0}\u7684\u51FA\u5E93\u4EFB\u52A1[{1}]\u5DF2\u88AB\u53D6\u6D88 smfcore.task.hasCancel=\u66F4\u65B0\u72B6\u6001\u65F6{0}\u7684\u51FA\u5E93\u4EFB\u52A1[{1}]\u5DF2\u88AB\u53D6\u6D88
smfcore.robotBox.notFound=\u672A\u627E\u5230\u673A\u5668\u4EBA\u6599\u4ED3[{0}]
smfcore.robotBox.boxHasTask=\u4EFB\u52A1[{0}][{1}]\u7C7B\u578B{2}\u72B6\u6001{3}
...@@ -228,4 +228,6 @@ smfcore.linemsg.posLock=[{0}]\u5EAB\u4F4D[{1}]\u5DF2\u88AB\u9396\u5B9A\uFF0C\u66 ...@@ -228,4 +228,6 @@ smfcore.linemsg.posLock=[{0}]\u5EAB\u4F4D[{1}]\u5DF2\u88AB\u9396\u5B9A\uFF0C\u66
smfcore.task.notExist=\u4EFB\u52D9\u4E0D\u5B58\u5728 smfcore.task.notExist=\u4EFB\u52D9\u4E0D\u5B58\u5728
smfcore.task.hasEnd=\u4EFB\u52D9\u5DF2\u5B8C\u6210 smfcore.task.hasEnd=\u4EFB\u52D9\u5DF2\u5B8C\u6210
smfcore.task.hasCancel=\u66F4\u65B0\u72C0\u614B\u6642{0}\u7684\u51FA\u5EAB\u4EFB\u52D9[{1}]\u5DF2\u88AB\u53D6\u6D88 smfcore.task.hasCancel=\u66F4\u65B0\u72C0\u614B\u6642{0}\u7684\u51FA\u5EAB\u4EFB\u52D9[{1}]\u5DF2\u88AB\u53D6\u6D88
smfcore.robotBox.notFound=\u672A\u627E\u5230\u6A5F\u5668\u4EBA\u6599\u5009[{0}]
smfcore.robotBox.boxHasTask=\u4EFB\u52D9[{0}][{1}]\u985E\u578B{2}\u72C0\u614B{3}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!