From 65dd7e79a8ee24a181e54f88118c6a48fbaa9663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E9=A3=9E?= Date: Thu, 29 May 2025 20:14:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9websocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mwms/solution/config/WebSocketConfig.java | 18 +++ zi-wms-pda/pom.xml | 4 + .../idm/service/Impl/InvoiceServiceImpl.java | 7 +- .../com/cim/idm/utils/WsServerEndpoint.java | 148 ++++++++++++++++++ .../com/cim/idm/dao/FgStockInDao.xml | 2 + 5 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 zi-wms-boot/src/main/java/com/zi/mwms/solution/config/WebSocketConfig.java create mode 100644 zi-wms-pda/src/main/java/com/cim/idm/utils/WsServerEndpoint.java diff --git a/zi-wms-boot/src/main/java/com/zi/mwms/solution/config/WebSocketConfig.java b/zi-wms-boot/src/main/java/com/zi/mwms/solution/config/WebSocketConfig.java new file mode 100644 index 0000000..49ab2ef --- /dev/null +++ b/zi-wms-boot/src/main/java/com/zi/mwms/solution/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.zi.mwms.solution.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } + +} \ No newline at end of file diff --git a/zi-wms-pda/pom.xml b/zi-wms-pda/pom.xml index 2794845..fd856da 100644 --- a/zi-wms-pda/pom.xml +++ b/zi-wms-pda/pom.xml @@ -153,6 +153,10 @@ jackson-dataformat-xml 2.12.4 + + org.springframework.boot + spring-boot-starter-websocket + \ No newline at end of file diff --git a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java index 8e2f30f..63c5694 100644 --- a/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java +++ b/zi-wms-pda/src/main/java/com/cim/idm/service/Impl/InvoiceServiceImpl.java @@ -2482,6 +2482,7 @@ public class InvoiceServiceImpl implements InvoiceService { " count(*) AS ZROL, \r\n" + " m1.SHIPREQUESTDETAILNAME , \r\n" + " t.ERPLOCATION, \r\n" + + " sum(t.FQTY) FQTY, \r\n" + " sum(m.QTY)MATERIALQUANTITY \r\n" + " FROM \r\n" + " MATERIALPACKINGSUB m \r\n" + @@ -2557,7 +2558,8 @@ public class InvoiceServiceImpl implements InvoiceService { //实际发货卷数 item.put("Z_ROL", mm.get("ZROL")); //实际发货平方米 - item.put("Z_SQUE", mm.get("MATERIALQUANTITY")); +// item.put("Z_SQUE", mm.get("MATERIALQUANTITY")); + item.put("Z_SQUE", mm.get("FQTY")); itemArray.add(item); } @@ -2574,7 +2576,8 @@ public class InvoiceServiceImpl implements InvoiceService { //实际发货卷数 body.put("Z_ROL", mm.get("ZROL")); //COUNT //实际发货平方米 - body.put("Z_SQUE", mm.get("MATERIALQUANTITY")); +// body.put("Z_SQUE", mm.get("MATERIALQUANTITY")); + body.put("Z_SQUE", mm.get("FQTY")); } } diff --git a/zi-wms-pda/src/main/java/com/cim/idm/utils/WsServerEndpoint.java b/zi-wms-pda/src/main/java/com/cim/idm/utils/WsServerEndpoint.java new file mode 100644 index 0000000..1e250cd --- /dev/null +++ b/zi-wms-pda/src/main/java/com/cim/idm/utils/WsServerEndpoint.java @@ -0,0 +1,148 @@ +package com.cim.idm.utils; + +import com.cim.idm.framework.IDMFrameServiceProxy; +import lombok.extern.slf4j.Slf4j; +import org.json.JSONObject; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/*** + * 监听websocket地址 /myWs + */ +@ServerEndpoint("/socket/{userId}") +@Component +@Slf4j +@EnableScheduling +public class WsServerEndpoint { + + static Map map = new ConcurrentHashMap(); + /*** + * 连接建立时执行的操作 + * @param session + */ + @OnOpen + public void onOpen(@PathParam("userId") String userId, Session session) + { +// map.put(session.getId(),session); + map.put(userId,session); + + log.info("websocket is open session=" + session); + log.info("websocket is open userId=" + userId); + + } + + /*** + * 收到客户端消息执行的操作 + * @param + */ +// @OnMessage +// public void onMessage(byte[] message) throws IOException{ +//// byte[] data = Arrays.copyOfRange(message, 50, message.length); +//// String msg = new String(data, "utf-8"); +// log.info("webSocket后台收到消息:" + msg); +// } + @OnMessage + public void onMessage(String message, Session session) throws IOException { + System.out.println("收到客户端消息:" + message); + session.getBasicRemote().sendText("服务器收到消息:" + message); + } + + /*** + * 连接关闭时执行的操作 + * @param session + */ + @OnClose + public void OnClose(Session session) + { + map.remove(session.getId()); + log.info("连接关闭时执行的操作"); + } + + /*** + * 向客户端发送信息 + */ + @Scheduled(fixedRate = 300000) + public void sendMsg() throws IOException { +// log.info("map," + map); + String sql = "SELECT\n" + + "'1' RECEIVEREQUESTDETAILNAME,\n" + + "SUM(m.REQUESTQUANTITY) REQUESTQUANTITY,\n" + + "SUM(m.ASSIGNEDQUANTITY) RECEIVEDQUANTITY,\n" + + "SUM(m.REQUESTQUANTITY - m.ASSIGNEDQUANTITY) AS MINUSQTY,\n" + + "m3.DESC_CN ,\n" + + "m.UNIT ,\n" + + "m.SDK_ID ,\n" + + "ss.SPECNAME ,\n" + + "m.PHASE ,\n" + + "m.MATERIALSPECNAME,\n" + + "m.SITENAME,\n" + + "m.SHIPREQUESTNAME RECEIVEREQUESTNAME,\n" + + "be.LOCATION_USER,\n" + + "be.ERPLOCATIONNAME,\n" + + "m2.ERPLOCATION,\n" + + "TO_CHAR(SYSDATE,'YYYY-MM-DD') RECEIVETIME,\n" + + "TO_CHAR(SYSDATE,'YYYY-MM-DD') MAKEDATE\n" + + "FROM\n" + + "MATERIALSHIPREQUESTDETAIL m\n" + + "LEFT JOIN MATERIALSHIPREQUEST m2 ON\n" + + "m.SHIPREQUESTNAME = m2.SHIPREQUESTNAME\n" + + "LEFT JOIN MATERIALSPEC m3 ON\n" + + "m.MATERIALSPECNAME = m3.MATERIALSPECNAME\n" + + "LEFT JOIN SDK_SPEC ss ON\n" + + "m.SDK_ID = ss.SDK_ID\n" + + "--\\t\\t\\t\\tLEFT JOIN SUPPLIER S ON\n" + + "--\\t\\t\\t\\tm2.SUPPLIERNO = S.SUPPLIERNO\n" + + "LEFT JOIN MATERIALUNIT MM ON\n" + + "MM.FNUMBER = m.UNIT\n" + + "LEFT JOIN BS_ERPLOCATION be ON\n" + + "m2.ERPLOCATION = be.ERPLOCATIONNAME\n" + + "--\\t\\t\\t\\tLEFT JOIN ORG o ON\n" + + "--\\t\\t\\t\\to.ORGNO = m2.STOCKORGNO\n" + + "LEFT JOIN STORAGESPEC sss ON\n" + + "m.LOCATIONNAME = sss.STORAGENAME\n" + + "WHERE \n" + + "ORDERDATE >= SYSDATE - INTERVAL '5' MINUTE\n" + + "AND m2.ERPLOCATION IS NOT NULL\n" + + "AND be.LOCATION_USER = :LOCATION_USER\n" + + "GROUP BY\n" + + "m3.DESC_CN ,\n" + + "m.UNIT ,\n" + + "m.SDK_ID ,\n" + + "ss.SPECNAME ,\n" + + "m.PHASE ,\n" + + "m.MATERIALSPECNAME,\n" + + "m.SITENAME,\n" + + "m.SHIPREQUESTNAME,\n" + + "be.LOCATION_USER,\n" + + "be.ERPLOCATIONNAME,\n" + + "m2.ERPLOCATION"; + Map bindMap = new HashMap(); + bindMap.put("LOCATION_USER", map.keySet().iterator().next()); + List> list = IDMFrameServiceProxy.getSqlTemplate().queryForList(sql, bindMap); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("list", list); + jsonObject.put("total", list.size()); + for (String key : map.keySet()) + { + if(!list.isEmpty()) { + map.get(key).getAsyncRemote().sendText(String.valueOf(jsonObject)); + }else { + map.get(key).getAsyncRemote().sendText(""); + } + } + } +} \ No newline at end of file diff --git a/zi-wms-pda/src/main/resources/com/cim/idm/dao/FgStockInDao.xml b/zi-wms-pda/src/main/resources/com/cim/idm/dao/FgStockInDao.xml index 7c1723d..db04949 100644 --- a/zi-wms-pda/src/main/resources/com/cim/idm/dao/FgStockInDao.xml +++ b/zi-wms-pda/src/main/resources/com/cim/idm/dao/FgStockInDao.xml @@ -42,6 +42,8 @@ 'Created' oldStockState, 'N' holdState, 'Box' materialPackingType, + T.FUNIT funit, + T.FQTY fqty, T.DURABLETYPE durableType, #{erpFactory} ERPFactory, #{erpLocation} ERPLOCATION,