From 059083082a6d284821b70eb7bb6805763014c402 Mon Sep 17 00:00:00 2001 From: wujian <14790700720@163.com> Date: 星期六, 16 三月 2024 10:54:46 +0800 Subject: [PATCH] add PLC连接通信 add 扫码数据推送到前端 --- jcdm-main/src/main/java/com/jcdm/main/plcserver/conf/OPCElement.java | 8 jcdm-main/pom.xml | 11 jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/mapper/DaPassingStationCollectionMapper.java | 3 jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/IDaPassingStationCollectionService.java | 2 jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketServer.java | 158 ++++++++++++ jcdm-main/src/main/java/com/jcdm/main/plcserver/CustomRunner.java | 43 ++ jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/controller/DaPassingStationCollectionController.java | 49 ++- jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/impl/DaPassingStationCollectionServiceImpl.java | 59 ++- jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketConfig.java | 16 + jcdm-main/src/main/resources/mapper/da/passingStationCollection/DaPassingStationCollectionMapper.xml | 10 jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java | 1 jcdm-main/src/main/java/com/jcdm/main/websocket/SystemController.java | 44 +++ jcdm-ui/src/utils/WebsocketTool.js | 105 ++++++++ jcdm-ui/src/views/main/kb/engineCheck/index.vue | 92 ++++++ jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java | 136 +++++++++- jcdm-admin/src/main/java/com/jcdm/MesApplication.java | 4 16 files changed, 667 insertions(+), 74 deletions(-) diff --git a/jcdm-admin/src/main/java/com/jcdm/MesApplication.java b/jcdm-admin/src/main/java/com/jcdm/MesApplication.java index 83c6e00..9e69293 100644 --- a/jcdm-admin/src/main/java/com/jcdm/MesApplication.java +++ b/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 { diff --git a/jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java b/jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java index 353fda4..f7c1c83 100644 --- a/jcdm-framework/src/main/java/com/jcdm/framework/config/SecurityConfig.java +++ b/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() diff --git a/jcdm-main/pom.xml b/jcdm-main/pom.xml index 3e9eefe..2681c44 100644 --- a/jcdm-main/pom.xml +++ b/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> \ No newline at end of file diff --git a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/controller/DaPassingStationCollectionController.java b/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/controller/DaPassingStationCollectionController.java index 8405255..0e23230 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/controller/DaPassingStationCollectionController.java +++ b/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); +// } } diff --git a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/mapper/DaPassingStationCollectionMapper.java b/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/mapper/DaPassingStationCollectionMapper.java index 10b4fe5..a6b0321 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/mapper/DaPassingStationCollectionMapper.java +++ b/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); } diff --git a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/IDaPassingStationCollectionService.java b/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/IDaPassingStationCollectionService.java index d0e0301..44733b3 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/IDaPassingStationCollectionService.java +++ b/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); } diff --git a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/impl/DaPassingStationCollectionServiceImpl.java b/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/impl/DaPassingStationCollectionServiceImpl.java index fe4d082..de56bec 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/da/passingStationCollection/service/impl/DaPassingStationCollectionServiceImpl.java +++ b/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(); } } diff --git a/jcdm-main/src/main/java/com/jcdm/main/plcserver/CustomRunner.java b/jcdm-main/src/main/java/com/jcdm/main/plcserver/CustomRunner.java index bbb8144..970139d 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/plcserver/CustomRunner.java +++ b/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; } } diff --git a/jcdm-main/src/main/java/com/jcdm/main/plcserver/conf/OPCElement.java b/jcdm-main/src/main/java/com/jcdm/main/plcserver/conf/OPCElement.java index 1641e9e..39298a7 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/plcserver/conf/OPCElement.java +++ b/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"; + } \ No newline at end of file diff --git a/jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java b/jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java index 2dd7941..f7313b2 100644 --- a/jcdm-main/src/main/java/com/jcdm/main/plcserver/sub/OPCUaSubscription.java +++ b/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銆佹绱N鍙� + //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("-------鐩戝惉鍒�,{}鐨勬壂鐮佹灙鎵爜鐨凜ODE_CHECK鐨勪俊鍙�",identifier); + Integer i = map.getOrDefault(identifier + "鐨勬壂鐮佹灙鎵爜鐨凜ODE_CHECK鐨勪俊鍙�",0); + if (0==i){ + map.put(identifier + "鐨勬壂鐮佹灙鎵爜鐨凜ODE_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("-------鐩戝惉鍒�,{}鐨剆aveRequest鐨勪俊鍙�",identifier); + Integer i = map.getOrDefault(identifier + "鐨剆aveRequest鐨勪俊鍙�",0); + if (0==i){ + map.put(identifier + "鐨剆aveRequest鐨勪俊鍙�",i+1); + } +// miloService.writeToOpcByte(entity); + }else if ("SaveRequestLast".equals(parts[2])){ + ReadWriteEntity entity = new ReadWriteEntity(parts[0] + "." + parts[1] + ".SaveFeedLast", 1); + log.info("-------鐩戝惉鍒�,{}鐨凷aveRequestLast鐨勪俊鍙�",identifier); + Integer i = map.getOrDefault(identifier + "鐨凷aveRequestLast鐨勪俊鍙�",0); + if (0==i){ + map.put(identifier + "鐨凷aveRequestLast鐨勪俊鍙�",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("-------鐩戝惉鍒�,{}鐨凜odeCheck鐨勪俊鍙�",Node); + Integer i = map.getOrDefault(Node + "鐨凜odeCheck鐨勪俊鍙�",0); + if (0==i){ + map.put(Node + "鐨凜odeCheck鐨勪俊鍙�",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); } - }*/ + } } } diff --git a/jcdm-main/src/main/java/com/jcdm/main/websocket/SystemController.java b/jcdm-main/src/main/java/com/jcdm/main/websocket/SystemController.java new file mode 100644 index 0000000..e20672c --- /dev/null +++ b/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; + } + + + + +} diff --git a/jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketConfig.java b/jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketConfig.java new file mode 100644 index 0000000..822cb37 --- /dev/null +++ b/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(); + } +} diff --git a/jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketServer.java b/jcdm-main/src/main/java/com/jcdm/main/websocket/WebSocketServer.java new file mode 100644 index 0000000..d6360e6 --- /dev/null +++ b/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锛岀敤鏉ュ瓨鏀炬瘡涓鎴风瀵瑰簲鐨凪yWebSocket瀵硅薄銆� + */ + 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); + //浠巗et涓垹闄� + subOnlineCount(); + } + log.info("鐢ㄦ埛閫�鍑�:" + userId + ",褰撳墠鍦ㄧ嚎浜烘暟涓�:" + getOnlineCount()); + } + + /** + * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉� + * + * @param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅 + */ + @OnMessage + public void onMessage(String message, Session session) { + log.info("鐢ㄦ埛娑堟伅:" + userId + ",鎶ユ枃:" + message); + //鍙互缇ゅ彂娑堟伅 + //娑堟伅淇濆瓨鍒版暟鎹簱銆乺edis + + if (! StringUtils.isEmpty(message)) { + try { + //瑙f瀽鍙戦�佺殑鎶ユ枃 + 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瀹炵幇鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佹垚鍔焨serIds====" + 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--; + } +} diff --git a/jcdm-main/src/main/resources/mapper/da/passingStationCollection/DaPassingStationCollectionMapper.xml b/jcdm-main/src/main/resources/mapper/da/passingStationCollection/DaPassingStationCollectionMapper.xml index d38a3dd..bec913f 100644 --- a/jcdm-main/src/main/resources/mapper/da/passingStationCollection/DaPassingStationCollectionMapper.xml +++ b/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> \ No newline at end of file diff --git a/jcdm-ui/src/utils/WebsocketTool.js b/jcdm-ui/src/utils/WebsocketTool.js new file mode 100644 index 0000000..711e2f4 --- /dev/null +++ b/jcdm-ui/src/utils/WebsocketTool.js @@ -0,0 +1,105 @@ +//闇�姹傦細鍦↗avaScript涓疄鐜癢ebSocket杩炴帴澶辫触鍚�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(`姝e湪灏濊瘯閲嶈繛 (${this.reconnectCount}/${this.maxReconnectAttempts})娆�...`) + this.reconnectTimeout = setTimeout(() => { + this.connect() + }, this.reconnectInterval) + + if (this.startTime === null) { + this.startTime = Date.now() + } + } else { + console.log('瓒呰繃鏈�澶ч噸杩炴鏁版垨閲嶈繛鏃堕棿瓒呮椂锛屽凡鏀惧純杩炴帴锛丮ax 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 鏂规硶鍦╓ebSocket杩炴帴鍏抽棴鎴栧彂鐢熼敊璇椂琚皟鐢紝鏍规嵁鏉′欢鍐冲畾鏄惁灏濊瘯閲嶈繛銆� +// clearReconnectTimeout 鏂规硶鐢ㄤ簬娓呴櫎涔嬪墠璁剧疆鐨勯噸杩炲畾鏃跺櫒銆� +// close 鏂规硶鐢ㄤ簬鍏抽棴WebSocket杩炴帴锛屽苟娓呴櫎閲嶈繛鐩稿叧鐨勭姸鎬併�� + +// 浣跨敤绀轰緥 +// const webSocketReconnect = new WebSocketReconnect('ws://your-websocket-url') +// 褰撲笉鍐嶉渶瑕乄ebSocket杩炴帴鏃讹紝鍙互璋冪敤close鏂规硶 +// webSocketReconnect.close(); + +export default WebSocketReconnect + diff --git a/jcdm-ui/src/views/main/kb/engineCheck/index.vue b/jcdm-ui/src/views/main/kb/engineCheck/index.vue index a3b2be1..2e2ac99 100644 --- a/jcdm-ui/src/views/main/kb/engineCheck/index.vue +++ b/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 +// //鍒ゆ柇褰撳墠娴忚鍣ㄦ槸鍚︽敮鎸乄ebSocket +// 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) +// } +// +// } +// //鐩戝惉绐楀彛鍏抽棴浜嬩欢锛屽綋绐楀彛鍏抽棴鏃讹紝涓诲姩鍘诲叧闂瓀ebsocket杩炴帴锛岄槻姝㈣繛鎺ヨ繕娌℃柇寮�灏卞叧闂獥鍙o紝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 (){ + //鍒ゆ柇褰撳墠娴忚鍣ㄦ槸鍚︽敮鎸乄ebSocket + 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) + } + } +//鐩戝惉绐楀彛鍏抽棴浜嬩欢锛屽綋绐楀彛鍏抽棴鏃讹紝涓诲姩鍘诲叧闂瓀ebsocket杩炴帴锛岄槻姝㈣繛鎺ヨ繕娌℃柇寮�灏卞叧闂獥鍙o紝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, -- Gitblit v1.9.3