Explorar el Código

晋掌柜webSocket通信

helixiao hace 2 años
padre
commit
5e58c70772

+ 5 - 0
pom.xml

@@ -629,6 +629,11 @@
             <artifactId>sdk-jar-1.1.0</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <!--   websocket :APP保存地理位置    -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
     </dependencies>
 
 

+ 23 - 0
src/main/java/com/ydtech/config/SpringContextUtils.java

@@ -0,0 +1,23 @@
+package com.ydtech.config;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SpringContextUtils implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) {
+        SpringContextUtils.applicationContext = applicationContext;
+    }
+
+    public static <T> T getBean(Class<T> beanClass) {
+        return applicationContext.getBean(beanClass);
+    }
+
+    public static Object getBean(String beanName) {
+        return applicationContext.getBean(beanName);
+    }
+}

+ 27 - 0
src/main/java/com/ydtech/config/WebsocketConfig.java

@@ -0,0 +1,27 @@
+package com.ydtech.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * 自动扫描websocket声明对象
+ */
+@Configuration
+public class WebsocketConfig {
+    @PostConstruct
+    public void init() {
+        System.out.println("WebSocketConfig 已注册");
+    }
+
+    @Bean
+    public ServerEndpointExporter serverEndpointConfig() {
+        return new ServerEndpointExporter();
+    }
+
+
+}

+ 41 - 0
src/main/java/com/ydtech/modules/admin/controller/websocket/SysGeographyPositionController.java

@@ -0,0 +1,41 @@
+package com.ydtech.modules.admin.controller.websocket;
+
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.model.SysGeographyPosition;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+import com.ydtech.modules.admin.service.SysGeographyPositionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+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.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("/geography")
+@Api(tags = "APP地理经纬度")
+public class SysGeographyPositionController {
+
+    @Resource
+    private SysGeographyPositionService sysGeographyPositionService;
+
+    @GetMapping("/queryPosition/{userId}")
+    @ApiOperation(value = "查询用户的最新位置")
+    public HttpResult<SysGeographyPosition> queryPosition(@PathVariable("userId") @ApiParam("用户id") String userId) {
+        return HttpResult.ok("success", this.sysGeographyPositionService.queryPosition(userId));
+    }
+
+    @GetMapping("/queryPositionList/{userId}")
+    @ApiOperation(value = "查询用户的所有位置")
+    public HttpResult<List<SysGeographyPositionRecord>> queryPositionList(@PathVariable("userId") @ApiParam("用户id") String userId) {
+        return HttpResult.ok("success", this.sysGeographyPositionService.queryPositionList(userId));
+    }
+
+
+
+}

+ 122 - 0
src/main/java/com/ydtech/modules/admin/controller/websocket/WebSocketServer.java

@@ -0,0 +1,122 @@
+package com.ydtech.modules.admin.controller.websocket;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.ydtech.config.SpringContextUtils;
+import com.ydtech.modules.admin.model.SysGeographyPosition;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.service.SysGeographyPositionRecordService;
+import com.ydtech.modules.admin.service.SysGeographyPositionService;
+import com.ydtech.modules.admin.service.SysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.Date;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Slf4j
+@ServerEndpoint(value = "/websocket/{userId}")
+@Component
+public class WebSocketServer {
+
+    private String userId;
+
+    private Session session;
+
+    private static Map<String, Session> sessionClientMap = new ConcurrentHashMap<>();
+
+    /**静态变量,用来记录当前在线连接数*/
+    private static final AtomicInteger onlineCount = new AtomicInteger(0);
+
+    /**
+     * 连接成功调用的方法
+     * @param userId
+     * @param session
+     */
+    @OnOpen
+    public void onOpen(@PathParam("userId") String userId, Session session) {
+        this.session=session;
+        this.userId=userId;
+        if (sessionClientMap.containsKey(userId)) {
+            sessionClientMap.remove(userId);
+            // 加入map中
+            sessionClientMap.put(userId, session);
+        } else {
+            // 加入map中
+            sessionClientMap.put(userId, session);
+            // 在线数加1
+            onlineCount.incrementAndGet();
+        }
+        log.info("用户连接:" + userId + ",当前在线人数为:" + onlineCount);
+        sendMessage("连接成功");
+    }
+
+
+    @OnMessage
+    public void onMessage(String message, Session session) {
+        JSONObject jsonObject = JSONObject.parseObject(message);
+        String userId = jsonObject.getString("userId");
+        String longitude = jsonObject.getString("longitude");
+        String latitude = jsonObject.getString("latitude");
+        saveLocationData(userId, latitude, longitude);
+        log.info("服务端收到消息:{} ,主体:{}", message, userId);
+        session.getAsyncRemote().sendText("服务端已收到信息:" + message);
+    }
+
+    @OnClose
+    public void onClose(@PathParam("userId") String userId, Session session) {
+        sessionClientMap.remove(userId);
+        log.info("断联成功!");
+    }
+
+    @OnError
+    public void onError(Throwable throwable) {
+        log.info("websocket异常,错误信息:{}", throwable.getMessage());
+    }
+
+    public void sendMessage(String message) {
+        this.session.getAsyncRemote().sendText(message);
+    }
+
+    public void saveLocationData(String userId, String latitude, String longitude) {
+        SysGeographyPositionRecordService sysGeographyPositionRecordService = SpringContextUtils.getBean(SysGeographyPositionRecordService.class);
+
+        SysGeographyPositionService sysGeographyPositionService= SpringContextUtils.getBean(SysGeographyPositionService.class);
+        SysGeographyPosition sysGeographyPosition1 = sysGeographyPositionService.getById(userId);
+        if (sysGeographyPosition1 == null) {
+            //不存在新增
+            SysUserService sysUserService = SpringContextUtils.getBean(SysUserService.class);
+            SysUser sysUser = sysUserService.getById(userId);
+            SysGeographyPosition sysGeographyPosition = new SysGeographyPosition();
+            sysGeographyPosition.setId(userId);
+            sysGeographyPosition.setUserName(sysUser.getName());
+            sysGeographyPosition.setLatitude(latitude);
+            sysGeographyPosition.setLongitude(longitude);
+            sysGeographyPosition.setCreateTime(new Date());
+            sysGeographyPosition.setCreateBy(sysUser.getName());
+            sysGeographyPositionService.save(sysGeographyPosition);
+            SysGeographyPositionRecord sysGeographyPositionRecord = BeanUtil.copyProperties(sysGeographyPosition, SysGeographyPositionRecord.class);
+            sysGeographyPositionRecord.setId(null);
+            sysGeographyPositionRecord.setUserId(sysGeographyPosition.getId());
+            sysGeographyPositionRecordService.save(sysGeographyPositionRecord);
+        }else {
+            //存在更新
+            sysGeographyPosition1.setLongitude(longitude);
+            sysGeographyPosition1.setLatitude(latitude);
+            sysGeographyPosition1.setCreateTime(new Date());
+            sysGeographyPositionService.updateById(sysGeographyPosition1);
+            SysGeographyPositionRecord sysGeographyPositionRecord = BeanUtil.copyProperties(sysGeographyPosition1, SysGeographyPositionRecord.class);
+            sysGeographyPositionRecord.setId(null);
+            sysGeographyPositionRecord.setUserId(sysGeographyPosition1.getId());
+            sysGeographyPositionRecordService.save(sysGeographyPositionRecord);
+
+        }
+    }
+
+}

+ 20 - 0
src/main/java/com/ydtech/modules/admin/dao/SysGeographyPositionMapper.java

@@ -0,0 +1,20 @@
+package com.ydtech.modules.admin.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.admin.model.SysGeographyPosition;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * APP用户地理位置表(SysGeographyPosition)表数据库访问层
+ *
+ * @author makejava
+ * @since 2024-08-27 17:17:27
+ */
+@Mapper
+public interface SysGeographyPositionMapper extends BaseMapper<SysGeographyPosition> {
+
+
+
+}
+

+ 19 - 0
src/main/java/com/ydtech/modules/admin/dao/SysGeographyPositionRecordMapper.java

@@ -0,0 +1,19 @@
+package com.ydtech.modules.admin.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * APP用户地理位置记录表(SysGeographyPositionRecord)表数据库访问层
+ *
+ * @author makejava
+ * @since 2024-08-27 17:17:45
+ */
+@Mapper
+public interface SysGeographyPositionRecordMapper extends BaseMapper<SysGeographyPositionRecord> {
+
+
+}
+

+ 46 - 0
src/main/java/com/ydtech/modules/admin/model/SysGeographyPosition.java

@@ -0,0 +1,46 @@
+package com.ydtech.modules.admin.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * APP用户地理位置表(SysGeographyPosition)实体类
+ *
+ * @author makejava
+ * @since 2024-08-27 17:17:27
+ */
+@Data
+public class SysGeographyPosition implements Serializable {
+    private static final long serialVersionUID = -99465536309552206L;
+    /**
+     * 员工编号
+     */
+    private String id;
+    /**
+     * 员工姓名
+     */
+    private String userName;
+    /**
+     * 经度
+     */
+    private String longitude;
+    /**
+     * 纬度
+     */
+    private String latitude;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+
+}
+

+ 50 - 0
src/main/java/com/ydtech/modules/admin/model/SysGeographyPositionRecord.java

@@ -0,0 +1,50 @@
+package com.ydtech.modules.admin.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * APP用户地理位置记录表(SysGeographyPositionRecord)实体类
+ *
+ * @author makejava
+ * @since 2024-08-27 17:17:45
+ */
+@Data
+public class SysGeographyPositionRecord implements Serializable {
+    private static final long serialVersionUID = 981510022474925106L;
+    /**
+     * 自增id
+     */
+    @TableId(value = "id", type= IdType.AUTO)
+    private String id;
+    /**
+     * 员工编号
+     */
+    private String userId;
+    /**
+     * 员工姓名
+     */
+    private String userName;
+    /**
+     * 经度
+     */
+    private String longitude;
+    /**
+     * 纬度
+     */
+    private String latitude;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+}
+

+ 7 - 0
src/main/java/com/ydtech/modules/admin/service/SysGeographyPositionRecordService.java

@@ -0,0 +1,7 @@
+package com.ydtech.modules.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+
+public interface SysGeographyPositionRecordService extends IService<SysGeographyPositionRecord> {
+}

+ 14 - 0
src/main/java/com/ydtech/modules/admin/service/SysGeographyPositionService.java

@@ -0,0 +1,14 @@
+package com.ydtech.modules.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.admin.model.SysGeographyPosition;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+
+import java.util.List;
+
+public interface SysGeographyPositionService extends IService<SysGeographyPosition> {
+
+    SysGeographyPosition queryPosition(String userId);
+
+    List<SysGeographyPositionRecord> queryPositionList(String userId);
+}

+ 12 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysGeographyPositionRecordServiceImpl.java

@@ -0,0 +1,12 @@
+package com.ydtech.modules.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.modules.admin.dao.SysGeographyPositionRecordMapper;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+import com.ydtech.modules.admin.service.SysGeographyPositionRecordService;
+import org.springframework.stereotype.Service;
+
+@Service("SysGeographyPositionRecordService")
+public class SysGeographyPositionRecordServiceImpl extends ServiceImpl<SysGeographyPositionRecordMapper, SysGeographyPositionRecord> implements SysGeographyPositionRecordService {
+
+}

+ 44 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysGeographyPositionServiceImpl.java

@@ -0,0 +1,44 @@
+package com.ydtech.modules.admin.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.modules.admin.dao.SysGeographyPositionMapper;
+import com.ydtech.modules.admin.dao.SysGeographyPositionRecordMapper;
+import com.ydtech.modules.admin.dao.SysUserMapper;
+import com.ydtech.modules.admin.model.SysGeographyPosition;
+import com.ydtech.modules.admin.model.SysGeographyPositionRecord;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.service.SysGeographyPositionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+@Service("SysGeographyPositionService")
+public class SysGeographyPositionServiceImpl extends ServiceImpl<SysGeographyPositionMapper, SysGeographyPosition> implements SysGeographyPositionService {
+    @Resource
+    private SysGeographyPositionMapper sysGeographyPositionMapper;
+
+    @Resource
+    private SysGeographyPositionRecordMapper sysGeographyPositionRecordMapper;
+
+
+
+    @Override
+    public SysGeographyPosition queryPosition(String userId) {
+        return  sysGeographyPositionMapper.selectOne(new LambdaQueryWrapper<SysGeographyPosition>()
+                .eq(SysGeographyPosition::getId,userId));
+    }
+
+    @Override
+    public List<SysGeographyPositionRecord> queryPositionList(String userId) {
+        return sysGeographyPositionRecordMapper.selectList(new LambdaQueryWrapper<SysGeographyPositionRecord>()
+                .eq(SysGeographyPositionRecord::getUserId, userId).orderByDesc(SysGeographyPositionRecord::getCreateTime));
+    }
+
+
+}

+ 16 - 0
src/main/resources/mapper/modules/admin/SysGeographyPositionMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ydtech.modules.admin.dao.SysGeographyPositionMapper">
+
+    <resultMap type="com.ydtech.modules.admin.model.SysGeographyPosition" id="SysGeographyPositionMap">
+        <result property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+        <result property="userName" column="user_name" jdbcType="VARCHAR"/>
+        <result property="longitude" column="longitude" jdbcType="VARCHAR"/>
+        <result property="latitude" column="latitude" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+    </resultMap>
+
+</mapper>
+

+ 17 - 0
src/main/resources/mapper/modules/admin/SysGeographyPositionRecordMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ydtech.modules.admin.dao.SysGeographyPositionRecordMapper">
+
+    <resultMap type="com.ydtech.modules.admin.model.SysGeographyPositionRecord" id="SysGeographyPositionRecordMap">
+        <result property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="positionId" column="position_id" jdbcType="INTEGER"/>
+        <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+        <result property="userName" column="user_name" jdbcType="VARCHAR"/>
+        <result property="longitude" column="longitude" jdbcType="VARCHAR"/>
+        <result property="latitude" column="latitude" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+    </resultMap>
+
+</mapper>
+