外部添加机械设备定位-实时和报警数据信息

This commit is contained in:
guo 2024-03-19 17:36:28 +08:00
parent 7303ab9ec7
commit 9e6b3b3963
12 changed files with 320 additions and 37 deletions

View File

@ -725,6 +725,4 @@ public class ParamEnum {
this.desc = desc;
}
}
}

View File

@ -1,27 +1,23 @@
package com.zhgd.xmgl.modules.mechanicalequipmentposition.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiImplicitParams;
import java.util.HashMap;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zhgd.jeecg.common.api.vo.Result;
import org.apache.commons.collections.MapUtils;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionData;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.service.IMechanicalEquipmentPositionDataService;
import org.simpleframework.xml.core.Validate;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.simpleframework.xml.core.Validate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.HashMap;
import java.util.List;
/**
@ -125,4 +121,19 @@ public class MechanicalEquipmentPositionDataController {
return result;
}
@ApiOperation(value = "外部添加机械设备定位-实时和报警数据信息", notes = "外部添加机械设备定位-实时和报警数据信息", httpMethod = "POST")
@ApiImplicitParams({
@ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"),
})
@PostMapping(value = "/addData")
public Result addData(@ApiIgnore @RequestBody HashMap<String, Object> paramMap) {
log.info("外部添加机械设备定位-实时和报警数据信息:{}", JSON.toJSONString(paramMap));
try {
mechanicalEquipmentPositionDataService.addData(paramMap);
} catch (Exception e) {
return Result.ok(e.getMessage());
}
return Result.ok();
}
}

View File

@ -4,6 +4,7 @@ import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

View File

@ -69,7 +69,7 @@ public class MechanicalEquipmentPositionData implements Serializable {
* 工作状态
*/
@Excel(name = "工作状态", width = 15)
@ApiModelProperty(value = "工作状态")
@ApiModelProperty(value = "工作状态1ACC开(工作状态)2ACC关(怠速状态)")
private java.lang.Integer workStatus;
/**
* 设备电量

View File

@ -0,0 +1,55 @@
package com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class PositionAddData {
/*
code=200的情况
{"Altitude":0,"Code":200,"Direction":121,"Speed":0,"Time":"2024-03-10 04:52:19","deviceid":61136981730,"devicename":61136981730,"lat":"22.734326","lon":"114.243999","stralarm":"拆除报警","strstatus":"ACC关","supplyvoltage":"0.00","voltagepercent":22}
Speed速度
Time当前时间
deviceid设备id
devicename设备名称
lon经度
lat纬度
stralarm拆除报警信息
strstatus工作状态ACC开为工作状态ACC关为怠速状态
supplyvoltage设备电压根据电压值计算电量百分比3.7-4.20%-100%
voltagepercent设备电量
code=704解析平台重启后回补数据在外面封装了一层里面内容一样
{"Code":704,"Items":[{"Altitude":0,"Code":200,"Direction":121,"Speed":0,"Time":"2024-03-10 04:49:19","deviceid":61136981730,"devicename":61136981730,"lat":"22.734326","lon":"114.243999","stralarm":"拆除报警","strstatus":"ACC关","supplyvoltage":"3.70","voltagepercent":0}],"Type":1}
*/
@JsonProperty("Altitude")
private Long altitude;
@JsonProperty("Code")
private Long code;
@JsonProperty("Direction")
private Long direction;
@JsonProperty("Speed")
private Long speed;
@JsonProperty("Time")
private String time;
@JsonProperty("deviceid")
private Long deviceid;
@JsonProperty("devicename")
private Long devicename;
@JsonProperty("lat")
private String lat;
@JsonProperty("lon")
private String lon;
@JsonProperty("stralarm")
private String stralarm;
@JsonProperty("strstatus")
private String strstatus;
@JsonProperty("supplyvoltage")
private String supplyvoltage;
@JsonProperty("voltagepercent")
private Long voltagepercent;
}

View File

@ -24,4 +24,6 @@ public interface IMechanicalEquipmentPositionDataService extends IService<Mechan
void edit(MechanicalEquipmentPositionData mechanicalEquipmentPositionData);
void delete(String id);
void addData(HashMap<String, Object> paramMap);
}

View File

@ -1,23 +1,38 @@
package com.zhgd.xmgl.modules.mechanicalequipmentposition.service.impl;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionData;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionDataMapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.service.IMechanicalEquipmentPositionDataService;
import org.springframework.stereotype.Service;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
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.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zhgd.jeecg.common.system.query.QueryGenerator;
import com.zhgd.xmgl.util.PageUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.jeecg.common.system.query.QueryGenerator;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionAlarm;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionData;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionDev;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.vo.PositionAddData;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionAlarmMapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionDataMapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionDevMapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.service.IMechanicalEquipmentPositionDataService;
import com.zhgd.xmgl.util.PageUtil;
import com.zhgd.xmgl.util.RefUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import com.zhgd.xmgl.util.RefUtil;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Objects;
/**
* @Description: 机械设备定位-实时数据
@ -27,9 +42,14 @@ import org.springframework.beans.factory.annotation.Autowired;
*/
@Service
@Transactional(rollbackFor = Exception.class)
@Slf4j
public class MechanicalEquipmentPositionDataServiceImpl extends ServiceImpl<MechanicalEquipmentPositionDataMapper, MechanicalEquipmentPositionData> implements IMechanicalEquipmentPositionDataService {
@Autowired
private MechanicalEquipmentPositionDataMapper mechanicalEquipmentPositionDataMapper;
@Autowired
private MechanicalEquipmentPositionDevMapper mechanicalEquipmentPositionDevMapper;
@Autowired
private MechanicalEquipmentPositionAlarmMapper alarmMapper;
@Override
public IPage<MechanicalEquipmentPositionData> queryPageList(HashMap<String, Object> paramMap) {
@ -77,5 +97,82 @@ public class MechanicalEquipmentPositionDataServiceImpl extends ServiceImpl<Mech
baseMapper.deleteById(id);
}
@Override
@Transactional(noRollbackFor = OpenAlertException.class)
public void addData(HashMap<String, Object> paramMap) {
Integer code = MapUtils.getInteger(paramMap, "Code");
if (Objects.equals(code, 200)) {
PositionAddData data = JSONObject.parseObject(JSON.toJSONString(paramMap), PositionAddData.class);
insertData(data);
} else if (Objects.equals(code, 704)) {
//code=704解析平台重启后回补数据在外面封装了一层里面内容一样
JSONObject jo = JSON.parseObject(JSON.toJSONString(paramMap));
JSONArray jaItems = jo.getJSONArray("Items");
StringBuilder sb = new StringBuilder();
if (jaItems.size() != 0) {
for (int i = 0; i < jaItems.size(); i++) {
JSONObject joItem = jaItems.getJSONObject(i);
PositionAddData data = JSON.parseObject(joItem.toJSONString(), PositionAddData.class);
try {
insertData(data);
} catch (OpenAlertException e) {
sb.append(e.getMessage());
}
}
}
if (StrUtil.isNotBlank(sb.toString())) {
throw new OpenAlertException(sb.toString());
}
}
}
private void insertData(PositionAddData data) {
MechanicalEquipmentPositionDev dev = mechanicalEquipmentPositionDevMapper.selectOne(new LambdaQueryWrapper<MechanicalEquipmentPositionDev>()
.eq(MechanicalEquipmentPositionDev::getDevSn, data.getDeviceid()));
if (dev == null) {
log.error("设备编号不正确:{}", data.getDeviceid());
throw new OpenAlertException(Convert.toStr("设备编号不正确:" + data.getDeviceid()) + ",");
}
dev.setHeartbeatTime(new Date());
mechanicalEquipmentPositionDevMapper.updateById(dev);
MechanicalEquipmentPositionData positionData = new MechanicalEquipmentPositionData();
positionData.setDevSn(dev.getDevSn());
positionData.setLatitude(Convert.toDouble(data.getLat()));
positionData.setLongitude(Convert.toDouble(data.getLon()));
positionData.setUploadTime(DateUtil.parseDateTime(data.getTime()));
positionData.setSpeed(Convert.toDouble(data.getSpeed()));
positionData.setWorkStatus(getWorkStatus(data.getStrstatus()));
positionData.setEquipmentPower(Convert.toDouble(data.getVoltagepercent()));
positionData.setEquipmentVoltage(Convert.toDouble(data.getSupplyvoltage()));
positionData.setProjectSn(dev.getProjectSn());
baseMapper.insert(positionData);
if (StrUtil.isNotBlank(data.getStralarm())) {
//插入报警
MechanicalEquipmentPositionAlarm alarm = new MechanicalEquipmentPositionAlarm();
alarm.setDevSn(dev.getDevSn());
alarm.setEquipmentName(dev.getEquipmentName());
alarm.setAlarmTime(positionData.getUploadTime());
alarm.setAlarmInfo(data.getStralarm());
alarm.setProjectSn(dev.getProjectSn());
alarmMapper.insert(alarm);
}
}
private Integer getWorkStatus(String strstatus) {
if (StrUtil.isBlank(strstatus)) {
return null;
}
switch (strstatus) {
case "ACC开":
return 1;
case "ACC关":
return 2;
}
return null;
}
}

View File

@ -13,14 +13,12 @@
<select id="countSafetyHatDev"
resultType="com.zhgd.xmgl.modules.vehicleposition.entity.vo.CountVehiclePositionDevVo">
select t.*,t.count - t.onlineCount as offlineCount from (
select count(*) count,
IFNULL(sum(IFNULL(((case
when round((UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(heartbeat_time)) / 60) &lt;= 30
then 1
else 0 end)), 0)),0) onlineCount,
IFNULL(sum(IFNULL(((case
when round((UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(heartbeat_time)) / 60) > 30 then 1
else 0 end)), 0)),0) offlineCount
else 0 end)), 0)),0) onlineCount
from safety_hat_dev
where 1 = 1
<if test="devSn != null and devSn != ''">
@ -29,5 +27,6 @@
<if test="projectSn != null and projectSn != ''">
and project_sn = #{projectSn}
</if>
)t
</select>
</mapper>

View File

@ -1,7 +1,6 @@
package com.zhgd.xmgl.modules.safetyhat.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -13,7 +12,6 @@ import com.zhgd.jeecg.common.system.query.QueryGenerator;
import com.zhgd.xmgl.modules.safetyhat.entity.SafetyHatDev;
import com.zhgd.xmgl.modules.safetyhat.mapper.SafetyHatDevMapper;
import com.zhgd.xmgl.modules.safetyhat.service.ISafetyHatDevService;
import com.zhgd.xmgl.modules.vehicleposition.entity.VehiclePositionDev;
import com.zhgd.xmgl.modules.vehicleposition.entity.vo.CountVehiclePositionDevVo;
import com.zhgd.xmgl.util.PageUtil;
import com.zhgd.xmgl.util.RefUtil;
@ -63,7 +61,8 @@ public class SafetyHatDevServiceImpl extends ServiceImpl<SafetyHatDevMapper, Saf
if (online == 1) {
queryWrapper.ge(alias + RefUtil.fieldNameUlc(SafetyHatDev::getHeartbeatTime), dateTime);
} else {
queryWrapper.lt(alias + RefUtil.fieldNameUlc(SafetyHatDev::getHeartbeatTime), dateTime);
queryWrapper.and(qw -> qw.lt(alias + RefUtil.fieldNameUlc(SafetyHatDev::getHeartbeatTime), dateTime).or()
.isNull(alias + RefUtil.fieldNameUlc(SafetyHatDev::getHeartbeatTime)));
}
}
return queryWrapper;

View File

@ -332,6 +332,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/xmgl/safetyHatData/add").permitAll()
.antMatchers("/xmgl/safetyHatDayRecord/saveData").permitAll()
.antMatchers("/xmgl/safetyHatAlarm/add").permitAll()
.antMatchers("/xmgl/mechanicalEquipmentPositionData/addData").permitAll()
.antMatchers(HttpMethod.OPTIONS, "/**").anonymous()
.anyRequest().authenticated() // 剩下所有的验证都需要验证.
.and()

View File

@ -0,0 +1,86 @@
package com.zhgd.xmgl.task;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionData;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionDayRecord;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.entity.MechanicalEquipmentPositionDev;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionDataMapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionDayRecordMapper;
import com.zhgd.xmgl.modules.mechanicalequipmentposition.mapper.MechanicalEquipmentPositionDevMapper;
import com.zhgd.xmgl.modules.project.service.IProjectService;
import com.zhgd.xmgl.util.TiandituUtil;
import lombok.extern.slf4j.Slf4j;
import net.javacrumbs.shedlock.core.SchedulerLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.stream.Collectors;
/**
* 机械设备定位task
*/
@Slf4j
@RestController
@RequestMapping("xmgl/task")
public class MechanicalEquipmentPositionDayRecordTask {
@Autowired
IProjectService projectService;
@Autowired
MechanicalEquipmentPositionDayRecordMapper mechanicalEquipmentPositionDayRecordMapper;
@Autowired
MechanicalEquipmentPositionDataMapper mechanicalEquipmentPositionDataMapper;
@Autowired
MechanicalEquipmentPositionDevMapper mechanicalEquipmentPositionDevMapper;
/**
* 每天计算一次轨迹距离
*/
@SchedulerLock(name = "getHelmet", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 7)
@Scheduled(cron = "0 0 2 * * ?")
@RequestMapping("")
public void getHelmet() {
log.info("每天计算一次昨日的轨迹距离,开始任务");
List<MechanicalEquipmentPositionDev> devList = mechanicalEquipmentPositionDevMapper.selectList(null);
for (MechanicalEquipmentPositionDev dev : devList) {
DateTime yesterday = DateUtil.offsetDay(DateUtil.date(), -1);
List<MechanicalEquipmentPositionData> dataList = mechanicalEquipmentPositionDataMapper.selectList(new LambdaQueryWrapper<MechanicalEquipmentPositionData>()
.eq(MechanicalEquipmentPositionData::getDevSn, dev.getDevSn())
.ge(MechanicalEquipmentPositionData::getUploadTime, DateUtil.formatDateTime(DateUtil.beginOfDay(yesterday)))
.le(MechanicalEquipmentPositionData::getUploadTime, DateUtil.formatDateTime(DateUtil.endOfDay(yesterday)))
);
MechanicalEquipmentPositionDayRecord dayRecord = new MechanicalEquipmentPositionDayRecord();
dayRecord.setDevSn(dev.getDevSn());
if (dataList.size() > 1) {
dayRecord.setTrackDistanceDay(TiandituUtil.getDistance(getPoint(dataList.get(0)), getPoint(dataList.get(dataList.size() - 1)), getMid(dataList), 0));
} else {
dayRecord.setTrackDistanceDay(0D);
}
dayRecord.setDay(DateUtil.formatDate(yesterday));
dayRecord.setProjectSn(dev.getProjectSn());
mechanicalEquipmentPositionDayRecordMapper.insert(dayRecord);
}
}
private String getMid(List<MechanicalEquipmentPositionData> dataList) {
List<MechanicalEquipmentPositionData> subList = dataList.subList(1, dataList.size() - 1);
StringBuilder sb = new StringBuilder();
for (MechanicalEquipmentPositionData data : subList) {
sb.append(getPoint(data));
sb.append(";");
}
List<String> pointList = subList.stream().map(data -> getPoint(data)).collect(Collectors.toList());
return StrUtil.join(";", pointList);
}
private String getPoint(MechanicalEquipmentPositionData mechanicalEquipmentPositionData) {
return mechanicalEquipmentPositionData.getLongitude() + "," + mechanicalEquipmentPositionData.getLatitude();
}
}

View File

@ -0,0 +1,34 @@
package com.zhgd.xmgl.util;
import cn.hutool.core.convert.Convert;
import cn.hutool.http.HttpUtil;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TiandituUtil {
static Pattern pattern = Pattern.compile("<distance>(.*)</distance>");
/**
* 查询轨迹距离
*
* @param orig string 起点经纬度 -180,-90,180,90
* @param dest string 终点经纬度 -180,-90,180,90
* @param mid 途径点经纬度字符串 途径点字符串格式116.35506,39.92277;116.35506,39.92277两个坐标之间以分号隔开坐标xy之间用逗号隔开(都是半角)
* @param style 导航路线类型 默认0 0最快路线1最短路线2避开高速3步行 0-3
* @return
*/
public static Double getDistance(String orig, String dest, String mid, Integer style) {
String key = "000c3ade82b69dee54ac334e750cfac0";
String url = "http://api.tianditu.gov.cn/drive?postStr={\"orig\":\"" + orig + "\",\"dest\":\"" + dest + "\",\"mid\":\"" + mid + "\",\"style\":\"" + style + "\"}&type=search&tk=" + key;
String rs = HttpUtil.get(url);
Matcher matcher = pattern.matcher(rs);
matcher.find();
return Convert.toDouble(matcher.group(0));
}
public static void main(String[] args) {
Double distance = getDistance("116.35506,39.92277", "116.40332,39.90025", "116.35506,39.92277;116.35506,39.92277", 0);
System.out.println(distance);
}
}