Commit f4f1beb5 孙克
2 个父辈 ad74ca3e 94964b9c
正在显示 35 个修改的文件 包含 1125 行增加21 行删除
...@@ -248,6 +248,11 @@ ...@@ -248,6 +248,11 @@
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.8</version>
</dependency>
</dependencies> </dependencies>
...@@ -290,6 +295,7 @@ ...@@ -290,6 +295,7 @@
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-resources-plugin</artifactId> <artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration> <configuration>
<encoding>utf-8</encoding> <encoding>utf-8</encoding>
<useDefaultDelimiters>false</useDefaultDelimiters> <useDefaultDelimiters>false</useDefaultDelimiters>
......
...@@ -130,6 +130,8 @@ public class MenuInit { ...@@ -130,6 +130,8 @@ public class MenuInit {
//电子看板 //电子看板
addDefaultFunctionMenu(1, boardMap, "仪表盘2", "eleckanban", "eleckanban/index", "kanban"); addDefaultFunctionMenu(1, boardMap, "仪表盘2", "eleckanban", "eleckanban/index", "kanban");
//SP仪表盘
addDefaultFunctionMenu(0, boardMap, "SP仪表盘", "spkanban", "kanban/spkanban/index", "kanban");
//设备看板 //设备看板
addDefaultFunctionMenu(1,null,"设备互联","lockMaterial", "lockMaterial/material/index","kanban",DEFAULT_SHOW_MENU); addDefaultFunctionMenu(1,null,"设备互联","lockMaterial", "lockMaterial/material/index","kanban",DEFAULT_SHOW_MENU);
......
...@@ -173,4 +173,10 @@ public class Constants { ...@@ -173,4 +173,10 @@ public class Constants {
*/ */
public static final String CACHE_closeWorkOrder = "CACHE_closeWorkOrder"; public static final String CACHE_closeWorkOrder = "CACHE_closeWorkOrder";
/**
* 料架自动灭灯时间(毫秒),默认8000秒
*/
public static final String CACHE_shelfDelayCloseTime = "CACHE_shelfDelayCloseTime";
} }
...@@ -180,7 +180,7 @@ public class HttpHelper { ...@@ -180,7 +180,7 @@ public class HttpHelper {
//httpClient.close(); //httpClient.close();
return responseContent; return responseContent;
} catch (Exception e) { } catch (Exception e) {
throw new ApiException("Request to [" + url + "] failed:" + e.getMessage()); throw new ApiException("Request to [" + url + "]["+requestBody+"] failed:" + e.getMessage());
} finally { } finally {
try { try {
if (response != null) { if (response != null) {
......
...@@ -2,9 +2,7 @@ package com.neotel.smfcore.core.api; ...@@ -2,9 +2,7 @@ package com.neotel.smfcore.core.api;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.init.MenuInit;
import com.neotel.smfcore.core.api.listener.ISmfApiListener; import com.neotel.smfcore.core.api.listener.ISmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode; import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.api.bean.CodeValidateParam; import com.neotel.smfcore.core.api.bean.CodeValidateParam;
...@@ -84,6 +82,8 @@ public class SmfApi { ...@@ -84,6 +82,8 @@ public class SmfApi {
@Value("${api.fetchOrderUrl:}") @Value("${api.fetchOrderUrl:}")
protected String fetchOrderUrl = ""; protected String fetchOrderUrl = "";
@Value("${api.deviceStatusUrl:}")
protected String deviceStatusUrl = "";
@PostConstruct @PostConstruct
public void init(){ public void init(){
...@@ -99,6 +99,7 @@ public class SmfApi { ...@@ -99,6 +99,7 @@ public class SmfApi {
fetchInListUrl = dataCache.getConfigCache("api.fetchInListUrl",fetchInListUrl); fetchInListUrl = dataCache.getConfigCache("api.fetchInListUrl",fetchInListUrl);
fetchOrderUrl = dataCache.getConfigCache("api.fetchOrderUrl",fetchOrderUrl); fetchOrderUrl = dataCache.getConfigCache("api.fetchOrderUrl",fetchOrderUrl);
loginCheckUrl=dataCache.getConfigCache("api.loginCheckUrl",loginCheckUrl); loginCheckUrl=dataCache.getConfigCache("api.loginCheckUrl",loginCheckUrl);
deviceStatusUrl=dataCache.getConfigCache("api.deviceStatusUrl",deviceStatusUrl);
} }
/** /**
...@@ -277,7 +278,22 @@ public class SmfApi { ...@@ -277,7 +278,22 @@ public class SmfApi {
} }
return null; return null;
} }
/**
* 设备状态变化是调用
* @return
* @throws ValidateException
*/
public boolean deviceStatusChanges(String[] cids,Integer[] status) throws ValidateException {
if (isUrlExist(deviceStatusUrl)) {
for (ISmfApiListener apiListener : apiListenerList) {
if (apiListener.isForThisApi(apiName)) {
return apiListener.deviceStatusChanges(deviceStatusUrl, cids, status);
}
}
}
return true;
}
public String getApiName(){ public String getApiName(){
return apiName; return apiName;
} }
......
...@@ -73,7 +73,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener { ...@@ -73,7 +73,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener {
return component; return component;
} }
protected Component resolveComponent(Barcode barcode){ protected Component resolveComponent(Barcode barcode){
return resolveComponent(barcode, COMPONENT_TYPE.COMPONENT); return resolveComponent(barcode, COMPONENT_TYPE.COMPONENT);
} }
@Override @Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task){ public void inTaskStatusChange(String inNotifyUrl, DataLog task){
...@@ -100,7 +100,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener { ...@@ -100,7 +100,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener {
} }
@Override @Override
public LiteOrder fetchOrder(String fetchOrderUrl, String orderNumber, String username){ public LiteOrder fetchOrder(String fetchOrderUrl, String orderNumber, String username) {
return null; return null;
} }
...@@ -110,7 +110,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener { ...@@ -110,7 +110,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener {
} }
@Override @Override
public DataLog canCheckOut(String outCheckUrl, DataLog dataLog) throws ValidateException{ public DataLog canCheckOut(String outCheckUrl, DataLog dataLog) throws ValidateException {
return null; return null;
} }
...@@ -120,7 +120,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener { ...@@ -120,7 +120,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener {
} }
@Override @Override
public InList fetchInList(String fetchInListUrl, String number){ public InList fetchInList(String fetchInListUrl, String number) {
return null; return null;
} }
protected String getData(Map<String, Object> dataMap, String dataKey) { protected String getData(Map<String, Object> dataMap, String dataKey) {
...@@ -131,7 +131,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener { ...@@ -131,7 +131,7 @@ public abstract class BaseSmfApiListener implements ISmfApiListener {
return data.toString(); return data.toString();
} }
} }
protected Integer getIntData(Map<String, Object> dataMap, String dataKey,Integer defValue) { protected Integer getIntData(Map<String, Object> dataMap, String dataKey, Integer defValue) {
try { try {
Object data = dataMap.get(dataKey); Object data = dataMap.get(dataKey);
if (data == null) { if (data == null) {
...@@ -147,4 +147,9 @@ public abstract class BaseSmfApiListener implements ISmfApiListener { ...@@ -147,4 +147,9 @@ public abstract class BaseSmfApiListener implements ISmfApiListener {
} }
return defValue; return defValue;
} }
@Override
public boolean deviceStatusChanges(String deviceStatusUrl, String[] cids,Integer[] status) {
return true;
}
} }
...@@ -72,4 +72,12 @@ public interface ISmfApiListener { ...@@ -72,4 +72,12 @@ public interface ISmfApiListener {
InList fetchInList(String fetchInListUrl, String number); InList fetchInList(String fetchInListUrl, String number);
/**
* 设备状态变化
* @param deviceStatusUrl
* @param cids
* @return
*/
boolean deviceStatusChanges(String deviceStatusUrl, String[] cids,Integer[] status );
} }
...@@ -855,16 +855,25 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -855,16 +855,25 @@ public class BaseDeviceHandler implements IDeviceHandler {
List<MsgInfo> mergeMsgList = statusBean.MsgDataProcess(); List<MsgInfo> mergeMsgList = statusBean.MsgDataProcess();
//判断是否刚刚上线 //判断是否刚刚上线
StatusBean bean = DevicesStatusUtil.getStatusBean(statusBean.getCid()); StatusBean bean = DevicesStatusUtil.getStatusBean(statusBean.getCid());
int preStatus=-1;
if (bean == null || bean.getBoxStatus() == null) { if (bean == null || bean.getBoxStatus() == null) {
DeviceMessageUtil.addOnlineMessage(statusBean.getCid(), "",statusBean.getClientIp()); DeviceMessageUtil.addOnlineMessage(statusBean.getCid(), "",statusBean.getClientIp());
DevicesStatusUtil.updateClientMsg(statusBean.getCid(),new ArrayList<>()); DevicesStatusUtil.updateClientMsg(statusBean.getCid(),new ArrayList<>());
} else if (bean.timeOut() && (bean.getOfflineTime() > -1)) { } else if (bean.timeOut() && (bean.getOfflineTime() > -1)) {
DeviceMessageUtil.addOnlineMessage(statusBean.getCid(), "",statusBean.getClientIp()); DeviceMessageUtil.addOnlineMessage(statusBean.getCid(), "",statusBean.getClientIp());
DevicesStatusUtil.updateClientMsg(statusBean.getCid(), new ArrayList<>()); DevicesStatusUtil.updateClientMsg(statusBean.getCid(), new ArrayList<>());
}else{
preStatus=statusBean.getStatus();
} }
if(ObjectUtil.isNotEmpty(mergeMsgList)&& mergeMsgList.size()>0) { if(ObjectUtil.isNotEmpty(mergeMsgList)&& mergeMsgList.size()>0) {
DevicesStatusUtil.updateClientMsg(statusBean.getCid(), mergeMsgList); DevicesStatusUtil.updateClientMsg(statusBean.getCid(), mergeMsgList);
} }
//状态变化
if(statusBean.getStatus()!=preStatus){
smfApi.deviceStatusChanges(new String[]{statusBean.getCid()},new Integer[]{statusBean.getStatus()});
}
// //判断是否刚刚上线 // //判断是否刚刚上线
// StatusBean bean = DevicesStatusUtil.getStatusBean(statusBean.getCid()); // StatusBean bean = DevicesStatusUtil.getStatusBean(statusBean.getCid());
// if (bean == null || bean.getBoxStatus() == null) { // if (bean == null || bean.getBoxStatus() == null) {
......
...@@ -5,6 +5,7 @@ import com.google.common.base.Strings; ...@@ -5,6 +5,7 @@ import com.google.common.base.Strings;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
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.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.barcode.bean.CodeBean; import com.neotel.smfcore.core.barcode.bean.CodeBean;
...@@ -169,10 +170,19 @@ public class NLMShelfHandler extends BaseDeviceHandler { ...@@ -169,10 +170,19 @@ public class NLMShelfHandler extends BaseDeviceHandler {
} }
log.info(str+":"+allOpStr); log.info(str+":"+allOpStr);
} }
private long GetCloseTime(long delayCloseTime){
Long closeTime= dataCache.getCache(Constants.CACHE_shelfDelayCloseTime);
if(closeTime==null||closeTime<=0){
closeTime=delayCloseTime;
dataCache.updateCache(Constants.CACHE_shelfDelayCloseTime,closeTime);
}
return closeTime;
}
/** /**
* 开灯, 等6秒后关闭 * 开灯, 等6秒后关闭
*/ */
private void openAndCloseLights(final Storage storage, final List<String> posNameList, final long delayCloseTime, String color) { private void openAndCloseLights(final Storage storage, final List<String> posNameList, final long delayCloseTime, String color) {
final String cid = storage.getCid(); final String cid = storage.getCid();
if (posNameList == null) { if (posNameList == null) {
return; return;
...@@ -183,7 +193,7 @@ public class NLMShelfHandler extends BaseDeviceHandler { ...@@ -183,7 +193,7 @@ public class NLMShelfHandler extends BaseDeviceHandler {
DevicesStatusUtil.appendOp(cid, "open", lightOnStr); DevicesStatusUtil.appendOp(cid, "open", lightOnStr);
allLightOnStr += lightOnStr + ","; allLightOnStr += lightOnStr + ",";
} }
log.info("[" + cid + "]点亮库位:" + allLightOnStr); log.info("[" + cid + "]点亮库位:" + allLightOnStr+",["+delayCloseTime+"]毫秒后自动灭灯");
//5秒后灭灯 //5秒后灭灯
Thread closeTask = new Thread(new Runnable() { Thread closeTask = new Thread(new Runnable() {
...@@ -234,7 +244,7 @@ public class NLMShelfHandler extends BaseDeviceHandler { ...@@ -234,7 +244,7 @@ public class NLMShelfHandler extends BaseDeviceHandler {
if (currentStorage == null || !currentStorage.isNLMShelf()) { if (currentStorage == null || !currentStorage.isNLMShelf()) {
return ResultBean.newErrorResult(1, "smfcore.shelf.nlm.notFound", "未找到移动料架{0}",new String[]{storageId}); return ResultBean.newErrorResult(1, "smfcore.shelf.nlm.notFound", "未找到移动料架{0}",new String[]{storageId});
} }
StoragePos lastPutinPos = lastPutinPosMap.get(currentStorage.getId()); StoragePos lastPutinPos = lastPutinPosMap.get(currentStorage.getCid());
if (lastPutinPos != null) { if (lastPutinPos != null) {
log.info("扫码时关闭上一个库位:" + lastPutinPos.getPosName()); log.info("扫码时关闭上一个库位:" + lastPutinPos.getPosName());
opPosLight("close", currentStorage, lastPutinPos, ""); opPosLight("close", currentStorage, lastPutinPos, "");
...@@ -347,7 +357,7 @@ public class NLMShelfHandler extends BaseDeviceHandler { ...@@ -347,7 +357,7 @@ public class NLMShelfHandler extends BaseDeviceHandler {
} }
} }
} }
int delayCloseTime = 8000; long delayCloseTime = GetCloseTime(8000) ;
String color = "red"; String color = "red";
if (pos != null) { if (pos != null) {
log.info(barcode.getPartNumber() + " [ " + barcode.getBarcode() + " ] " + "入库到:" + currentStorage.getName() + "[" + currentStorage.getCid() + "] " + pos.getPosName()); log.info(barcode.getPartNumber() + " [ " + barcode.getBarcode() + " ] " + "入库到:" + currentStorage.getName() + "[" + currentStorage.getCid() + "] " + pos.getPosName());
......
package com.neotel.smfcore.core.device.handler.impl;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
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.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 io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
@Api(tags = "SHELF: NLSM(推荐库位钢网料架)")
@Slf4j
@Service
public class NLSMShelfHandler extends BaseDeviceHandler{
@Override
public DeviceType getDeviceType() {
return DeviceType.NLSM;
}
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost());
handleMsg(statusBean);
statusBean = saveAlarmAndHumidity(statusBean);
OrderSetting orderSetting = dataCache.getOrderSetting();
boolean openZhiYin = orderSetting.getShelfLightType().equals(1);
Map<String, List<DataLog>> outMap = new HashMap<>();
if (statusBean != null) {
String cid = statusBean.getCid();
List<DataLog> finishedTasks = taskService.getFinishedTasks();
for (DataLog finishedTask : finishedTasks) {
if(finishedTask.getCid().equals(cid) && finishedTask.isCheckOutTask() && finishedTask.isCancel()){
//取消的任务,需要关灯
taskService.removeFinishedTask(finishedTask);
statusBean.addData("close",finishedTask.getPosName());
}
}
Map<String, String> opMap = DevicesStatusUtil.getAndRemoveOp(statusBean.getCid());
statusBean.addOp(opMap);
}
//亮灯
Collection<DataLog> queueTasks = taskService.getQueueTasks(statusBean.getCid());
for (DataLog queueTask : queueTasks) {
if (queueTask.isWait()) {
queueTask.setStatus(OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(queueTask);
String rgb = queueTask.getLightColor();
ORDER_COLOR color = ORDER_COLOR.fromRgb(rgb);
if (color == null) {
// if(queueTask.isPutInTask()){
// color = ORDER_COLOR.DARKGREEN;
// }else{
if (openZhiYin && ObjectUtil.isNotEmpty(queueTask.getSourceId())) {
List<DataLog> dataLogList = outMap.get(queueTask.getSourceId());
if (dataLogList == null) {
dataLogList = new ArrayList<>();
}
dataLogList.add(queueTask);
outMap.put(queueTask.getSourceId(), dataLogList);
} else {
color = ORDER_COLOR.BLUE;
}
// }
}
// statusBean.addData("open",queueTask.getPosName()+"="+color.name());
addMergeData(statusBean, queueTask, "open", color.name());
log.info("库位[" + queueTask.getPosName() + "]+亮灯:" + color.name());
}
}
List<DataLog> dataLogs = getLightGuideTask(outMap,statusBean.getCid());
for (DataLog task :
dataLogs) {
// statusBean.addData("open", task.getPosName() + "=" + ORDER_COLOR.fromRgb(task.getLightColor()).name());
if (StringUtils.isBlank(task.getLightColor())){
task.setLightColor(ORDER_COLOR.BLUE.getRgb());
}
String color = ORDER_COLOR.fromRgb(task.getLightColor()).name();
addMergeData(statusBean, task, "open", color);
}
return statusBean;
}
private StatusBean addMergeData(StatusBean statusBean, DataLog task, String opKey,String color){
StoragePos pos=storagePosManager.getByPosName(task.getPosName());
if(pos!=null){
List<String> relatedPosNames = pos.getMergePosList();
if(relatedPosNames == null || relatedPosNames.isEmpty()){
relatedPosNames = new ArrayList<>();
relatedPosNames.add(pos.getPosName());
// log.info("操作库位["+pos.getPosName()+"]" + opKey);
}else{
// log.info("操作合并库位["+pos.getPosName()+"]" + opKey);
}
for(String posName : relatedPosNames){
statusBean.addData(opKey,posName+"="+color);
}
}
return statusBean;
}
}
...@@ -4,7 +4,7 @@ import com.neotel.smfcore.core.storage.enums.DeviceType; ...@@ -4,7 +4,7 @@ import com.neotel.smfcore.core.storage.enums.DeviceType;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Api(tags = "SHELF: NLS(钢网料架)") @Api(tags = "SHELF: NLS(扫码钢网料架)")
@Slf4j @Slf4j
public class NLSShelfHandler extends NLShelfHandler{ public class NLSShelfHandler extends NLShelfHandler{
......
...@@ -135,14 +135,20 @@ public enum DeviceType { ...@@ -135,14 +135,20 @@ public enum DeviceType {
NLL("storage.type.nll"), NLL("storage.type.nll"),
/** /**
* 22 钢网料架 NLS * 22 扫码钢网料架 NLS
*/ */
NLS("storage.type.nls"), NLS("storage.type.nls"),
/** /**
* 23 SMD_MIMO_G2 * 23 SMD_MIMO_G2
*/ */
SMD_MIMO_G2("storage.type.smdMimoG2") SMD_MIMO_G2("storage.type.smdMimoG2"),
/**
* 24 推荐库位钢网料架 NLSM
*/
NLSM("storage.type.nlsm"),
; ;
private String key; private String key;
...@@ -164,6 +170,6 @@ public enum DeviceType { ...@@ -164,6 +170,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,VIRTUAL,NL,NLP,NLM,NLL,NLS,SMDBOX_THIRD,SMD_MIMO_G2); return Lists.newArrayList(AUTO,LINE,BATCH,SOLDERPASTE,VERTICALBOX,SMD_XL,SMD_DUO,SMD_XLC,SMD_XLR,VIRTUAL,NL,NLP,NLM,NLL,NLS,NLSM,SMDBOX_THIRD,SMD_MIMO_G2);
} }
} }
...@@ -162,7 +162,7 @@ public class Storage extends BasePo implements Serializable { ...@@ -162,7 +162,7 @@ public class Storage extends BasePo implements Serializable {
* 是否是移动料架 * 是否是移动料架
*/ */
public boolean isNLMShelf() { public boolean isNLMShelf() {
return DeviceType.NLM.name().equals(type); return DeviceType.NLM.name().equals(type)||DeviceType.NLSM.name().equals(type);
} }
/** /**
* 是否是垂直货柜 * 是否是垂直货柜
......
...@@ -6,6 +6,7 @@ import com.google.common.collect.Maps; ...@@ -6,6 +6,7 @@ import com.google.common.collect.Maps;
import com.neotel.smfcore.common.init.MenuInit; import com.neotel.smfcore.common.init.MenuInit;
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.api.SmfApi;
import com.neotel.smfcore.core.dashboard.bean.dto.box.MesInfoDto; import com.neotel.smfcore.core.dashboard.bean.dto.box.MesInfoDto;
import com.neotel.smfcore.core.device.bean.MsgInfo; import com.neotel.smfcore.core.device.bean.MsgInfo;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
...@@ -45,6 +46,14 @@ public class DevicesStatusUtil { ...@@ -45,6 +46,14 @@ public class DevicesStatusUtil {
DevicesStatusUtil.menuInit = init; DevicesStatusUtil.menuInit = init;
} }
private static SmfApi smfApi;
@Autowired
private void setSmfApi(SmfApi init) {
DevicesStatusUtil.smfApi = init;
}
/** /**
* 状态 map,key为 cid value 为状态 Bean * 状态 map,key为 cid value 为状态 Bean
*/ */
...@@ -292,6 +301,7 @@ public class DevicesStatusUtil { ...@@ -292,6 +301,7 @@ public class DevicesStatusUtil {
if (bean.getOfflineTime() == -1 && bean.timeOut()) { if (bean.getOfflineTime() == -1 && bean.timeOut()) {
bean.setOfflineTime(System.currentTimeMillis()); bean.setOfflineTime(System.currentTimeMillis());
DeviceMessageUtil.addOfflineMessage(bean.getCid(), ""); DeviceMessageUtil.addOfflineMessage(bean.getCid(), "");
smfApi.deviceStatusChanges(new String[]{bean.getCid()},new Integer[]{-1});
} }
} }
} }
......
package com.neotel.smfcore.custom.hanwha.client;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
@Slf4j
public class MyWebSocketClient extends WebSocketClient {
private WsMsgReceivedListener msgReceivedListener; // 消息接收监听器
public MyWebSocketClient(URI serverUri, WsMsgReceivedListener listener) {
super(serverUri);
this.msgReceivedListener =listener;
}
@Override
public void onOpen(ServerHandshake serverHandshake) {
log.info("onOpen ");
log.info((new Date().toString()) + "connect webSServer ok ");
cancelReconnect();
if(msgReceivedListener!=null) {
msgReceivedListener.onOpen();
}
}
@Override
public void onMessage(String s) {
log.info("onMessage: "+s);
if(msgReceivedListener!=null){
msgReceivedListener.onMsgReceived(s);
}
}
@Override
public void onClose(int i, String s, boolean b) {
log.info("onClose: code:{} reason:{} {}", i, s, b);
startReconnect();
}
@Override
public void onError(Exception e) {
log.error("web socket client onerror :"+e.toString());
//关闭后重新连接
try {
close();
}catch (Exception ex){
log.error("web socket client onerror close error:"+e.toString());
}
startReconnect();
}
private static final long RECONNECT_DELAY = 5000; // 重连延迟时间,单位:毫秒
private Timer reconnectTimer; // 重连定时器
private void startReconnect() {
try {
if (reconnectTimer == null) {
reconnectTimer = new Timer();
reconnectTimer.schedule(new TimerTask() {
@Override
public void run() {
try {
log.info("startReconnect ");
// 创建新的WebSocket连接
reconnect();
} catch (Exception e) {
log.error("出错:" + e.toString());
}
}
}, RECONNECT_DELAY);
}
} catch (Exception exception) {
log.error("startReconnect error :" + exception.toString());
}
}
private void cancelReconnect() {
try{
if (reconnectTimer != null) {
log.info("cancelReconnect ");
reconnectTimer.cancel();
reconnectTimer = null;
}
}catch (Exception exception){
log.error("cancelReconnect error :"+exception.toString());
}
}
// private void reconnect() throws URISyntaxException {
// URI serverUri = super.getURI();
// MyWebSocketClient newClient = new MyWebSocketClient(serverUri);
// newClient.connect();
// }
}
package com.neotel.smfcore.custom.hanwha.client;
public interface WsMsgReceivedListener {
void onMsgReceived(String message);
void onOpen();
}
package com.neotel.smfcore.custom.hanwha.controller;
public class HanwhaController {
}
package com.neotel.smfcore.custom.hanwha.handler;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.api.bean.CodeValidateParam;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.custom.hanwha.handler.bean.TMSPart;
import com.neotel.smfcore.custom.hanwha.handler.bean.TMSPartReelPos;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class HanwhaApiHandler extends BaseSmfApiListener {
//配置說明
// api:
// name: hanwha
// inCheckUrl: webservice/RequestGetPartInfo
// outNotifyUrl: webservice/RequestSyncPartReelPosInfo
// inNotifyUrl: webservice/RequestSyncPartReelPosInfo
// deviceStatusUrl: webservice/RequestUpdateStorageConnectionInfo
//
// hanwha:
// host: 127.0.0.1
// webPort: 18189
// apiPort: 8374
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("hanwha")&& TMSCommunicator.isEnable();
}
@Autowired
private TMSApis tmsApis;
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
if (task.isFinished()) {
if (task.isPutInTask()) {
List<TMSPartReelPos> list = new ArrayList<>();
TMSPartReelPos bean = TMSPartReelPos.newBean(task.getPartNumber(), task.getBarcode(), task.getNum(), task.getCid(), task.getPosName(), 1, task.getUpdateDate().getTime(), -1);
list.add(bean);
log.info("barcode["+task.getBarcode()+"],pn["+task.getPartNumber()+"],posName["+task.getPosName()+"]入库完成,调用 RequestSyncPartReelPosInfo");
tmsApis.RequestSyncPartReelPosInfo(0, list);
}
}
}
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
if (task.isFinished()) {
if (task.isCheckOutTask()) {
List<TMSPartReelPos> list = new ArrayList<>();
TMSPartReelPos bean = TMSPartReelPos.newBean(task.getPartNumber(), task.getBarcode(), task.getNum(), task.getCid(), task.getPosName(), 2, -1, task.getUpdateDate().getTime());
list.add(bean);
log.info("barcode[" + task.getBarcode() + "],pn[" + task.getPartNumber() + "],posName[" + task.getPosName() + "]出库完成,调用 RequestSyncPartReelPosInfo");
tmsApis.RequestSyncPartReelPosInfo(0, list);
}
}
}
@Override
public Barcode canPutInAfterResolve(String inCheckUrl, CodeValidateParam params, Barcode barcode) throws ValidateException {
log.info("barcode[" + barcode.getBarcode() + "] 准备入库,调用 RequestGetPartInfo");
List<TMSPart> result = tmsApis.RequestGetPartInfo(0, barcode.getFullCode());
if (result.size() > 0) {
String pn = result.get(0).getPartName();
String code = result.get(0).getReelCode();
boolean needS = false;
if (ObjectUtil.isNotEmpty(pn)) {
barcode.setPartNumber(pn);
needS = true;
}
if (ObjectUtil.isNotEmpty(code)) {
barcode.setBarcode(code);
needS = true;
}
int count = result.get(0).getResponseCount();
if (count > 0) {
barcode.setAmount(count);
needS = true;
}
if (needS) {
log.info("barcode[" + barcode.getBarcode() + "] 准备入库,调用 RequestGetPartInfo ,更改pn=[" + barcode.getPartNumber() + "],code=[" + barcode.getBarcode() + "],count=[" + barcode.getAmount() + "]");
barcodeManager.saveBarcode(barcode);
}
}
return barcode;
}
@Override
public boolean deviceStatusChanges(String deviceStatusUrl, String[] cids,Integer[] statusList ) {
log.info("deviceStatusChanges ,设备状态变化["+ JsonUtil.toJsonStr(cids) +"],["+ JsonUtil.toJsonStr(statusList) +"],通知TMS");
UpdateStorageConnectionInfo(cids,statusList);
return true;
}
public void UpdateStorageConnectionInfo(String[] cids,Integer[] statusList) {
if (!TMSCommunicator.isEnable()) {
return;
}
List<String> storageIds = new ArrayList<>();
List<String> storageTypes = new ArrayList<>();
List<Integer> isConns = new ArrayList<>();
int i = 0;
for (String cid : cids) {
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
continue;
}
String type = "Storage";
if (storage.isNLShelf() || storage.isNLPShelf() || storage.isNLMShelf() || storage.isShelf()) {
type = "Rack";
}
int status = -1;
if (statusList != null && statusList.length > i) {
status = statusList[i];
} else {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut()) {
status = -1;
} else {
status = bean.getStatus();
}
}
String conCode = TMS_Code.CODE_1020;
if (status <= 0) {
//初始化失败
conCode = TMS_Code.CODE_0002;
} else if (status == 1) {
conCode = TMS_Code.CODE_1020;
} else if (status <= 4) {
//报警
conCode = TMS_Code.CODE_1024;
} else if (status == 5) {
conCode = TMS_Code.CODE_1023;
} else {
//忙碌
conCode = TMS_Code.CODE_1010;
}
storageIds.add(storage.getCid());
storageTypes.add(type);
isConns.add(Integer.parseInt(conCode));
i++;
}
if (storageIds.size() > 0) {
tmsApis.RequestUpdateStorageConnectionInfo(0, storageIds, storageTypes, isConns);
}
}
}
package com.neotel.smfcore.custom.hanwha.handler;
public class TMS_Code {
/**
* 0000 OK
*/
public static final String CODE_0000 = "0000";
// Code 内容
/**
* 0001 Failed (exception etc) 失败(异常等)
*/
public static final String CODE_0001 = "0001";
/**
* 0002 Delivery initialization failed. (Rack stand-by fail) 传输初始化失败。(机架待机失败)
*/
public static final String CODE_0002 = "0002";
/**
* 0003 Failed by alarm
*/
public static final String CODE_0003 = "0003";
/**
* 0004 Already processing for the same request.
*/
public static final String CODE_0004 = "0004";
/**
* 0100 Waiting for the DeliveryOrder request. (DeliveryReservation has requested and ready to deliver)
*/
public static final String CODE_0100 = "0100";
/**
* 0101 DeliveryReservation cancelled
*/
public static final String CODE_0101 = "0101";
/**
* 1010 Delivery started 开始送货
*/
public static final String CODE_1010 = "1010";
/**
* 1011 Error while starting the delivery. (Delivery got cancelled and state goes to normal operation mode) 开始配送时出错。(送货被取消,状态转为正常运行模式)
*/
public static final String CODE_1011 = "1011";
/**
* 1012 Delivery finished.
*/
public static final String CODE_1012 = "1012";
/**
* 1020 Idle state. (normal operation mode and can get the requests) (正常运行模式,可以接收请求)
*/
public static final String CODE_1020 = "1020";
/**
* 1021 Delivering
*/
public static final String CODE_1021 = "1021";
/**
* 1022 In the process of position request
*/
public static final String CODE_1022 = "1022";
/**
* 1023 Boot-up state 启动状态
*/
public static final String CODE_1023 = "1023";
/**
* 1024 Rack raised Alarm 机架报警
*/
public static final String CODE_1024 = "1024";
/**
* 2001 Part not enough
*/
public static final String CODE_2001 = "2001";
/**
* 2002 Out of part
*/
public static final String CODE_2002 = "2002";
/**
* 2003 Registered part but not on the rack
*/
public static final String CODE_2003 = "2003";
/**
* 2010 Waiting for the delivery(reserved)
*/
public static final String CODE_2010 = "2010";
/**
* 2011 Delivering
*/
public static final String CODE_2011 = "2011";
/**
* 2012 Delivery cancelled
*/
public static final String CODE_2012 = "2012";
/**
* 2013 Delivery finished
*/
public static final String CODE_2013 = "2013";
/**
* 2014 Cannot cancel the delivery (already start delivery)
*/
public static final String CODE_2014 = "2014";
/**
* 2015 Removed from the Rack
*/
public static final String CODE_2015 = "2015";
/**
* 2016 Delivery finished in abnormal state
*/
public static final String CODE_2016 = "2016";
/**
* 2017 Delivery deleted
*/
public static final String CODE_2017 = "2017";
/**
* 2018 Can NOT deliver because it is not reserved
*/
public static final String CODE_2018 = "2018";
/**
* 2019 Failure while Delivering 在交付时失败
*/
public static final String CODE_2019 = "2019";
/**
* 2020 Already cancelled
*/
public static final String CODE_2020 = "2020";
/**
* 2021 Delivery started in abnormal state because of Rack issue 因机架问题在异常状态下开始交付
*/
public static final String CODE_2021 = "2021";
/**
* 2022 Rack have problem while Delivering送货时机架出现问题
*/
public static final String CODE_2022 = "2022";
/**
* 2040 Failed to start the delivery (General Rack issue)无法开始交付(一般机架问题)
*/
public static final String CODE_2040 = "2040";
/**
* 2041 Failed to start the delivery (Sync issue) 无法开始交付(同步问题)
*/
public static final String CODE_2041 = "2041";
/**
* 2042 Failed to start the delivery (H/W check issue) 无法开始交付(硬件/软件检查问题)
*/
public static final String CODE_2042 = "2042";
/**
* 2043 Failed to Start/Stop delivery. (because of other job)
*/
public static final String CODE_2043 = "2043";
/**
* 2044 Failed to Start/Stop delivery. (because of system error, exception)
*/
public static final String CODE_2044 = "2044";
/**
* 2045 Rack is initializing
*/
public static final String CODE_2045 = "2045";
/**
* 2050 The reels are already on the rack. (When restocked)
*/
public static final String CODE_2050 = "2050";
// Code 내용
//0000 OK
//0001 Failed (exception etc)
//0002 Delivery initialization failed. (Rack stand-by fail)
// 0003 Failed by alarm
//0004 Already processing for the same request.
//0100 Waiting for the DeliveryOrder request. (DeliveryReservation has requested and ready to deliver)
// 0101 DeliveryReservation cancelled
//1010 Delivery started
//1011 Error while starting the delivery. (Delivery got cancelled and state goes to normal operation mode)
// 1012 Delivery finished.
// 1020 Idle state. (normal operation mode and can get the requests)
// 1021 Delivering
//1022 In the process of position request
// 1023 Boot-up state
//1024 Rack raised Alarm
//2001 Part not enough
//2002 Out of part
//2003 Registered part but not on the rack
//2010 Waiting for the delivery(reserved)
//2011 Delivering
//2012 Delivery cancelled
//2013 Delivery finished
//2014 Cannot cancel the delivery (already start delivery)
//2015 Removed from the Rack
//2016 Delivery finished in abnormal state
//2017 Delivery deleted
//2018 Can NOT deliver because it is not reserved
//2019 Failure while Delivering
//2020 Already cancelled
//2021 Delivery started in abnormal state because of Rack issue
//2022 Rack have problem while Delivering
//2040 Failed to start the delivery (General Rack issue)
//2041 Failed to start the delivery (Sync issue)
//2042 Failed to start the delivery (H/W check issue)
//2043 Failed to Start/Stop delivery. (because of other job)
// 2044 Failed to Start/Stop delivery. (because of system error, exception)
// 2045 Rack is initializing
//2050 The reels are already on the rack. (When restocked
//
// 代码 내용
//0000 确定
//0001 失败(异常等)
// 0002 输送初始化失败。(机架备用失败)
// 0003 因警报而失败
//0004 已在处理同一请求。
// 0100 等待交货订单请求。(已请求并
// 准备交付)
// 0101 已取消交货预约
//1010 开始送货
//1011 开始配送时出错。(送货被取消,状态转为正常运行模式)。
// 运行模式)。
// 1012 送货结束。
// 1020 闲置状态。
// (正常运行模式,可接收请求)
// 1021 发送
//1022 定位请求中
//17
// 1023 启动状态
//1024 机架报警
//2001 部件不足
//2002 无部件
//2003 已登记部件但不在机架上
//2010 等待交货(保留)
// 2011 发货
//2012 取消交货
//2013 发货完成
//2014 无法取消交货(已开始交货)
// 2015 从货架移除
//2016 在异常状态下完成交付
//2017 已删除交付
//2018 因未预订而无法交付
//2019 在交付时失败
//2020 已取消
//2021 因机架问题在异常状态下开始交付
//2022 送货时机架出现问题
//2040 无法开始交付(一般机架问题)
// 2041 无法开始交付(同步问题)
// 2042 无法开始交付(硬件/软件检查问题)
// 2043 启动/停止递送失败。(因为其他任务)
//
// 通过www.DeepL.com/Translator(免费版)翻译
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class TMSDockingCartInfo implements Serializable {
private String cartCd = "";
private String cartNm = "";
private int cartSlotCount = 0;
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class TMSOrderCodeInfo implements Serializable {
private int planID = 0;
private String modelNm ="";
private String date ="" ;
private int quantity = 0;
private String lineCd ;
private String userNm ="";
private String userID ="";
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TMSPart extends TMSPos implements Serializable {
private int index = 0;
private String partName = "";
private String reelCode = "";
private int requestCount = 0;
private int responseCount = 0;
private String resultCode = "";
public static TMSPart newBean(String pn,String barcode,int requestCount,int responseCount,String resultCode,String cid,String posName ) {
TMSPart bean = new TMSPart();
bean.setPartName(pn);
bean.setReelCode(barcode);
bean.setRequestCount(requestCount);
bean.setResponseCount(responseCount);
bean.setRackID(cid);
bean.setPosName(posName);
bean.setResultCode(resultCode);
return bean;
}
@Override
public Map<String,Object> getJson(){
Map<String, Object> dataMap2 = new HashMap<>();
dataMap2.put("Index", index);
dataMap2.put("PartName", getPartName());
dataMap2.put("ReelCode", getReelCode());
dataMap2.put("RequestCount", getRequestCount());
dataMap2.put("ResponseCount", getResponseCount());
dataMap2.put("ResultCode", getResultCode());
return dataMap2;
}
public Map<String,Object> getAJson() {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("Index", index);
dataMap.put("PartName", getPartName());
dataMap.put("RequestCount", getRequestCount());
dataMap.put("ResponseCount", getResponseCount());
dataMap.put("ResultCode", getResultCode());
dataMap.put("ReelCode", getReelCode());
dataMap.put("RackID", getRackID());
dataMap.put("RowID", getRowID());
dataMap.put("ColID", getColID());
return dataMap;
}
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import com.neotel.smfcore.common.utils.DateUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Data
@Slf4j
public class TMSPartReelPos extends TMSPos implements Serializable {
private String partName;
private String reelCode;
private int count;
/**
* 1: Part inserted to the rack
* 2: Part removed from the rack
* 4: When the Rack initializes
*/
private int flag = 0;
private int state = 0;
//yyyy-MM-dd HH:mm:ss
private String indate;
private String outdate;
public TMSPartReelPos()
{
setCount(-1);
setRackID("");
setRowID("");
setColID("");
setIndate("");
setOutdate("");
}
@Override
public Map<String,Object> getJson() {
Map<String, Object> map = new HashMap<>();
map.put("PartName", getPartName());
map.put("ReelCode", getReelCode());
map.put("RackID", getRackID());
map.put("Count", getCount());
map.put("RowID", getRowID());
map.put("ColID", getColID());
map.put("Flag", getFlag());
map.put("Indate", getIndate());
map.put("Outdate", getOutdate());
return map;
}
public static TMSPartReelPos newBean(String pn,String barcode,int count,String cid,String posName,int flag,long inTime,long outTime) {
TMSPartReelPos bean = new TMSPartReelPos();
bean.setPartName(pn);
bean.setReelCode(barcode);
bean.setCount(count);
bean.setRackID(cid);
bean.setFlag(flag);
bean.setState(0);
bean.setPosName(posName);
String format="yyyy-MM-dd HH:mm:ss";
if (inTime > 0) {
String inStr = DateUtil.toDateString(new Date(inTime),format);
bean.setIndate(inStr);
}
if (outTime > 0) {
String outStr = DateUtil.toDateString(new Date(outTime),format);
bean.setOutdate(outStr);
}
return bean;
}
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
public class TMSPartReelStatus extends TMSPart implements Serializable {
private String ReserveCode = "";
private boolean TowerLamp = false;
@Override
public Map<String,Object> getJson() {
Map<String, Object> map = new HashMap<>();
map.put("ReserveCode", getReserveCode());
map.put("index", getIndex());
map.put("PartName", getPartName());
map.put("ReelCode", getReelCode());
map.put("RequestCount", getRequestCount());
map.put("ResponseCount", getResponseCount());
map.put("RackID", getRackID());
map.put("RowID", getRowID());
map.put("ColID", getColID());
map.put("ResultCode", getResultCode());
map.put("TowerLamp", isTowerLamp());
return map;
}
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
@Slf4j
public class TMSPos implements Serializable {
private String RackID;
private String RowID;
private String ColID;
public Map<String,Object> getJson()
{
Map<String,Object> jObject = new HashMap<>();
jObject.put("RackID", RackID);
jObject.put("RowID", RowID);
jObject.put("ColID", ColID);
return jObject;
}
public String getPosName(){
return getRowID()+"_"+getColID();
}
public void setPosName(String posName){
if(ObjectUtil.isEmpty(posName)){
setColID("");
setRowID("");
return;
}
//posName=rowId_colId
int index=posName.indexOf('_');
if(index>0){
setRowID(posName.substring(0,index-1));
setColID(posName.substring(index+1,posName.length()-1));
}
// String[] posArray = posName.split("_");
// if (posArray.length >= 2) {
// try {
// setColID(posArray[posArray.length - 1]);
// setRowID(posArray[posArray.length - 2]);
// } catch (Exception ex) {
// log.error("解析位置的行列失败 " + posName + "," + ex.toString());
// }
// }
}
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@Data
public class TMSRackStatus extends TMSPos implements Serializable {
private int Flag = 0;
private String Indate;
private String Outdate;
public TMSRackStatus() {
setRackID("");
setRowID("");
setColID("");
setIndate("");
setOutdate("");
}
public Map<String, Object> getJson() {
Map<String, Object> jObject = new HashMap<>();
jObject.put("RackID", getRackID());
jObject.put("RowID", getRowID());
jObject.put("ColID", getColID());
jObject.put("Flag", Flag);
jObject.put("Indate", Indate);
jObject.put("Outdate", Outdate);
return jObject;
}
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
public class TMSReserve implements Serializable {
private String ReserveCode = "";
private String Date = "";
private String ResultCode = "";
private List<TMSPart> PartList;
public TMSReserve()
{
PartList = new ArrayList<>();
}
}
package com.neotel.smfcore.custom.hanwha.handler.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TMSResultMsg implements Serializable {
private int result = 1;
private String resultMsg = "";
}
...@@ -384,4 +384,5 @@ smfcore.neoai=Neo Ai ...@@ -384,4 +384,5 @@ smfcore.neoai=Neo Ai
smfcore.duo.offline=\u8BBE\u5907{0}\u79BB\u7EBF smfcore.duo.offline=\u8BBE\u5907{0}\u79BB\u7EBF
smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25 smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728 smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728
smfcore.order.finished=\u5DE5\u5355[{0}]\u7684\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210
\ No newline at end of file \ No newline at end of file
smfcore.order.finished=\u5DE5\u5355[{0}]\u7684\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210
smfcore.spkanban=SP\u4EEA\u8868\u76D8
\ No newline at end of file \ No newline at end of file
...@@ -375,4 +375,5 @@ smfcore.neoai=Neo Ai ...@@ -375,4 +375,5 @@ smfcore.neoai=Neo Ai
smfcore.duo.offline=Equipment {0} offline smfcore.duo.offline=Equipment {0} offline
smfcore.msg.op.fail=failure of an operation smfcore.msg.op.fail=failure of an operation
smfcore.equip.notExist=Device does not exist smfcore.equip.notExist=Device does not exist
smfcore.order.finished=workorder[{0}] has completed all of its tasks
\ No newline at end of file \ No newline at end of file
smfcore.order.finished=workorder[{0}] has completed all of its tasks
smfcore.spkanban=SP Dash Board
\ No newline at end of file \ No newline at end of file
...@@ -371,4 +371,5 @@ smfcore.neoai=Neo Ai ...@@ -371,4 +371,5 @@ smfcore.neoai=Neo Ai
smfcore.duo.offline=\u8BBE\u5907{0}\u79BB\u7EBF smfcore.duo.offline=\u8BBE\u5907{0}\u79BB\u7EBF
smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25 smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728 smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728
smfcore.order.finished=\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC[{0}]\u306E\u30BF\u30B9\u30AF\u306F\u3059\u3079\u3066\u5B8C\u4E86\u3057\u307E\u3057\u305F
\ No newline at end of file \ No newline at end of file
smfcore.order.finished=\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC[{0}]\u306E\u30BF\u30B9\u30AF\u306F\u3059\u3079\u3066\u5B8C\u4E86\u3057\u307E\u3057\u305F
smfcore.spkanban=\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9
\ No newline at end of file \ No newline at end of file
...@@ -371,4 +371,5 @@ smfcore.neoai=Neo Ai ...@@ -371,4 +371,5 @@ smfcore.neoai=Neo Ai
smfcore.duo.offline=\u8BBE\u5907{0}\u79BB\u7EBF smfcore.duo.offline=\u8BBE\u5907{0}\u79BB\u7EBF
smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25 smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728 smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728
smfcore.order.finished=\u5DE5\u5355[{0}]\u7684\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210
\ No newline at end of file \ No newline at end of file
smfcore.order.finished=\u5DE5\u5355[{0}]\u7684\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210
smfcore.spkanban=SP\u4EEA\u8868\u76D8
\ No newline at end of file \ No newline at end of file
...@@ -371,4 +371,5 @@ smfcore.neoai=Neo Ai ...@@ -371,4 +371,5 @@ smfcore.neoai=Neo Ai
smfcore.duo.offline=\u8A2D\u5099{0}\u96E2\u7DDA smfcore.duo.offline=\u8A2D\u5099{0}\u96E2\u7DDA
smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u6557 smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u6557
smfcore.equip.notExist=\u8A2D\u5099\u4E0D\u5B58\u5728 smfcore.equip.notExist=\u8A2D\u5099\u4E0D\u5B58\u5728
smfcore.order.finished=\u5DE5\u55AE[{0}]\u7684\u4EFB\u52D9\u5DF2\u5168\u90E8\u5B8C\u6210
\ No newline at end of file \ No newline at end of file
smfcore.order.finished=\u5DE5\u55AE[{0}]\u7684\u4EFB\u52D9\u5DF2\u5168\u90E8\u5B8C\u6210
smfcore.spkanban=SP\u5100\u9336\u76E4
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!