PCSocketServer.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package com.ydtech.modules.admin.controller.websocket;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.ydtech.config.SpringContextUtils;
  6. import com.ydtech.modules.admin.constants.SystemType;
  7. import com.ydtech.modules.admin.dao.SysDeptMapper;
  8. import com.ydtech.modules.admin.model.SysDept;
  9. import com.ydtech.modules.admin.model.SysGeographyPosition;
  10. import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
  11. import com.ydtech.modules.admin.model.SysUser;
  12. import com.ydtech.modules.admin.model.dto.IpInfoDto;
  13. import com.ydtech.modules.admin.model.po.SysPcAddress;
  14. import com.ydtech.modules.admin.service.SysGeographyPositionRecordService;
  15. import com.ydtech.modules.admin.service.SysGeographyPositionService;
  16. import com.ydtech.modules.admin.service.SysPcAddressService;
  17. import com.ydtech.modules.admin.service.SysUserService;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.stereotype.Component;
  20. import javax.websocket.*;
  21. import javax.websocket.server.PathParam;
  22. import javax.websocket.server.ServerEndpoint;
  23. import java.util.Date;
  24. import java.util.Map;
  25. import java.util.concurrent.ConcurrentHashMap;
  26. import java.util.concurrent.atomic.AtomicInteger;
  27. @Slf4j
  28. @ServerEndpoint(value = "/pcWebsocket/{userId}")
  29. @Component
  30. public class PCSocketServer {
  31. private String userId;
  32. private Session session;
  33. private static Map<String, Session> sessionClientMap = new ConcurrentHashMap<>();
  34. /**静态变量,用来记录当前在线连接数*/
  35. private static final AtomicInteger onlineCount = new AtomicInteger(0);
  36. /**
  37. * 连接成功调用的方法
  38. * @param userId
  39. * @param session
  40. */
  41. @OnOpen
  42. public void onOpen(@PathParam("userId") String userId, Session session) {
  43. this.session=session;
  44. this.userId=userId;
  45. if (sessionClientMap.containsKey(userId)) {
  46. sessionClientMap.remove(userId);
  47. // 加入map中
  48. sessionClientMap.put(userId, session);
  49. } else {
  50. // 加入map中
  51. sessionClientMap.put(userId, session);
  52. // 在线数加1
  53. onlineCount.incrementAndGet();
  54. }
  55. editStatus(userId);
  56. log.info("PC用户连接成功:" + userId + ",当前在线人数为:" + onlineCount);
  57. sendMessage("连接成功");
  58. }
  59. @OnMessage
  60. public void onMessage(String message, Session session) {
  61. JSONObject jsonObject = JSONObject.parseObject(message);
  62. String userId = jsonObject.getString("userId");
  63. String longitude = jsonObject.getString("lng");
  64. String latitude = jsonObject.getString("lat");
  65. String province = jsonObject.getString("prov");
  66. String city = jsonObject.getString("city");
  67. String district = jsonObject.getString("district");
  68. String ip = jsonObject.getString("ip");
  69. String systemType = jsonObject.getString("systemType");
  70. saveLocationData(userId, latitude, longitude,province,city,district,ip,systemType);
  71. log.info("服务端收到PC用户消息:{} ,主体:{}", message, userId);
  72. sendMessage("服务端已收到PC用户信息:" +message);
  73. }
  74. @OnClose
  75. public void onClose(@PathParam("userId") String userId, Session session) {
  76. delStatus(userId);
  77. sessionClientMap.remove(userId);
  78. log.info("PC用户断联成功!");
  79. }
  80. @OnError
  81. public void onError(Throwable throwable) {
  82. log.info("websocket异常,错误信息:{}", throwable.getMessage());
  83. }
  84. private void delStatus(String userId) {
  85. SysPcAddressService sysPcAddressService= SpringContextUtils.getBean(SysPcAddressService.class);
  86. SysPcAddress sysPcAddress = sysPcAddressService.getById(userId);
  87. if (sysPcAddress != null) {
  88. sysPcAddress.setStatus(0);
  89. sysPcAddressService.updateById(sysPcAddress);
  90. }
  91. }
  92. private void editStatus(String userId) {
  93. SysPcAddressService sysPcAddressService= SpringContextUtils.getBean(SysPcAddressService.class);
  94. SysPcAddress sysPcAddress = sysPcAddressService.getById(userId);
  95. if (sysPcAddress != null) {
  96. sysPcAddress.setStatus(1);
  97. sysPcAddressService.updateById(sysPcAddress);
  98. }
  99. }
  100. public void sendMessage(String message) {
  101. this.session.getAsyncRemote().sendText(message);
  102. }
  103. public void saveLocationData(String userId, String latitude, String longitude,
  104. String province,String city,String district,
  105. String ip,String systemType) {
  106. SysPcAddressService sysPcAddressService = SpringContextUtils.getBean(SysPcAddressService.class);
  107. SysUserService sysUserService = SpringContextUtils.getBean(SysUserService.class);
  108. if (SystemType.ST_1.getCode().equals(systemType)) {
  109. try {
  110. IpInfoDto ipInfoDto = new IpInfoDto();
  111. ipInfoDto.setIp(ip);
  112. ipInfoDto.setLng(longitude);
  113. ipInfoDto.setLat(latitude);
  114. ipInfoDto.setProv(province);
  115. ipInfoDto.setCity(city);
  116. ipInfoDto.setDistrict(district);
  117. SysUser user = sysUserService.getById(userId);
  118. // 保存登录信息
  119. sysPcAddressService.saveSysPcAddress(ipInfoDto,user);
  120. }catch (Exception e){}
  121. }
  122. }
  123. }