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