Commit d9d0ae72 zshaohui

海康功能对接提交

1 个父辈 bc5b7568
正在显示 29 个修改的文件 包含 428 行增加35 行删除
......@@ -45,10 +45,10 @@ public class DataInitManager {
MainTimer mainTimer;
//@Value("${menu.show}")
private String[] menuShowList = new String[]{"commonIn","returnIn","cutIn"};
private String[] menuShowList = new String[]{""};
//@Value("${menu.hide}")
private String[] menuHideList = new String[]{"singleDiskWarehousing"};
private String[] menuHideList = new String[]{"mslOut","inList","dumpWarehousing","commonIn","returnIn","cutIn","sluggishMaterials","safetyInventory","outList","orderSet","reelOut","orderSheet","orderShortageOut","orderShortageSheet","productionLineReple","productionLineOut","interfaceException"};
@Autowired
PermissionInitUtil annotationUtil;
......
......@@ -59,4 +59,33 @@ public class HttpHelper {
}
public static String postJson(String url, String paramStr, Map<String, String> headerMap) throws ApiException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
for (Entry<String, String> entry : headerMap.entrySet()) {
httpPost.addHeader(entry.getKey(),entry.getValue());
}
// 设置请求参数
ObjectMapper mapper = new ObjectMapper();
try {
httpPost.setEntity(new StringEntity(paramStr));
} catch (UnsupportedEncodingException e) {
throw new ApiException("Request params to [" + url + "] failed:" + e.getMessage());
}
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
//System.out.println(response.getStatusLine().getStatusCode() + "\n");
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, CONTENT_CHARSET);
response.close();
httpClient.close();
return responseContent;
} catch (Exception e) {
throw new ApiException("Request to [" + url + "] failed:" + e.getMessage());
}
}
}
......@@ -21,6 +21,7 @@ import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.service.po.Component;
import com.neotel.smfcore.core.barcode.utils.QrcodeUtils;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -250,6 +251,7 @@ public class ComponentController {
}
@ApiOperation("下载元器件模板")
@GetMapping(value = "/downloadModel")
@AnonymousAccess
@PreAuthorize("@el.check('component:list')")
public void downloadModel(HttpServletResponse response) throws IOException {
downloadComponentModel(response);
......
......@@ -53,7 +53,7 @@ public class Barcode extends BasePo implements Serializable {
/**
* 锡膏状态
*/
private int solderStatus = SOLDER_STATUS.NONE;
//private int solderStatus = SOLDER_STATUS.NONE;
/**
* 锡膏指定时间出库
......@@ -382,7 +382,7 @@ public class Barcode extends BasePo implements Serializable {
}
}
public int getSolderStatus() {
/*public int getSolderStatus() {
if (solderStatus == SOLDER_STATUS.REWARMING) {
//如果状态是回温中,且回温时间已经大于warmTime,修改状态为待搅拌
long now = System.currentTimeMillis();
......@@ -391,7 +391,7 @@ public class Barcode extends BasePo implements Serializable {
}
}
return solderStatus;
}
}*/
public String getNeedOutDateStr() {
if (needOutDate == null) {
......
......@@ -632,7 +632,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
barcode.setInOpor(task.getOperator());
barcode.setCheckOutDate(null, "");
barcode.setPosName(task.getPosName());
if (barcode.isSolder()) {
/*if (barcode.isSolder()) {
if (storagePos.isWarmPos()) {
//回温仓位
barcode.setSolderStatus(SOLDER_STATUS.RETREAT_STORAGE);
......@@ -640,7 +640,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
barcode.setSolderStatus(SOLDER_STATUS.UNDER_REFRIGERATION);
}
barcode.setNeedOutDate(null);
}
}*/
barcodeManager.save(barcode);
}
......
......@@ -2,12 +2,9 @@ package com.neotel.smfcore.core.device.handler.impl;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
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.inList.service.po.InList;
import com.neotel.smfcore.core.inList.service.po.InListItem;
......@@ -16,32 +13,25 @@ import com.neotel.smfcore.core.order.enums.ORDER_COLOR;
import com.neotel.smfcore.core.storage.enums.DeviceType;
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.websocket.MsgType;
import com.neotel.smfcore.core.system.websocket.SocketMsg;
import com.neotel.smfcore.core.system.websocket.WebSocketServer;
import com.neotel.smfcore.hikvision.HikApi;
import com.neotel.smfcore.hikvision.bean.InOutApiInfo;
import com.neotel.smfcore.hikvision.bean.TransferOrderInInfo;
import com.neotel.smfcore.security.TokenProvider;
import com.neotel.smfcore.hikvision_mobile.HikVisionApi;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.service.manager.IUserManager;
import com.neotel.smfcore.security.service.po.User;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
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.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
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 javax.servlet.http.HttpSession;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
@Api(tags = "SHELF: NLP感应料架")
@RestController
......@@ -54,6 +44,9 @@ public class NLPShelfHandler extends BaseDeviceHandler{
@Autowired
private IUserManager userManager;
@Autowired
HikVisionApi hikVisionApi;
/**
* 库位盘点料架CID列表
*/
......@@ -204,6 +197,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
}
hasReelPosList=newList.toArray(new String[newList.size()]);
hikVisionApi.posChange(storage,hasReelPosList,0+"");
//入库的库位列表
if(hasReelPosList.length > 1){
......@@ -242,6 +236,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
String[] noReelPosList = request.getParameterValues("noReelPosList");
if(noReelPosList != null){
hikVisionApi.posChange(storage,noReelPosList,1+"");
//出库
for (String noReelPosName : noReelPosList) {
log.info(cid + "处理无料库位:["+noReelPosName+"]");
......@@ -304,9 +299,12 @@ public class NLPShelfHandler extends BaseDeviceHandler{
try {
//入库完成,发送入库完成请求
log.info(queueTask.getBarcode() + "入库完成,发送入库完成请求");
boolean accept = hikVisionApi.acceptTaskStatus(queueTask);
if (accept){
super.finishedPutIn(storage.getCid(), pos.getPosName());
String msg = queueTask.getBarcode() + "入库到" + pos.getPosName() + "成功";
log.info(msg);
}
inResult = true;
try {
//判断是否是入库单入库
......@@ -318,13 +316,13 @@ public class NLPShelfHandler extends BaseDeviceHandler{
InList inList = inListCache.getInList(queueTask.getSourceName());
//入库完成,调用 7.2转储单入库过账接口
TransferOrderInInfo inInfo = new TransferOrderInInfo(inList.getName(), inList.getDocType(), queueTask.getBarcode(), item.getBaseCode(), item.getInLgort(), queueTask.getNum());
HikApi.transferOrderInApi(queueTask.getOperator(), inInfo);
//HikApi.transferOrderInApi(queueTask.getOperator(), inInfo);
}
} else {
log.info("调用 7.5入库上架过账接口");
//入库完成,调用 7.5入库上架过账接口
HikApi.putInApi(queueTask.getOperator(), InOutApiInfo.inputInfo(queueTask.getInType(), queueTask.getBarcode(), queueTask.getNum()));
//HikApi.putInApi(queueTask.getOperator(), InOutApiInfo.inputInfo(queueTask.getInType(), queueTask.getBarcode(), queueTask.getNum()));
}
} catch (Exception e) {
......@@ -377,10 +375,13 @@ public class NLPShelfHandler extends BaseDeviceHandler{
//出库完成
try {
outResult = noReelPosName;
boolean accept = hikVisionApi.acceptTaskStatus(queueTask);
if (accept){
super.finishedOutPos(storage.getCid(),noReelPosName);
String msg = queueTask.getBarcode()+ "从"+ noReelPosName+"出库成功";
log.info(msg);
break;
}
} catch (Exception e) {
log.error("库位:" + noReelPosName+"出库出错",e);
break;
......
......@@ -383,7 +383,7 @@ public class SpBoxHandler extends BaseDeviceHandler {
Barcode barcode = barcodeManager.findByBarcode(puttingTask.getBarcode());
barcode.setPosName(puttingTask.getPosName());
barcode.setStartWarmTime(System.currentTimeMillis());
barcode.setSolderStatus(SOLDER_STATUS.REWARMING);
//barcode.setSolderStatus(SOLDER_STATUS.REWARMING);
barcodeManager.save(barcode);
/**
* 仓位状态
......@@ -438,13 +438,13 @@ public class SpBoxHandler extends BaseDeviceHandler {
return;
}
Barcode barcode = storagePos.getBarcode();
if (barcode != null && barcode.getSolderStatus() != solderStatus) {
/*if (barcode != null && barcode.getSolderStatus() != solderStatus) {
barcode.setSolderStatus(solderStatus);
barcode = barcodeManager.save(barcode);
storagePos.setBarcode(barcode);
storagePosManager.save(storagePos);
}
}*/
}
private void mixEnd(DataLog mixTask) throws ValidateException {
......
......@@ -3,6 +3,7 @@ package com.neotel.smfcore.core.storage.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import java.util.Date;
import java.util.List;
......
package com.neotel.smfcore.core.storage.service.manager.impl;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
......@@ -8,6 +9,7 @@ import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.storage.service.dao.IStorageDao;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
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.dao.IDataLogDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -16,4 +16,6 @@ public interface IDataLogManager extends IBaseManager<DataLog> {
DataLog findLastOutTask(String barcode,boolean addOutbound);
void download(Query query, Pageable pageable, HttpServletResponse response, Locale locale) throws IOException;
int countByReqCode(String reqCode);
}
......@@ -145,4 +145,9 @@ public class DataLogManagerImpl implements IDataLogManager {
}
});
}
@Override
public int countByReqCode(String reqCode) {
return dataLogDao.countByQuery(new Query(Criteria.where("reqCode").is(reqCode)));
}
}
......@@ -258,6 +258,11 @@ public class DataLog extends BasePo implements Serializable {
*/
private MSDAppendInfo msdAppendInfo;
/**
* 请求序列号
*/
private String reqCode;
public String getBarcode() {
if(barcode == null){
return "";
......
......@@ -184,7 +184,7 @@ public class TaskService {
tiggerTaskChangeListener(task);
}
public void addTaskToExecute(DataLog taskToExecute) throws ValidateException {
public DataLog addTaskToExecute(DataLog taskToExecute) throws ValidateException {
Collection<DataLog> tasks = taskMap.values();
for (DataLog task : tasks) {
String barcode = taskToExecute.getBarcode();
......@@ -197,7 +197,7 @@ public class TaskService {
throw new ValidateException("smfcore.error.pos.inQueue", "位置:[{0}}]已在操作队列中,操作失败", new String[]{posName});
}
}
updateQueueTask(taskToExecute);
return updateQueueTask(taskToExecute);
}
/**
......
package com.neotel.smfcore.hikvision_mobile;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.hikvision_mobile.bean.request.ApiRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
@Component
public class HikVisionApi implements ITaskListener {
@Value("${hik.inOutTaskUrl}")
private String inOutTaskUrl = "";
@Value("${hik.posChangeUrl}")
private String posChangeUrl = "";
@Value("${hik.machineId}")
private String machineId = "";
@Value("${hik.authorization}")
private String authorization = "";
@Value("hik.onOff")
private String onOff = "";
@Autowired
private DataCache dataCache;
@PostConstruct
public void initHikVision() {
inOutTaskUrl = dataCache.GetConfigCache("hik.inOutTaskUrl", "hik.inOutTaskUrl", inOutTaskUrl);
posChangeUrl = dataCache.GetConfigCache("hik.posChangeUrl", "hik.posChangeUrl", posChangeUrl);
machineId = dataCache.GetConfigCache("hik.machineId", "hik.machineId", machineId);
authorization = dataCache.GetConfigCache("hik.authorization", "hik.authorization", authorization);
onOff = dataCache.GetConfigCache("hik.onOff", "hik.onOff", onOff);
}
/**
* taskCode String 32 是 任务单号
* status String 20 是 任务状态 0成功 1失败
* shelfCode String 20 是 货架编码
* uniqueCode String 54 是 物料唯一码,41位
* storageCode String 20 是 库位号
*
* @param task
*/
@Override
public void onTaskStatusChange(DataLog task) {
}
public boolean acceptTaskStatus(DataLog task) {
boolean flag = true;
if (!task.isFinished()) {
//构造查询条件
Map<String, Object> map = new HashMap<>();
map.put("taskCode", task.getId());
//if (task.isFinished()) {
map.put("status", 0);
/* } else {
map.put("status", 1);
}*/
map.put("shelfCode", task.getStorageName());
map.put("uniqueCode", task.getBarcode());
map.put("storageCode", task.getPosName());
ApiRequest apiRequest = new ApiRequest(getReqCode(), task.getCreator(), Arrays.asList(map));
String requestBody = JSON.toJSONString(apiRequest);
log.info("出入库通知hik请求为:" + requestBody);
try {
String result = HttpHelper.postJson(inOutTaskUrl, requestBody, getHeaderMap());
log.info("出入库通知hik返回为:" + result);
JSONObject jsonObject = JSONObject.parseObject(result);
if (jsonObject.getInteger("code") != null && jsonObject.getInteger("code") == 0) {
flag = true;
} else {
flag = false;
}
} catch (ApiException e) {
e.printStackTrace();
flag = false;
}
}
return flag;
}
public void posChange(Storage storage,String[] posNameList,String flag) {
if ("0".equals(onOff)) {
log.info("库位变化,白盒接口预留,暂不开启");
return;
}
List<Map<String, String>> paramList = new ArrayList<>();
for (String posName : posNameList) {
Map<String, String> paramMap = new HashMap<>();
paramMap.put("shelfCode", storage.getName());
paramMap.put("storageCode", posName);
paramMap.put("flag", flag);
paramList.add(paramMap);
}
ApiRequest apiRequest = new ApiRequest(getReqCode(), "", paramList);
String paramStr = JSON.toJSONString(apiRequest);
log.info("接受库位变化信息接口入参为:" + paramStr);
try {
String result = HttpHelper.postJson(posChangeUrl, paramStr, getHeaderMap());
log.info("接受库位变化信息接口出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
}
}
private Map<String, String> getHeaderMap() {
Map<String, String> headerMap = new HashMap<>();
headerMap.put("MachineId", machineId);
headerMap.put("Authorization", authorization);
return headerMap;
}
private synchronized static String getReqCode() {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
return "100000" + format.format(new Date());
}
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.Data;
@Data
public class CancelTaskInfo {
/**
* taskCode String 20 是 任务单号
*/
private String taskCode;
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class LightUpInfo {
/**
* shelfCode String 20 是 货架编码
* storageCode String 20 是 库位号
* lightType String 5 是 亮灯类型/亮灯颜色 (7种灯,业务场景)
*/
private String shelfCode;
private String storageCode;
private String lightType;
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.Data;
/**
* 库位变化信息
*/
@Data
public class PosChangeInfo {
/**
* shelfCode String 20 是 货架编码
* storageCode String 20 是 库位号
* flag String 1 是 上/下架标识 0上架 1下架
*/
private String shelfCode;
private String storageCode;
private String flag;
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.Data;
/**
* 下架信息
*/
@Data
public class PutOffShelvesInfo {
/**
* uniqueCode String 54 是 物料唯一码,41位
* matnr String 20 否 物料编码
* shelfCode String 20 是 货架编码
*/
private String shelfCode;
private String uniqueCode;
private String matnr;
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.Data;
/**
* 上架信息
*/
@Data
public class PutOnShelvesInfo {
/**
* uniqueCode String 54 是 物料唯一码,41位
* matnr String 20 否 物料编码
* qty Integer 是 数量
* shelfCode String 20 是 货架编码
*/
private String uniqueCode;
private String matnr;
private Integer qty;
private String shelfCode;
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.Data;
/**
* 库存信息
*/
@Data
public class StockInfo {
/**
* shelfCode String 20 否 货架编码
* uniqueCode String 54 否 物料唯一码,41位
* storageCode String 20 否 库位号
*/
private String shelfCode;
private String uniqueCode;
private String storageCode;
}
package com.neotel.smfcore.hikvision_mobile.bean;
import lombok.Data;
@Data
public class StockResponseInfo {
/**
* shelfCode String 20 是 货架编码
* uniqueCode String 54 是 物料唯一码,41位
* storageCode String 20 是 库位号
* qty Integer 否 数量
* matnr String 20 否 物料编码
* seq Integer 否 排序字段
*/
private String shelfCode;
private String uniqueCode;
private String storageCode;
private Integer qty;
private String matnr;
private String seq;
}
package com.neotel.smfcore.hikvision_mobile.bean.enums;
public enum ResponseCode {
/**
* 0 成功
* 1 参数错误,需要重发
* 6 报文已处理,无需重发
* 99 其他未知错误,需要重发
*/
SUCCESS(0),
REQUEST_ERROR(1),
PROCESSED(6),
ERROR(99);
private Integer code;
ResponseCode(Integer code) {
this.code = code;
}
public Integer getCode() {
return code;
}
}
package com.neotel.smfcore.hikvision_mobile.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.poi.ss.formula.functions.T;
/**
* 接口入参
*/
@Data
@AllArgsConstructor
public class ApiRequest {
/**
* reqCode String 32 是 唯一请求号,保证每次请求不重复
* userCode String 32 是 操作人
*/
private String reqCode;
private String userCode;
private Object data;
}
package com.neotel.smfcore.hikvision_mobile.bean.response;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.language.util.MessageUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Locale;
@Data
public class ApiResponse {
/**
* reqCode 是 String 唯一请求号,与传入的参数reqCode保持一致
* code 是 String 结果码:0-成功,1~N-失败
* message 是 String 0:成功 1~N:失败原因
* data 选填 Json 返回的数据结构
*/
private String reqCode;
private Integer code;
private String message;
private Object data;
public static ApiResponse apiResponse(String reqCode, Integer code, Object data, String msgKey, String[] params, String defaultMsg) {
ApiResponse apiResponse = new ApiResponse();
apiResponse.setReqCode(reqCode);
apiResponse.setCode(code);
apiResponse.setMessage(MessageUtils.getText(msgKey, params, new Locale(SecurityUtils.getCurrentUserLanguage()), defaultMsg));
apiResponse.setData(data);
return apiResponse;
}
}
......@@ -445,13 +445,13 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
@Override
public void onTaskStatusChange(DataLog task) {
if(task.isFinished()){
/*if(task.isFinished()){
if(task.isPutInTask()){
checkInNotification(task);
}else{
deliverNotification(task);
}
}
}*/
}
/**
......
......@@ -2,9 +2,9 @@
spring:
data:
mongodb:
host: 10.1.129.59 # 主机地址
host: localhost # 主机地址
port: 27017 # 端口
database: hikvision # 数据库
database: smf # 数据库
minConSize: 1000
maxConSize: 2000
......
server:
port: 8800
hik:
inOutTaskUrl: http://meshz-uat.hikvision.com.cn:8000/hiscada/mesapi/mobileShelf/receiveTaskChange
machineId: NEO_SMF
authorization: 1211111111111
posChangeUrl: http://meshz-uat.hikvision.com.cn:8000/hiscada/mesapi/mobileShelfWM/receiveStorageChange
onOff: 1 #白盒接口预留开关,0是关闭 1是开启
# server: http://cloudapi-uat.hikvision.com.cn/api/
# baseCode: "8001"
# lgort: "M9142"
......@@ -93,7 +98,7 @@ spring:
mongodb:
host: localhost # 主机地址
port: 27017 # 端口
database: hikvision # 数据库
database: smf # 数据库
minConSize: 5
maxConSize: 5
......
......@@ -266,7 +266,7 @@ smfcore.order.noBind=\u64CD\u4F5C\u5931\u8D25\uFF0C\u8BF7\u5148\u4E3A\u5DE5\u535
#smfcore.order.out.short=\u5DE5\u5355\u51FA\u5E93\u5931\u8D25\uFF0C\u5DE5\u5355\u7F3A\u6599
#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=\u672A\u627E\u5230\u5E93\u4F4D:{0}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
#smfclient.nlp.outputOk={0}\u4ECE{1}\u51FA\u5E93\u6210\u529F
#smfclient.nlp.noOutTask=\u672A\u627E\u5230[{0}]\u7684\u51FA\u5E93\u4EFB\u52A1
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!