Bläddra i källkod

LED发送临时消息,socket发送81报文

qzy 3 månader sedan
förälder
incheckning
ae81a22b59

+ 7 - 2
config.xml

@@ -1,19 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <config>
     <managerSetting>
-        <enable>true</enable>
+        <enable>false</enable>
         <host>192.168.3.15</host>
         <beatPort>8010</beatPort>
         <serverUrl>http://127.0.0.1:9191</serverUrl>
     </managerSetting>
+    <socketSetting>
+        <host>127.0.0.1</host>
+        <port>8012</port>
+    </socketSetting>
     <!--通道属性配置-->
     <channelSetting>
         <!--本机IP-->
         <ip>192.168.3.15</ip>
+        <placeCode>10FGDDF</placeCode>
         <sourcePort>8090</sourcePort>
         <channelName>行政通道</channelName>
         <channelCode>NA01</channelCode>
+        <ieFlag>I</ieFlag>
         <twinChannelCode>C1000</twinChannelCode>
         <!--共生通道地址-->
         <twinService>http://127.0.0.1:9898</twinService>

+ 2 - 2
pom.xml

@@ -165,9 +165,9 @@
                     <!--联运中心-->
 <!--                    <code>D72E7F75D4CDEEFAD7AC77891557F586D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>-->
                     <!--北海-->
-<!--                    <code>AE135DDFE7E3871BE848301327CA8E2ED41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>-->
+                    <code>AE135DDFE7E3871BE848301327CA8E2ED41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>
                     <!--南京-->
-                    <code>A4CFD53BE12CC512727611ACFC1EE05ED41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>
+<!--                    <code>A4CFD53BE12CC512727611ACFC1EE05ED41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>-->
                     <!--限定区域-->
 <!--                    <code>C41BF0CE8FF4E89D45E95A3AFB46E2E9D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>-->
                     <packages>com.gzlh</packages> <!--可以多个-->

+ 17 - 16
src/main/java/com/gzlh/api/OpenApi.java

@@ -88,19 +88,19 @@ public class OpenApi {
         String text = "船名: 船名" + "\n" +
                 "船次:123456 " + " \n" +
                 "仓单号:123456 " + " \n" +
-                "货名: 广西公司由西安肌肤"  + " \n" +
+                "货名: 广西公司由西安肌肤" + " \n" +
                 "货主单位: 船名的或者大胆" + "\n" +
-                "车号: 桂A025623"  + "\n" +
+                "车号: 桂A025623" + "\n" +
                 "一次过磅时间: 23" + "\n" +
-                "毛重: 434"  + "吨\n" +
-                "二次过磅时间:22222 "  + "\n" +
+                "毛重: 434" + "吨\n" +
+                "二次过磅时间:22222 " + "\n" +
                 "皮重: 3534" + "吨\n" +
                 "净重: 3232" + "吨\n" +
-                "件数/重量/体积: 54/48/65"  + "\n" +
+                "件数/重量/体积: 54/48/65" + "\n" +
                 "地点: 地点" + "\n" +
-                "备注: 你好" ;
+                "备注: 你好";
         String imageResourcePath = "/chapter/qzChapter.jpg";
-        ThreadUtil.execute(new PrintWithChapter(imageResourcePath,text));
+        ThreadUtil.execute(new PrintWithChapter(imageResourcePath, text));
         return "ok";
     }
 
@@ -110,9 +110,9 @@ public class OpenApi {
         // http://10.26.1.26/DE3/2025/4/27/桂E31655-2504270636.jpg
         String rootPath = SysConfig.channelSetting.getFileRootPath();
         String serverUrl = "http://" + SysConfig.channelSetting.getIp();
-        String sourcePort= SysConfig.channelSetting.getSourcePort();
-        if (StrUtil.isNotEmpty(sourcePort)){
-            serverUrl=serverUrl+":"+sourcePort;
+        String sourcePort = SysConfig.channelSetting.getSourcePort();
+        if (StrUtil.isNotEmpty(sourcePort)) {
+            serverUrl = serverUrl + ":" + sourcePort;
         }
         String separator = File.separator;
         String fileName = StrUtil.replace(url, serverUrl, rootPath).replace("/", separator);
@@ -145,10 +145,11 @@ public class OpenApi {
         eventBus.startEvent(event);
         return AjaxJson.getSuccess();
     }
+
     @RequestMapping("say")
     public AjaxJson say(String msg) {
-      SystemObject.voiceFactory.handler(SysConfig.voiceSetting.getBrand()).weekUp();
-      SystemObject.voiceFactory.handler(SysConfig.voiceSetting.getBrand()).sendMsgSpeek(msg);
+        SystemObject.voiceFactory.handler(SysConfig.voiceSetting.getBrand()).weekUp();
+        SystemObject.voiceFactory.handler(SysConfig.voiceSetting.getBrand()).sendMsgSpeek(msg);
         return AjaxJson.getSuccess();
     }
 
@@ -209,7 +210,7 @@ public class OpenApi {
     public AjaxJson getCurrentCarImg() {
         ReqBO reqBO = EventDataManager.getCacheData();
         JSONObject result = new JSONObject();
-        result.set("carNo", reqBO.getCarNo()).set("carImg", reqBO.getCarImg());
+        result.set("carNo", reqBO.getCarNo()).set("carImg", reqBO.getCarImg()).set("recordId", reqBO.getId());
         return AjaxJson.getSuccess("成功", result);
     }
 
@@ -257,7 +258,7 @@ public class OpenApi {
 
     @RequestMapping("channel/sleep")
     public AjaxJson sleep(String carNo) {
-        if (StrUtil.isEmpty(carNo)){
+        if (StrUtil.isEmpty(carNo)) {
             return AjaxJson.getSuccess();
         }
         //log.error("双向通道,下磅休眠5秒=======");
@@ -300,7 +301,7 @@ public class OpenApi {
 
 
     @RequestMapping("channel/led")
-    public AjaxJson led(String msg, String line) {
+    public AjaxJson led(String msg, String line,String type) {
         LedOptions options = new LedOptions().setLine("0" + line).setShowType("00");
         SystemObject.ledFactory.handler(SysConfig.serialSetting.getLed().getBrand())
                 .sendMsg(msg, options);
@@ -324,7 +325,7 @@ public class OpenApi {
         });
         DeviceCache.setInterrupt(false);
         SubmitCache.cleanCache();
-        if (SysConfig.channelSetting.getChannelType()==1) {
+        if (SysConfig.channelSetting.getChannelType() == 1) {
             //行政通道
             eventBus.startEvent(ModuleEnum.CAPTURE_MODULE.getModuleEn() + "." + CaptureEvent.CAPTURE_ADMIN);
             return AjaxJson.getSuccess();

+ 3 - 0
src/main/java/com/gzlh/bus/CenterActionCommand.java

@@ -7,6 +7,8 @@ public interface CenterActionCommand {
 
     //    提交数据
     String SUBMIT = "SUBMIT";
+
+    String SUBMIT_81_SOCKET = "SUBMIT_81_SOCKET";
     String SUBMIT_WIDE = "SUBMIT_WIDE";
     /**
      * 东岸
@@ -28,6 +30,7 @@ public interface CenterActionCommand {
 
 
     String FINISH_WEIGHT = "FINISH_WEIGHT";
+
     /**
      * 提交车牌数据给限定区域
      */

+ 2 - 0
src/main/java/com/gzlh/bus/SysConfig.java

@@ -29,6 +29,7 @@ public class SysConfig {
     public static PassportSetting passportSetting;
     public static VoiceSetting voiceSetting;
     public static  QrcodeSetting qrcodeSetting;
+    public static  SocketSetting socketSetting;
     public static FaceListDTO faceDTO;
 
     public static void initConfig() {
@@ -52,6 +53,7 @@ public class SysConfig {
         passportSetting = configDTO.getConfig().getPassport();
         voiceSetting = configDTO.getConfig().getVoice();
         qrcodeSetting=configDTO.getConfig().getQrcodeSetting();
+        socketSetting=configDTO.getConfig().getSocketSetting();
         parseFace(result);
         DeviceCache.deviceStatusInit();
     }

+ 6 - 4
src/main/java/com/gzlh/bus/thread/EventThread.java

@@ -50,7 +50,7 @@ public class EventThread implements Runnable {
         CaputreSetting caputreSetting = SysConfig.caputreSetting;
         PassportEventHandlerFactory passportEventHandlerFactory = SystemObject.passportEventHandlerFactory;
         VoiceFactory voiceFactory = SystemObject.voiceFactory;
-//          log.info("event:{}", eventName);
+        log.info("event:{}", eventName);
         SysConfig.eventDTOList.stream().filter(eventDTO -> StrUtil.equals(eventName, eventDTO.getName()))
                 .findFirst().ifPresent(eventDTO -> {
                     List<String> actionList = eventDTO.getActionList().getAction();
@@ -91,7 +91,7 @@ public class EventThread implements Runnable {
                         } else if (StrUtil.equals(module, ModuleEnum.PASSPORT_MODULE.getModuleEn())) {
                             //动作护照
                             passportEventHandlerFactory.handler(SysConfig.passportSetting.getBrand()).handlerAction(command);
-                        }  else if (StrUtil.equals(module, ModuleEnum.VOICE_MODULE.getModuleEn())) {
+                        } else if (StrUtil.equals(module, ModuleEnum.VOICE_MODULE.getModuleEn())) {
                             //动作 语音播报
                             voiceFactory.handler(SysConfig.voiceSetting.getBrand()).handlerAction(command);
                         } else if (StrUtil.equals(module, ModuleEnum.CENTER_MODULE.getModuleEn())) {
@@ -120,12 +120,12 @@ public class EventThread implements Runnable {
             ThreadUtil.execute(new SubmitWideThread());
         } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_DONG_AN)) {
             ThreadUtil.execute(new SubmitDongAnThread());
-        }  else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_DONG_AN_ADMIN)) {
+        } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_DONG_AN_ADMIN)) {
             ThreadUtil.execute(new SubmitDongAnAdminThread());
         } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_HARBORPOLE)) {
             //港内称重
             handlerHarborpoleSubmit();
-        }  else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_NANJING)) {
+        } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_NANJING)) {
             //南京空港
             ThreadUtil.execute(new SubmitNanJingThread());
         } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.FINISH_WEIGHT)) {
@@ -134,6 +134,8 @@ public class EventThread implements Runnable {
             ThreadUtil.execute(new SubmitCarToLimitServerThread());
         } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_FACE_LIMIT_SERVER)) {
             ThreadUtil.execute(new SubmitFaceToLimitServerThread());
+        } else if (StrUtil.equalsIgnoreCase(action, CenterActionCommand.SUBMIT_81_SOCKET)) {
+            ThreadUtil.execute(new Sub81Thread());
         }
     }
 

+ 67 - 0
src/main/java/com/gzlh/bus/thread/Sub81Thread.java

@@ -0,0 +1,67 @@
+package com.gzlh.bus.thread;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.gzlh.bus.ChannelCacheManager;
+import com.gzlh.bus.EventDataManager;
+import com.gzlh.bus.SysConfig;
+import com.gzlh.config.SystemObject;
+import com.gzlh.config.dto.ChannelSetting;
+import com.gzlh.config.parser81.Xml81Data;
+import com.gzlh.config.parser81.XmlPlaceholderFiller;
+import com.gzlh.entity.ReqBO;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.Socket;
+
+@Slf4j
+public class Sub81Thread implements Runnable {
+
+
+    @Override
+    public void run() {
+        ReqBO reqBO = EventDataManager.getCacheData();
+        if (!ChannelCacheManager.stateEnable(SysConfig.channelSetting.getChannelCode())) {
+            log.error("通道已停用:{}", JSONUtil.toJsonStr(reqBO));
+            return;
+        }
+        ChannelSetting channelSetting = SysConfig.channelSetting;
+        Xml81Data xml81Data = new Xml81Data();
+        String img = reqBO.getCarImg();
+        ReqBO.Box box = reqBO.getBox();
+        if (box != null) {
+            String boxFImg = box.getBoxFImg();
+            img = img + "," + boxFImg;
+            String boxBImg = box.getBoxBImg();
+            if (StrUtil.isNotEmpty(boxBImg)) {
+                img = img + "," + boxBImg;
+            }
+        }
+        xml81Data.setCHANNEL_CODE(channelSetting.getChannelCode()).setI_E_FLAG(channelSetting.getIeFlag())
+                .setAREA_ID(channelSetting.getPlaceCode()).setPLATE_D(reqBO.getCarNo())
+                .setVEHICLE_WEIGHT_DATA(reqBO.getWeight() + "")
+                .setVEHICLE_RFID_DATA(reqBO.getEri()).setPLATE_PATH(img);
+        try (Socket socket = new Socket(SysConfig.socketSetting.getHost(), SysConfig.socketSetting.getPort());
+             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
+             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
+            String xmlContent = XmlPlaceholderFiller.fillXmlFromTemplate("81.xml", xml81Data);
+            // 发送XML
+            out.println(xmlContent);
+            log.info("已发送XML到服务器:{}", xmlContent);
+            // 接收响应
+            StringBuilder response = new StringBuilder();
+            String line;
+            while ((line = in.readLine()) != null) {
+                response.append(line).append("\n");
+            }
+            String resp = response.toString();
+            log.info("resp:{}", resp);
+        } catch (Exception e) {
+            log.error("send msg error:{}", e.getMessage());
+            e.printStackTrace();
+        }
+    }
+}

+ 2 - 2
src/main/java/com/gzlh/bus/thread/SubmitNanJingThread.java

@@ -45,7 +45,6 @@ public class SubmitNanJingThread implements Runnable {
             if (response.getStatus() == 200) {
                 String body = response.body();
                 JSONObject jsonObject = JSONUtil.parseObj(body);
-                //            返回数据解密
                 String data = WordHandlerUtils.AESDecrypt(jsonObject.get("data").toString());
                 log.info("data:{}", data);
                 CommandBO commandBO = JSONUtil.toBean(data, CommandBO.class);
@@ -53,7 +52,8 @@ public class SubmitNanJingThread implements Runnable {
 //                EventDataManager.cacheData("voiceMsg",msg);
                 SystemObject.voiceFactory.handler(SysConfig.voiceSetting.getBrand()).weekUp();
                 SystemObject.voiceFactory.handler(SysConfig.voiceSetting.getBrand()).sendMsgSpeek(msg);
-                if (jsonObject.getInt("code") == 200) {
+                int code=jsonObject.getInt("code");
+                if (code == 200) {
                     log.info("抬杆放行==========");
                     eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.RAILING_RISE);
                     EventDataManager.cleanData();

+ 1 - 0
src/main/java/com/gzlh/config/dto/ApplicationConfigDTO.java

@@ -35,6 +35,7 @@ public class ApplicationConfigDTO implements Serializable {
 
         private VoiceSetting voice;
         private QrcodeSetting qrcodeSetting;
+        private SocketSetting socketSetting;
 
         @NoArgsConstructor
         @Data

+ 4 - 0
src/main/java/com/gzlh/config/dto/ChannelSetting.java

@@ -22,6 +22,10 @@ public class ChannelSetting implements Serializable {
     @JsonProperty("channelCode")
     private String channelCode;
 
+    private String ieFlag;
+
+    private String placeCode;
+
     @JsonProperty("channelType")
     private int channelType=0;
 

+ 14 - 0
src/main/java/com/gzlh/config/dto/SocketSetting.java

@@ -0,0 +1,14 @@
+package com.gzlh.config.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+public class SocketSetting implements Serializable {
+    private String host;
+    private Integer port;
+
+}

+ 53 - 0
src/main/java/com/gzlh/config/parser81/Xml81Data.java

@@ -0,0 +1,53 @@
+package com.gzlh.config.parser81;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+@Data
+@Accessors(chain = true)
+public class Xml81Data {
+    /**
+     * <!--进出标识,I进E出-->
+     */
+    private String I_E_FLAG = "";
+    /**
+     * 通道号
+     */
+    private String CHANNEL_CODE = "";
+    private String AREA_ID = "";
+    /**
+     *<!--通道业务类型,通常为A,已经读取-->
+     */
+    private String PASS_METHOD = "A";
+    /**
+     * <!--会话编号,自动生成-->
+     */
+    private String SESSION_ID_DATA = DateUtil.format(new Date(), "yyyyMMddHHmmss")+ RandomUtil.randomNumbers(6) ;
+    /**
+     * <!--读取到的IC卡号-->
+     */
+    private String VEHICLE_IC_DATA = "";
+    private String IC_GOODS_NAME = "";
+    private String IC_BILL_NO = "";
+    /**
+     * <!--读取到的车牌号信息-->
+     */
+    private String PLATE_D = "";
+    /**
+     * <!--读取到的地磅重量-->
+     */
+    private String VEHICLE_WEIGHT_DATA = "";
+    /**
+     * <!--RFID卡号信息-->
+     */
+    private String VEHICLE_RFID_DATA = "";
+    /**
+     * <!--车牌图片保存路径,如有箱号,有箱号图片路径-->
+     */
+    private String PLATE_PATH = "";
+
+}

+ 118 - 0
src/main/java/com/gzlh/config/parser81/XmlPlaceholderFiller.java

@@ -0,0 +1,118 @@
+package com.gzlh.config.parser81;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+public class XmlPlaceholderFiller {
+    private static final Pattern XML_COMMENT_PATTERN = Pattern.compile("<!--.*?-->", Pattern.DOTALL);
+    /**
+     * 从XML模板文件读取内容并填充占位符
+     * @param templatePath 模板文件路径
+     * @param dataObject 包含真实数据的对象
+     * @return 填充后的XML字符串
+     * @throws IOException 文件读取异常
+     */
+    public static String fillXmlFromTemplate(String templatePath, Object dataObject) throws IOException {
+        // 读取XML模板
+        String xmlTemplate = readResourceFile(templatePath);
+
+        // 将对象属性转换为键值对映射
+        Map<String, String> dataMap = convertObjectToMap(dataObject);
+
+        // 替换占位符
+        return replacePlaceholders(xmlTemplate, dataMap);
+    }
+    /**
+     * 使用正则表达式移除XML注释
+     */
+    private static String removeXmlComments(String xml) {
+        return XML_COMMENT_PATTERN.matcher(xml).replaceAll("");
+    }
+    /**
+     * 读取类路径下的资源文件
+     */
+    private static String readResourceFile(String filePath) throws IOException {
+        StringBuilder content = new StringBuilder();
+        try (InputStream is = XmlPlaceholderFiller.class.getClassLoader().getResourceAsStream(filePath);
+             BufferedReader reader = new BufferedReader(new InputStreamReader(is,"GB2312"))) {
+
+            String line;
+            while ((line = reader.readLine()) != null) {
+                content.append(line).append("\n");
+            }
+        }
+        return removeXmlComments(content.toString());
+    }
+
+    /**
+     * 将对象属性转换为键值对映射
+     */
+    private static Map<String, String> convertObjectToMap(Object object) {
+        Map<String, String> map = new HashMap<>();
+        if (object == null) return map;
+
+        // 获取对象的所有字段
+        Class<?> clazz = object.getClass();
+        for (Field field : clazz.getDeclaredFields()) {
+            try {
+                field.setAccessible(true);
+                Object value = field.get(object);
+                if (value != null) {
+                    // 构建占位符名称,例如: {FIELD_NAME}
+                    String placeholder = "{" + field.getName().toUpperCase() + "}";
+                    map.put(placeholder, value.toString());
+                }
+            } catch (IllegalAccessException e) {
+                // 记录异常或忽略
+                e.printStackTrace();
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 替换XML模板中的占位符
+     */
+    private static String replacePlaceholders(String template, Map<String, String> data) {
+        String result = template;
+        for (Map.Entry<String, String> entry : data.entrySet()) {
+            result = result.replace(entry.getKey(), entry.getValue());
+        }
+        return result;
+    }
+    // 定义数据对象类
+   static class XmlData {
+        private String I_E_FLAG = "E";
+        private String CHANNEL_CODE = "12345";
+        private String PASS_METHOD = "A";
+        private String SESSION_ID_DATA = "S001";
+        private String VEHICLE_IC_DATA = "IC123";
+        private String IC_GOODS_NAME = "Goods";
+        private String IC_BILL_NO = "B001";
+        private String PLATE_D = "ABC123";
+        private String VEHICLE_WEIGHT_DATA = "1000";
+        private String VEHICLE_RFID_DATA = "RFID123";
+        private String PLATE_PATH = "/path/to/image";
+
+        // getter 和 setter 方法
+        // (可以根据需要添加,上面的反射代码不依赖这些方法)
+    }
+
+    // 使用方法
+    public static void main(String[] args) {
+        try {
+            XmlData data = new XmlData();
+            String filledXml = XmlPlaceholderFiller.fillXmlFromTemplate("81.xml", data);
+            System.out.println(filledXml);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 1 - 1
src/main/java/com/gzlh/device/led/client/LedClientHandler.java

@@ -20,7 +20,7 @@ public class LedClientHandler extends SimpleChannelInboundHandler<String> {
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
         DeviceCache.changeDeviceStatus(ModuleEnum.LED_MODULE.getModuleZh(), 1);
-        log.info("led get msg:{}", msg);
+//        log.info("led get msg:{}", msg);
     }
 
     @Override

+ 2 - 1
src/main/java/com/gzlh/device/led/handler/impl/LedHandlerFengLiYuan.java

@@ -77,7 +77,8 @@ public class LedHandlerFengLiYuan implements ILedHandler {
                 String weight = "";
                 weight = String.format("%.0f", EventDataManager.getCacheData().getWeight()).concat("kg");
                 ledOptions.setLine(line).setShowType("0B");
-                if (StrUtil.equals("", weight)) {
+                if (StrUtil.equals("kg", weight)) {
+                    weight="";
                     log.info("clean weight-----");
                 }
                 sendMsg(weight, ledOptions);

+ 45 - 39
src/main/java/com/gzlh/device/led/utils/FengLiYuanPackUtils.java

@@ -7,67 +7,73 @@ import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 public class FengLiYuanPackUtils {
-    private static final String HEADER_HEX="F501";
+    private static final String HEADER_HEX = "F501";
+
     /**
      * 构建
+     *
      * @param message 发送的信息
-     * @param line 行号
+     * @param line    行号
      * @return 起始字 F501 长度(从[屏地址]到[数据]最后字节) 屏地址 00 命令 01 发送 01 数据 总包校
      * 验
      */
-    public static String build(String message, LedOptions options){
+    public static String build(String message, LedOptions options) {
+        return build(message, "02", options);
+    }
+
+    public static String build(String message, String type, LedOptions options) {
         //消息的15进制
-         String msgHex=  WordHandlerUtils.msgToASCII(message);
-         int msgLength= msgHex.length();
-         String msgLenHex=Integer.toHexString(msgLength/2);
-         if (msgLenHex.length()==1){
-             msgLenHex="0"+msgLenHex;
-         }
-         String line= options.getLine();
-         String showType= options.getShowType();
-        if (StrUtil.isEmpty(showType)){
-            showType="00";
+        String msgHex = WordHandlerUtils.msgToASCII(message);
+        int msgLength = msgHex.length();
+        String msgLenHex = Integer.toHexString(msgLength / 2);
+        if (msgLenHex.length() == 1) {
+            msgLenHex = "0" + msgLenHex;
+        }
+        String line = options.getLine();
+        String showType = options.getShowType();
+        if (StrUtil.isEmpty(showType)) {
+            showType = "00";
         }
-        String color= options.getColor();
-        if (StrUtil.isEmpty(color)){
-            color="01";
+        String color = options.getColor();
+        if (StrUtil.isEmpty(color)) {
+            color = "01";
         }
         //内容=行号(01->08)+显示方式(00左移入)+日期显示方式(00固定信息)+速度(00->02)+颜色(01红色)+固定信息长度(xx)+message
-        String content=line+showType+"0001"+color+msgLenHex+msgHex;
-         //屏地址-->数据包内容
-         String packData="000101"+content;
-         int packLength=packData.length();
-        String packLengthHex= Integer.toHexString(packLength/2);
-        if (packLengthHex.length()==2){
-           packLengthHex="00"+packLengthHex;
-        }else if (packLengthHex.length()==1){
-            packLengthHex="000"+packLengthHex;
+        String content = line + showType + options.getTime() + "01" + color + msgLenHex + msgHex;
+        //屏地址-->数据包内容
+        String packData = "00" + type + "01" + content;
+        int packLength = packData.length();
+        String packLengthHex = Integer.toHexString(packLength / 2);
+        if (packLengthHex.length() == 2) {
+            packLengthHex = "00" + packLengthHex;
+        } else if (packLengthHex.length() == 1) {
+            packLengthHex = "000" + packLengthHex;
         }
         //长度->内容
-       String dataContent= packLengthHex+packData;
+        String dataContent = packLengthHex + packData;
         //异或校验
-       String xor= XorUtils.xor(HEADER_HEX+dataContent);
+        String xor = XorUtils.xor(HEADER_HEX + dataContent);
         //将特殊字节做处理
-        String str=dataContent+xor;
-        int len=str.length();
-        StringBuilder sb=new StringBuilder();
-        for (int i=0;i<len;i+=2){
-            String hex=  str.substring(i,i+2);
-            if (hex.equals("F5")){
-                hex="FA05";
-            }else if (hex.equals("FA")){
-                hex="FA0A";
+        String str = dataContent + xor;
+        int len = str.length();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < len; i += 2) {
+            String hex = str.substring(i, i + 2);
+            if (hex.equals("F5")) {
+                hex = "FA05";
+            } else if (hex.equals("FA")) {
+                hex = "FA0A";
             }
             sb.append(hex);
         }
 
-        return HEADER_HEX+sb;
+        return HEADER_HEX + sb;
     }
 
     public static void main(String[] args) {
-        LedOptions ledOptions=new LedOptions();
+        LedOptions ledOptions = new LedOptions();
         ledOptions.setColor("05").setLine("02").setShowType("0B");
-        System.out.println(build("桂A132V1",ledOptions));
+        System.out.println(build("桂A132V1", ledOptions));
 
     }
 

+ 8 - 2
src/main/java/com/gzlh/device/led/utils/LedOptions.java

@@ -43,6 +43,12 @@ public class LedOptions {
      * 0x0B 同时显示
      */
     private String showType="00";
-
-    private String time="1E";
+    /**
+     * 停留时间 50秒
+     */
+    private String time="30";
+    /**
+     * 固定01 临时02
+     */
+    private String type="02";
 }

+ 8 - 1
src/main/java/com/gzlh/device/plc/event/PLCEvent.java

@@ -57,5 +57,12 @@ public interface PLCEvent {
     //不放行
     String CUSTOMER_GATE_PASS_DETER="CUSTOMER_GATE_PASS_DETER";
 
-
+    /**
+     * 车进闸口
+     */
+    String CAR_PASS = "CAR_PASS";
+    /**
+     * 退车
+     */
+    String CAR_BACK = "CAR_BACK";
 }

+ 1 - 0
src/main/java/com/gzlh/device/plc/handler/PLCHadnler.java

@@ -275,6 +275,7 @@ public class PLCHadnler {
             } else if (upPoint.equals(judgePoint)) {
                 //上到位触发-->发送继电器断开---->防止不落��
                 if (upPointStatus.equals("1")) {
+                    EventDataManager.cacheData("poleResult", 1);
                     eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.UP_POINT_READ);
                 }
             } else if (downPoint.equals(judgePoint)) {

+ 14 - 2
src/main/java/com/gzlh/device/plc/job/StartInitTask.java

@@ -1,9 +1,11 @@
 package com.gzlh.device.plc.job;
 
 import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import com.gzlh.bus.ChannelCacheManager;
 import com.gzlh.bus.EventBus;
+import com.gzlh.bus.EventDataManager;
 import com.gzlh.bus.SysConfig;
 import com.gzlh.config.ModuleEnum;
 import com.gzlh.config.dto.SerialSetting;
@@ -11,6 +13,7 @@ import com.gzlh.config.task.Task;
 import com.gzlh.device.plc.event.PLCEvent;
 import com.gzlh.device.weighbridge.event.WeighbridgeEvent;
 import com.gzlh.device.weighbridge.handler.impl.CommonWeighbridgeHandler;
+import com.gzlh.entity.ReqBO;
 import com.gzlh.utils.DeviceCache;
 import lombok.extern.slf4j.Slf4j;
 
@@ -23,17 +26,26 @@ public class StartInitTask extends Task {
 
     @Override
     public void run() {
+        EventBus eventBus = SpringUtil.getBean(EventBus.class);
         int count = 0;
         while (count < 20) {
             count++;
-            if (!CommonWeighbridgeHandler.hsCar&& ChannelCacheManager.stateEnable(SysConfig.channelSetting.getChannelCode())) {
+            if (!CommonWeighbridgeHandler.hsCar && ChannelCacheManager.stateEnable(SysConfig.channelSetting.getChannelCode())) {
                 log.info("雷达断开,通道无车,触发初始化======");
-                EventBus eventBus = SpringUtil.getBean(EventBus.class);
                 eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
                 break;
             }
             ThreadUtil.sleep(1000);
         }
+        SerialSetting.PlcDTO.StatusDTO pointInfo = SysConfig.serialSetting.getPlc().getStatus();
+        String upPoint = pointInfo.getUpPoint();
+        String plcStatus = DeviceCache.getPlcStatus();
+        String upPointStatus = plcStatus.charAt(Integer.parseInt(upPoint)) + "";
+        if (StrUtil.equals(upPointStatus,"1")){
+            eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.CAR_PASS);
+        }else if (StrUtil.equals(upPointStatus,"0")&&!CommonWeighbridgeHandler.hsCar){
+            eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.CAR_BACK);
+        }
 
     }
 }

+ 1 - 1
src/main/java/com/gzlh/device/print/test/PrintWithChapter.java

@@ -31,7 +31,7 @@ public class PrintWithChapter implements Runnable{
 
         // 读取公章图片
         try {
-            BufferedImage stampImage = ImageIO.read(new File("E:\\file\\qzChapter.jpg"));
+            BufferedImage stampImage = ImageIO.read(new File("E:\\file\\C1000\\2025\\3\\24\\-2503241442.jpg"));
 
             // 创建一个新的图像用于组合文字和图片
             int width = 800;

+ 4 - 5
src/main/java/com/gzlh/startup/StartupRunner.java

@@ -107,9 +107,8 @@ public class StartupRunner implements CommandLineRunner {
         SerialSetting serialSetting = SysConfig.serialSetting;
         if (serialSetting.getWeighbridge().getEnable()) {
             ThreadUtil.execute(() -> weighbridgeNettyConfig.connect());
-
-            long initialDelay = 0;
-            long period = 15000; // 5秒
+            long initialDelay = 20000;
+            long period = 60000; // 5秒
             scheduler.scheduleAtFixedRate(new CheckWeightTask(), initialDelay, period, TimeUnit.MILLISECONDS);
         }
         if (serialSetting.getLed().getEnable()) {
@@ -120,7 +119,7 @@ public class StartupRunner implements CommandLineRunner {
             long initialDelay = 5000;
             long period = 250; // 10秒
             scheduler.scheduleAtFixedRate(new SearchJob(), initialDelay, period, TimeUnit.MILLISECONDS);
-            scheduler.scheduleAtFixedRate(new CheckPLCStatusTask(), initialDelay, 10000, TimeUnit.MILLISECONDS);
+            scheduler.scheduleAtFixedRate(new CheckPLCStatusTask(), 50000, 60000, TimeUnit.MILLISECONDS);
         }
         if (SysConfig.serialSetting.getPrint() != null && SysConfig.serialSetting.getPrint().isEnable()) {
             long initialDelay = 0;
@@ -181,7 +180,7 @@ public class StartupRunner implements CommandLineRunner {
         if (SysConfig.voiceSetting!=null&&SysConfig.voiceSetting.isEnable()) {
             log.info("连接语音播报:{},{}",SysConfig.voiceSetting.getHost(),SysConfig.voiceSetting.getPort());
             ThreadUtil.execute(() -> voiceNettyConfig.connect());
-            long initialDelay = 1000;
+            long initialDelay = 10000;
             long period = 5000; // 5秒
             scheduler.scheduleAtFixedRate(new CheckVoiceStatusTask(), initialDelay, period, TimeUnit.MILLISECONDS);
         }

+ 58 - 0
src/main/resources/81.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="GB2312"?>
+<GATHER_INFO>
+<!--进出标识,I进E出-->
+<I_E_FLAG>{I_E_FLAG}</I_E_FLAG>
+<!--场站号,固定写为场所分配的场站号-->
+<AREA_ID>{AREA_ID}</AREA_ID>
+<!--通道号,已经从通道号配置文件中读取-->
+<CHNL_NO>{CHANNEL_CODE}</CHNL_NO>
+<!--通道业务类型,通常为A,已经读取-->
+<GETHER_MODE>{PASS_METHOD}</GETHER_MODE>
+<!--会话编号,自动生成-->
+<SESSION_ID>{SESSION_ID_DATA}</SESSION_ID>
+<!--IC卡配置信息-->
+<IC_INFO>
+<!--读取到的IC卡号-->
+<IC_ID>{VEHICLE_IC_DATA}</IC_ID>
+<IC_GOODS_NAME>{IC_GOODS_NAME}</IC_GOODS_NAME>
+<IC_BILL_NO>{IC_BILL_NO}</IC_BILL_NO>
+<IC_NO></IC_NO>
+<IC_Type></IC_Type>
+<IC_EXTENDED_CONTENT></IC_EXTENDED_CONTENT>
+</IC_INFO>	
+<DR_CUSTOMS_NO></DR_CUSTOMS_NO>
+<VE_CUSTOMS_NO></VE_CUSTOMS_NO>
+<!--读取到的车牌号信息-->
+<VE_LICENSE_NO>{PLATE_D}</VE_LICENSE_NO>
+<ESEAL_ID></ESEAL_ID>
+<!--读取到的地磅重量-->
+<GROSS_WT>{VEHICLE_WEIGHT_DATA}</GROSS_WT>
+<!--RFID信息-->
+<VE_RFID>
+<!--RFID卡号信息-->
+<RFID_ID>{VEHICLE_RFID_DATA}</RFID_ID>
+<!--RFID绑定的光学车牌信息-->
+<VE_LICENSE_NO>{PLATE_D}</VE_LICENSE_NO>
+<VE_CUSTOMS_NO></VE_CUSTOMS_NO>
+<VE_WT></VE_WT>
+<VE_COMPANY></VE_COMPANY>
+<VE_PERFORMANCE></VE_PERFORMANCE>
+</VE_RFID>	
+<DR_RFID>
+<RFID_ID>{VEHICLE_RFID_DATA}</RFID_ID>
+<DR_NAME></DR_NAME>
+<DR_CUSTOMS_NO></DR_CUSTOMS_NO>
+<DR_COMPANY></DR_COMPANY>
+<DR_PERFORMANCE></DR_PERFORMANCE>
+</DR_RFID>	
+<OPERATOR_ID></OPERATOR_ID>
+<OPERATE_TIME></OPERATE_TIME>	
+<VE_LICENSE_RECOGNITION>
+<DOMESTIC_LICENSE_NO>{PLATE_D}</DOMESTIC_LICENSE_NO>
+<!--车牌图片保存路径,如有箱号,有箱号图片路径-->
+<DOMESTIC_LICENSE_COLOR>{PLATE_PATH}</DOMESTIC_LICENSE_COLOR>
+<FOREIGN_LICENSE_NO>{PLATE_D}</FOREIGN_LICENSE_NO>
+<FOREIGN_LICENSE_COLOR>{PLATE_PATH}</FOREIGN_LICENSE_COLOR>
+<CONFIDENCE_RATIO> </CONFIDENCE_RATIO>
+</VE_LICENSE_RECOGNITION>
+</GATHER_INFO>