Commit 85ab06b6 LN

通用版本其他设备功能。

1 个父辈 a528e691
正在显示 33 个修改的文件 包含 1309 行增加147 行删除
package com.neotel.smfcore.core.device.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.system.util.EquipStatusUtil;
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.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@Api(tags = "视频控制")
public class VideoController {
@ApiOperation("图片上传接口,客户端调用")
@PostMapping(value = "/service/video/upload")
@ResponseBody
@AnonymousAccess
public ResultBean upload(@RequestBody Map<String, String> params) {
try {
String cid = params.get("cid");
String img = params.get("img");
updateVideo(cid,img);
if(params.size()>2){
Map<String, String> data=new HashMap<>();
for (String key :params.keySet()){
if(key.equals("cid")||key.equals("img")){
continue;
}
data.put(key, params.get(key));
}
if(data.size()>0){
EquipStatusUtil.updateData(cid,data);
}
}
} catch (Exception e) {
log.error("出错:", e);
return ResultBean.newErrorResult(-1, "", "");
}
return ResultBean.newOkResult("ok");
}
@ApiOperation("图片获取接口,smf调用")
@PostMapping(value = "/service/video/downloading")
@ResponseBody
@AnonymousAccess
public ResultBean downloading(@RequestBody Map<String, String> params) {
try {
String cid = params.get("cid");
String value = getVideo(cid);
return ResultBean.newOkResult(value);
} catch (Exception e) {
log.error("出错:", e);
return ResultBean.newErrorResult(-1, "", "");
}
}
public static String getVideo(String cid) {
String value = videoMap.getOrDefault(cid, "");
if (ObjectUtil.isEmpty(value) && videoMap.size() > 0) {
//默认查找cid_1的视频
String nCid=cid+"_1";
value = videoMap.getOrDefault(nCid, "");
// List<String> keylist = new ArrayList<>(videoMap.keySet());
// Collections.sort(keylist);
// for (String key :
// keylist) {
// if (key.startsWith(cid)) {
// value = videoMap.getOrDefault(key, "");
// }
// }
}
return value;
}
public static void updateVideo(String cid, String img) {
if (videoMap.containsKey(cid)) {
videoMap.remove(cid);
}
videoMap.put(cid, img);
}
public static Map<String, String> videoMap = new HashMap<>();
}
package com.neotel.smfcore.core.device.util;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.equipment.service.manager.IEquipmentManager;
import com.neotel.smfcore.core.equipment.service.po.Equipment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Repository
public class EquipmentCache {
@Autowired
private IEquipmentManager equipmentManager;
/**
* 所有的料仓 key 为 cid, value 为 Storage
*/
private static Map<String, Equipment> allEquipment = new ConcurrentHashMap<>();
public Map<String, Equipment> getAllEquipment(){
if(allEquipment.isEmpty()){
synchronized (allEquipment){
if(allEquipment.isEmpty()){
List<Equipment> all = equipmentManager.findAll();
if(all != null){
Map<String, Equipment> map = new ConcurrentHashMap<>();
for(Equipment equipment : all){
map.put(equipment.getCid(), equipment);
}
allEquipment = map;
log.info("加载所有料仓["+all.size()+"]信息到缓存");
}
}
}
}
return allEquipment;
}
public Equipment getEquipment(String cid){
if(Strings.isNullOrEmpty(cid)){
return null;
}
return getAllEquipment().get(cid);
}
public Equipment getEquipmentById(String id){
for(Equipment equipment : getAllEquipment().values()){
if(equipment.getId().equals(id)){
return equipment;
}
}
return null;
}
public Equipment getEquipmentByName(String name){
for(Equipment equipment : getAllEquipment().values()){
if(equipment.getName().equals(name)){
return equipment;
}
}
return null;
}
public Equipment reloadEquipment(Equipment equipment,String oldCid) throws ValidateException {
if (!oldCid.equals("") && allEquipment.containsKey(oldCid)) {
allEquipment.remove(oldCid);
}
equipment = equipmentManager.save(equipment);
allEquipment.put(equipment.getCid(), equipment);
return equipment;
}
public void removeEquipment(Equipment equipment) {
if (equipment.getCid() != null) {
if (allEquipment.containsKey(equipment.getCid())) {
allEquipment.remove(equipment.getCid());
log.info("从缓存中删除设备:" + equipment.getCid() + "_" + equipment.getName());
}
}
}
public Equipment autoCreateEquip(String cid, String type) {
//判断cid存在
Equipment equipment = null;
equipment = getEquipment(cid);
if (equipment != null) {
return equipment;
}
//判断cid是否和其他料仓名称重复,重复时无法自动创建
if (getEquipmentByName(cid) != null) {
return null;
}
equipment = new Equipment();
equipment.setCid(cid);
equipment.setType(type);
equipment.setName(cid);
equipment = equipmentManager.save(equipment);
reloadEquipment(equipment, "");
log.info("AutoCreateEquip :自动创建设备完成:cid["+equipment.getCid()+"]name["+equipment.getName()+"]type["+equipment.getType() +"]");
return equipment;
}
}
...@@ -2,13 +2,17 @@ package com.neotel.smfcore.core.equipment.bean; ...@@ -2,13 +2,17 @@ package com.neotel.smfcore.core.equipment.bean;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
import java.util.Locale; import java.util.Locale;
@ToString @ToString
@Data @Data
@AllArgsConstructor
@NoArgsConstructor
public class EquipMsg { public class EquipMsg {
/** /**
* 设备模块 * 设备模块
......
...@@ -17,6 +17,11 @@ public class EquipStatusBean implements Serializable { ...@@ -17,6 +17,11 @@ public class EquipStatusBean implements Serializable {
private String cid; private String cid;
/** /**
* 设备名称
*/
private String name;
/**
* 设备类型 ,NEOSCAN=扫码贴标,COUNTING=点料机 * 设备类型 ,NEOSCAN=扫码贴标,COUNTING=点料机
*/ */
private String type = EquipmentType.AUTO.name(); private String type = EquipmentType.AUTO.name();
...@@ -40,10 +45,30 @@ public class EquipStatusBean implements Serializable { ...@@ -40,10 +45,30 @@ public class EquipStatusBean implements Serializable {
/** /**
* 仅显示的日志消息集合
*/
private List<EquipMsg> showLogs = new ArrayList<>();
/**
* 发上来的数据 * 发上来的数据
*
* NS200定义:
* key=tPCount,value=今天已打印数量
* key=tNGCount,value=今天NG数量
* key=MES,value=MES最后一次对接信息:格式参考NsMesInfo
*
* key=inShelfStatus ,value=入口料串状态:
* key=outShelfStatus ,value=出口料串状态:
*/ */
private Map<String, Object> data = new HashMap<>(); private Map<String, Object> data = new HashMap<>();
// 料串状态定义 IDLE=空闲;
// LOADING=入库中;
// UNLOADING=出库中;
// NEED_EMPTY=需要空料串出库;
// EMPTY_OUT=空料串需要取走
// FULL_OUT=满料串需要取走
/** /**
* 离线时间,用于判断是否已经处理过离线 * 离线时间,用于判断是否已经处理过离线
*/ */
...@@ -87,7 +112,10 @@ public class EquipStatusBean implements Serializable { ...@@ -87,7 +112,10 @@ public class EquipStatusBean implements Serializable {
} }
public void addData(String key, String value) { public void addData(String key, String value) {
String oldValue = data.get(key).toString(); String oldValue = "";
if (data.get(key) != null){
oldValue = data.get(key).toString();
}
String valueStr = value; String valueStr = value;
if (!Strings.isNullOrEmpty(oldValue)) { if (!Strings.isNullOrEmpty(oldValue)) {
valueStr = valueStr + "|" + oldValue; valueStr = valueStr + "|" + oldValue;
...@@ -95,14 +123,28 @@ public class EquipStatusBean implements Serializable { ...@@ -95,14 +123,28 @@ public class EquipStatusBean implements Serializable {
data.put(key, valueStr); data.put(key, valueStr);
} }
public EquipMsg getMsgByType(String type){ public EquipMsg getMsgByType(String type) {
for (EquipMsg msg : getMsgList()){ if (msgList != null && !msgList.isEmpty()) {
if(msg.getType().equals(type)){ for (EquipMsg msg : msgList) {
return msg; if (msg.getType().equals(type)) {
return msg;
}
} }
} }
return null; return null;
} }
public String getShowMsg(Locale locale){
MessageType[] types=new MessageType[]{MessageType.ERROR,MessageType.WARNING,MessageType.INFO,MessageType.SHOW };
for (MessageType type :
types) {
EquipMsg showMsg= getMsgByType(type.name());
if(showMsg!=null){
return showMsg.getShowMsg(locale);
}
}
return "";
}
} }
package com.neotel.smfcore.core.equipment.enums; package com.neotel.smfcore.core.equipment.enums;
import com.google.common.collect.Lists;
import java.util.List;
/** /**
* 设备类型(非料仓) * 设备类型(非料仓)
*/ */
...@@ -11,12 +15,73 @@ public enum EquipmentType { ...@@ -11,12 +15,73 @@ public enum EquipmentType {
AUTO(), AUTO(),
/** /**
* 1 扫码贴标 * 扫码贴标
*/ */
@Deprecated
NEOSCAN(), NEOSCAN(),
NS100(),
/**
* NS200
*/
NS200(),
/**
* 点料机
*/
// COUNTING(),
NEOCOUNTER(),
/**
* 插件机
*/
NEOSTATION(),
// /**
// * 4 FUJINEOLINK
// */
// FUJINEOLINK(),
/**
* 5 PANACIMNEOLINK
*/
PANACIMNEOLINK(),
/**
* 6 AGV
*/
AGV(),
/**
* 韩华
*/
T_SOLUTION(),
/** /**
* 2 点料机 * NEXIM
*/ */
COUNTING() NEXIM();
public static List<EquipmentType> availableTypeList(){
return Lists.newArrayList(AUTO,NS100,NS200,NEOCOUNTER,PANACIMNEOLINK,AGV,T_SOLUTION,NEXIM);
}
public static List<String> apiTypeList(){
return Lists.newArrayList(T_SOLUTION.name(),PANACIMNEOLINK.name(),NEXIM.name());
}
public static List<String> nsList(){
return Lists.newArrayList(NS100.name(),NS200.name());
}
public static List<String> neoCounterList(){
return Lists.newArrayList(NEOCOUNTER.name());
}
} }
package com.neotel.smfcore.core.equipment.handler.impl; package com.neotel.smfcore.core.equipment.handler.impl;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.agv.util.AgvCache;
import com.neotel.smfcore.core.equipment.bean.EquipMsg; import com.neotel.smfcore.core.equipment.bean.EquipMsg;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean; import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.equipment.enums.EquipmentType; import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.handler.IEquipmentHandler; import com.neotel.smfcore.core.equipment.handler.IEquipmentHandler;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.system.bean.MesInfoDto;
import com.neotel.smfcore.core.system.util.EquipStatusUtil; import com.neotel.smfcore.core.system.util.EquipStatusUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -19,6 +21,15 @@ public class BaseEquipHandler implements IEquipmentHandler { ...@@ -19,6 +21,15 @@ public class BaseEquipHandler implements IEquipmentHandler {
statusBean.setClientIp(request.getRemoteHost()); statusBean.setClientIp(request.getRemoteHost());
handleMsg(statusBean); handleMsg(statusBean);
//处理AGV调度
if (statusBean.getType().equals(EquipmentType.AGV.name())){
boolean callAgv = AgvCache.getCallAgv();
if (callAgv){
statusBean.addData("call","1");
} else {
statusBean.addData("call","0");
}
}
return statusBean; return statusBean;
} }
/** /**
...@@ -58,11 +69,23 @@ public class BaseEquipHandler implements IEquipmentHandler { ...@@ -58,11 +69,23 @@ public class BaseEquipHandler implements IEquipmentHandler {
} }
} }
if (newMsg) { if (newMsg) {
DeviceMessageUtil.addDeviceMessage(statusBean.getCid(), msg.getType(), msg.getModule(), msg.getMsgCode(), msg.getMsg(), msg.getMsgParams(),"",""); DeviceMessageUtil.addDeviceMessage(statusBean.getCid(), msg.getType(), msg.getModule(), msg.getMsgCode(), msg.getMsg(), msg.getMsgParams());
} }
} }
} }
} }
if(statusBean.getData().containsKey("MES")) {
try {
MesInfoDto mesInfo = (MesInfoDto) statusBean.getData().get("MES");
if(mesInfo!=null){
EquipStatusUtil.updateNsMesInfo(statusBean.getCid(),mesInfo);
}
} catch (Exception ex) {
log.error(""+ex);
}
}
EquipStatusUtil.updateStatusBean(statusBean); EquipStatusUtil.updateStatusBean(statusBean);
} catch (Exception e) { } catch (Exception e) {
......
package com.neotel.smfcore.core.equipment.rest; package com.neotel.smfcore.core.equipment.rest;
import com.neotel.smfcore.core.device.util.EquipmentCache; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.equipment.util.EquipmentCache;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean; import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.equipment.enums.EquipmentType; import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.handler.IEquipmentHandler; import com.neotel.smfcore.core.equipment.handler.IEquipmentHandler;
...@@ -41,15 +44,34 @@ public class EquipCommunicationController { ...@@ -41,15 +44,34 @@ public class EquipCommunicationController {
public EquipStatusBean communication(@RequestBody final EquipStatusBean statusBean, HttpServletRequest request) { public EquipStatusBean communication(@RequestBody final EquipStatusBean statusBean, HttpServletRequest request) {
try { try {
String cid = statusBean.getCid(); String cid = statusBean.getCid();
String name = statusBean.getName();
Equipment equipment = equipmentCache.getEquipment(cid); Equipment equipment = equipmentCache.getEquipment(cid);
if (equipment == null) { if (equipment == null) {
equipment = equipmentCache.autoCreateEquip(cid, statusBean.getType()); equipment = equipmentCache.autoCreateEquip(name,cid, statusBean.getType());
if (equipment != null) { if (equipment != null) {
log.error("设备cid: [" + cid + "]不存在,自动创建设备完成"); log.error("设备cid: [" + cid + "]不存在,自动创建设备完成");
} else { } else {
log.error("设备cid: [" + cid + "]不存在,自动创建设备失败"); log.error("设备cid: [" + cid + "]不存在,自动创建设备失败");
return null; return null;
} }
/*log.info("设备cid: [" + cid + "]不存在");
return null;*/
} else {
if (StringUtils.isNotBlank(name)) {
if (!name.equals(equipment.getName())) {
log.info("自动修改设备 cid[" + equipment.getCid() + "] name[" + equipment.getName() + "] 的名字为=" + name);
equipment.setName(name);
equipment = equipmentCache.reloadEquipment(equipment, equipment.getCid());
}
}
String type = statusBean.getType();
if (ObjectUtil.isNotEmpty(type)) {
if (!type.equals(equipment.getType())) {
log.info("自动修改设备 cid[" + equipment.getCid() + "] type [" + equipment.getType() + "] 的类型为=" + type);
equipment.setType(type);
equipment = equipmentCache.reloadEquipment(equipment, equipment.getCid());
}
}
} }
synchronized (equipment) { synchronized (equipment) {
String deviceType = equipment.getType(); String deviceType = equipment.getType();
...@@ -67,4 +89,27 @@ public class EquipCommunicationController { ...@@ -67,4 +89,27 @@ public class EquipCommunicationController {
return statusBean; return statusBean;
} }
@ApiOperation("设备客户端定时通信接口")
@GetMapping(value = "/service/equipment/remove")
@ResponseBody
@AnonymousAccess
public ResultBean removeEquip(String cid) {
try {
Equipment equipment = equipmentCache.getEquipment(cid);
if (equipment == null) {
return ResultBean.newErrorResult(-1, "", "未找到设备");
} else {
log.info("删除设备:" + equipment.getCid() + "_" + equipment.getName());
equipmentCache.removeEquipment(equipment);
return ResultBean.newOkResult("OK");
}
} catch (Exception e) {
log.error("", e);
return ResultBean.newErrorResult(-1, "", e.toString());
}
}
} }
package com.neotel.smfcore.core.equipment.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.rest.dto.EquipConfigInfoDto;
import com.neotel.smfcore.core.equipment.rest.mapstruct.EquipConfigInfoMapper;
import com.neotel.smfcore.core.equipment.util.EquipConfigUtil;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
//import com.neotel.smfcore.custom.hanwha.handler.TMSApis;
//import com.neotel.smfcore.custom.hanwha.handler.TMSCommunicator;
import com.neotel.smfcore.custom.panacim.PanaApiController;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/equipConfig")
public class EquipConfigController {
@Autowired
private EquipConfigInfoMapper equipConfigInfoMapper;
@Autowired
private EquipConfigUtil equipConfigUtil;
@Autowired
private PanaApiController panaApiController;
// @Autowired
// private TMSApis tmsApis;
//
// @Autowired
// private TMSCommunicator tmsCommunicator;
@ApiOperation("获取配置信息")
@GetMapping("/getConfig")
public ResultBean getCacheConfig(String equipType) {
EquipConfigInfo configInfo= equipConfigUtil.getConfigCache(equipType);
return ResultBean.newOkResult(equipConfigInfoMapper.toDto(configInfo));
}
@ApiOperation("更改配置信息")
@PostMapping("/updateConfig")
public ResultBean updateConfig(@RequestBody EquipConfigInfo cacheConfig) {
if (ObjectUtil.isEmpty(cacheConfig.getEquipType())) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"equipType"});
}
equipConfigUtil.updateConfigCache(cacheConfig);
return ResultBean.newOkResult("");
}
@ApiOperation("测试接口是否连通")
@PostMapping("/apiTest")
public ResultBean apiTest(@RequestBody EquipConfigInfoDto configInfoDto) {
if (ObjectUtil.isEmpty(configInfoDto.getEquipType())) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"equipType"});
}
//判断测试哪个接口
boolean result = false;
// if (configInfoDto.equipType.equals(EquipmentType.T_SOLUTION.name())) {
//
// EquipConfigInfo config = equipConfigInfoMapper.toEntity(configInfoDto);
// String ip = config.GetConfigValue("host", "");
// if (ObjectUtil.isEmpty(ip)) {
// return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"host"});
// }
// if (configInfoDto.apiTestKey.equals("webPort")) {
// int webPort = config.GetConfigValue("webPort", 0);
// String webUrl = String.format("ws://%s:%d/", ip, webPort);
//
// if (ObjectUtil.isEmpty(webPort) || webPort == 0) {
// return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"webPort"});
// }
// if (TMSCommunicator.wsURL.equals(webUrl)) {
// result = tmsCommunicator.isConnected();
// } else {
// result = tmsApis.TestWebSocket(ip, webPort);
// }
// } else if (configInfoDto.apiTestKey.equals("host")) {
// result = HttpHelper.pingIP(ip, 1000);
// } else {
// int apiPort = config.GetConfigValue("apiPort", 0);
// if (ObjectUtil.isEmpty(apiPort) || apiPort == 0) {
// return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"apiPort"});
// }
// result = tmsApis.TestApi(ip, apiPort);
// }
//
//
// } else if (configInfoDto.equipType.equals(EquipmentType.PANACIMNEOLINK.name())) {
//
// if (configInfoDto.apiTestKey.equals(Constants.Cache_PanaCIMIP)) {
// result = panaApiController.TestIp(1000);
// } else {
// result = panaApiController.TestApi();
// }
//
// }
if (result) {
return ResultBean.newOkResult("OK");
} else {
return ResultBean.newErrorResult(-1, "smfcore.equipconfig.connectTimeout", "连接超时");
}
}
}
package com.neotel.smfcore.core.equipment.rest; package com.neotel.smfcore.core.equipment.rest;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import com.neotel.smfcore.core.equipment.rest.dto.EquipmentDto;
import com.neotel.smfcore.core.equipment.rest.mapstruct.EquipmentMapper;
import com.neotel.smfcore.core.equipment.rest.query.EquipmentQueryCriteria;
import com.neotel.smfcore.core.equipment.service.manager.IEquipmentManager;
import com.neotel.smfcore.core.equipment.service.po.Equipment;
import com.neotel.smfcore.core.equipment.util.EquipmentCache;
import com.neotel.smfcore.core.storage.rest.dto.StorageDto;
import com.neotel.smfcore.core.storage.rest.query.StorageQueryCriteria;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController; import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Slf4j @Slf4j
@RestController @RestController
...@@ -12,4 +42,180 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -12,4 +42,180 @@ import org.springframework.web.bind.annotation.RestController;
@Api(tags = "设备管理(非料仓)") @Api(tags = "设备管理(非料仓)")
@RequestMapping("api/equipment") @RequestMapping("api/equipment")
public class EquipmentController { public class EquipmentController {
@Autowired
private IEquipmentManager equipmentManager;
@Autowired
private EquipmentMapper equipmentMapper;
@Autowired
private EquipmentCache equipmentCache;
@ApiOperation("查询非料仓设备")
@GetMapping
//@AnonymousAccess
public PageData<EquipmentDto> query(EquipmentQueryCriteria criteria, Pageable pageable){
Query query= QueryHelp.getQuery(criteria);
PageData<Equipment> pages = equipmentManager.findByPage(query, pageable);
List<EquipmentDto> equipmentDtos =equipmentMapper.toDto(pages.getContent());
for (int i=0;i<equipmentDtos.size();i++){
if(EquipmentType.apiTypeList().contains(equipmentDtos.get(i).getType())){
equipmentDtos.get(i).setAPIEquip(true);
}
}
return new PageData(equipmentDtos,pages.getTotalElements());
}
@ApiOperation("新增非料仓")
@PostMapping
//@AnonymousAccess
public ResponseEntity<Object> create(@Validated @RequestBody EquipmentDto equipmentDto) {
Equipment equipment = equipmentMapper.toEntity(equipmentDto);
if(StringUtils.isEmpty(equipment.getName())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"name"} );
} if(StringUtils.isEmpty(equipment.getCid())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"cid"} );
} if(StringUtils.isEmpty(equipment.getType())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"type"} );
}
for (Equipment equ : equipmentCache.getAllEquipment().values()) {
if (!equipment.getId().equals(equ.getId())){
if(equipment.getName().equals(equ.getName())){
throw new ValidateException("smfcore.valueAlreadyExist","{0}[{1}]已存在",new String[]{"name",equipment.getName()});
}
if(equipment.getCid().equals(equ.getCid())){
throw new ValidateException("smfcore.valueAlreadyExist","{0}[{1}]已存在",new String[]{"cid",equipment.getCid()});
}
}
}
if(equipment.isAPIEquip()){
equipment.setActivate(false);
}else{
equipment.setActivate(true);
}
equipment = equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment,equipment.getCid());
return new ResponseEntity<>(HttpStatus.CREATED);
}
@ApiOperation("修改非料仓")
@PutMapping
//@AnonymousAccess
public ResponseEntity<Object> update(@Validated @RequestBody EquipmentDto equipmentDto) {
Equipment equipment=equipmentMapper.toEntity(equipmentDto);
if (StringUtils.isEmpty(equipment.getId())) {
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"ID"} );
}
if(StringUtils.isEmpty(equipment.getName())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"name"} );
} if(StringUtils.isEmpty(equipment.getCid())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"cid"} );
} if(StringUtils.isEmpty(equipment.getType())){
throw new ValidateException("smfcore.valueCanotNull","{0}不能为空",new String[]{"type"} );
}
String oldCid="";
for (Equipment equ : equipmentCache.getAllEquipment().values()) {
if (!equipment.getId().equals(equ.getId())){
if(equipment.getName().equals(equ.getName())){
throw new ValidateException("smfcore.valueAlreadyExist","{0}[{1}]已存在",new String[]{"name",equipment.getName()});
}
if(equipment.getCid().equals(equ.getCid())){
throw new ValidateException("smfcore.valueAlreadyExist","{0}[{1}]已存在",new String[]{"cid",equipment.getCid()});
}
}else{
oldCid=equ.getCid();
}
}
if(ObjectUtil.isEmpty(oldCid)){
oldCid=equipment.getCid();
}
equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment,oldCid);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("删除非料仓设备")
@DeleteMapping
//@AnonymousAccess
public ResponseEntity<Object> delete(@RequestBody Set<String> ids) {
for (String id : ids) {
if (id == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"ID"});
}
}
for (String id : ids) {
Equipment equipment = equipmentManager.get(id);
if (equipment == null){
continue;
}
equipmentCache.removeEquipment(equipment);
equipmentManager.deleteById(id);
log.info(SecurityUtils.getLoginUsername()+"手动删除设备[{}]",equipment.getName());
}
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("返回所有非料仓类型")
@GetMapping(value = "/typeList")
//@AnonymousAccess
public List<String> typeList() {
List<EquipmentType> availableTypeList= EquipmentType.availableTypeList();
List<String> allList=new ArrayList<>();
for (EquipmentType type :
availableTypeList) {
allList.add(type.name());
}
return allList;
}
@RequestMapping(value = "/activation")
@AnonymousAccess
public ResultBean activation( @RequestParam String cid) {
Criteria c = Criteria.where("cid").is(cid);
List<Equipment> equipmentList = equipmentManager.findByQuery(new Query(c));
if (equipmentList == null || equipmentList.size() < 0) {
return ResultBean.newErrorResult(1, "smfcore.msg.noCid", "操作失败,未找到CID");
}
Equipment equipment = equipmentList.get(0);
if (equipment.isActivate()) {
return ResultBean.newOkResult("OK");
}
equipment.setActivate(true);
equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment, equipment.getCid());
log.info("设备cid=" + cid + ", equipType=" + equipment.getType() + " setActivate(true)成功");
return ResultBean.newOkResult("OK");
}
@RequestMapping(value = "/deactivation")
@AnonymousAccess
public ResultBean deactivation( @RequestParam String cid) {
Criteria c = Criteria.where("cid").is(cid);
List<Equipment> equipmentList = equipmentManager.findByQuery(new Query(c));
if (equipmentList == null || equipmentList.size() < 0) {
return ResultBean.newErrorResult(1, "smfcore.msg.noCid", "操作失败,未找到CID");
}
Equipment equipment = equipmentList.get(0);
if(!equipment.isAPIEquip()){
return ResultBean.newErrorResult(1, "smfcore.operationFailure", "操作失败");
}
if (!equipment.isActivate()) {
return ResultBean.newOkResult("OK");
}
equipment.setActivate(false);
equipmentManager.save(equipment);
equipmentCache.reloadEquipment(equipment, equipment.getCid());
log.info("设备cid=" + cid + ", equipType=" + equipment.getType() + " setActivate(false)成功");
return ResultBean.newOkResult("OK");
}
} }
package com.neotel.smfcore.core.equipment.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.LinkedHashMap;
@Data
public class EquipConfigInfoDto {
@ApiModelProperty("设备类型")
public String equipType = "";
@ApiModelProperty("启用API连接 默认不启用")
public boolean enableApi;
@ApiModelProperty("配置列表")
public LinkedHashMap<String, Object> apiConfigMap;
@ApiModelProperty("测试连接的Key")
public String apiTestKey;
}
package com.neotel.smfcore.core.equipment.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@AllArgsConstructor
public class EquipGroupDto {
@ApiModelProperty("组名称")
private String groupName;
@ApiModelProperty("设备列表")
private List<EquipStatusDto> equipList;
// @ApiModelProperty("ID")
// private String groupId;
// @ApiModelProperty("组类型:=1时点击组名称进入料架分组界面")
// private int groupType;
}
\ No newline at end of file \ No newline at end of file
package com.neotel.smfcore.core.equipment.rest.dto;
import com.neotel.smfcore.core.kanban.rest.bean.dto.GroupStatusDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EquipKanbanDto {
@ApiModelProperty("组列表")
private List<EquipGroupDto> groupList;
}
package com.neotel.smfcore.core.equipment.rest.dto;
import com.neotel.smfcore.core.equipment.enums.EquipmentType;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EquipStatusDto implements Serializable {
@ApiModelProperty("ID")
private String id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("CID")
private String cid;
@ApiModelProperty("是否在线")
private boolean onLine=false;
@ApiModelProperty("设备状态,0=离线,1=正常运行中, 2=急停")
private int status=0;
@ApiModelProperty("文字显示")
private String msg = "";
@ApiModelProperty("设备类型,NEOSCAN=扫码贴标,COUNTING=点料机")
private String type = EquipmentType.AUTO.name();
@ApiModelProperty("是否激活")
private boolean activate = false;
}
...@@ -20,4 +20,10 @@ public class EquipmentDto { ...@@ -20,4 +20,10 @@ public class EquipmentDto {
@ApiModelProperty("是否可用") @ApiModelProperty("是否可用")
private boolean available = true; private boolean available = true;
@ApiModelProperty("是否激活")
private boolean activate=true;
@ApiModelProperty("是否是第三方对接设备")
private boolean aPIEquip=false;
private String id;
} }
package com.neotel.smfcore.core.equipment.rest.dto;
import com.neotel.smfcore.core.equipment.bean.EquipMsg;
import com.neotel.smfcore.core.system.bean.MesInfoDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class NsViewDto implements Serializable {
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("CID")
private String cid;
@ApiModelProperty("设备状态,0=离线,1=正常运行中, 2=急停")
private int status=0;
@ApiModelProperty("文字显示")
private String msg = "";
@ApiModelProperty("Mes信息")
private MesInfoDto mesInfo = null;
@ApiModelProperty("agv通信信息")
private MesInfoDto agvInfo = null;
@ApiModelProperty("仅显示的日志消息集合")
private List<EquipMsg> showLogs = new ArrayList<>();
/**
* 发上来的数据
*
* NS200定义:
* key=tPCount,value=今天已打印数量
* key=tNGCount,value=今天NG数量
* key=MES,value=MES最后一次对接信息:格式参考NsMesInfo
*/
private Map<String, Object> data = new HashMap<>();
/**
* NS打印数据
*/
private Map<String, String> printData = new HashMap<>();
}
package com.neotel.smfcore.core.equipment.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.equipment.rest.dto.EquipConfigInfoDto;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface EquipConfigInfoMapper extends BaseMapper<EquipConfigInfoDto, EquipConfigInfo> {
}
package com.neotel.smfcore.core.equipment.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.equipment.rest.dto.EquipmentDto;
import com.neotel.smfcore.core.equipment.service.po.Equipment;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface EquipmentMapper extends BaseMapper<EquipmentDto, Equipment> {
}
package com.neotel.smfcore.core.equipment.rest.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class EquipmentQueryCriteria {
@QueryCondition(blurry = "name,cid")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "updateDate")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> createDate;
}
...@@ -7,4 +7,6 @@ import java.util.List; ...@@ -7,4 +7,6 @@ import java.util.List;
public interface IEquipmentManager extends IBaseManager<Equipment> { public interface IEquipmentManager extends IBaseManager<Equipment> {
List<Equipment> findAll(); List<Equipment> findAll();
void deleteById(String id);
} }
...@@ -50,4 +50,9 @@ public class EquipmentManagerImpl implements IEquipmentManager { ...@@ -50,4 +50,9 @@ public class EquipmentManagerImpl implements IEquipmentManager {
public List<Equipment> findAll(){ public List<Equipment> findAll(){
return equipmentDao.findAll(); return equipmentDao.findAll();
} }
@Override
public void deleteById(String id) {
equipmentDao.removeOneById(id);
}
} }
...@@ -26,4 +26,26 @@ public class Equipment extends BasePo implements Serializable { ...@@ -26,4 +26,26 @@ public class Equipment extends BasePo implements Serializable {
* 是否可用 * 是否可用
*/ */
private boolean available = true; private boolean available = true;
/**
* 是否激活
*/
private boolean activate=true;
public boolean isNEOSCAN() {
return EquipmentType.NEOSCAN.name().equals(type)||EquipmentType.NS200.name().equals(type)||EquipmentType.NS100.name().equals(type);
}
/**
* 是否是接口设备
* @return
*/
public boolean isAPIEquip() {
if(EquipmentType.apiTypeList().contains(type)){
return true;
}
return false;
}
} }
...@@ -25,5 +25,7 @@ public enum MessageType { ...@@ -25,5 +25,7 @@ public enum MessageType {
/** /**
* 4 需要人员立即操作的 * 4 需要人员立即操作的
*/ */
CRITICAL CRITICAL,
SHOW
} }
...@@ -39,6 +39,19 @@ public class Message extends BasePo implements Serializable { ...@@ -39,6 +39,19 @@ public class Message extends BasePo implements Serializable {
Message message=new Message(deviceName,deviceId,module, type,msgCode,msg,msgParams,null,null,"",alarmType,alarmCode); Message message=new Message(deviceName,deviceId,module, type,msgCode,msg,msgParams,null,null,"",alarmType,alarmCode);
return message; return message;
} }
public boolean sameMas(Message msg){
if(deviceName.equals(msg.getDeviceName())
&&deviceId.equals(msg.getDeviceId())
&&module.equals(msg.getModule())
&&type.equals(msg.getType())
&&getMsg().equals(msg.getMsg())
&&(ObjectUtil.isEmpty(msgCode)|| msgCode.equals(msg.getMsgCode()))
){
return true;
}
return false;
}
/** /**
* 设备名称 * 设备名称
*/ */
......
...@@ -3,7 +3,7 @@ package com.neotel.smfcore.core.message.util; ...@@ -3,7 +3,7 @@ package com.neotel.smfcore.core.message.util;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.core.device.bean.StatusBean; import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.device.util.EquipmentCache; import com.neotel.smfcore.core.equipment.util.EquipmentCache;
import com.neotel.smfcore.core.equipment.service.po.Equipment; import com.neotel.smfcore.core.equipment.service.po.Equipment;
import com.neotel.smfcore.core.language.util.MessageUtils; import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.message.enums.MessageType; import com.neotel.smfcore.core.message.enums.MessageType;
...@@ -14,17 +14,16 @@ import com.neotel.smfcore.core.message.util.bean.DeviceInfo; ...@@ -14,17 +14,16 @@ import com.neotel.smfcore.core.message.util.bean.DeviceInfo;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -37,8 +36,6 @@ public class DeviceMessageUtil { ...@@ -37,8 +36,6 @@ public class DeviceMessageUtil {
private static IMessageManager messageManager; private static IMessageManager messageManager;
private static Boolean onlyReport = false;
@Autowired @Autowired
public void setDataCache(DataCache dataCache) { public void setDataCache(DataCache dataCache) {
DeviceMessageUtil.dataCache = dataCache; DeviceMessageUtil.dataCache = dataCache;
...@@ -51,9 +48,6 @@ public class DeviceMessageUtil { ...@@ -51,9 +48,6 @@ public class DeviceMessageUtil {
public void setMessageManager(IMessageManager messageManager) { public void setMessageManager(IMessageManager messageManager) {
DeviceMessageUtil.messageManager = messageManager; DeviceMessageUtil.messageManager = messageManager;
} }
@Value("${menu.onlyReport:}")
public void setOnlyReport(Boolean onlyReport){DeviceMessageUtil.onlyReport=onlyReport;}
/** /**
* 流水线提示消息,只保存最后一条 * 流水线提示消息,只保存最后一条
...@@ -79,7 +73,7 @@ public class DeviceMessageUtil { ...@@ -79,7 +73,7 @@ public class DeviceMessageUtil {
private static DeviceInfo getDeviceName(String cid) { private static DeviceInfo getDeviceName(String cid) {
Storage storage = dataCache.getStorage(cid); Storage storage = dataCache.getStorage(cid);
if (storage != null) { if (storage != null) {
return new DeviceInfo(storage.getId(),storage.getName(),storage.getCid()); return new DeviceInfo(storage.getId(),storage.getName(),storage.getCid());
} }
Equipment equipment = equipmentCache.getEquipment(cid); Equipment equipment = equipmentCache.getEquipment(cid);
if(equipment!=null){ if(equipment!=null){
...@@ -89,6 +83,23 @@ public class DeviceMessageUtil { ...@@ -89,6 +83,23 @@ public class DeviceMessageUtil {
} }
public static void addDeviceMessage(String cid,String msgType, String moudle, String msgCode, String msg, String[] msgParam) {
DeviceInfo deviceInfo=getDeviceName(cid);
if (deviceInfo!=null) {
String code=msgCode;
if(ObjectUtil.isNotEmpty(msgCode)){
if(!msgCode.startsWith(MessageUtils.smfcore)){
code=MessageUtils.smfcore+"."+msgCode;
}
}
Message message=Message.newMsg(msgType ,deviceInfo.getName(), deviceInfo.getId(), moudle, code,msg,msgParam);
boolean result=msgNeedSave(message);
if(result){
messageManager.save(message);
}
// messageManager.save(message);
}
}
public static void addDeviceMessage(String cid,String msgType, String moudle, String msgCode, String msg, String[] msgParam,String almType,String almCode) { public static void addDeviceMessage(String cid,String msgType, String moudle, String msgCode, String msg, String[] msgParam,String almType,String almCode) {
DeviceInfo deviceInfo=getDeviceName(cid); DeviceInfo deviceInfo=getDeviceName(cid);
if (deviceInfo!=null) { if (deviceInfo!=null) {
...@@ -98,9 +109,12 @@ public class DeviceMessageUtil { ...@@ -98,9 +109,12 @@ public class DeviceMessageUtil {
code=MessageUtils.smfcore+"."+msgCode; code=MessageUtils.smfcore+"."+msgCode;
} }
} }
Message message=Message.newMsg(msgType ,deviceInfo.getName(), deviceInfo.getId(), moudle, code,msg,msgParam,almType,almCode); Message message=Message.newMsg(msgType ,deviceInfo.getName(), deviceInfo.getId(), moudle, code,msg,msgParam,almType,almCode);
messageManager.save(message); boolean result=msgNeedSave(message);
if(result){
messageManager.save(message);
}
// messageManager.save(message);
} }
} }
...@@ -165,6 +179,37 @@ public class DeviceMessageUtil { ...@@ -165,6 +179,37 @@ public class DeviceMessageUtil {
} }
private static List<Message> messageList=new ArrayList<>();
private synchronized static boolean msgNeedSave(Message message) {
int TimeOutMs = 20000;
boolean needSave = true;
if (messageList == null) {
messageList = new ArrayList<>();
}
List<Message> oldMsg = new ArrayList<>();
oldMsg.addAll(messageList);
messageList = new ArrayList<>();
message.setCreateDate(new Date());
for (Message msg :
oldMsg) {
long ms = (new Date()).getTime() - msg.getCreateDate().getTime();
if (ms < TimeOutMs) {
if (msg.sameMas(message)) {
needSave = false;
messageList.add(message);
} else {
messageList.add(msg);
}
}
}
if(needSave){
messageList.add(message);
}
return needSave;
}
/** /**
* 服务器重启后,自动更新设备为离线 * 服务器重启后,自动更新设备为离线
*/ */
...@@ -172,11 +217,6 @@ public class DeviceMessageUtil { ...@@ -172,11 +217,6 @@ public class DeviceMessageUtil {
public static void processDeviceStatus() { public static void processDeviceStatus() {
try { try {
if(onlyReport){
log.info("processDeviceStatus : onlyReport=true,直接返回");
return;
}
//获取所有料仓状态 //获取所有料仓状态
Map<String, Storage> allStorages = dataCache.getAllStorage(); Map<String, Storage> allStorages = dataCache.getAllStorage();
String[] msgCodes = new String[]{"smfcore.messages.online", "smfcore.messages.offline"}; String[] msgCodes = new String[]{"smfcore.messages.online", "smfcore.messages.offline"};
......
package com.neotel.smfcore.core.system.util; package com.neotel.smfcore.core.system.util;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.neotel.smfcore.core.equipment.bean.EquipStatusBean; import com.neotel.smfcore.core.equipment.bean.EquipStatusBean;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.system.bean.MesInfoDto;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
@Slf4j @Slf4j
public class EquipStatusUtil { public class EquipStatusUtil {
...@@ -17,9 +18,9 @@ public class EquipStatusUtil { ...@@ -17,9 +18,9 @@ public class EquipStatusUtil {
protected static Map<String, EquipStatusBean> statusMap = Maps.newConcurrentMap(); protected static Map<String, EquipStatusBean> statusMap = Maps.newConcurrentMap();
/** /**
* CID的设备故障消息(key 为 cid) * NS设备最后一次MES通信信息(key 为 cid,value是最后一次MesInfo)
*/ */
private static Map<String, EquipStatusBean> clientMsgs = Maps.newConcurrentMap(); private static Map<String, MesInfoDto> NsMesInfoMap = Maps.newConcurrentMap();
/** /**
...@@ -38,6 +39,29 @@ public class EquipStatusUtil { ...@@ -38,6 +39,29 @@ public class EquipStatusUtil {
} }
public static void updateNsMesInfo(String cid,MesInfoDto nsMesInfo) {
if(nsMesInfo==null){
return;
}
if(nsMesInfo.getTime()==null){
nsMesInfo.setTime(DateTime.now());
}
NsMesInfoMap.put(cid, nsMesInfo);
}
public static MesInfoDto getNsMesInfo(String cid){
MesInfoDto mesInfo= NsMesInfoMap.get(cid);
return mesInfo;
}
/**
* 获取所有的设备信息
* @return
*/
public static Collection<EquipStatusBean> getAllStatusBean(){
return statusMap.values();
}
public static void runTimer() { public static void runTimer() {
try { try {
if(statusMap==null){ if(statusMap==null){
...@@ -58,4 +82,48 @@ public class EquipStatusUtil { ...@@ -58,4 +82,48 @@ public class EquipStatusUtil {
log.error("设备状态定时器执行出错:", ex); log.error("设备状态定时器执行出错:", ex);
} }
} }
private static Map<String, MesInfoDto> lastAgvMesMap =new HashMap<>();
public static void UpdateAgvInfo(String key, String request, String response, String status){
MesInfoDto mesInfo=new MesInfoDto(status, DateTime.now(),request,response );
if(ObjectUtil.isEmpty(key)){
key="";
}
lastAgvMesMap.put(key,mesInfo);
}
public static MesInfoDto getLastAgvInfo(String key) {
if (lastAgvMesMap.containsKey(key)) {
return lastAgvMesMap.get(key);
}
return lastAgvMesMap.get("");
}
public static Map<String,Map<String,String>> dataMap=new HashMap<>();
public static void updateData(String cid, Map<String,String> data) {
if (dataMap.containsKey(cid)) {
dataMap.remove(cid);
}
dataMap.put(cid, data);
}
public static Map<String,String> getData(String cid) {
Map<String, String> data = dataMap.getOrDefault(cid, new HashMap<>());
if (data == null || data.size() <= 0) {
//默认查找cid_1的视频
String nCid = cid + "_2";
data = dataMap.getOrDefault(nCid, new HashMap<>());
}
if (data == null || data.size() <= 0) {
//默认查找cid_1的视频
String nCid = cid + "_1";
data = dataMap.getOrDefault(nCid, new HashMap<>());
}
return data;
}
} }
package com.neotel.smfcore.core.xRay.rest;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("service/equipment/xRayData")
public class XrayDataController {
@ApiOperation("上传点料结果")
@PostMapping("/uploadCountingHistory")
@AnonymousAccess
public ResultBean uploadCountingHistory(@RequestBody Map<String,String> paramMap) {
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.core.xRay.rest;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.equipment.util.bean.EquipConfigInfo;
import com.neotel.smfcore.core.xRay.service.manager.IXrayPrintDataManager;
import com.neotel.smfcore.core.xRay.service.po.XrayPrintData;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("service/equipment/xRay")
public class XrayDeviceController {
@Autowired
private IXrayPrintDataManager xrayPrintDataManager;
@Autowired
private CodeResolve codeResolve;
@Autowired
private IBarcodeManager barcodeManager;
@ApiOperation("1584手动点料功能:上传打印参数")
@PostMapping("/uploadMResult")
@AnonymousAccess
public ResultBean uploadMResult(@RequestBody Map<String,String> paramMap) {
String reelId=paramMap.get("reelId");
String fullCode=paramMap.get("fullCode");
String printParam=paramMap.get("printParam");
int qty=0;
if(paramMap.containsKey("qty")){
qty= Convert.toInt(paramMap.get("qty"));
}
if (ObjectUtil.isEmpty(reelId)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"reelId"});
}
if (ObjectUtil.isEmpty(fullCode)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"fullCode"});
}
if (ObjectUtil.isEmpty(printParam)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"printParam"});
}
XrayPrintData printData=new XrayPrintData(reelId,fullCode,qty,printParam);
log.info("uploadMResult: reelID="+reelId+",qty="+qty+",fullCode="+fullCode+",printParam="+printParam);
xrayPrintDataManager.save(printData);
return ResultBean.newOkResult("");
}
@ApiOperation("1584手动点料功能:获取打印参数")
@PostMapping("/getMResult")
@AnonymousAccess
public ResultBean getMResult(@RequestBody Map<String,String> paramMap) {
String barcodeStr = paramMap.get("barcodes");
if (ObjectUtil.isEmpty(barcodeStr)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"barcodes"});
}
XrayPrintData data = xrayPrintDataManager.findByReelID(barcodeStr);
if (data == null) {
//解析条码
Barcode barcode = codeResolve.resolveOneValideBarcode(barcodeStr);
if (barcode != null) {
data = xrayPrintDataManager.findByReelID(barcodeStr);
}
}
if (data != null) {
return ResultBean.newOkResult(data);
}
return ResultBean.newErrorResult(-1, "", "not find data");
}
@ApiOperation("1588点料验证:是否需要点料,未入库条码不需要点料")
@PostMapping("/isNeedCounting")
@AnonymousAccess
public ResultBean isNeedCounting(@RequestBody Map<String,String> paramMap) {
String barcodeStr = paramMap.get("barcodes");
log.info("isNeedCounting: 条码:barcodes:" + barcodeStr);
if (ObjectUtil.isEmpty(barcodeStr)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"barcodes"});
}
Barcode barcode = null;
try {
barcode = codeResolve.resolveOneValideBarcode(barcodeStr);
} catch (ValidateException ex) {
log.error(ex.getDefaultMsg());
}
//已入库的条码需要点料
if (barcode == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"barcode", barcodeStr});
}
if (barcode.getPutInTime() <= -1) {
log.info("isNeedCounting: 条码:" + barcode.getBarcode() + "未入库过,不需要点料");
return ResultBean.newErrorResult(1, "", "new barcode");
} else {
DateTime putIntime = new DateTime(barcode.getPutInTime());
log.info("isNeedCounting: 条码:" + barcode.getBarcode() + "首次入库时间=" + DateUtil.toDateString(putIntime, "yyyy-MM-dd HH:mm:ss") + ",需要点料");
return ResultBean.newOkResult("true");
}
// return ResultBean.newErrorResult(-1, "", "not find data");
}
@ApiOperation("1588点料:传点料数量到服务器")
@RequestMapping(value = "xrayUpdateAmount")
@AnonymousAccess
public ResultBean xrayUpdateAmount(@RequestBody Map<String,String> paramMaps) {
String amountStr = paramMaps.get("amount");
String barcodeStr = paramMaps.get("barcode");
String fullBarcode = paramMaps.get("fullCode");
boolean needResolve = false;
String offlineMode = paramMaps.get("offlineMode");
if (ObjectUtil.isNotEmpty(offlineMode) && offlineMode.equalsIgnoreCase("true")) {
needResolve = true;
}
log.info("xrayUpdateAmount: 点料信息:barcode:" + barcodeStr + ",amount为:" + amountStr + ",offlineMode=" + offlineMode);
if (StringUtils.isNotBlank(barcodeStr)) {
Barcode barcode = barcodeManager.findByBarcode(barcodeStr);
if (needResolve && barcode == null && ObjectUtil.isNotEmpty(fullBarcode)) {
try {
//解析条码
barcode = codeResolve.resolveOneValideBarcode(fullBarcode);
} catch (ValidateException ex) {
log.error(ex.getDefaultMsg());
}
}
if (barcode != null) {
int oldQty = barcode.getAmount();
int qty = NumberUtil.parseInt(amountStr);
barcode.setAmount(qty);
barcodeManager.save(barcode);
log.info("点料信息:barcode:" + barcodeStr + ",旧数量:" + oldQty + ",新数量=" + qty + "");
return ResultBean.newOkResult(qty);
}
}
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"barcode", barcodeStr});
}
}
package com.neotel.smfcore.core.xRay.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IXrayPrintDataDao extends IBaseDao {
}
package com.neotel.smfcore.core.xRay.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.xRay.service.dao.IXrayPrintDataDao;
import com.neotel.smfcore.core.xRay.service.po.XrayPrintData;
import org.springframework.stereotype.Service;
@Service
public class XrayPrintDataDaoImpl extends AbstractBaseDao implements IXrayPrintDataDao {
@Override
public Class getEntityClass() {
return XrayPrintData.class;
}
}
package com.neotel.smfcore.core.xRay.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.xRay.service.po.XrayPrintData;
public interface IXrayPrintDataManager extends IBaseManager<XrayPrintData> {
public XrayPrintData findByReelID(String reelID);
}
package com.neotel.smfcore.core.xRay.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.xRay.service.dao.IXrayPrintDataDao;
import com.neotel.smfcore.core.xRay.service.manager.IXrayPrintDataManager;
import com.neotel.smfcore.core.xRay.service.po.XrayPrintData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class XrayPrintDataManagerImpl implements IXrayPrintDataManager {
@Autowired
private IXrayPrintDataDao xrayPrintDataDao;
@Override
public XrayPrintData get(String id) {
return xrayPrintDataDao.findOneById(id);
}
@Override
public XrayPrintData save(XrayPrintData object) throws ValidateException {
Query query=new Query(Criteria.where("reelId").is(object.getReelId()));
XrayPrintData obj= xrayPrintDataDao.findOne(query);
if(obj!=null){
object.setId(obj.getId());
}
return xrayPrintDataDao.save(object);
}
@Override
public void delete(XrayPrintData object) throws ValidateException {
xrayPrintDataDao.removeOneById(object.getId());
}
@Override
public PageData<XrayPrintData> findByPage(Query query, Pageable pageable) {
int totalCount = xrayPrintDataDao.countByQuery(query);
List<XrayPrintData> list= xrayPrintDataDao.findByQuery(query,pageable);
return new PageData<XrayPrintData>(list,totalCount );
}
@Override
public List<XrayPrintData> findByQuery(Query query) {
return xrayPrintDataDao.findByQuery(query);
}
@Override
public XrayPrintData findByReelID(String reelID) {
Query query = new Query(Criteria.where("reelId").is(reelID));
return xrayPrintDataDao.findOne(query);
}
}
package com.neotel.smfcore.core.xRay.service.po;
import com.neotel.smfcore.common.base.BasePo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
@Data
@Document
@AllArgsConstructor
@NoArgsConstructor
public class XrayPrintData extends BasePo implements Serializable {
/**
* 唯一码
*/
private String reelId;
/**
* 完整条码
*/
private String fullCode;
/**
* 数量
*/
private int qty;
/**
* 打印参数字符串
*/
private String printParam;
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!