jcdm-admin/src/main/java/com/jcdm/MesApplication.java
@@ -3,6 +3,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; /** * å¯å¨ç¨åº @@ -11,6 +13,8 @@ */ @EnableScheduling //å®æ¶ä»»å¡ @ServletComponentScan //webSocket @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class MesApplication { jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java
@@ -115,6 +115,7 @@ // éæèµæºï¼å¯å¿åè®¿é® .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() .antMatchers("/websocket/**").anonymous() // é¤ä¸é¢å¤çææ请æ±å ¨é¨éè¦é´æè®¤è¯ .anyRequest().authenticated() .and() jcdm-main/pom.xml
@@ -80,6 +80,17 @@ <artifactId>milo-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.22</version> </dependency> </dependencies> </project> jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/controller/DaPassingStationCollectionController.java
@@ -1,30 +1,24 @@ package com.jcdm.main.da.passingStationCollection.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; import com.jcdm.common.core.domain.R; import com.jcdm.common.utils.DateUtils; import com.jcdm.main.bs.orderScheduling.domain.BsOrderScheduling; import com.jcdm.main.da.passingStationCollection.domain.DaPassingStationCollection; import com.jcdm.main.da.passingStationCollection.service.IDaPassingStationCollectionService; import com.jcdm.main.da.passingStationCollection.vo.DaPassingStationVO; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.jcdm.common.annotation.Log; import com.jcdm.common.core.controller.BaseController; import com.jcdm.common.core.domain.AjaxResult; import com.jcdm.common.enums.BusinessType; import com.jcdm.common.utils.poi.ExcelUtil; import com.jcdm.common.core.domain.R; import com.jcdm.common.core.page.TableDataInfo; import com.jcdm.common.enums.BusinessType; import com.jcdm.common.utils.DateUtils; import com.jcdm.common.utils.poi.ExcelUtil; import com.jcdm.main.da.passingStationCollection.domain.DaPassingStationCollection; import com.jcdm.main.da.passingStationCollection.service.IDaPassingStationCollectionService; import com.jcdm.main.da.passingStationCollection.service.impl.DaPassingStationCollectionServiceImpl; import com.jcdm.main.da.passingStationCollection.vo.DaPassingStationVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * 产åè¿ç«ééController @@ -38,6 +32,9 @@ { @Autowired private IDaPassingStationCollectionService daPassingStationCollectionService; @Resource private DaPassingStationCollectionServiceImpl passingStationCollectionServiceImpl; /** * æ¥è¯¢äº§åè¿ç«ééå表 @@ -147,4 +144,14 @@ { return toAjax(daPassingStationCollectionService.deleteDaPassingStationCollectionByIds(ids)); } //设置å®æ¶åç§ä¸æ¬¡ // @Scheduled(cron = "0/10 * * * * ?") // @PostMapping("/send") // public String sendMessage(String message) throws Exception { // if (StringUtils.isEmpty(message)){ // message = "TESTMESSAGE"; // } // return passingStationCollectionServiceImpl.sendMessage(message); // } } jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/mapper/DaPassingStationCollectionMapper.java
@@ -4,6 +4,7 @@ import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * 产åè¿ç«ééMapperæ¥å£ @@ -62,4 +63,6 @@ * @return ç»æ */ public int deleteDaPassingStationCollectionByIds(Long[] ids); public String SelectSN(Map<String, Object> map); } jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/IDaPassingStationCollectionService.java
@@ -79,5 +79,5 @@ * @param SNcode 产åSN * @return ç»æ */ public String SelectSN(String SNcode); public String SelectSN(String SNcode,String node); } jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/impl/DaPassingStationCollectionServiceImpl.java
@@ -1,15 +1,7 @@ package com.jcdm.main.da.passingStationCollection.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import cn.hutool.core.collection.CollUtil; import com.jcdm.common.constant.Constants; import com.alibaba.fastjson2.JSONObject; import com.jcdm.common.utils.DateUtils; import com.jcdm.common.utils.StringUtils; import com.jcdm.main.bs.orderScheduling.domain.BsOrderScheduling; @@ -21,9 +13,17 @@ import com.jcdm.main.da.passingStationCollection.vo.DaPassingStationVO; import com.jcdm.main.rm.repairRecord.domain.RmRepairRecord; import com.jcdm.main.rm.repairRecord.mapper.RmRepairRecordMapper; import com.jcdm.main.websocket.WebSocketServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * 产åè¿ç«ééServiceä¸å¡å±å¤ç @@ -223,19 +223,32 @@ } } @Override public String SelectSN(String SNcode){ return "1"; public String SelectSN(String SNcode,String node) { try { Map<String, Object> params = new HashMap<>(); params.put("SNcode",SNcode); params.put("node",node); params.put("Success",""); daPassingStationCollectionMapper.SelectSN(params); return (String)params.get("Success"); } catch (Exception e) { return "æ°æ®æ¥è¯¢å¤±è´¥ï¼"; } } // --订åæ产 // select * from bs_order_scheduling where engine_no='2V91Y-F RA182118' // // --å·¥èºè·¯çº¿åè¡¨ä¿¡æ¯ // select * from bs_technology_route_child_info where route_code='H_191S' // // --è¿ä¿®æ°æ® // select * from rm_repair_record where box_code='2V91Y-F RA182118' // // --è¿ç«éé // select * from da_passing_station_collection --where sfc_code='2V91Y-F RA182118' public String sendMessage(String message) throws Exception{ Map<String,Object> map = new HashMap<>(); // è·åå½åæ¥æåæ¶é´ LocalDateTime nowDateTime = LocalDateTime.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println(dateTimeFormatter.format(nowDateTime)); map.put("server_time",dateTimeFormatter.format(nowDateTime)); map.put("server_code","200"); map.put("server_message",message); JSONObject jsonObject = new JSONObject(map); WebSocketServer.sendAllMessage(jsonObject.toString()); return jsonObject.toString(); } } jcdm-main/src/main/java/com/jcdm/main/plcserver/CustomRunner.java
@@ -2,8 +2,10 @@ import com.jcdm.main.da.collectionParamConf.service.IDaCollectionParamConfService; import com.jcdm.main.da.opcuaconfig.domain.DaOpcuaConfig; import com.jcdm.main.da.opcuaconfig.service.IDaOpcuaConfigService; import com.jcdm.main.da.paramCollection.service.IDaParamCollectionService; import com.jcdm.main.plcserver.conf.OPCElement; import com.jcdm.main.da.passingStationCollection.service.impl.DaPassingStationCollectionServiceImpl; import com.jcdm.main.plcserver.sub.OPCUaSubscription; import com.kangaroohy.milo.service.MiloService; import org.springframework.beans.factory.annotation.Autowired; @@ -11,8 +13,9 @@ import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.util.ArrayList; import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; @Component public class CustomRunner implements ApplicationRunner { @@ -26,28 +29,46 @@ @Autowired public IDaParamCollectionService daParamCollectionService; @Resource private DaPassingStationCollectionServiceImpl passingStationCollectionServiceImpl; @Resource private IDaOpcuaConfigService iDaOpcuaConfigService; @Override public void run(ApplicationArguments args) throws Exception { List<DaOpcuaConfig> lists = getSubList(); List<String> collect = lists.stream().map(DaOpcuaConfig::getNode).collect(Collectors.toList()); OPCUaSubscription opcUaSubscription = new OPCUaSubscription( miloService, collectionParamConfService, daParamCollectionService); daParamCollectionService ,passingStationCollectionServiceImpl, lists); List<String> lists = getSubList(); miloService.subscriptionFromOpcUa(lists,opcUaSubscription); miloService.subscriptionFromOpcUa(collect,opcUaSubscription); } /** * 订é å 容 */ public List<String> getSubList(){ List<String> lists = new ArrayList<>(); lists.add(OPCElement.OP010_SaveRequest);//请æ±ä¿å lists.add(OPCElement.OP010_CodeCheck);//请æ±æ£ç´¢æ¡ç lists.add(OPCElement.OP020_SaveRequest);//请æ±ä¿å return lists; public List<DaOpcuaConfig> getSubList(){ DaOpcuaConfig config = new DaOpcuaConfig(); List<DaOpcuaConfig> list = iDaOpcuaConfigService.selectDaOpcuaConfigList(config); // List<String> lists = new ArrayList<>(); // if (CollUtil.isNotEmpty(list)){ // lists = list.stream().map(DaOpcuaConfig::getNode).distinct().collect(Collectors.toList()); // } // List<String> lists = new ArrayList<>(); //// lists.add(OPCElement.OP010_SaveRequest);//请æ±ä¿å //// lists.add(OPCElement.OP010_CodeCheck);//请æ±æ£ç´¢æ¡ç //// lists.add(OPCElement.OP020_SaveRequest);//请æ±ä¿å // lists.add(OPCElement.OP120_SaveRequestLast);//请æ±ä¿å // lists.add(OPCElement.OP120_ZZ_CODE_CHECK);//请æ±ä¿å return list; } } jcdm-main/src/main/java/com/jcdm/main/plcserver/conf/OPCElement.java
@@ -20,9 +20,17 @@ * OP100 */ private static final String OP020_ITEM = "OP.OP100.";// private static final String OP120_ITEM_HX = "CFL4HX.OP120.";// private static final String OP120_ITEM_ZZ = "CFL4ZZ.OP120.";// public static final String OP020_SaveRequest = OP020_ITEM + "SaveRequest";//请æ±ä¿å public static final String OP120_SaveRequestLast = OP120_ITEM_HX + "SaveRequestLast";//请æ±ä¿å public static final String OP020_MesSaveFeed = OP020_ITEM + "MesSaveFeed";//Mesä¿åå®æ public static final String OP120_ZZ_CODE_CHECK = OP120_ITEM_ZZ + "CodeCheck";//请æ±ä¿å public static final String SN_CHECK = "SNRetrieval"; public static final String SAVE_DATA = "saveData"; } jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java
@@ -3,20 +3,27 @@ import com.jcdm.main.da.collectionParamConf.domain.DaCollectionParamConf; import com.jcdm.main.da.collectionParamConf.service.IDaCollectionParamConfService; import com.jcdm.main.da.opcuaconfig.domain.DaOpcuaConfig; import com.jcdm.main.da.paramCollection.domain.DaParamCollection; import com.jcdm.main.da.paramCollection.service.IDaParamCollectionService; import com.jcdm.main.da.passingStationCollection.domain.DaPassingStationCollection; import com.jcdm.main.da.passingStationCollection.service.impl.DaPassingStationCollectionServiceImpl; import com.jcdm.main.plcserver.conf.OPCElement; import com.kangaroohy.milo.model.ReadWriteEntity; import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; import com.kangaroohy.milo.service.MiloService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.text.Format; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @Slf4j @Component public class OPCUaSubscription implements SubscriptionCallback { @@ -26,12 +33,23 @@ public IDaParamCollectionService daParamCollectionService; public DaPassingStationCollectionServiceImpl passingStationCollectionServiceImpl; public List<DaOpcuaConfig> lists; public static final HashMap<String,Integer> map = new HashMap<>(); public OPCUaSubscription(MiloService miloService, IDaCollectionParamConfService collectionParamConfService, IDaParamCollectionService daParamCollectionService) { IDaParamCollectionService daParamCollectionService, DaPassingStationCollectionServiceImpl passingStationCollectionServiceImpl, List<DaOpcuaConfig> lists) { OPCUaSubscription.miloService = miloService; this.collectionParamConfService = collectionParamConfService; this.daParamCollectionService = daParamCollectionService; this.passingStationCollectionServiceImpl = passingStationCollectionServiceImpl; this.lists = lists; } @@ -41,20 +59,82 @@ String ecpStr = "";//å¼å¸¸è®°å½æ è®° try { if(null != value) { //1ãæ£ç´¢SNå· //2ãè¿ç«åæ°éé //3ãæ«ç æªæ°æ®åä¼ List<String> collect1 = lists.stream().filter(x -> OPCElement.SN_CHECK.equals(x.getrFunction())) .map(DaOpcuaConfig::getNode).collect(Collectors.toList()); List<String> collect2 = lists.stream().filter(x -> OPCElement.SAVE_DATA.equals(x.getrFunction())) .map(DaOpcuaConfig::getNode).collect(Collectors.toList()); if (collect1.contains(identifier)){ //sn this.SNRetrieval(identifier,value.toString()); if (identifier.equals(OPCElement.OP120_ZZ_CODE_CHECK) && "1".equals(value.toString())){ //æ»è£ ä¸çº¿æ«ç ä¼ è¾æ°æ® log.info("-------çå¬å°,{}çæ«ç æªæ«ç çCODE_CHECKçä¿¡å·",identifier); Integer i = map.getOrDefault(identifier + "çæ«ç æªæ«ç çCODE_CHECKçä¿¡å·",0); if (0==i){ map.put(identifier + "çæ«ç æªæ«ç çCODE_CHECKçä¿¡å·",i+1); } String[] parts = OPCElement.OP120_ZZ_CODE_CHECK.split("[.]"); Object SNCodeObject = miloService.readFromOpcUa(parts[0] + "." + parts[1] + ".Code1").getValue(); if (null != SNCodeObject){ String SNCode = SNCodeObject.toString(); passingStationCollectionServiceImpl.sendMessage(SNCode); } } } else if (collect2.contains(identifier)){ //save this.SaveData(identifier); //è¿åplcä¿åæå String[] parts = identifier.split("[.]"); if (parts.length==3){ if ("SaveRequest".equals(parts[2])){ ReadWriteEntity entity = new ReadWriteEntity(parts[0] + "." + parts[1] + ".SaveFeed", 1); log.info("-------çå¬å°,{}çsaveRequestçä¿¡å·",identifier); Integer i = map.getOrDefault(identifier + "çsaveRequestçä¿¡å·",0); if (0==i){ map.put(identifier + "çsaveRequestçä¿¡å·",i+1); } // miloService.writeToOpcByte(entity); }else if ("SaveRequestLast".equals(parts[2])){ ReadWriteEntity entity = new ReadWriteEntity(parts[0] + "." + parts[1] + ".SaveFeedLast", 1); log.info("-------çå¬å°,{}çSaveRequestLastçä¿¡å·",identifier); Integer i = map.getOrDefault(identifier + "çSaveRequestLastçä¿¡å·",0); if (0==i){ map.put(identifier + "çSaveRequestLastçä¿¡å·",i+1); } // miloService.writeToOpcByte(entity); } } } //OP010ä¿åè¯·æ± if (identifier.equals(OPCElement.OP010_SaveRequest) && "1".equals(value.toString())) { //1ãæ´æ°å·¥åæ°æ® //2ãä¿åè¿ç«ééæ°æ® //3ãä¿ååæ°ééæ°æ® ReadWriteEntity entity = new ReadWriteEntity(OPCElement.OP010_MesSaveFeed, 1); miloService.writeToOpcByte(entity); } //OP010请æ±æ£ç´¢æ¡ç else if (identifier.equals(OPCElement.OP010_CodeCheck) && "1".equals(value.toString())) { ReadWriteEntity entity = new ReadWriteEntity(OPCElement.OP010_MesCodeCheckFeed, 1); miloService.writeToOpcByte(entity); } // if (identifier.equals(OPCElement.OP120_SaveRequestLast) && "1".equals(value.toString())) { // this.SaveData(OPCElement.OP120_SaveRequestLast); // //1ãæ´æ°å·¥åæ°æ® // //2ãä¿åè¿ç«ééæ°æ® // //3ãä¿ååæ°ééæ°æ® // ReadWriteEntity entity = new ReadWriteEntity(OPCElement.OP010_MesSaveFeed, 1); // miloService.writeToOpcByte(entity); // } // else if (identifier.equals(OPCElement.OP120_ZZ_CODE_CHECK) && "1".equals(value.toString())){ // //æ»è£ ä¸çº¿æ«ç ä¼ è¾æ°æ® // String[] parts = OPCElement.OP120_ZZ_CODE_CHECK.split("[.]"); // Object SNCodeObject = miloService.readFromOpcUa(parts[0] + "." + parts[1] + ".Code1").getValue(); // if (null != SNCodeObject){ // String SNCode = SNCodeObject.toString(); // passingStationCollectionServiceImpl.sendMessage(SNCode); // } // } // //OP010请æ±æ£ç´¢æ¡ç // else if (identifier.equals(OPCElement.OP010_CodeCheck) && "1".equals(value.toString())) { // ReadWriteEntity entity = new ReadWriteEntity(OPCElement.OP010_MesCodeCheckFeed, 1); // miloService.writeToOpcByte(entity); // } } @@ -69,8 +149,34 @@ } } public void SNRetrieval(String Node, String value) throws Exception { String[] parts = Node.split("[.]"); if(value.equals("1")) { //SNå·æ£ç´¢ Object SNCodeObject = miloService.readFromOpcUa(parts[0] + "." + parts[1] + ".Code").getValue(); if(null != SNCodeObject) { String SNCode=SNCodeObject.toString(); String a=passingStationCollectionServiceImpl.SelectSN(SNCode,parts[1]); // 1:OKå¯ç产 2:NGä¸å¯ç产 3:NGå¯è¿å·¥ 4:PCæ£ç´¢å¤±è´¥ï¼æ è®°å½ï¼5:PCæ£ç´¢å¤±è´¥ï¼è½¯ä»¶ï¼ ReadWriteEntity entity = new ReadWriteEntity(parts[0]+"."+parts[1]+".CodeCheckFeed", a); log.info("-------çå¬å°,{}çCodeCheckçä¿¡å·",Node); Integer i = map.getOrDefault(Node + "çCodeCheckçä¿¡å·",0); if (0==i){ map.put(Node + "çCodeCheckçä¿¡å·",i+1); } // miloService.writeToOpcByte(entity); DaPassingStationCollection PassingStationCollection=new DaPassingStationCollection(); PassingStationCollection.setSfcCode(SNCode); PassingStationCollection.setLocationCode(parts[1]); PassingStationCollection.setInboundTime(new Date()); passingStationCollectionServiceImpl.insertDaPassingStationCollection(PassingStationCollection); } } } public void SaveData(String Node) throws Exception { /*String[] parts = Node.split("[.]"); String[] parts = Node.split("[.]"); Object SNCodeObject = miloService.readFromOpcUa(parts[0] + "." + parts[1] + ".Code1").getValue(); if(null != SNCodeObject) @@ -108,6 +214,6 @@ } daParamCollectionService.saveBeachDaParamCollection(daParamCollectionlist); } }*/ } } } jcdm-main/src/main/java/com/jcdm/main/websocket/SystemController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,44 @@ package com.jcdm.main.websocket; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Controller("web_Scoket_system") @RequestMapping("/api/socket") public class SystemController { //页é¢è¯·æ± @GetMapping("/index/{userId}") public ModelAndView socket(@PathVariable String userId) { ModelAndView mav = new ModelAndView("/socket1"); mav.addObject("userId", userId); return mav; } //æ¨éæ°æ®æ¥å£ @ResponseBody @RequestMapping("/socket/push/{cid}") public Map pushToWeb(@PathVariable String cid, String message) { Map<String,Object> result = new HashMap<>(); try { WebSocketServer.sendInfo(message, cid); result.put("code", cid); result.put("msg", message); } catch (IOException e) { e.printStackTrace(); } return result; } } jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.jcdm.main.websocket; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketServer.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,158 @@ package com.jcdm.main.websocket; import cn.hutool.log.Log; import cn.hutool.log.LogFactory; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; @Component @Service @ServerEndpoint("/websocket/{userId}") public class WebSocketServer { static Log log = LogFactory.get(WebSocketServer.class); /** * éæåéï¼ç¨æ¥è®°å½å½åå¨çº¿è¿æ¥æ°ãåºè¯¥æå®è®¾è®¡æ线ç¨å®å ¨çã */ private static int onlineCount = 0; /** * concurrentå ç线ç¨å®å ¨Setï¼ç¨æ¥åæ¾æ¯ä¸ªå®¢æ·ç«¯å¯¹åºçMyWebSocket对象ã */ private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>(); /** * ä¸æ个客æ·ç«¯çè¿æ¥ä¼è¯ï¼éè¦éè¿å®æ¥ç»å®¢æ·ç«¯åéæ°æ® */ private Session session; /** * æ¥æ¶userId */ private String userId = ""; /** * è¿æ¥å»ºç«æåè°ç¨çæ¹æ³ */ @OnOpen public void onOpen(Session session, @PathParam("userId") String userId) { this.session = session; this.userId = userId; if (webSocketMap.containsKey(userId)) { webSocketMap.remove(userId); webSocketMap.put(userId, this); //å å ¥setä¸ } else { webSocketMap.put(userId, this); //å å ¥setä¸ addOnlineCount(); //å¨çº¿æ°å 1 } log.info("ç¨æ·è¿æ¥:" + userId + ",å½åå¨çº¿äººæ°ä¸º:" + getOnlineCount()); try { sendMessage("è¿æ¥æå"); } catch (IOException e) { log.error("ç¨æ·:" + userId + ",ç½ç»å¼å¸¸!!!!!!"); } } /** * è¿æ¥å ³éè°ç¨çæ¹æ³ */ @OnClose public void onClose() { if (webSocketMap.containsKey(userId)) { webSocketMap.remove(userId); //ä»setä¸å é¤ subOnlineCount(); } log.info("ç¨æ·éåº:" + userId + ",å½åå¨çº¿äººæ°ä¸º:" + getOnlineCount()); } /** * æ¶å°å®¢æ·ç«¯æ¶æ¯åè°ç¨çæ¹æ³ * * @param message 客æ·ç«¯åéè¿æ¥çæ¶æ¯ */ @OnMessage public void onMessage(String message, Session session) { log.info("ç¨æ·æ¶æ¯:" + userId + ",æ¥æ:" + message); //å¯ä»¥ç¾¤åæ¶æ¯ //æ¶æ¯ä¿åå°æ°æ®åºãredis if (! StringUtils.isEmpty(message)) { try { //解æåéçæ¥æ JSONObject jsonObject = JSON.parseObject(message); } catch (Exception e) { e.printStackTrace(); } } } /** * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error("ç¨æ·é误:" + this.userId + ",åå :" + error.getMessage()); error.printStackTrace(); } /** * å®ç°æå¡å¨ä¸»å¨æ¨é */ public void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } /** * å®ç°æå¡å¨ä¸»å¨æ¨é */ public static void sendAllMessage(String message) throws IOException { log.info("åéæ¶æ¯:" + message); ConcurrentHashMap.KeySetView<String, WebSocketServer> userIds = webSocketMap.keySet(); for (String userId : userIds) { WebSocketServer webSocketServer = webSocketMap.get(userId); webSocketServer.session.getBasicRemote().sendText(message); System.out.println("webSocketå®ç°æå¡å¨ä¸»å¨æ¨éæåuserIds====" + userIds); } } /** * åéèªå®ä¹æ¶æ¯ */ public static void sendInfo(String message, @PathParam("userId") String userId) throws IOException { log.info("åéæ¶æ¯å°:" + userId + "ï¼æ¥æ:" + message); if (!StringUtils.isEmpty(message) && webSocketMap.containsKey(userId)) { webSocketMap.get(userId).sendMessage(message); } else { log.error("ç¨æ·" + userId + ",ä¸å¨çº¿ï¼"); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } } jcdm-main/src/main/resources/mapper/da/passingStationCollection/DaPassingStationCollectionMapper.xml
@@ -150,4 +150,14 @@ #{id} </foreach> </delete> <select id="SelectSN" parameterType="java.util.Map" statementType="CALLABLE" resultType="java.lang.String"> { call SNRetrieval( #{SN_CODE,mode=IN,jdbcType=VARCHAR}, #{Node,mode=IN,jdbcType=VARCHAR}, #{Success,mode=OUT,jdbcType=VARCHAR} ) } </select> </mapper> jcdm-ui/src/utils/WebsocketTool.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,105 @@ //éæ±ï¼å¨JavaScriptä¸å®ç°WebSocketè¿æ¥å¤±è´¥å3åéå å°è¯éè¿3次çåè½ï¼ä½ å¯ä»¥è®¾ç½®ä¸ä¸ªéè¿çç¥ï¼ // å æ¬éè¿çé´éæ¶é´ãå°è¯æ¬¡æ°ä»¥åæ»æ¶é´éå¶ã /** * @param {string} url Url to connect * @param {number} maxReconnectAttempts Maximum number of times * @param {number} reconnect Timeout * @param {number} reconnectTimeout Timeout * */ class WebSocketReconnect { constructor(url, maxReconnectAttempts = 3, reconnectInterval = 20000, maxReconnectTime = 180000) { this.url = url this.maxReconnectAttempts = maxReconnectAttempts this.reconnectInterval = reconnectInterval this.maxReconnectTime = maxReconnectTime this.reconnectCount = 0 this.reconnectTimeout = null this.startTime = null this.socket = null this.connect() } //è¿æ¥æä½ connect() { console.log('connecting...') this.socket = new WebSocket(this.url) //è¿æ¥æå建ç«çåè°æ¹æ³ this.socket.OnOpen = () => { console.log('WebSocket Connection Opened!') this.clearReconnectTimeout() this.reconnectCount = 0 } //è¿æ¥å ³éçåè°æ¹æ³ this.socket.OnClose = (event) => { console.log('WebSocket Connection Closed:', event) this.handleClose() } //è¿æ¥åçé误çåè°æ¹æ³ this.socket.OnError = (error) => { console.error('WebSocket Connection Error:', error) this.handleClose() //éè¿ } } //æ线éè¿æä½ handleClose() { if (this.reconnectCount < this.maxReconnectAttempts && (this.startTime === null || Date.now() - this.startTime < this.maxReconnectTime)) { this.reconnectCount++ console.log(`æ£å¨å°è¯éè¿ (${this.reconnectCount}/${this.maxReconnectAttempts})次...`) this.reconnectTimeout = setTimeout(() => { this.connect() }, this.reconnectInterval) if (this.startTime === null) { this.startTime = Date.now() } } else { console.log('è¶ è¿æ大éè¿æ¬¡æ°æéè¿æ¶é´è¶ æ¶ï¼å·²æ¾å¼è¿æ¥ï¼Max reconnect attempts reached or exceeded max reconnect time. Giving up.') this.reconnectCount = 0 // éç½®è¿æ¥æ¬¡æ°0 this.startTime = null // éç½®å¼å§æ¶é´ } } //æ¸ é¤éè¿å®æ¶å¨ clearReconnectTimeout() { if (this.reconnectTimeout) { clearTimeout(this.reconnectTimeout) this.reconnectTimeout = null } } //å ³éè¿æ¥ close() { if (this.socket && this.socket.readyState === WebSocket.OPEN) { this.socket.close() } this.clearReconnectTimeout() this.reconnectCount = 0 this.startTime = null } } // WebSocketReconnect ç±»å°è£ äºWebSocketçè¿æ¥ãéè¿é»è¾ã // maxReconnectAttempts æ¯æ大éè¿å°è¯æ¬¡æ°ã // reconnectInterval æ¯æ¯æ¬¡éè¿å°è¯ä¹é´çé´éæ¶é´ã // maxReconnectTime æ¯æ»çéè¿æ¶é´éå¶ï¼è¶ è¿è¿ä¸ªæ¶é´åä¸åå°è¯éè¿ã // reconnectCount ç¨äºè®°å½å·²ç»å°è¯çéè¿æ¬¡æ°ã // startTime ç¨äºè®°å½å¼å§éè¿çæ¶é´ã // connect æ¹æ³ç¨äºå»ºç«WebSocketè¿æ¥ï¼å¹¶è®¾ç½®ç¸åºçäºä»¶çå¬å¨ã // handleClose æ¹æ³å¨WebSocketè¿æ¥å ³éæåçé误æ¶è¢«è°ç¨ï¼æ ¹æ®æ¡ä»¶å³å®æ¯å¦å°è¯éè¿ã // clearReconnectTimeout æ¹æ³ç¨äºæ¸ é¤ä¹å设置çéè¿å®æ¶å¨ã // close æ¹æ³ç¨äºå ³éWebSocketè¿æ¥ï¼å¹¶æ¸ é¤éè¿ç¸å ³çç¶æã // 使ç¨ç¤ºä¾ // const webSocketReconnect = new WebSocketReconnect('ws://your-websocket-url') // å½ä¸åéè¦WebSocketè¿æ¥æ¶ï¼å¯ä»¥è°ç¨closeæ¹æ³ // webSocketReconnect.close(); export default WebSocketReconnect jcdm-ui/src/views/main/kb/engineCheck/index.vue
@@ -44,7 +44,7 @@ <el-row :gutter="10" class="mb8" type="flex" justify="center" style="text-align: center"> <el-col :span="1.5"> <el-button plain :disabled="buttondisabled" type="primary" style="width:400px;height:160px" v-hasPermi="['bs:formula:add']" @click="forceOnline"> <el-button plain :disabled="buttondisabled" type="primary" style="width:400px;height:160px" v-hasPermi="['bs:formula:add']"> <span class="el-icon-thumb" style="font-size:40px;color:black"></span> <span style="font-size:45px;color:black"><strong>强å¶ä¸çº¿</strong></span> </el-button> @@ -77,6 +77,41 @@ import { listOrderScheduling, getOrderScheduling, delOrderScheduling, addOrderScheduling, updateOrderScheduling } from "@/api/main/bs/orderScheduling/orderScheduling"; import { listPassingStationCollection, getPassingStationCollection, delPassingStationCollection, addPassingStationCollection, updatePassingStationCollection } from "@/api/main/da/passingStationCollection/passingStationCollection"; import {listLineInfo} from "@/api/main/bs/lineInfo/lineInfo"; import WebSocketReconnect from "@/utils/WebsocketTool"; // let websocket = null // //å¤æå½åæµè§å¨æ¯å¦æ¯æWebSocket // if ('WebSocket' in window) { // //è¿æ¥WebSocketèç¹ // websocket = new WebSocketReconnect('ws://127.0.0.1:8086/websocket/111122') // } else { // alert('æµè§å¨ä¸æ¯æwebSocket') // } // //æ¥æ¶å°æ¶æ¯çåè°æ¹æ³ // websocket.socket.onmessage = function (event) { // let data = event.data // console.log('åç«¯ä¼ éçæ°æ®:' + data) // if (data != null && data !== ''){ // this.result = JSON.parse(data) // console.log('this.result',this.result) // // this.form.engineNo = this.result.server_message // this.transEngineNo = this.result.server_message // console.log('this.transEngineNo11111111111',this.transEngineNo) // } // // } // //çå¬çªå£å ³éäºä»¶ï¼å½çªå£å ³éæ¶ï¼ä¸»å¨å»å ³éwebsocketè¿æ¥ï¼é²æ¢è¿æ¥è¿æ²¡æå¼å°±å ³éçªå£ï¼server端ä¼æå¼å¸¸ã // window.onbeforeunload = function () { // websocket.close() // } // //å ³éè¿æ¥ // function closeWebSocket() { // websocket.close() // } // //åéæ¶æ¯ // function send() { // websocket.socket.send({ kk: 123 }) // } export default { components: { }, @@ -84,11 +119,15 @@ props: [], data() { return { websocket: null, result: {}, transEngineNo: '', options: [], total: 0, engineCheckList:[], showFlag:false, buttondisabled:true, mess:'', // æ¥è¯¢åæ° queryParams: { pageNum: 1, @@ -115,10 +154,57 @@ }; }, computed: {}, watch: {}, watch: { // transEngineNo:{ // handler(newVal,oldVal) { // console.log('newVal',newVal) // console.log('oldVal',oldVal) // this.form.engineNo = newVal // console.log('11111111111111') // console.log('this.form.engineNo',this.form.engineNo) // }, // immediate:true // } }, created() {}, mounted() {}, mounted() { this.initWebSocket() }, methods: { initWebSocket: function (){ //å¤æå½åæµè§å¨æ¯å¦æ¯æWebSocket if ('WebSocket' in window) { //è¿æ¥WebSocketèç¹ this.websocket = new WebSocketReconnect('ws://127.0.0.1:8086/websocket/111122') //æ¥æ¶å°æ¶æ¯çåè°æ¹æ³ this.websocket.socket.onmessage = (event) => { let data = event.data console.log('åç«¯ä¼ éçæ°æ®:' + data) if (data != null && data !== ''){ this.result = JSON.parse(data) console.log('this.result',this.result) this.form.engineNo = this.result.server_message // this.transEngineNo = this.result.server_message console.log('this.transEngineNo11111111111',this.transEngineNo) } } //çå¬çªå£å ³éäºä»¶ï¼å½çªå£å ³éæ¶ï¼ä¸»å¨å»å ³éwebsocketè¿æ¥ï¼é²æ¢è¿æ¥è¿æ²¡æå¼å°±å ³éçªå£ï¼server端ä¼æå¼å¸¸ã window.onbeforeunload = function () { this.websocket.close() } //å ³éè¿æ¥ function closeWebSocket() { this.websocket.close() } //åéæ¶æ¯ function send() { this.websocket.socket.send({ kk: 123 }) } } else { alert('æµè§å¨ä¸æ¯æwebSocket') } }, reset() { this.form = { engineNo:null,