From 1e0c93c0c7efaaaed05064831bb8041eb35d70d2 Mon Sep 17 00:00:00 2001
From: pengjie <17373303529@163.com>
Date: Fri, 14 Mar 2025 10:27:27 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E6=B5=B7=E7=94=B5=E5=8A=9B=E4=BA=BA?=
=?UTF-8?q?=E5=91=98=E5=AE=9A=E4=BD=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../xmgl/modules/project/entity/Project.java | 13 +
.../mapper/xml/SafetyHatDevMapper.xml | 2 +-
.../com/zhgd/xmgl/task/GpsLocateTask.java | 262 ++++++++++++++++++
3 files changed, 276 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/com/zhgd/xmgl/task/GpsLocateTask.java
diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java
index ea879027e..0d0e7689b 100644
--- a/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java
+++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/Project.java
@@ -216,6 +216,19 @@ public class Project implements Serializable {
@ApiModelProperty(value = "第三方安全帽网站密码")
private java.lang.String helmetPassword;
+ /**
+ * 上海电力定位标签系统用户名
+ */
+ @JsonIgnore
+ @ApiModelProperty(value = "上海电力定位标签系统用户名")
+ private java.lang.String gpsLocateUser;
+ /**
+ * 上海电力定位标签系统密码
+ */
+ @JsonIgnore
+ @ApiModelProperty(value = "上海电力定位标签系统密码")
+ private java.lang.String gpsLocatePassword;
+
/**
* 场所码ID
*/
diff --git a/src/main/java/com/zhgd/xmgl/modules/safetyhat/mapper/xml/SafetyHatDevMapper.xml b/src/main/java/com/zhgd/xmgl/modules/safetyhat/mapper/xml/SafetyHatDevMapper.xml
index 90dbc87f3..9c30f9787 100644
--- a/src/main/java/com/zhgd/xmgl/modules/safetyhat/mapper/xml/SafetyHatDevMapper.xml
+++ b/src/main/java/com/zhgd/xmgl/modules/safetyhat/mapper/xml/SafetyHatDevMapper.xml
@@ -15,7 +15,7 @@
select count(*) count,
IFNULL(sum(online),0) onlineCount
from safety_hat_dev
- where 1 = 1
+ where type = 1
and dev_sn = #{devSn}
diff --git a/src/main/java/com/zhgd/xmgl/task/GpsLocateTask.java b/src/main/java/com/zhgd/xmgl/task/GpsLocateTask.java
new file mode 100644
index 000000000..6ebdae06b
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/task/GpsLocateTask.java
@@ -0,0 +1,262 @@
+package com.zhgd.xmgl.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.zhgd.annotation.OperLog;
+import com.zhgd.jeecg.common.api.vo.Result;
+import com.zhgd.jeecg.common.util.SpringContextUtils;
+import com.zhgd.xmgl.config.SafetyHatWSClient;
+import com.zhgd.xmgl.modules.project.entity.Project;
+import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo;
+import com.zhgd.xmgl.modules.project.service.IProjectService;
+import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatAlarm;
+import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatData;
+import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatDev;
+import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatAlarmMapper;
+import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatDataMapper;
+import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatDevMapper;
+import com.zhgd.xmgl.modules.safetyhat.service.ISafetyHatAlarmService;
+import com.zhgd.xmgl.modules.safetyhat.service.ISafetyHatDataService;
+import com.zhgd.xmgl.modules.safetyhat.service.ISafetyHatDevService;
+import com.zhgd.xmgl.util.RundeSafeyHatUtils;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import net.javacrumbs.shedlock.core.SchedulerLock;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import javax.websocket.DeploymentException;
+import javax.websocket.WebSocketContainer;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 上海电力项目人员定位标签对接
+ */
+@Slf4j
+@RestController
+@RequestMapping("xmgl/task")
+@Transactional(rollbackFor = Exception.class)
+public class GpsLocateTask {
+ public static final String SESSION_ID = "session_id";
+ @Autowired
+ IProjectService projectService;
+ @Autowired
+ ISafetyHatDevService safetyHatDevService;
+ @Autowired
+ SafetyHatDataMapper safetyHatDataMapper;
+ @Autowired
+ ISafetyHatAlarmService safetyHatAlarmService;
+ @Autowired
+ ISafetyHatDataService safetyHatDataService;
+ @Autowired
+ WebSocketContainer webSocketContainer;
+
+ /**
+ * 获取定位标签信息更新设备状态
+ */
+ @Scheduled(cron = "0 */1 * * * ?")
+ @RequestMapping("updateGpsStatus")
+ public void updateGpsStatus() {
+ List projectList = projectService.list(Wrappers.lambdaQuery().ne(Project::getGpsLocateUser, "").ne(Project::getGpsLocatePassword, ""));
+ if (CollUtil.isNotEmpty(projectList)) {
+ log.info("定时更新定位标签设备状态开始");
+ for (Project project : projectList) {
+ String loginUrl = "http://openapi.18gps.net/GetDataService.aspx?method=SignApi&w=UserLogin&userName=" + project.getGpsLocateUser() + "&password=" + project.getGpsLocatePassword() + "";
+ String loginInfo = HttpRequest.get(loginUrl)
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+ JSONObject loginObj = JSON.parseObject(loginInfo);
+ if (loginObj == null || !loginObj.getString("errorCode").equals("200")) {
+ continue;
+ }
+ String mds = loginObj.getJSONObject("data").getString("mds");
+ List devList = safetyHatDevService.list(new LambdaQueryWrapper()
+ .eq(SafetyHatDev::getProjectSn, project.getProjectSn()));
+ //获取设备列表
+ String url = StrUtil.format("http://openapi.18gps.net/GetDataService.aspx?method=QueryApi&w=UserDevices&mds={}", mds);
+ String rs = HttpRequest.get(url)
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+ JSONObject rsJo = JSON.parseObject(rs);
+ if (rsJo.getString("errorCode").equals("200")) {
+ JSONArray dataJa = rsJo.getJSONArray("data");
+ for (int i = 0; i < dataJa.size(); i++) {
+ JSONObject devObj = dataJa.getJSONObject(i);
+ String macid = devObj.getString("macid");
+ for (SafetyHatDev safetyHatDev : devList) {
+ if (macid.equals(safetyHatDev.getDevSn())) {
+ safetyHatDev.setOnline(Integer.valueOf(devObj.getString("status")));
+ }
+ }
+ }
+ }
+ safetyHatDevService.updateBatchById(devList);
+ }
+ }
+ }
+
+ /**
+ * 定时2分钟获取定位标签数据
+ */
+ @Scheduled(cron = "0 */2 * * * ?")
+ @RequestMapping("getGpsLocateData")
+ public void getHelmetData() {
+ List projectList = projectService.list(Wrappers.lambdaQuery().ne(Project::getGpsLocateUser, "").ne(Project::getGpsLocatePassword, ""));
+ if (CollUtil.isNotEmpty(projectList)) {
+ log.info("定时2分钟获取人员定位标签数据任务开始");
+ List list = new ArrayList<>();
+ for (Project project : projectList) {
+ String loginUrl = "http://openapi.18gps.net/GetDataService.aspx?method=SignApi&w=UserLogin&userName=" + project.getGpsLocateUser() + "&password=" + project.getGpsLocatePassword() + "";
+ String loginInfo = HttpRequest.get(loginUrl)
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+ JSONObject loginObj = JSON.parseObject(loginInfo);
+ if (loginObj == null || !loginObj.getString("errorCode").equals("200")) {
+ continue;
+ }
+ String mds = loginObj.getJSONObject("data").getString("mds");
+ List devList = safetyHatDevService.list(new LambdaQueryWrapper()
+ .eq(SafetyHatDev::getProjectSn, project.getProjectSn()));
+ for (SafetyHatDev dev : devList) {
+ SafetyHatData lastData = safetyHatDataMapper.selectOne(new LambdaQueryWrapper()
+ .eq(SafetyHatData::getDevSn, dev.getDevSn()).orderByDesc(SafetyHatData::getUploadTime).last("limit 1"));
+ Long start;
+ if (lastData != null) {
+ start = lastData.getCreateTime().getTime();
+ } else {
+ start = DateUtil.offsetHour(new Date(), -1).getTime();
+ }
+ //获取历史数据
+ String url = StrUtil.format("http://openapi.18gps.net/GetDataService.aspx?method=QueryApi&w=PlaybackByPage&mds={}&macid={}&mapType=GAODE&startTime={}&endTime={}&playLBS=true",
+ mds, dev.getDevSn(), start, new Date().getTime());
+ String rs = HttpRequest.get(url)
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+ JSONObject rsJo = JSON.parseObject(rs);
+ if (rsJo.getString("errorCode").equals("200")) {
+ JSONArray dataJa = rsJo.getJSONObject("data").getJSONArray("rows");
+ if (CollUtil.isEmpty(dataJa)) {
+ continue;
+ }
+ for (int i = 0; i < dataJa.size(); i++) {
+ JSONObject dataJo = dataJa.getJSONObject(i);
+ Double xPoint = dataJo.getDouble("lat");
+ Double yPoint = dataJo.getDouble("lon");
+ SafetyHatData data = new SafetyHatData();
+ data.setWorkerInfoId(dev.getWorkerInfoId());
+ data.setDevSn(dev.getDevSn());
+ data.setLatitude(xPoint);
+ data.setLongitude(yPoint);
+ data.setUploadTime(new Date(dataJo.getLong("gpstime")));
+ data.setProjectSn(dev.getProjectSn());
+ data.setIsPlatformData(1);
+ data.setType(dev.getType());
+ data.setWorkerInfoName(dev.getWorkerInfoName());
+ list.add(data);
+// safetyHatDataService.add(data);
+ }
+ } else {
+ log.error("定时2分钟获取定位标签数据任务失败:devSn:{}", dev.getDevSn());
+ }
+ }
+ }
+ safetyHatDataService.saveBatch(list);
+ }
+ }
+
+ /**
+ * 定时2分钟获取报警数据
+ */
+ @Scheduled(cron = "0 */2 * * * ?")
+ @RequestMapping("getGpsLocateAlarm")
+ public void getGpsLocateAlarm() {
+ List projectList = projectService.list(Wrappers.lambdaQuery().ne(Project::getGpsLocateUser, "").ne(Project::getGpsLocatePassword, ""));
+ if (CollUtil.isNotEmpty(projectList)) {
+ log.info("定时2分钟获取人员定位标签报警数据任务开始");
+ List list = new ArrayList<>();
+ for (Project project : projectList) {
+ String loginUrl = "http://openapi.18gps.net/GetDataService.aspx?method=SignApi&w=UserLogin&userName=" + project.getGpsLocateUser() + "&password=" + project.getGpsLocatePassword() + "";
+ String loginInfo = HttpRequest.get(loginUrl)
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+ JSONObject loginObj = JSON.parseObject(loginInfo);
+ if (loginObj == null || !loginObj.getString("errorCode").equals("200")) {
+ continue;
+ }
+ String mds = loginObj.getJSONObject("data").getString("mds");
+ List devList = safetyHatDevService.list(new LambdaQueryWrapper()
+ .eq(SafetyHatDev::getProjectSn, project.getProjectSn()));
+ for (SafetyHatDev dev : devList) {
+ SafetyHatAlarm lastAlarm = safetyHatAlarmService.getOne(new LambdaQueryWrapper()
+ .eq(SafetyHatAlarm::getDevSn, dev.getDevSn()).orderByDesc(SafetyHatAlarm::getAlarmTime).last("limit 1"));
+ Long start;
+ if (lastAlarm != null) {
+ start = lastAlarm.getAlarmTime().getTime();
+ } else {
+ start = DateUtil.offsetHour(new Date(), -1).getTime();
+ }
+ //获取历史报警
+ String url = StrUtil.format("http://openapi.18gps.net/GetDataService.aspx?method=QueryApi&w=AlarmNearer&mds={}&nearerTime={}&mapType=GAODE",
+ mds, start);
+ String rs = HttpRequest.get(url)
+ .timeout(20000)//超时,毫秒
+ .execute().body();
+ JSONObject rsJo = JSON.parseObject(rs);
+ if (rsJo.getString("errorCode").equals("200")) {
+ JSONArray dataJa = rsJo.getJSONObject("data").getJSONArray("rows");
+ if (CollUtil.isEmpty(dataJa)) {
+ continue;
+ }
+ for (int i = 0; i < dataJa.size(); i++) {
+ JSONObject dataJo = dataJa.getJSONObject(i);
+ Double xPoint = dataJo.getDouble("lat");
+ Double yPoint = dataJo.getDouble("lon");
+ SafetyHatAlarm alarm = new SafetyHatAlarm();
+ alarm.setWorkerInfoId(dev.getWorkerInfoId());
+ alarm.setDevSn(dev.getDevSn());
+ alarm.setAlarmTime(new Date(dataJo.getLong("alarmime")));
+ alarm.setProjectSn(dev.getProjectSn());
+ alarm.setAlarmType(dataJo.getInteger("alarmType"));
+ alarm.setLatitude(xPoint);
+ alarm.setLongitude(yPoint);
+ alarm.setFenceId(dev.getFenceId());
+ alarm.setType(dev.getType());
+ alarm.setWorkerInfoName(dev.getWorkerInfoName());
+ list.add(alarm);
+ }
+ } else {
+ log.error("定时2分钟获取定位标签报警数据任务失败:devSn:{}", dev.getDevSn());
+ }
+ }
+ }
+ safetyHatAlarmService.saveBatch(list);
+ }
+ }
+}