From c370397fe6c7552bb63f2580233c4b233f0ff56c Mon Sep 17 00:00:00 2001 From: whycq <913841844@qq.com> Date: 星期四, 21 十一月 2024 13:50:18 +0800 Subject: [PATCH] #websocket --- src/main/java/com/zy/common/config/WebSocketServer.java | 116 +++++++++++++++++++ pom.xml | 10 + src/main/java/com/zy/asrs/timer/LedWebsocket.java | 176 +++++++++++++++++++++++++++++ 3 files changed, 302 insertions(+), 0 deletions(-) diff --git a/pom.xml b/pom.xml index 4a2f68e..83a1484 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,16 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-websocket</artifactId> + </dependency> + <dependency> + <groupId>cn.hutool</groupId> + <artifactId>hutool-all</artifactId> + <version>5.8.26</version> + </dependency> <!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-tomcat</artifactId>--> diff --git a/src/main/java/com/zy/asrs/timer/LedWebsocket.java b/src/main/java/com/zy/asrs/timer/LedWebsocket.java new file mode 100644 index 0000000..0d4ea9c --- /dev/null +++ b/src/main/java/com/zy/asrs/timer/LedWebsocket.java @@ -0,0 +1,176 @@ +package com.zy.asrs.timer; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.core.common.Arith; +import com.core.common.Cools; +import com.zy.asrs.domain.dto.AxisBean; +import com.zy.asrs.domain.dto.WorkChartAxis; +import com.zy.asrs.domain.vo.LocChartPie; +import com.zy.asrs.entity.LocDetl; +import com.zy.asrs.mapper.ReportQueryMapper; +import com.zy.asrs.service.LocDetlService; +import com.zy.common.config.WebSocketServer; +import com.zy.common.service.CommonService; +import com.zy.core.cache.SlaveConnection; +import com.zy.core.enums.SlaveType; +import com.zy.core.model.LedSlave; +import com.zy.core.model.command.LedCommand; +import com.zy.core.properties.SlaveProperties; +import com.zy.core.thread.LedThread; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.*; + +@Component +@Slf4j +public class LedWebsocket { + + private static final String[] WEEK = {"鏄熸湡鏃�","鏄熸湡涓�","鏄熸湡浜�","鏄熸湡涓�","鏄熸湡鍥�","鏄熸湡浜�","鏄熸湡鍏�"}; + + @Autowired + private ReportQueryMapper reportQueryMapper; + @Autowired + private SlaveProperties slaveProperties; + @Autowired + private WebSocketServer webSocketServer; + @Autowired + private LocDetlService locDetlService; + + @Scheduled(cron = "0/2 * * * * ? ") + private void send() { + + //楗煎浘 + List<Map<String, Object>> pie = new ArrayList<>(); + LocChartPie locUseRate = reportQueryMapper.getLocUseRate(); + if(locUseRate!=null) { + Map<String, Object> map = new HashMap<>(); + map.put("name", "鍦ㄥ簱"); + map.put("value", locUseRate.getFqty()); + pie.add(map); + + Map<String, Object> map1 = new HashMap<>(); + map1.put("name", "绌�"); + map1.put("value", locUseRate.getOqty()); + pie.add(map1); + + Map<String, Object> map2 = new HashMap<>(); + map2.put("name", "浣跨敤"); + map2.put("value", locUseRate.getUqty()); + pie.add(map2); + + Map<String, Object> map3 = new HashMap<>(); + map3.put("name", "绂佺敤"); + map3.put("value", locUseRate.getXqty()); + pie.add(map3); + } + // 鎬诲簱浣嶆暟 + Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty()); + // 浣跨敤涓� + Integer used = locUseRate.getFqty() + locUseRate.getUqty(); + // 搴撲綅浣跨敤鐜� + double usedDivides = Arith.divides(3, used, total); + double usedPr = Arith.multiplys(1, usedDivides, 100); + + //鎶樼嚎鍥� + Map<String,Object> map=new HashMap<String, Object>(); + List<AxisBean> list = new ArrayList<AxisBean>(); + List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis(); + + if(listChart!=null) { + ArrayList<Integer> data1 = new ArrayList<Integer>(); + ArrayList<Integer> data2 = new ArrayList<Integer>(); + + SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, -12); + for(int i=0;i<12;i++) { + boolean flag = true; + calendar.add(Calendar.DATE, 1); + String str = sf.format(calendar.getTime()); + for(WorkChartAxis workChart : listChart) { + if(str.equals(workChart.getYmd())) { + data1.add(workChart.getInqty()); + data2.add(workChart.getOutqty()); + flag = false; + break; + } + } + if(flag) { + data1.add(0); + data2.add(0); + } + } + AxisBean inqty = new AxisBean(); + inqty.setName("鍏ュ簱鏁伴噺"); + Integer[] array1 = new Integer[data1.size()]; + inqty.setData(data1.toArray(array1)); + list.add(inqty); + AxisBean outqty = new AxisBean(); + outqty.setName("鍑哄簱鏁伴噺"); + Integer[] array2 = new Integer[data2.size()]; + outqty.setData(data2.toArray(array2)); + list.add(outqty); + } + //浠撳簱鏁版嵁 + EntityWrapper<LocDetl> locDetlEntityWrapper = new EntityWrapper<>(); + locDetlEntityWrapper.setSqlSelect("matnr,COUNT(*) as matnrCount").groupBy("matnr"); + List<Map<String, Object>> selectMap = locDetlService.selectMaps(locDetlEntityWrapper); + + Date now = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); +// Map<String, Object> map = new HashMap<>(); + map.put("to","all"); + map.put("message", Cools.add("type", "default").add("pie", pie) + .add("stockCunt", locUseRate.getFqty()) + .add("emptyCount", locUseRate.getOqty()) + .add("noneCount", locUseRate.getXqty()) + .add("total", total) + .add("used", used) + .add("usedPr", usedPr) + .add("rows",list) + .add("year", calendar.get(Calendar.YEAR)) + .add("month", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MONTH)+1), 2)) + .add("day", CommonService.zerofill(String.valueOf(calendar.get(Calendar.DATE)), 2)) + .add("hour", CommonService.zerofill(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)), 2)) + .add("minute", CommonService.zerofill(String.valueOf(calendar.get(Calendar.MINUTE)), 2)) + .add("second", CommonService.zerofill(String.valueOf(calendar.get(Calendar.SECOND)) , 2)) + .add("week", WEEK[calendar.get(Calendar.DAY_OF_WEEK)-1]) + .add("inventoryData",selectMap)); + webSocketServer.onMessage(JSONObject.toJSONString(map),null,"all"); + + } + @Scheduled(cron = "0/2 * * * * ? ") + private void errorSend(){ + Map<String,Object> map=new HashMap<String, Object>(); + for (LedSlave slave : slaveProperties.getLed()) { + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, slave.getId()); + if (null != ledThread) { + map.put("to",slave.getStaArr().get(0).toString()); + map.put("message",Cools.add("type", "error").add("errMsg",ledThread.getErrorMsg().toString())); + webSocketServer.onMessage(JSONObject.toJSONString(map),null,slave.getStaArr().get(0).toString()); + } + + } + } + + @Scheduled(cron = "0/2 * * * * ? ") + private void TaskSend(){ + Map<String,Object> map=new HashMap<String, Object>(); + List<LedCommand> commandList = null; + for (LedSlave slave : slaveProperties.getLed()) { + LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, slave.getId()); + if (null != ledThread) { + map.put("to",slave.getStaArr().get(0).toString()); + map.put("message",Cools.add("type", "task").add("taskList",ledThread.getCommandList())); + webSocketServer.onMessage(JSONObject.toJSONString(map),null,slave.getStaArr().get(0).toString()); + } + + } + } +} diff --git a/src/main/java/com/zy/common/config/WebSocketServer.java b/src/main/java/com/zy/common/config/WebSocketServer.java new file mode 100644 index 0000000..393fc16 --- /dev/null +++ b/src/main/java/com/zy/common/config/WebSocketServer.java @@ -0,0 +1,116 @@ +package com.zy.common.config; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import javax.websocket.*; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@ServerEndpoint(value = "/led/{username}") +@Component +@Service +public class WebSocketServer { + private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class); + /** + * 璁板綍褰撳墠鍦ㄧ嚎杩炴帴鏁� + */ + public static final Map<String, Session> sessionMap = new ConcurrentHashMap<>(); + /** + * 杩炴帴寤虹珛鎴愬姛璋冪敤鐨勬柟娉� + */ + @OnOpen + public void onOpen(Session session, @PathParam("username") String username) { + sessionMap.put(username, session); + log.info("鏈夋柊鐢ㄦ埛鍔犲叆锛寀sername={}, 褰撳墠鍦ㄧ嚎浜烘暟涓猴細{}", username, sessionMap.size()); + JSONObject result = new JSONObject(); + JSONArray array = new JSONArray(); + result.set("users", array); + for (Object key : sessionMap.keySet()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set("username", key); + // {"username", "zhang", "username": "admin"} + array.add(jsonObject); + } +// {"users": [{"username": "zhang"},{ "username": "admin"}]} + sendAllMessage(JSONUtil.toJsonStr(result)); // 鍚庡彴鍙戦�佹秷鎭粰鎵�鏈夌殑瀹㈡埛绔� + } + /** + * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉� + */ + @OnClose + public void onClose(Session session, @PathParam("username") String username) { + sessionMap.remove(username); + log.info("鏈変竴杩炴帴鍏抽棴锛岀Щ闄sername={}鐨勭敤鎴穝ession, 褰撳墠鍦ㄧ嚎浜烘暟涓猴細{}", username, sessionMap.size()); + } + /** + * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉� + * 鍚庡彴鏀跺埌瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅 + * onMessage 鏄竴涓秷鎭殑涓浆绔� + * 鎺ュ彈 娴忚鍣ㄧ socket.send 鍙戦�佽繃鏉ョ殑 json鏁版嵁 + * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅 + */ + @OnMessage + public void onMessage(String message, Session session, @PathParam("username") String username) { +// log.info("鏈嶅姟绔敹鍒扮敤鎴穟sername={}鐨勬秷鎭�:{}", username, message); + JSONObject obj = JSONUtil.parseObj(message); + String toUsername = obj.getStr("to"); // to琛ㄧず鍙戦�佺粰鍝釜鐢ㄦ埛锛屾瘮濡� admin + String text = obj.getStr("message"); // 鍙戦�佺殑娑堟伅鏂囨湰 hello + // {"to": "admin", "text": "鑱婂ぉ鏂囨湰"} + if ("heartBeat".equals(toUsername)) { + log.info("蹇冭烦"); + }else if ("all".equals(toUsername)) { + sendAllMessage(text); + }else { + Session toSession = sessionMap.get(toUsername); // 鏍规嵁 to鐢ㄦ埛鍚嶆潵鑾峰彇 session锛屽啀閫氳繃session鍙戦�佹秷鎭枃鏈� + if (toSession != null) { + // 鏈嶅姟鍣ㄧ 鍐嶆妸娑堟伅缁勮涓�涓嬶紝缁勮鍚庣殑娑堟伅鍖呭惈鍙戦�佷汉鍜屽彂閫佺殑鏂囨湰鍐呭 + // {"from": "zhang", "text": "hello"} + JSONObject jsonObject = new JSONObject(); + jsonObject.set("from", username); // from 鏄� zhang + jsonObject.set("text", text); // text 鍚屼笂闈㈢殑text + this.sendMessage(text, toSession); +// log.info("鍙戦�佺粰鐢ㄦ埛username={}锛屾秷鎭細{}", toUsername, jsonObject.toString()); + } else { +// log.info("鍙戦�佸け璐ワ紝鏈壘鍒扮敤鎴穟sername={}鐨剆ession", toUsername); + } + } + + } + @OnError + public void onError(Session session, Throwable error) { + log.error("鍙戠敓閿欒"); + error.printStackTrace(); + } + /** + * 鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔� + */ + private void sendMessage(String message, Session toSession) { + try { +// log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", toSession.getId(), message); + toSession.getBasicRemote().sendText(message); + } catch (Exception e) { + log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", e); + } + } + /** + * 鏈嶅姟绔彂閫佹秷鎭粰鎵�鏈夊鎴风 + */ + private void sendAllMessage(String message) { + try { + for (Session session : sessionMap.values()) { +// log.info("鏈嶅姟绔粰瀹㈡埛绔痆{}]鍙戦�佹秷鎭瘂}", session.getId(), message); + session.getBasicRemote().sendText(message); + } + } catch (Exception e) { + log.error("鏈嶅姟绔彂閫佹秷鎭粰瀹㈡埛绔け璐�", e); + } + } +} -- Gitblit v1.9.1