fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/ProtocolEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.fzzy.igds.constant; /** * @Description æææ¹å¼ * @Author CZT * @Date 2026/01/08 16:48 */ public enum ProtocolEnum { TCP_DEFAULT("TCP_DEFAULT", "ç³»ç»é»è®¤åè®®"), TCP_MS_STORAGE("TCP_MS_STORAGE", "çå±±æ°éæ£æµåè®®"), TCP_XSX_V1("TCP_XSX_V1", "é«èé«ä¸»åè®®1.0"), TCP_ZLDZ_GRAIN_V1("TCP_ZLDZ_GRAIN_V1", "æ£æ¥çµåç²®æ åè®®1.0"), TCP_FZZY_V3("TCP_FZZY_V3", "飿£è´è¿V3.0åè®®"), TCP_FZZY_IOT_V3("TCP_FZZY_IOT_V3", "飿£è´è¿ç©èç½V3.0åè®®"), TCP_SHUHAN_V1("TCP_SHUHAN_V1", "èæ±æ°éæ£æµV1"), TCP_FZZY_WEIGHT("TCP_FZZY_WEIGHT", "FZZY-å°ç£ 主æ§åè®®"), RK_WEATHER_V30("RK_WEATHER_V30", "建大ä»ç§æ°è±¡ç«äºV30"), TCP_FZZY_QUANTITY_V35("TCP_FZZY_QUANTITY_V35", "飿£è´è¿æ°éæ£æµV35"), TCP_BHZH_GRAIN_FM_V1("TCP_BHZH_GRAIN_FM_V1", "馿µ·æºè½æ 线主æºçV1"), TCP_BHZH_GRAIN_V2("TCP_BHZH_GRAIN_V2", "馿µ·æºè½æçº¿çV2"), TCP_BEIBO_GRAIN_V1("TCP_BEIBO_GRAIN_V1", "è´åç²®æ åæºæå¡ç«¯åè®®"), FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "飿£è´è¿API-HTTPåè®®"); private String code; private String msg; ProtocolEnum(String code, String msg) { this.code = code; this.msg = msg; } public String getCode() { return code; } public String getMsg() { return msg; } } fzzy-igdss-core/src/main/java/com/fzzy/igds/data/QuantityProgressData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package com.fzzy.igds.data; import com.bstek.dorado.annotation.PropertyDef; import lombok.Data; import java.io.Serializable; /** * è«å®³æ£æµè¿åº¦ ä¿¡æ¯å°è£ * * @author vince */ @Data public class QuantityProgressData implements Serializable { /** * */ private static final long serialVersionUID = 1L; @PropertyDef(label = "æ§å¶æID") private String serId; @PropertyDef(label = "ç»ç»ç¼ç ") private String companyId; @PropertyDef(label = "ä»åºID") private String depotId; @PropertyDef(label = "åºåºID") private String deptId; @PropertyDef(label = "å½åç¶æ") private String state; @PropertyDef(label = "è¿åº¦ç¾åæ¯") private int progress; @PropertyDef(label = "说æ") private String msg = ""; } fzzy-igdss-core/src/main/java/com/fzzy/igds/notify/NotifyWebInvoker.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.fzzy.igds.notify; import com.fzzy.igds.constant.OrderRespEnum; import com.fzzy.igds.data.QuantityProgressData; /** * @Description * @Author CZT * @Date 2026/01/08 16:36 */ public interface NotifyWebInvoker { String BEAN_ID = "notifyWebInvoker"; /** * ç´æ¥éç¥é¡µé¢ * * @param companyId * @param orderResp * @param notifyMsg */ void notifyWeb(String companyId, OrderRespEnum orderResp, String bizType,String notifyMsg); void notifyQuantityProgress(QuantityProgressData progress); } fzzy-igdss-core/src/main/java/com/fzzy/igds/notify/NotifyWebInvokerImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ package com.fzzy.igds.notify; import com.fzzy.igds.constant.OrderRespEnum; import com.fzzy.igds.data.QuantityProgressData; import com.fzzy.igds.websocket.WebSocketPacket; import com.fzzy.igds.websocket.WebSocketServer; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * @Description * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j @Component public class NotifyWebInvokerImpl implements NotifyWebInvoker { @Override public void notifyWeb(String companyId, OrderRespEnum orderResp, String bizType, String notifyMsg) { // éç¥å端 WebSocketPacket packet = new WebSocketPacket(); packet.setBizType(bizType); packet.setCompanyId(companyId); packet.setOrderResp(orderResp.getCode()); packet.setData(notifyMsg); WebSocketServer.sendByPocket(packet); } @Override public void notifyQuantityProgress(QuantityProgressData progress) { // éç¥å端è¿åº¦ä¿¡æ¯ WebSocketPacket packet = new WebSocketPacket(); packet.setBizType("quantity"); packet.setCompanyId(progress.getCompanyId()); packet.setOrderResp(OrderRespEnum.ORDER_INPROGRESS.getCode()); packet.setData(progress); packet.setDeptId(progress.getDeptId()); WebSocketServer.sendByPocket(packet); } } fzzy-igdss-core/src/main/java/com/fzzy/igds/request/QuantityRequest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ package com.fzzy.igds.request; import lombok.Data; import lombok.EqualsAndHashCode; /** * ç²®æ æ£æµè¯·æ± */ @Data @EqualsAndHashCode(callSuper = false) public class QuantityRequest extends ExeBaseRequest { /** * äºå°åè½ ç¼ç PTZFunc */ public String func ; /** * äºå°åè½éå åæ°ï¼æ¯å¦é度ï¼é¢è®¾ç¹ä½ */ public String par; private Double length1 = 0.0 ; private Double length2 = 0.0 ; private Double length3 = 0.0 ; private Double length4 = 0.0 ; private Double width= 0.0; private Double height= 0.0; private Double lineHeight = 0.0; private Double density = 0.0; private Double length = 0.0; private String ytIp; private Integer ytPort; private String depotType;//仿¿ç±»å private Double volumeAdd = 0.0;//vä½ç§¯è¡¥å¿ åä½ m³ private Double weightAdd = 0.0;//ééè¡¥å¿ åä½KG private String sn; //ç¨äºå¼å§ééçæ¶åæåçææ¹æ¬¡ç¼å· private String batchId; } fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java
@@ -89,14 +89,28 @@ data.setBizTag(bizTag); } data.setCreateTime(new Date()); data.setCreateBy(ContextUtil.getLoginUserName()); data.setUpdateTime(new Date()); data.setUpdateBy(ContextUtil.getLoginUserName()); fileMapper.insert(data); saveFile(data); } } /** * * @param data */ public void saveFile(FileInfo data) { data.setUpdateTime(new Date()); data.setUpdateBy(ContextUtil.getLoginUserName()); if(StringUtils.isBlank(data.getId())){ data.setId(ContextUtil.UUID()); data.setCreateTime(new Date()); data.setCreateBy(ContextUtil.getLoginUserName()); } fileMapper.insert(data); } /** * æ ¹æ®æ¡ä»¶æ¥è¯¢æ°æ® @@ -139,6 +153,7 @@ if("TEMP".equals(pathTag)) return getTempFilePath(); if("CONF".equals(pathTag)) return getConfPath(); if("TEMPLATE".equals(pathTag)) return getTemplateFilePath(); if("QUANTITY".equals(pathTag)) return getQuantityPath(); if("WORD".equals(pathTag)) return getWordPath(); return getCommonFilePath(); @@ -148,6 +163,19 @@ * è·åäºä»¶æä»¶è·¯å¾ * @return */ public String getQuantityPath() { String basePath = FrameworkConfig.getProfile() + "QUANTITY/" + DateFormatUtils.format(new Date(), "yyyyMM") + "/"; File file = new File(basePath); if (!file.exists()) { file.mkdirs(); } return basePath; } /** * è·åäºä»¶æä»¶è·¯å¾ * @return */ public String getEventFilePath() { String basePath = FrameworkConfig.getProfile() + "EVENT/" + DateFormatUtils.format(new Date(), "yyyyMM") + "/"; File file = new File(basePath); fzzy-igdss-core/src/main/java/com/fzzy/igds/service/QuantityService.java
@@ -89,6 +89,15 @@ } /** * ä¿åæ°æ® * * @param data */ public void saveData(Quantity data) { quantityMapper.insert(data); } /** * æ¥è¯¢é 置信æ¯ï¼æ ¹æ®åºåºç¼ç è·å * * @param companyId fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/Base64Util.java
@@ -1,15 +1,18 @@ package com.fzzy.igds.utils; import lombok.extern.slf4j.Slf4j; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; import java.util.Base64; /** * @Description å¾çBaseå¤ç * @Author CZT * @Date 2026/1/7 11:07 */ @Slf4j public class Base64Util { public static String BASE_IMG_START = "data:image/jpg;base64,"; @@ -85,4 +88,59 @@ } } /** * base64转为å¾ç * * @param path æä»¶è·¯å¾ï¼å°æä»¶å¤¹å³å¯ï¼ä»£ç éä¼å¨æä»¶å¤¹éçæå¯¹åºçjpgæä»¶ * @param base64 * @return */ public static String base64ToJpg(String path, String fileName, String base64) { // 夿æä»¶è·¯å¾æ¯å¦åå¨ File filePath = new File(path); if (!filePath.exists()) { filePath.mkdirs(); } // å建æä»¶ String jpgFile = path + "\\" + fileName + ".jpg"; File file = new File(jpgFile); boolean jpgFileExist = false; try { jpgFileExist = file.createNewFile(); log.info("jpgæä»¶å建æå"); } catch (IOException e) { log.info("jpgæä»¶å建失败"); e.printStackTrace(); } if (jpgFileExist) { // è§£å¯ Base64.Decoder decoder = Base64.getDecoder(); // 廿base64åç¼ data:image/jpeg;base64, base64 = base64.substring(base64.indexOf(",", 1) + 1, base64.length()); byte[] b = decoder.decode(base64); // å¤çæ°æ® for (int i = 0; i < b.length; ++i) { if (b[i] < 0) { b[i] += 256; } } // ä¿åå¾ç try { FileOutputStream out = new FileOutputStream(jpgFile); out.write(b); out.flush(); out.close(); // åå ¥æåè¿åæä»¶è·¯å¾ return jpgFile; } catch (FileNotFoundException e) { log.info("æä»¶æªæ¾å°"); e.printStackTrace(); } catch (IOException e) { log.info("åå ¥å¤±è´¥"); e.printStackTrace(); } } return "æä»¶ä¸åå¨"; } } fzzy-igdss-io/pom.xml
@@ -67,9 +67,6 @@ </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </project> fzzy-igdss-io/src/main/java/com/fzzy/igds/ServerRunner.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.fzzy.igds; import com.fzzy.igds.quantity.server.BhznQuantityServerEngine; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * @Description å¯ä»¥æ ¹æ®é ç½®æä»¶çµæ´»è°æ´,é ç½®éç³»ç»èªå¨å¯å¨æå¡ -- æ§è¡é¡ºåº10-19 * @Author CZT * @Date 2026/01/08 16:36 */ @Component(ServerRunner.BEAN_ID) @Order(value = 10) public class ServerRunner implements CommandLineRunner { public static final String BEAN_ID = "quantity.serverRunner"; @Resource private BhznQuantityServerEngine serverEngine; @Override public void run(String... strings) throws Exception { serverEngine.start(BhznQuantityServerEngine.PORT); } } fzzy-igdss-io/src/main/java/com/fzzy/igds/io/manager/QuantityRemoteManager.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.fzzy.igds.io.manager; import com.fzzy.igds.io.service.RemoteQuantityService; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * @Description æ¥å£Apiææåè®®çåè®®ç±»ï¼æ ¹æ®ä¸åçåè®®é ç½®è°ç¨ä¸åçåè®®å®ç° * @Author CZT * @Date 2025/12/9 9:56 */ @Component(QuantityRemoteManager.BEAN_ID) public class QuantityRemoteManager implements ApplicationContextAware { public static final String BEAN_ID = "quantity.remoteManager"; public static Map<String, RemoteQuantityService> remoteQuantityMap = new HashMap<>(); @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { Map<String, RemoteQuantityService> quantityMap = applicationContext .getBeansOfType(RemoteQuantityService.class); for (String key : quantityMap.keySet()) { remoteQuantityMap.put(quantityMap.get(key).getProtocol(), quantityMap.get(key)); } } /** * æ ¹æ®åè®®è·åå®ç° * * @param protocol * @return */ public RemoteQuantityService getRemoteQuantityService(String protocol) { return remoteQuantityMap.get(protocol); } } fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/RemoteQuantityService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,70 @@ package com.fzzy.igds.io.service; import com.fzzy.igds.request.QuantityRequest; import com.fzzy.igds.response.BaseResponse; /** * @Desc: æ°éæ£æµåè½æ¥å£å®ä¹ * @author: Andy * @update-time: 2022/12/22 */ public interface RemoteQuantityService { /** * å½ååè®®åç§°ï¼ç³»ç»æ ¹æ®åè®®åç§°èªå¨è°ç¨åæºå¹é çåè®®å®ç° * * @return */ String getProtocol(); /** * æ°éæ£æµå¼å§æ§è¡æ£æµ * * @param request * @return */ BaseResponse checkStart(QuantityRequest request); /** * @Desc:è¿ç¨ä¸åé ç½®ä¿¡æ¯ * @author: Andy * @update-time: 2022/12/22 */ BaseResponse remoteConf(QuantityRequest request); /** * æåæ£æµåè½ * * @param request * @return */ BaseResponse checkStop(QuantityRequest request); /** * è¿ç¨ææç §ç * * @param request * @return */ BaseResponse snapImg(QuantityRequest request); /** * å ³éæ¥è¦ * * @param request * @return */ BaseResponse closeWarn(QuantityRequest request); /** * æå头äºå°æ§å¶ * * @param Request * @return */ BaseResponse ptz(QuantityRequest Request); } fzzy-igdss-io/src/main/java/com/fzzy/igds/io/service/impl/DefaultRemoteQuantityImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.fzzy.igds.io.service.impl; import com.fzzy.igds.constant.OrderRespEnum; import com.fzzy.igds.constant.ProtocolEnum; import com.fzzy.igds.io.service.RemoteQuantityService; import com.fzzy.igds.request.QuantityRequest; import com.fzzy.igds.response.BaseResponse; import org.springframework.stereotype.Repository; @Repository public class DefaultRemoteQuantityImpl implements RemoteQuantityService { @Override public String getProtocol() { return ProtocolEnum.TCP_DEFAULT.getCode(); } @Override public BaseResponse checkStart(QuantityRequest request) { return new BaseResponse(OrderRespEnum.NO_PROTOCOL); } @Override public BaseResponse remoteConf(QuantityRequest request) { return null; } @Override public BaseResponse checkStop(QuantityRequest request) { return new BaseResponse(OrderRespEnum.NO_PROTOCOL); } @Override public BaseResponse snapImg(QuantityRequest request) { return new BaseResponse(OrderRespEnum.NO_PROTOCOL); } @Override public BaseResponse closeWarn(QuantityRequest request) { return new BaseResponse(OrderRespEnum.NO_PROTOCOL); } @Override public BaseResponse ptz(QuantityRequest Request) { return new BaseResponse(OrderRespEnum.NO_PROTOCOL); } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/analysis/AnalysisService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,299 @@ package com.fzzy.igds.quantity.analysis; import com.alibaba.fastjson.JSON; import com.fzzy.igds.constant.Constant; import com.fzzy.igds.data.QuantityProgressData; import com.fzzy.igds.domain.Depot; import com.fzzy.igds.domain.FileInfo; import com.fzzy.igds.domain.Quantity; import com.fzzy.igds.domain.QuantityConf; import com.fzzy.igds.notify.NotifyWebInvoker; import com.fzzy.igds.quantity.command.BhznRemoteQuantityImpl; import com.fzzy.igds.quantity.command.CommandBuilder; import com.fzzy.igds.quantity.dto.IoMessage; import com.fzzy.igds.quantity.dto.Resp2003; import com.fzzy.igds.quantity.dto.Resp2004; import com.fzzy.igds.quantity.dto.Resp2006; import com.fzzy.igds.quantity.server.BhznQuantityServerEngine; import com.fzzy.igds.quantity.util.ServerUtils; import com.fzzy.igds.request.QuantityRequest; import com.fzzy.igds.service.DepotService; import com.fzzy.igds.service.FileService; import com.fzzy.igds.service.QuantityService; import com.fzzy.igds.utils.ContextUtil; import com.ruoyi.common.config.FrameworkConfig; import com.ruoyi.common.core.redis.RedisCache; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; /** * @Description å议解æå ¥å£ * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j @Component("fzzy.quantityAnalysisService") public class AnalysisService{ @Autowired private DepotService depotService; @Autowired private QuantityService quantityService; @Autowired private NotifyWebInvoker notifyWebInvoker; @Autowired private FileService fileService; @Autowired private RedisCache redisUtil; @Autowired private BhznQuantityServerEngine bhznQuantityServerEngine; @Autowired private BhznRemoteQuantityImpl remoteQuantity; /** * @param sessionKey ip:port */ public void analysis(String sessionKey, IoMessage message) throws Exception { if (message == null) return; String[] attr = sessionKey.split(":"); String ip = attr[0]; Integer port = Integer.valueOf(attr[1]); String checkMsg = checkMsg(message); if (null != checkMsg) { log.warn("æ°éæ£æµ---->>>å¹³å°ï¼ï¼åæºSN={}ï¼æ¥æä¿¡æ¯-={}ï¼ååºåè¿å䏿£ç¡®ï¼æ æ³è¿è¡è§£æ," + checkMsg, message.getSn(), message.toString()); return; } QuantityConf conf = quantityService.getCacheQuantityConfBySn(message.getSn()); if (null == conf) { //说æå½åè®¾å¤æªæ³¨åå¹³å°ï¼ç´æ¥è¸¢åºè¿æ¥ log.info("æ°éæ£æµ---->>>å¹³å°ï¼ç»é认è¯SN-{}-平尿ªæ³¨åï¼ç´æ¥è¸¢åºè¿æ¥", message.getSn()); bhznQuantityServerEngine.destroy(ip, port); return; } switch (message.getFunctionId()) { case "1001"://æå¡ç«¯ä¸åé ç½® //ä¸å¤ç break; case "1002"://ç»ç«¯è¯·æ±æ¶é´åæ¥ analysis1002(ip, port, conf, message); break; case "1003"://ç»ç«¯è®¾å¤è¯·æ±ç»é analysis1003(ip, port, conf, message); break; case "2001"://å¼å§æ£æµ // break; case "2002"://åæ¢æ£æµ // break; case "2003"://æå¡ç«¯æ¥è¯¢è¿åº¦ analysis2003(ip, port, conf, message); break; case "2004"://ç»ç«¯åèµ·ç»æä¸æ¥ analysis2004(ip, port, conf, message); break; case "2005"://æå¡ç«¯åèµ·æ°æ®ç¹ä½æå analysis2005(ip, port, conf, message); break; case "2006"://æå¡ç«¯è¯·æ±ææï¼ç»ç«¯è¿åå¾åä¿¡æ¯ analysis2006(ip, port, conf, message); break; case "2007"://ç»ç«¯ä¸»å¨åèµ·å¿è·³ç»´æ analysis2007(ip, port, conf, message); break; default: break; } } /** * ç¨æ·ç»éæåï¼æ´æ°æ°æ®åç¼åï¼è¿å ¥å½åæ¥å£è¡¨ç¤ºå¹³å°å·²ç»è®¤è¯éè¿ï¼ç´æ¥æ´æ°å¹¶è¿åæ£å¸¸ä¿¡æ¯ * * @param ip * @param port * @param conf * @param message */ private void analysis1003(String ip, Integer port, QuantityConf conf, IoMessage message) { conf.setIp(ip); conf.setPort(port); conf.setStatus(Constant.YN_Y); quantityService.updateQuantityConfBySn(conf); //è¿åæ£å¸¸ remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build1003Message(message)); } /** * è¿åç»ç»ç«¯å½åæ¶é´ * * @param quantityConf * @param message */ private void analysis1002(String ip, Integer port, QuantityConf quantityConf, IoMessage message) { //ç´æ¥è¿å remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build1002Message(message)); } /** * è§£æç»ç«¯è¿åçééè¿åº¦ * * @param message */ private void analysis2003(String ip, Integer port, QuantityConf conf, IoMessage message) { String key = ServerUtils.buildRequestKey(conf.getCompanyId(), conf.getSn()); QuantityRequest quantityRequest = (QuantityRequest) redisUtil.getCacheObject(key); if (quantityRequest == null) { log.error("æ²¡ææ¾å°åéçå½ä»¤ï¼å¯è½å·²ç»è¶ æ¶ï¼åæ¶è§£æï¼" + message.toString()); return; } QuantityProgressData progressData = new QuantityProgressData(); progressData.setCompanyId(conf.getCompanyId()); progressData.setDepotId(conf.getDepotId()); progressData.setDeptId(conf.getDeptId()); Resp2003 content = JSON.parseObject(message.getContent(), Resp2003.class); if (content == null) { log.error("æ²¡ææ¾å°å ³èé ç½®ï¼åæ¶è§£æï¼" + message.toString()); return; } Depot depot = depotService.getCacheDepot(conf.getCompanyId(), conf.getDepotId()); progressData.setProgress(content.getProgress()); log.info(depot.getName() + "æ°éçæµæ§è¡è¿åº¦ï¼" + progressData.getProgress()); progressData.setMsg(depot.getName() + "æ°éçæµæ§è¡è¿åº¦ï¼" + progressData.getProgress()); notifyWebInvoker.notifyQuantityProgress(progressData); //æ ¹æ®è¿åº¦ææ if (progressData.getProgress() >= 1 && progressData.getProgress() <= 25) { remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build2006Message(message)); } if (progressData.getProgress() > 25 && progressData.getProgress() <= 50) { remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build2006Message(message)); } if (progressData.getProgress() > 50 && progressData.getProgress() <= 75) { remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build2006Message(message)); } if (progressData.getProgress() > 75 && progressData.getProgress() <= 99) { remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build2006Message(message)); } } /** * è§£æç»ç«¯è¿åçç»æï¼å¹¶è¿åæå * * @param conf * @param message */ private void analysis2004(String ip, Integer port, QuantityConf conf, IoMessage message) { Resp2004 content = JSON.parseObject(message.getContent(), Resp2004.class); if (content == null) { log.error("æ²¡ææ°æ®ï¼åæ¶è§£æï¼" + message.toString()); return; } String key = ServerUtils.buildRequestKey(conf.getCompanyId(), conf.getSn()); QuantityRequest request = (QuantityRequest) redisUtil.getCacheObject(key); if (request == null) { log.error("没æè·åå°åéå½ä»¤ï¼åæ¶è§£æï¼" + message.toString()); return; } Depot depot = depotService.getCacheDepot(conf.getCompanyId(), conf.getDepotId()); Quantity quantityData = new Quantity(); quantityData.setBatchId(request.getBatchId()); quantityData.setReceiveDate(new Date()); quantityData.setBulk(content.getVolume()); quantityData.setWeight(content.getWeight()); quantityData.setDepotId(depot.getId()); quantityData.setDeptId(depot.getDeptId()); quantityData.setCompanyId(depot.getCompanyId()); quantityData.setPoints(""); quantityService.saveData(quantityData); //ç´æ¥è¿å remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build2004Message(message)); } /** * è§£æç»ç«¯è¿åçç¹ä½æ°æ® * * @param quantityConf * @param message */ private void analysis2005(String ip, Integer port, QuantityConf quantityConf, IoMessage message) { // todo } /** * è§£æææçå¾çä¿¡æ¯ * * @param conf * @param message */ private void analysis2006(String ip, Integer port, QuantityConf conf, IoMessage message) { Resp2006 content = JSON.parseObject(message.getContent(), Resp2006.class); if (content == null) { log.error("æ²¡ææ°æ®ï¼åæ¶è§£æï¼" + message.toString()); return; } String key = ServerUtils.buildRequestKey(conf.getCompanyId(), conf.getSn()); QuantityRequest res = (QuantityRequest) redisUtil.getCacheObject(key); if (res == null) { log.error("没æè·åå°åéå½ä»¤ï¼åæ¶è§£æï¼" + message.toString()); return; } String fileName = ContextUtil.generateId()+ ".jpg"; String savePath = fileService.getFileSavePath("QUANTITY"); String filePath = savePath+fileName; fileService.baseImg2Disk(filePath, content.getData()); FileInfo data = new FileInfo(); data.setId(ContextUtil.UUID()); data.setCreateTime(new Date()); data.setFileName(fileName); data.setFilePath(filePath.replace(FrameworkConfig.getProfile(), "/profile/")); data.setBizId(res.getBatchId()); data.setBizTag("quantity"); data.setCompanyId(conf.getCompanyId()); fileService.saveFile(data); } /** * å¿è·³åé¦ * * @param quantityConf * @param message */ private void analysis2007(String ip, Integer port, QuantityConf quantityConf, IoMessage message) { remoteQuantity.sendMsg(ip, port, CommandBuilder.getInstance().build2007Message(message)); } public String checkMsg(IoMessage message) { if (StringUtils.isEmpty(message.getResult())) return null; if (ServerUtils.RESP_0.equals(message.getResult())) return null; if (ServerUtils.RESP_1.equals(message.getResult())) return "å½ä»¤æ ¼å¼é误"; if (ServerUtils.RESP_2.equals(message.getResult())) return "å½ä»¤æ°æ®æ£éªå¼å¸¸"; if (ServerUtils.RESP_3.equals(message.getResult())) return "åéè¶ æ¶é误"; if (ServerUtils.RESP_4.equals(message.getResult())) return "ç»ç«¯è®¾å¤ä¸å¨çº¿"; if (ServerUtils.RESP_5.equals(message.getResult())) return "ç»ç«¯è®¾å¤æ§è¡ä¸"; if (ServerUtils.RESP_6.equals(message.getResult())) return "ç»ç«¯è®¾å¤ææå¤±è´¥"; if (ServerUtils.RESP_9.equals(message.getResult())) return "å ¶å®é误"; return null; } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/command/BhznRemoteQuantityImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,140 @@ package com.fzzy.igds.quantity.command; import com.fzzy.igds.constant.OrderRespEnum; import com.fzzy.igds.constant.ProtocolEnum; import com.fzzy.igds.io.service.RemoteQuantityService; import com.fzzy.igds.notify.NotifyWebInvoker; import com.fzzy.igds.quantity.dto.IoMessage; import com.fzzy.igds.quantity.server.BhznQuantityServerEngine; import com.fzzy.igds.quantity.util.ServerUtils; import com.fzzy.igds.request.QuantityRequest; import com.fzzy.igds.response.BaseResponse; import com.ld.io.api.InvokeResult; import com.ruoyi.common.core.redis.RedisCache; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; /** * @Description * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j @Component(BhznRemoteQuantityImpl.BEAN_ID) public class BhznRemoteQuantityImpl implements RemoteQuantityService { public static final String BEAN_ID = "fzzy.remoteQuantityService"; @Autowired private BhznQuantityServerEngine bhznQuantityServerEngine; @Autowired private NotifyWebInvoker notifyWebInvoker; @Autowired private RedisCache redisUtil; @Override public String getProtocol() { return ProtocolEnum.TCP_FZZY_QUANTITY_V35.getCode(); } @Override public BaseResponse checkStart(QuantityRequest request) { try { String key = ServerUtils.buildRequestKey(request.getCompanyId(), request.getSn()); IoMessage message = CommandBuilder.getInstance().build2001Message(request); InvokeResult result = sendMsg(request.getIp(), request.getPort(), message); // å¦æææ§è¡å¼å¸¸ï¼ç´æ¥éç¥å°å端 if (InvokeResult.SUCCESS != result) { log.info("å¹³å°------>>>>æ°éæ£æµï¼å¼å§æ£æµ-失败{}", result.getMessage()); notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, "SYS", request.getSerName() + "ãå¼å§æ£æµï¼å½ä»¤æ§è¡å¤±è´¥"); return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "å¼å§æ£æµæ§è¡å¤±è´¥ï¼" + result.getMessage()); } //æé¿ä¿åä¸ä¸ªå°æ¶ redisUtil.setCacheObject(key, request, 60 * 60 , TimeUnit.SECONDS); //å¯å¨åä»»å¡å®æ¶æ¥è¯¢è¿åº¦ FutureTask<String> futureTask = new FutureTask<>(new QueryProgressTask(redisUtil, this, key)); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(futureTask); executorService.shutdown(); } catch (Exception e) { return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "æ§è¡å¤±è´¥ï¼" + e.getMessage()); } return new BaseResponse(OrderRespEnum.ORDER_SUCCESS); } @Override public BaseResponse remoteConf(QuantityRequest request) { //æ£æµä¹åå ä¸åé ç½® IoMessage message = CommandBuilder.getInstance().build1001Message(request); InvokeResult result = sendMsg(request.getIp(), request.getPort(), message); if (InvokeResult.SUCCESS != result) { log.info("å¹³å°------>>>>æ°éæ£æµï¼ä¸åé 置失败-失败{}", result.getMessage()); notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, "SYS", request.getSerName() + "ãä¸åæ£æµé ç½®ï¼å½ä»¤æ§è¡å¤±è´¥"); return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "ä¸åé ç½®æ§è¡å¤±è´¥ï¼" + result.getMessage()); } return new BaseResponse(OrderRespEnum.ORDER_SUCCESS); } @Override public BaseResponse checkStop(QuantityRequest request) { //æ£æµä¹åå ä¸åé ç½® IoMessage message = CommandBuilder.getInstance().build2002Message(request); InvokeResult result = sendMsg(request.getIp(), request.getPort(), message); if (InvokeResult.SUCCESS != result) { log.info("å¹³å°------>>>>æ°éæ£æµï¼åæ¢æ£æµ-失败{}", result.getMessage()); notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, "SYS", request.getSerName() + "ãåæ¢æ£æµå¤±è´¥ï¼å½ä»¤æ§è¡å¤±è´¥"); return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "åæ¢æ£æµæ§è¡å¤±è´¥ï¼" + result.getMessage()); } String key = ServerUtils.buildRequestKey(request.getCompanyId(),request.getSn()); //å é¤ç¼å redisUtil.deleteObject(key); return new BaseResponse(OrderRespEnum.ORDER_SUCCESS); } @Override public BaseResponse snapImg(QuantityRequest request) { return new BaseResponse(OrderRespEnum.NO_PROTOCOL); } @Override public BaseResponse closeWarn(QuantityRequest request) { return new BaseResponse(OrderRespEnum.NO_FUNCTION); } @Override public BaseResponse ptz(QuantityRequest Request) { return new BaseResponse(OrderRespEnum.NO_FUNCTION); } public InvokeResult sendMsg(String ip, Integer port, IoMessage message) { String msg = CommandBuilder.getInstance().build(message); log.info("å¹³å°------>>>>æ°éæ£æµï¼æ¥æä¿¡æ¯-{}", msg); InvokeResult result = bhznQuantityServerEngine.push(ip, port, msg.getBytes()); return result; } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/command/CommandBuilder.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,210 @@ package com.fzzy.igds.quantity.command; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fzzy.igds.quantity.dto.IoMessage; import com.fzzy.igds.quantity.dto.Req1001; import com.fzzy.igds.quantity.dto.Resp1002; import com.fzzy.igds.quantity.util.ServerUtils; import com.fzzy.igds.request.QuantityRequest; /** * @Description å½ä»¤çæ * @Author CZT * @Date 2026/01/08 16:36 */ public class CommandBuilder { /** * ä¸åé ç½® * * @param request * @return */ public IoMessage build1001Message(QuantityRequest request) { IoMessage message = new IoMessage(); // è°æ´ä¿¡æ¯ buildInfo(message, request); Req1001 req1001 = new Req1001(); req1001.setHeight(request.getHeight().intValue()); req1001.setOrien(1); req1001.setVoluWeight(request.getDensity().intValue()); req1001.setStorageType("01".equals(request.getDepotType()) ? 1 : 0); req1001.setWeightAdd(request.getWeightAdd().intValue()); req1001.setVolumeAdd(request.getVolumeAdd().intValue()); if ("01".equals(request.getDepotType())) { req1001.setStorageType(1); req1001.setLength(new Double((request.getLength() * 100.00)).intValue()); req1001.setWidth(new Double((request.getWidth() * 100.00)).intValue()); } else { req1001.setStorageType(0); req1001.setRadius(new Double((request.getWidth() * 100.00)).intValue()); //ç仿¶å宽度å½ä½åå¾ } message.setContent(JSON.toJSONString(req1001)); message.setFunctionId(ServerUtils.FUNCTION_1001); return message; } /** * å夿¶é´ * * @return */ public IoMessage build1002Message(IoMessage message) { message.setFunctionId(ServerUtils.FUNCTION_1002); Resp1002 resp1002 = new Resp1002(); resp1002.setTime(System.currentTimeMillis()); message.setContent(JSON.toJSONString(resp1002)); return message; } /** * åå¤ç»éæå * * @return */ public IoMessage build1003Message(IoMessage message) { message.setFunctionId(ServerUtils.FUNCTION_1003); message.setContent(null); return message; } /** * å¼å§æ£æµ * * @param request * @return */ public IoMessage build2001Message(QuantityRequest request) { IoMessage message = new IoMessage(); // è°æ´ä¿¡æ¯ buildInfo(message, request); message.setFunctionId(ServerUtils.FUNCTION_2001); return message; } /** * åæ¢æ£æµ * * @param request * @return */ public IoMessage build2002Message(QuantityRequest request) { IoMessage message = new IoMessage(); // è°æ´ä¿¡æ¯ buildInfo(message, request); message.setFunctionId(ServerUtils.FUNCTION_2002); return message; } /** * è¿åº¦æ¥è¯¢ * * @param request * @return */ public IoMessage build2003Message(QuantityRequest request) { IoMessage message = new IoMessage(); // è°æ´ä¿¡æ¯ buildInfo(message, request); message.setFunctionId(ServerUtils.FUNCTION_2003); return message; } /** * ç»æä¸æ¥ * * @param * @return */ public IoMessage build2004Message(IoMessage message) { message.setFunctionId(ServerUtils.FUNCTION_2004); message.setContent(null); return message; } /** * æ¥è¯¢ç¹ä½æ°æ® * * @param request * @return */ public IoMessage build2005Message(QuantityRequest request) { IoMessage message = new IoMessage(); // è°æ´ä¿¡æ¯ buildInfo(message, request); message.setFunctionId(ServerUtils.FUNCTION_2005); return message; } /** * ææ * * @param message * @return */ public IoMessage build2006Message(IoMessage message) { message.setFunctionId(ServerUtils.FUNCTION_2006); message.setContent(""); return message; } /** * ææ * * @param request * @return */ public IoMessage build2006Message(QuantityRequest request) { IoMessage message = new IoMessage(); // è°æ´ä¿¡æ¯ buildInfo(message, request); message.setFunctionId(ServerUtils.FUNCTION_2006); return message; } /** * å¿è·³è¿å * * @param message * @return */ public IoMessage build2007Message(IoMessage message) { //message.setFunctionId(ServerUtils.FUNCTION_2007); return message; } public void buildInfo(IoMessage message, QuantityRequest request) { message.setSn(request.getSn()); message.setOrderId(ServerUtils.createOrderId()); message.setSign(ServerUtils.SIGN_DEFAULT); message.setResult(ServerUtils.RESP_0); message.setVersion(ServerUtils.VERSION_1); } /** * æ ¹æ®çæçå½ä»¤ï¼è¿è¡è°æ´ * * @param message */ public String build(IoMessage message) { StringBuffer hexSb = new StringBuffer(); hexSb.append(ServerUtils.MSG_BEGIN); hexSb.append(JSONObject.toJSONString(message)); hexSb.append((ServerUtils.MSG_END)); return hexSb.toString(); } private static CommandBuilder instance = new CommandBuilder(); private CommandBuilder() { } public static CommandBuilder getInstance() { return instance; } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/command/QueryProgressTask.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ package com.fzzy.igds.quantity.command; import com.fzzy.igds.quantity.dto.IoMessage; import com.fzzy.igds.request.QuantityRequest; import com.ruoyi.common.core.redis.RedisCache; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Callable; /** * @Description æ°éæ£æµè¿åº¦æ¥è¯¢ï¼é»è®¤æ§è¡ä¸æ¬¡æ¥è¯¢å䏿¬¡ææ * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j public class QueryProgressTask implements Callable<String> { private RedisCache redisUtil; private String redisKey; private BhznRemoteQuantityImpl remoteQuantityService; public QueryProgressTask() { super(); } public QueryProgressTask(RedisCache redisUtil, BhznRemoteQuantityImpl remoteQuantityService, String redisKey) { super(); this.redisUtil = redisUtil; this.remoteQuantityService = remoteQuantityService; this.redisKey = redisKey; } @Override public String call() throws Exception { int index = 1; while (index <= 10) { index++; try { Thread.sleep(1000 * 35); QuantityRequest request = (QuantityRequest) redisUtil.getCacheObject(redisKey); if (null == request) { index = 11; log.debug("åå½ä»¤æ§è¡è¿åº¦æ¥è¯¢ç»æï¼æ£æµå®æ" ); return "SUCCESS"; } IoMessage message = CommandBuilder.getInstance().build2003Message(request); log.debug("å¹³å°---->>æ°éæ£æµï¼åå½ä»¤æ§è¡è¿åº¦æ¥è¯¢ï¼" + message.toString()); remoteQuantityService.sendMsg(request.getIp(), request.getPort(), message); Thread.sleep(1000 * 3); } catch (Exception e) { log.error("å¹³å°---->>æ°éæ£æµï¼åå½ä»¤æ§è¡åºç°å¼å¸¸ï¼" + e.getMessage()); log.error(e.getMessage(), e); } } return "SUCCESS"; } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/IoMessage.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class IoMessage implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String sn;//åºåå· private String version = "V1.0"; private String sign = "0000"; private String functionId; private String result; private String orderId; private String content;//æ¶æ¯ä½ } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/Req1001.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class Req1001 implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int height;//å®è£ é«åº¦ private int orien;//å®è£ æå 8个æ åæ¹åï¼1-ä¸ï¼2-西ï¼3-åï¼4-åï¼5-ä¸åï¼6-西åï¼7-ä¸åï¼8-西å private int voluWeight;//容éä»åºç²®é£å®¹éï¼å¦æä¸å¡«åï¼åææµéï¼åªè¿åä½ç§¯ï¼ä¸è¿åééä¿¡æ¯ private int storageType;// 仿¿ç±»å 0-çä»ï¼1-å¹³æ¿ä»ï¼ private int length;//仿¿é¿ åä½åç±³ private int width;// 仿¿å®½ åä½åç±³ private int radius;// çä»åå¾ private int coneHeight;//çä»ä¸é¥é«åº¦ private int probeX;//xè½´åæ åç§»é private int probeY;//yè½´åæ åç§»é private int volumeAdd;//vä½ç§¯è¡¥å¿ åä½ m³ private int weightAdd;//ééè¡¥å¿ åä½KG } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/Resp1002.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class Resp1002 implements Serializable { /** * */ private static final long serialVersionUID = 1L; private long time;// æ¶é´æ³ï¼å½å毫ç§å¼ } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/Resp2003.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class Resp2003 implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int index;// æ£æµç´¯ç§¯æ¬¡æ° private int progress;// 0-100ï¼è¡¨ç¤º0%-100% } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/Resp2004.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class Resp2004 implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int height; //é«åº¦ åä½åç±³ private double volume; //ä½ç§¯ private double weight; //éé private int index; //æ£æµç´¯ç§¯æ¬¡æ° } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/Resp2005.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class Resp2005 implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int index;// æ£æµç´¯ç§¯æ¬¡æ° private int curPackage;// å½åå æ° private int sumPackeage;// æ»å æ° private int orien;// å®è£ æå private int dataCount;// åæ ä¸ªæ° private String data;// åæ æ°æ® } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/dto/Resp2006.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.fzzy.igds.quantity.dto; import lombok.Data; import java.io.Serializable; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Data public class Resp2006 implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String data;// å¾çæ°æ® base64æ ¼å¼ } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/server/BhznQuantityMessageConsumer.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ package com.fzzy.igds.quantity.server; import com.fzzy.igds.quantity.analysis.AnalysisService; import com.fzzy.igds.quantity.dto.IoMessage; import com.fzzy.igds.quantity.util.ServerUtils; import com.ld.io.api.IoMsgConsumer; import com.ld.io.api.IoSession; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @Description è¿åä¿¡æ¯å°è£ * @Author CZT * @Date 2026/01/08 16:36 */ @Service @Slf4j public class BhznQuantityMessageConsumer implements IoMsgConsumer { @Autowired private AnalysisService analysisService; /** * å¤çæ¶æ¯ * * @param ioSession * @param bytes */ @Override public void consume(IoSession ioSession, byte[] bytes) { if (null == bytes) { log.error("Reply bytes is null"); return; } try { String message = new String(bytes, ServerUtils.CHARSET); message = message.substring(message.indexOf(ServerUtils.MSG_BEGIN) + ServerUtils.MSG_BEGIN.length()); log.info("æ°éæ£æµ---->>å¹³å°ï¼æ¥æä¿¡æ¯ï¼" + message); IoMessage ioMessage = ServerUtils.buildMessage(message); analysisService.analysis(ioSession.getBusinessKey(), ioMessage); } catch (Exception e) { log.error("æ°éæ£æµ---->>å¹³å°ï¼æ¥æå¼å¸¸ï¼" + e.getMessage()); } } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/server/BhznQuantityServerEngine.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,115 @@ package com.fzzy.igds.quantity.server; import com.fzzy.igds.quantity.util.ServerUtils; import com.ld.io.api.InvokeResult; import com.ld.io.api.IoServerOption; import com.ld.io.api.IoSession; import com.ld.io.api.IoSessionQuery; import com.ld.io.netty.NettyServer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @Description 飿£è´è¿åè®®Serverå¯å¨ç±» * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j @Service public class BhznQuantityServerEngine { public static final Integer PORT = 9306; @Autowired private BhznQuantityMessageConsumer defaultMessageConsumer; @Autowired private BhznQuantitySessionListener defaultSessionListener; private IoSessionQuery sessionQuery; public void start(Integer port) { IoServerOption ioServerOption = new IoServerOption(); if (null != port) { ioServerOption.setPort(port); } else { ioServerOption.setPort(PORT); } ioServerOption.setDelimiter(ServerUtils.MSG_END.getBytes()); NettyServer ioServer = new NettyServer(ioServerOption, defaultMessageConsumer, defaultSessionListener); ioServer.startup(); sessionQuery = ioServer.getSessionQuery(); log.info("* "); log.info("* ========================"); log.info("* "); log.info("* [QUANTITY-FZZY-SERVERï¼FZZY_TCP_QUANTITY_V3.5,PORT={}]", PORT); log.info("* "); log.info("* ========================"); log.info("* "); System.out.println("* ========================"); System.out.println("* "); System.out.println("* [QUANTITY-FZZY-SERVERï¼FZZY_TCP_QUANTITY_V3.5,PORT={}]" + port); System.out.println("* "); System.out.println("* ========================"); } public IoSessionQuery getSessionQuery() { return sessionQuery; } /** * åéä¿¡æ¯ * * @param ip * @param port * @param msg * @return */ public InvokeResult push(String ip, int port, byte[] msg) { IoSessionQuery sessionFactory = getSessionQuery(); List<IoSession> sessions = sessionFactory.getAllSession(); IoSession session = null; for (IoSession ioSession : sessions) { if (ServerUtils.getServerKey(ip, port).equals(ioSession.getBusinessKey())) { session = ioSession; break; } } if (null == session) { return InvokeResult.CHANNEL_CLOSED; } return session.invoke(msg); } /** * 主å¨éæ¯å½åè¿æ¥ * * @param ip * @param port * @return */ public InvokeResult destroy(String ip, int port) { IoSessionQuery sessionFactory = getSessionQuery(); List<IoSession> sessions = sessionFactory.getAllSession(); IoSession session = null; for (IoSession ioSession : sessions) { if (ServerUtils.getServerKey(ip, port).equals(ioSession.getBusinessKey())) { session = ioSession; break; } } if (null == session) { return InvokeResult.SUCCESS; } // æ§è¡è¿æ¥éæ¯ session.destroy(); return InvokeResult.SUCCESS; } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/server/BhznQuantitySessionListener.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,30 @@ package com.fzzy.igds.quantity.server; import com.fzzy.igds.quantity.util.ServerUtils; import com.ld.io.api.IoSession; import com.ld.io.api.IoSessionListener; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * @Description * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j @Service public class BhznQuantitySessionListener implements IoSessionListener { @Override public void onCreate(IoSession session) { log.info("++++æ°å»ºè¿æ¥++++-IP={}ï¼PORT={}", session.getAddress(), session.getPort()); // æ·»å èªå®ä¹ä¸å¡ID session.setBusinessKey(ServerUtils.getServerKey(session.getAddress(), session.getPort())); } @Override public void onDestroy(IoSession session) { log.info("----è¿æ¥æå¼-----IP={}ï¼PORT={}", session.getAddress(), session.getPort()); } } fzzy-igdss-io/src/main/java/com/fzzy/igds/quantity/util/ServerUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,77 @@ package com.fzzy.igds.quantity.util; import com.alibaba.fastjson.JSON; import com.fzzy.igds.constant.RedisConst; import com.fzzy.igds.quantity.dto.IoMessage; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomUtils; /** * @Description * @Author CZT * @Date 2026/01/08 16:36 */ @Slf4j public class ServerUtils { public static final String VERSION_1 = "v1.0"; public static final String SIGN_DEFAULT = "0000"; public static final String CHARSET = "UTF-8"; public static final String MSG_BEGIN = "<BHZN>"; public static final String MSG_END = "<END>"; //åè½ç public static final String FUNCTION_1001 = "1001";// åºç¡åæ°é ç½® public static final String FUNCTION_2001 = "2001";// å¼å§æ£æµ public static final String FUNCTION_2002 = "2002";// åæ¢æ£æµ public static final String FUNCTION_2003 = "2003";// è¿åº¦æ¥è¯¢ public static final String FUNCTION_2004 = "2004";// ç»æä¸æ¥ public static final String FUNCTION_2005 = "2005";// åæ æå public static final String FUNCTION_2006 = "2006";// è¿ç¨ææ public static final String FUNCTION_2007 = "2007";// å¿è·³ç»´æ public static final String FUNCTION_1002 = "1002";// æ¶é´åæ¥ public static final String FUNCTION_1003 = "1003";// 设å¤ç»é //ååºç public static String RESP_0 = "0";// æå public static String RESP_1 = "1";// å½ä»¤æ ¼å¼é误 public static String RESP_2 = "2";// å½ä»¤æ°æ®æ£éªå¼å¸¸ public static String RESP_3 = "3";// åéè¶ æ¶é误 public static String RESP_4 = "4";// ç»ç«¯è®¾å¤ä¸å¨çº¿ public static String RESP_5 = "5";// ç»ç«¯è®¾å¤æ§è¡ä¸ public static String RESP_6 = "6";// ç»ç«¯è®¾å¤ææå¤±è´¥ public static String RESP_9 = "9";// å ¶å®é误 /** * çæTCPè¿æ¥çKEY * * @param ip * @param port * @return */ public static String getServerKey(String ip, Integer port) { return ip + ":" + port; } /** * @param message * @return */ public static IoMessage buildMessage(String message) throws Exception { IoMessage ioMessage = JSON.parseObject(message, IoMessage.class); return ioMessage; } public static String buildRequestKey(String companyId, String sn) { return RedisConst.buildKey(companyId, sn); } public static String createOrderId() { return RandomUtils.nextInt(1000, 9999) + ""; } } fzzy-igdss-web/src/main/java/com/fzzy/Application.java
@@ -11,9 +11,7 @@ import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ImportResource; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import java.util.LinkedHashSet; import java.util.Set; @@ -25,7 +23,6 @@ @EnableRedisHttpSession @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @ComponentScan(basePackages = {"com.fzzy", "com.ruoyi", "com.ld"}) @MapperScan("com.fzzy.*.mapper") @EntityScan(basePackages = {"com.fzzy.*.*.domain"}) public class Application { fzzy-igdss-web/src/main/java/com/fzzy/security/SecurityController.java
@@ -9,6 +9,7 @@ import com.fzzy.igds.data.PageResponse; import com.fzzy.igds.data.PatrolSuperData; import com.fzzy.igds.domain.*; import com.fzzy.igds.response.BaseResponse; import com.fzzy.igds.utils.ContextUtil; import com.fzzy.igds.utils.SystemUtil; import com.fzzy.common.manager.CommonManager; @@ -277,7 +278,30 @@ return secManager.getQuantityFiles(param); } /** * æ°éçæµ-å¼å§æ£æµ * * @param param * @return */ @RequestMapping("/check-single") @ResponseBody public BaseResponse checkSingle(@RequestBody IgdsBaseParam param) { return secManager.checkSingle(param); } /** * æ°éçæµ-åæ¢æ£æµ * * @param param * @return */ @RequestMapping("/check-stop") @ResponseBody public BaseResponse checkStop(@RequestBody IgdsBaseParam param) { return secManager.checkStop(param); } /*------------------å·¡æ´è½¨è¿¹é¡µé¢------------------*/ /** fzzy-igdss-web/src/main/java/com/fzzy/security/manager/SecManager.java
@@ -4,15 +4,22 @@ import com.fzzy.igds.camera.ApiCameraManager; import com.fzzy.igds.camera.data.ApiCameraData; import com.fzzy.igds.camera.data.ApiCameraResp; import com.fzzy.igds.constant.OrderRespEnum; import com.fzzy.igds.constant.RespCodeEnum; import com.fzzy.igds.data.*; import com.fzzy.igds.domain.*; import com.fzzy.igds.io.manager.QuantityRemoteManager; import com.fzzy.igds.io.service.RemoteQuantityService; import com.fzzy.igds.request.QuantityRequest; import com.fzzy.igds.response.BaseResponse; import com.fzzy.igds.service.*; import com.fzzy.igds.utils.ContextUtil; import com.fzzy.igds.utils.DateUtil; import com.ruoyi.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -32,6 +39,8 @@ @Resource private CommonManager commonManager; @Resource private QuantityRemoteManager remoteManager; @Resource private SecCameraService secCameraService; @Resource @@ -316,4 +325,82 @@ return new PageResponse<>(RespCodeEnum.CODE_0000.getCode(), "æ§è¡æåï¼ï¼", fileList); } /** * å仿£æµ * * @param param * @return */ public BaseResponse checkSingle(IgdsBaseParam param) { if (null == param || StringUtils.isBlank(param.getDepotId())) { return new BaseResponse(RespCodeEnum.CODE_1007.getCode(), RespCodeEnum.CODE_1007.getMsg()); } if (StringUtils.isBlank(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } QuantityConf conf = quantityService.getCacheQuantityConf(param.getCompanyId(), param.getDepotId()); if (conf == null) { return new BaseResponse(RespCodeEnum.CODE_1007.getCode(), RespCodeEnum.CODE_1007.getMsg()); } RemoteQuantityService remoteQuantityService = remoteManager.getRemoteQuantityService(conf.getProtocol()); if (null == remoteQuantityService) { return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "ç³»ç»æ²¡æ" + conf.getProtocol() + "çåè®®å®ç°ï¼æ§è¡è¢«æç»ï¼"); } QuantityRequest request = new QuantityRequest(); BeanUtils.copyProperties(conf, request); request.setDepotId(conf.getDepotId()); request.setYtIp(conf.getYtIp()); request.setCompanyId(conf.getCompanyId()); request.setDeptId(conf.getDeptId()); request.setSn(conf.getSn()); request.setLength(conf.getLength()); request.setBatchId(conf.getDepotId() + "_" + DateFormatUtils.format(new Date(), "yyyyMMddHHmm")); return remoteQuantityService.checkStart(request); } /** * åæ¢æ£æµ * @param param * @return */ public BaseResponse checkStop(IgdsBaseParam param) { if (param == null || StringUtils.isEmpty(param.getDepotId())) { return new BaseResponse(RespCodeEnum.CODE_1007.getCode(), RespCodeEnum.CODE_1007.getMsg()); } if (StringUtils.isEmpty(param.getCompanyId())) { param.setCompanyId(ContextUtil.getCompanyId()); } QuantityConf conf = quantityService.getCacheQuantityConf(param.getCompanyId(), param.getDepotId()); if (conf == null) { return new BaseResponse(RespCodeEnum.CODE_1007.getCode(), RespCodeEnum.CODE_1007.getMsg()); } RemoteQuantityService remoteQuantityService = remoteManager.getRemoteQuantityService(conf.getProtocol()); if (null == remoteQuantityService) { return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(), "ç³»ç»æ²¡æ" + conf.getProtocol() + "çåè®®å®ç°ï¼æ§è¡è¢«æç»ï¼"); } QuantityRequest request = new QuantityRequest(); BeanUtils.copyProperties(conf, request); request.setCompanyId(conf.getCompanyId()); request.setYtIp(conf.getYtIp()); request.setSn(conf.getSn()); request.setDeptId(conf.getDeptId()); request.setDepotId(conf.getDepotId()); return remoteQuantityService.checkStop(request); } } fzzy-igdss-web/src/main/resources/static/security/quantity.js
@@ -143,7 +143,6 @@ } } /** * 请æ±å¾è¡¨ä¿¡æ¯ */ @@ -317,6 +316,68 @@ $("#divPlugin2").html(html); } /** * å¯å¨å¼å§æ£æµ */ function checkStart() { if (!curCamera) { shoTips("请å éæ©è®¾å¤ï¼"); return; } layer.msg("å¼å§æ§è¡â¦â¦"); var data = { 'depotId': curCamera.depotId }; $.ajax({ type: "POST", url: "/security/check-single", dataType: "json", contentType: "application/json;charset=UTF-8", data: JSON.stringify(data), success: function (result) { if (result.code == "ORDER_SUCCESS") { shoTips("å½ä»¤åçæåï¼è¯·çå¾ ç»ç«¯è¿åç»æâ¦â¦"); } else { shoTips("å½ä»¤åé失败ï¼" + result.msg); } }, error: function () { shoTips("æ£æµåºç°å¼å¸¸ï¼æ§è¡å¤±è´¥ï¼"); } }); } /** * åæ¢æ£æµ */ function checkStop() { if (!curCamera) { shoTips("请å éæ©ä»åºï¼"); return; } layer.msg("å¼å§æ§è¡â¦â¦"); var data = { 'depotId': curCamera.depotId }; $.ajax({ type: "POST", url: "/security/check-stop", dataType: "json", contentType: "application/json;charset=UTF-8", data: JSON.stringify(data), success: function (result) { if (result.code == "ORDER_SUCCESS") { shoTips("å½ä»¤åçæåâ¦â¦"); } else { shoTips("å½ä»¤åé失败ï¼" + result.msg); } }, error: function () { shoTips("æ£æµåºç°å¼å¸¸ï¼æ§è¡å¤±è´¥ï¼"); } }); } // åå§åECharts温度走å¿å¾ function initEcharts(names, data) { // åå§åECharts温度走å¿å¾ @@ -389,4 +450,11 @@ window.addEventListener('resize', function () { temperatureChart.resize(); }); } function shoTips(msg) { layer.msg(msg, {time: 3000, shift: 5, offset: "rb"}, function () { }); } fzzy-igdss-web/src/main/resources/templates/security/quantity.html
@@ -68,28 +68,34 @@ <!-- ç®åçè§é¢æ§å¶å·¥å ·æ --> <div style="margin-top: 15px; text-align: center; background-color: #f5f5f5; padding: 10px; border-radius: 4px;"> <button class="layui-btn layui-btn-default layui-btn-sm"> ä¸ç§» <i class="layui-icon layui-icon-up"></i> <button class="layui-btn layui-btn-default layui-btn-sm" onmousedown="ptzControl(1);" onmouseup="moveStop();"> ä¸ç§» <i class="layui-icon layui-icon-up"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> ä¸ç§» <i class="layui-icon layui-icon-down"></i> <button class="layui-btn layui-btn-default layui-btn-sm" onmousedown="ptzControl(2);" onmouseup="moveStop();"> ä¸ç§» <i class="layui-icon layui-icon-down"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> 左移 <i class="layui-icon layui-icon-left"></i> <button class="layui-btn layui-btn-default layui-btn-sm" onmousedown="ptzControl(3);" onmouseup="moveStop();"> 左移 <i class="layui-icon layui-icon-left"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> å³ç§» <i class="layui-icon layui-icon-right"></i> <button class="layui-btn layui-btn-default layui-btn-sm" onmousedown="ptzControl(4);" onmouseup="moveStop();"> å³ç§» <i class="layui-icon layui-icon-right"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> å å <i class="layui-icon layui-icon-addition"></i> <button class="layui-btn layui-btn-default layui-btn-sm" onmousedown="ptzControl(10);" onmouseup="zoomStop();"> åç¦å¤§ <i class="layui-icon layui-icon-addition"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> åå <i class="layui-icon layui-icon-subtraction"></i> <button class="layui-btn layui-btn-default layui-btn-sm" onmousedown="ptzControl(9);" onmouseup="zoomStop();"> åç¦å° <i class="layui-icon layui-icon-subtraction"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> <button class="layui-btn layui-btn-default layui-btn-sm" onclick="checkStart()"> å¼å§æ£æµ <i class="layui-icon layui-icon-subtraction"></i> </button> <button class="layui-btn layui-btn-default layui-btn-sm"> <button class="layui-btn layui-btn-default layui-btn-sm" onclick="checkStop()"> åæ¢æ£æµ <i class="layui-icon layui-icon-subtraction"></i> </button> </div> @@ -255,4 +261,5 @@ <script th:src="@{/ajax/libs/layui/layui.js}"></script> <script th:src="@{/js/plugins/echarts/echarts.min-4.7.js}"></script> <script th:src="@{/security/quantity.js}"></script> <script th:src="@{/security/video-control.js}"></script> </html>