From c9227526a51fa3c3fc54fda12291ab0da7c27c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=93=B2=E5=A5=87?= <13840175730@139.com> Date: Tue, 10 Sep 2024 16:07:29 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E8=AF=AD=E9=9F=B3WS?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 + .../com/dsic/gj_erp/bean/jhgk/DmYdjh.java | 2 + .../java/com/dsic/gj_erp/ws/WsHandler.java | 4 + .../com/dsic/gj_erp/wsclient/Message.java | 100 ++++++++++++++++++ .../wsclient/WebSocketClientComponent.java | 36 +++++++ .../dsic/gj_erp/wsclient/WebSocketConfig.java | 14 +++ .../gj_erp/wsclient/WebSocketService.java | 59 +++++++++++ .../gj_erp/wsclient/handler/HeartHandler.java | 37 +++++++ .../wsclient/handler/IHandlerService.java | 9 ++ .../gj_erp/wsclient/handler/ZxHandler.java | 33 ++++++ src/main/resources/application-ws.yml | 5 +- 11 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/Message.java create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/WebSocketClientComponent.java create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/WebSocketConfig.java create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/WebSocketService.java create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/handler/HeartHandler.java create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/handler/IHandlerService.java create mode 100644 src/main/java/com/dsic/gj_erp/wsclient/handler/ZxHandler.java diff --git a/pom.xml b/pom.xml index d31d483..5daf058 100644 --- a/pom.xml +++ b/pom.xml @@ -278,6 +278,10 @@ guava 21.0 + + org.springframework.boot + spring-boot-starter-websocket + diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmYdjh.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmYdjh.java index b2bba19..ca38272 100644 --- a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmYdjh.java +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmYdjh.java @@ -254,6 +254,8 @@ public class DmYdjh implements Serializable { // private String sljhrq; // private String pwpgrq; + private String djh;//派工单号 + // 生产状态 private String sczt; // 生产状态:编制, 提交, 下达, 上料, 抛丸, 理料, 划线/切割, 完成 diff --git a/src/main/java/com/dsic/gj_erp/ws/WsHandler.java b/src/main/java/com/dsic/gj_erp/ws/WsHandler.java index 5ee075c..81ccdbc 100644 --- a/src/main/java/com/dsic/gj_erp/ws/WsHandler.java +++ b/src/main/java/com/dsic/gj_erp/ws/WsHandler.java @@ -38,6 +38,10 @@ public class WsHandler { } } + public void whoIsSelect(JSONObject object){ + socketIOServer.getBroadcastOperations().sendEvent("whoIsSelect", object); + } + public void sendSlComplete(JSONObject object) { socketIOServer.getBroadcastOperations().sendEvent("slComplete", object); } diff --git a/src/main/java/com/dsic/gj_erp/wsclient/Message.java b/src/main/java/com/dsic/gj_erp/wsclient/Message.java new file mode 100644 index 0000000..a8b076f --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/Message.java @@ -0,0 +1,100 @@ +package com.dsic.gj_erp.wsclient; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +@Getter +@Setter +public class Message { + private String code; + private Msg msg; + @JSONField(serialize = false) + private CodeEnum codeEx; + @JSONField(serialize = false) + private Instructions instructions; + + public static Message reg(String id){ + Message message = new Message(); + message.setCode(CodeEnum.REG.getCode()); + message.setMsg(Msg.reg(id)); + message.formatCodeToEnum(CodeEnum.REG.getCode()); + return message; + } + + public static Message heart(String id){ + Message message = new Message(); + message.setCode(CodeEnum.HEART.getCode()); + message.setMsg(Msg.reg(id)); + message.formatCodeToEnum(CodeEnum.HEART.getCode()); + return message; + } + + public void formatInstructions(){ + if (this.getCodeEx()==CodeEnum.ZX){ + Instructions.valueOf(this.msg.getResult()); + } + } + + public void formatCodeToEnum(@NonNull String code){ + for (CodeEnum e:CodeEnum.values()){ + if (e.getCode().equals(code)){ + this.codeEx=e; + } + } + } + + public CodeEnum getEnumByCode(@NonNull String code){ + for (CodeEnum e:CodeEnum.values()){ + if (e.getCode().equals(code)){ + return e; + } + } + return null; + } + + @AllArgsConstructor + public enum CodeEnum{ + REG("9000"), + ZX("3000"), + RESULT("9002"), + HEART("9003"), + ; + + @Getter + private final String code; + } + + public enum Instructions{ + 大船大船,开始派工,开始报工,确认完毕 + } + + @Getter + @Setter + public static class Msg{ + private String erpId; + private String orderNumber; + private String actionType; + private String time; + private String deviceId; + private String result; + + private static Msg reg(String id){ + Msg msg = new Msg(); + msg.setErpId(id); + return msg; + } + } + + public JSONObject toJson(){ + return (JSONObject) JSONObject.toJSON(this); + } + + @Override + public String toString(){ + return JSONObject.toJSONString(this); + } +} diff --git a/src/main/java/com/dsic/gj_erp/wsclient/WebSocketClientComponent.java b/src/main/java/com/dsic/gj_erp/wsclient/WebSocketClientComponent.java new file mode 100644 index 0000000..46ce7d4 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/WebSocketClientComponent.java @@ -0,0 +1,36 @@ +package com.dsic.gj_erp.wsclient; + + +import com.dsic.gj_erp.wsclient.handler.HeartHandler; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +@RequiredArgsConstructor +public class WebSocketClientComponent { + + @Value("${ws.client.url}") + private String url; + + @Value("${ws.client.id}") + private String erpId; + + private final WebSocketService webSocketService; + private final HeartHandler heartHandler; + + @PostConstruct + public void init() { + // 发送消息示例 + try { + webSocketService.connect(this.url); + webSocketService.sendMessage(Message.reg(this.erpId).toString()); + heartHandler.execute(Message.heart(erpId)); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/dsic/gj_erp/wsclient/WebSocketConfig.java b/src/main/java/com/dsic/gj_erp/wsclient/WebSocketConfig.java new file mode 100644 index 0000000..a805d36 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/WebSocketConfig.java @@ -0,0 +1,14 @@ +package com.dsic.gj_erp.wsclient; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.client.WebSocketClient; +import org.springframework.web.socket.client.standard.StandardWebSocketClient; + +@Configuration +public class WebSocketConfig { + @Bean + public WebSocketClient webSocketClient() { + return new StandardWebSocketClient(); + } +} diff --git a/src/main/java/com/dsic/gj_erp/wsclient/WebSocketService.java b/src/main/java/com/dsic/gj_erp/wsclient/WebSocketService.java new file mode 100644 index 0000000..22653a6 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/WebSocketService.java @@ -0,0 +1,59 @@ +package com.dsic.gj_erp.wsclient; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.client.WebSocketClient; +import org.springframework.web.socket.client.WebSocketConnectionManager; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +@Service +@AllArgsConstructor +public class WebSocketService extends TextWebSocketHandler { + + private WebSocketSession session; + + private final WebSocketClient client; + + + public void connect(String uri) { + WebSocketConnectionManager manager = new WebSocketConnectionManager(client, this, uri); + manager.start(); + } + + public void disconnect() throws Exception { + if (session != null && session.isOpen()) { + session.close(); + } + } + + public void sendMessage(String message) throws Exception { + if (session != null && session.isOpen()) { + session.sendMessage(new TextMessage(message)); + } else { + throw new IllegalStateException("WebSocket is not connected."); + } + } + + @Override + public void afterConnectionEstablished(WebSocketSession session) throws Exception { + this.session = session; // 处理连接后保存session + } + + @Override + protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { + System.out.println("Received: " + message.getPayload()); + Message msg= JSONObject.parseObject(message.getPayload(),Message.class); + switch (msg.getCodeEx()){ + case REG: + break; + case ZX: + break; + + + } + } + +} diff --git a/src/main/java/com/dsic/gj_erp/wsclient/handler/HeartHandler.java b/src/main/java/com/dsic/gj_erp/wsclient/handler/HeartHandler.java new file mode 100644 index 0000000..3458f45 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/handler/HeartHandler.java @@ -0,0 +1,37 @@ +package com.dsic.gj_erp.wsclient.handler; + +import cn.hutool.cron.CronUtil; +import cn.hutool.cron.task.Task; +import com.alibaba.fastjson.JSONObject; +import com.dsic.gj_erp.wsclient.Message; +import com.dsic.gj_erp.wsclient.WebSocketService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class HeartHandler implements IHandlerService{ + + private final WebSocketService webSocketService; + + private boolean scheduleStartFlag=false; + + @Override + public void execute(Message message) { + if (this.scheduleStartFlag){ + return; + } + CronUtil.schedule("*/30 * * * * *", (Task) () -> { + try { + webSocketService.sendMessage(message.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + }); + + // 支持秒级别定时任务 + CronUtil.setMatchSecond(true); + CronUtil.start(); + this.scheduleStartFlag=true; + } +} diff --git a/src/main/java/com/dsic/gj_erp/wsclient/handler/IHandlerService.java b/src/main/java/com/dsic/gj_erp/wsclient/handler/IHandlerService.java new file mode 100644 index 0000000..93c06ec --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/handler/IHandlerService.java @@ -0,0 +1,9 @@ +package com.dsic.gj_erp.wsclient.handler; + +import com.alibaba.fastjson.JSONObject; +import com.dsic.gj_erp.wsclient.Message; + +public interface IHandlerService { + + void execute(Message message); +} diff --git a/src/main/java/com/dsic/gj_erp/wsclient/handler/ZxHandler.java b/src/main/java/com/dsic/gj_erp/wsclient/handler/ZxHandler.java new file mode 100644 index 0000000..734173e --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/wsclient/handler/ZxHandler.java @@ -0,0 +1,33 @@ +package com.dsic.gj_erp.wsclient.handler; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dsic.gj_erp.bean.jhgk.DmYdjh; +import com.dsic.gj_erp.service.jhgk.DmYdjhService; +import com.dsic.gj_erp.ws.WsHandler; +import com.dsic.gj_erp.wsclient.Message; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class ZxHandler implements IHandlerService{ + + private final DmYdjhService ydjhService; + private final WsHandler wsHandler; + + @Override + public void execute(Message message) { + String djh=message.getMsg().getOrderNumber(); + DmYdjh one = ydjhService.getOne(Wrappers.lambdaQuery().eq(DmYdjh::getDjh, djh)); + switch (message.getInstructions()){ + case 开始派工: + case 开始报工: + JSONObject object=new JSONObject(); + object.put("zyjh",one); + wsHandler.whoIsSelect(object); + break; + + } + } +} diff --git a/src/main/resources/application-ws.yml b/src/main/resources/application-ws.yml index 6a1e496..e7f3638 100644 --- a/src/main/resources/application-ws.yml +++ b/src/main/resources/application-ws.yml @@ -7,4 +7,7 @@ ws: pingTimeout: 60000 pingInterval: 25000 maxHttpContentLength: 1048576 - maxFramePayloadLength: 1048576 \ No newline at end of file + maxFramePayloadLength: 1048576 + client: + url: ws://127.0.0.1:9000 + id: abc \ No newline at end of file