screen-job/src/main/java/com/moral/api/controller/PubController.java
@@ -57,6 +57,9 @@ @Autowired private ManageCoordinateDetailService manageCoordinateDetailService; @Autowired private HistorySecondCruiserService historySecondCruiserService; private final EmailSpringUtil emailSpringUtil; private final CityWeatherForecastService cityWeatherForecastService; @@ -163,6 +166,15 @@ return new ResultMessage(); } @GetMapping("secondCruiserSort") @ApiOperation(value = "走航车排名", notes = "走航车排名") public ResultMessage secondCruiserSort() { String startTime ="2024-06-06 00:07:01"; String endTime ="2024-06-06 23:07:01"; historySecondCruiserService.sort(startTime,endTime); return new ResultMessage(); } @GetMapping("insertCoordinateDetail") @ApiOperation(value = "路段录入", notes = "路段录入") public ResultMessage insertCoordinateDetail() { screen-job/src/main/java/com/moral/api/entity/DustldDTO.java
New file @@ -0,0 +1,24 @@ package com.moral.api.entity; import lombok.Data; /** * Description //todo * * @author swb * @ClassName DustldDTO * @date 2024.06.25 14:25 */ @Data public class DustldDTO { private String name; //纬度 private String flyLat; //经度 private String flyLon; //尘负荷 private Double data; } screen-job/src/main/java/com/moral/api/entity/HistorySecondCruiser.java
New file @@ -0,0 +1,55 @@ package com.moral.api.entity; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.extension.activerecord.Model; /** * Description //todo * * @author swb * @ClassName HistorySecondCruiser * @date 2024.06.25 14:33 */ @Data @EqualsAndHashCode(callSuper = false) public class HistorySecondCruiser extends Model<HistorySecondCruiser> { private static final long serialVersionUID = 1L; /** * 设备mac */ private String mac; /** * 数据时间 */ private Date time; /** * 数据 */ private String value; /** * 此数据所属组织id */ private Integer organizationId; /** * 数据批次 */ private Date batch; @Override protected Serializable pkVal() { return null; } } screen-job/src/main/java/com/moral/api/entity/SecondCruiserSort.java
New file @@ -0,0 +1,48 @@ package com.moral.api.entity; import lombok.Data; import lombok.EqualsAndHashCode; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.moral.util.DateUtils; /** * Description //todo * * @author swb * @ClassName SecondCruiserSort * @date 2024.06.25 15:29 */ @Data @EqualsAndHashCode(callSuper = false) public class SecondCruiserSort extends Model<SecondCruiserSort> { /** * 路段名称 */ private String road; /** * 数据 */ private Double value; /** * mac号 */ private String mac; /** * 组织Id */ private Integer organizationId; /** * 时间 */ private String time; public SecondCruiserSort() { this.time =DateUtils.getDateStringOfDay(-1,"yyyy-MM-dd 00:00:00"); // 构造函数中设置默认值 } } screen-job/src/main/java/com/moral/api/entity/SysDictData.java
New file @@ -0,0 +1,65 @@ package com.moral.api.entity; import lombok.Data; import lombok.EqualsAndHashCode; 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.extension.activerecord.Model; /** * Description //todo * * @author swb * @ClassName SysDictData * @date 2024.06.25 14:01 */ @Data @EqualsAndHashCode(callSuper = false) public class SysDictData extends Model<SysDictData> { private static final long serialVersionUID = 1L; /** * 序号 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 数据类型Id */ private Integer dictTypeId; /** * 数据编码 */ @TableField("dataKey") private String dataKey; /** * 数据值 */ @TableField("dataValue") private String dataValue; /** * 创建时间 */ private Date createTime; /** * 更新时间 */ private Date updateTime; /** * 是否删除 */ private String isDelete; } screen-job/src/main/java/com/moral/api/entity/SysDictType.java
New file @@ -0,0 +1,63 @@ package com.moral.api.entity; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.extension.activerecord.Model; /** * Description //todo * * @author swb * @ClassName SysDictType * @date 2024.06.25 14:05 */ @Data @EqualsAndHashCode(callSuper = false) public class SysDictType extends Model<SysDictType> { private static final long serialVersionUID = 1L; /** * 序号 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 类型 */ private String name; /** * 描述 */ private String desc; /** * 系统内置 无法更改 */ private Integer system; /** * 创建时间 */ private Date createTime; /** * 更新时间 */ private Date updateTime; /** * 是否删除 */ private String isDelete; } screen-job/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
New file @@ -0,0 +1,14 @@ package com.moral.api.mapper; import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moral.api.entity.HistorySecondCruiser; public interface HistorySecondCruiserMapper extends BaseMapper<HistorySecondCruiser> { List<Map<String,Object>> getDusts(Map<String,Object> params); List<HistorySecondCruiser> getResult(String startTime,String endTime); } screen-job/src/main/java/com/moral/api/mapper/ManageCoordinateDetailMapper.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moral.api.entity.CruiserDTO; import com.moral.api.entity.DustldDTO; import com.moral.api.entity.ManageCoordinate; import com.moral.api.entity.ManageCoordinateDetail; @@ -13,4 +14,6 @@ List<ManageCoordinate> selectCoordinate(); List<CruiserDTO> getCruiserInfo(Map<String,Object> params); List<DustldDTO> CompareTo(Integer orgId); } screen-job/src/main/java/com/moral/api/mapper/OrganizationMapper.java
@@ -1,5 +1,9 @@ package com.moral.api.mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import com.moral.api.entity.Organization; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -13,4 +17,6 @@ */ public interface OrganizationMapper extends BaseMapper<Organization> { List<Integer> orgIdSpecialDevList(@Param("organizationId") Integer organizationId, @Param("mac") String mac); } screen-job/src/main/java/com/moral/api/mapper/SecondCruiserSortMapper.java
New file @@ -0,0 +1,11 @@ package com.moral.api.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moral.api.entity.SecondCruiserSort; public interface SecondCruiserSortMapper extends BaseMapper<SecondCruiserSort> { void insertAll(List<SecondCruiserSort> list); } screen-job/src/main/java/com/moral/api/mapper/SysDictTypeMapper.java
New file @@ -0,0 +1,14 @@ package com.moral.api.mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.moral.api.entity.SysDictData; import com.moral.api.entity.SysDictType; public interface SysDictTypeMapper extends BaseMapper<SysDictType> { List<SysDictData> selectCodeList(@Param("code") String code, @Param("id") String id); } screen-job/src/main/java/com/moral/api/service/HistorySecondCruiserService.java
New file @@ -0,0 +1,18 @@ package com.moral.api.service; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.entity.HistorySecondCruiser; /** * <p> * 走航车秒数据表 服务类 * </p> * * @author moral * @since 2021-09-13 */ public interface HistorySecondCruiserService extends IService<HistorySecondCruiser> { void sort(String startTime,String endTime); } screen-job/src/main/java/com/moral/api/service/SecondCruiserSortService.java
New file @@ -0,0 +1,7 @@ package com.moral.api.service; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.entity.SecondCruiserSort; public interface SecondCruiserSortService extends IService<SecondCruiserSort> { } screen-job/src/main/java/com/moral/api/service/SysDictTypeService.java
New file @@ -0,0 +1,10 @@ package com.moral.api.service; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.entity.SysDictData; import com.moral.api.entity.SysDictType; public interface SysDictTypeService extends IService<SysDictType> { SysDictData listOne(String code, String dataKey); } screen-job/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
New file @@ -0,0 +1,150 @@ package com.moral.api.service.impl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.entity.DustldDTO; import com.moral.api.entity.HistorySecondCruiser; import com.moral.api.entity.SecondCruiserSort; import com.moral.api.entity.SysDictData; import com.moral.api.mapper.HistorySecondCruiserMapper; import com.moral.api.mapper.ManageCoordinateDetailMapper; import com.moral.api.mapper.OrganizationMapper; import com.moral.api.mapper.SecondCruiserSortMapper; import com.moral.api.service.HistorySecondCruiserService; import com.moral.api.service.SysDictTypeService; import com.moral.util.DateUtils; /** * Description //todo * * @author swb * @ClassName HistorySecondCruiserServiceImpl * @date 2024.06.25 14:41 */ @Service @Slf4j public class HistorySecondCruiserServiceImpl extends ServiceImpl<HistorySecondCruiserMapper, HistorySecondCruiser> implements HistorySecondCruiserService { @Autowired private SysDictTypeService sysDictTypeService; @Autowired private HistorySecondCruiserMapper historySecondCruiserMapper; @Autowired private OrganizationMapper organizationMapper; @Autowired private ManageCoordinateDetailMapper manageCoordinateDetailMapper; @Autowired private SecondCruiserSortMapper secondCruiserSortMapper; @Override @Transactional public void sort(String startTime, String endTime) { if (ObjectUtils.isEmpty(startTime)&&ObjectUtils.isEmpty(endTime)){ //当前时间的前一天 startTime = DateUtils.getDateStringOfDay(-1, DateUtils.yyyy_MM_dd_HH_mm_ss_EN); //获取当前时间 endTime = DateUtils.getCurDate(DateUtils.yyyy_MM_dd_HH_mm_ss_EN); } SysDictData list = sysDictTypeService.listOne("ZHC", "dustld"); List<HistorySecondCruiser> result = historySecondCruiserMapper.getResult(startTime, endTime); // ArrayList<SecondCruiserSort> list1 = new ArrayList<>(); if (!ObjectUtils.isEmpty(result)){ for (HistorySecondCruiser historySecondCruiser : result) { String mac = historySecondCruiser.getMac(); Integer organizationId = historySecondCruiser.getOrganizationId(); List<Integer> orgList = organizationMapper.orgIdSpecialDevList(organizationId, mac); if(CollectionUtils.isEmpty(orgList)){ return; } HashMap<String, Object> params = new HashMap<>(); params.put("mac",mac); params.put("startTime",startTime); params.put("endTime",endTime); List<Map<String, Object>> dusts = historySecondCruiserMapper.getDusts(params); Map<String, List<DustldDTO>> collect = manageCoordinateDetailMapper.CompareTo(orgList.get(0)).stream().collect(Collectors.groupingBy(o -> o.getName())); if (ObjectUtils.isEmpty(dusts) || ObjectUtils.isEmpty(collect)){ return; } Set<String> strings = collect.keySet(); for (String string : strings) { SecondCruiserSort secondCruiserSort = new SecondCruiserSort(); ArrayList<Double> doubleArrayList = new ArrayList<>(); List<DustldDTO> dustldDTOS = collect.get(string); for (DustldDTO dustldDTO : dustldDTOS) { String flyLat = dustldDTO.getFlyLat(); String flyLon = dustldDTO.getFlyLon(); if (flyLon==null && flyLat==null){ continue; } double latDouble1 = Double.parseDouble(flyLat); double lonDouble1 = Double.parseDouble(flyLon); for (Map<String, Object> dust : dusts) { String flyLat1 = Objects.nonNull(dust.get("flyLat")) ? dust.get("flyLat").toString() :"0"; String flyLon1 = Objects.nonNull(dust.get("flyLon")) ? dust.get("flyLon").toString() :"0"; double latDouble = Double.parseDouble(flyLat1); double lonDouble = Double.parseDouble(flyLon1); // String flyLon1 = dust.get("flyLon").toString(); if (latDouble1==latDouble && lonDouble1==lonDouble){ Double dustld = Objects.nonNull(dust.get("dustld"))?Double.parseDouble(dust.get("dustld").toString()):0d; if(list.getDataValue().contains(",")){ List<String> resultStr = Arrays.asList(list.getDataValue().split(",")); if(resultStr.size() % 2 ==0){ dustld = numAvg(resultStr,BigDecimal.valueOf(dustld)).doubleValue(); } }else { BigDecimal dataValue = Objects.nonNull(list.getDataValue())?BigDecimal.valueOf(Double.parseDouble(list.getDataValue())):BigDecimal.ZERO; dustld = BigDecimal.valueOf(dustld).add(dataValue).doubleValue(); } doubleArrayList.add(dustld); break; } } } if (ObjectUtils.isEmpty(doubleArrayList)){ continue; } Double ListAva = doubleArrayList.stream() .collect(Collectors.averagingDouble(Double::doubleValue)); double rsAvg = new BigDecimal(ListAva/1000).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); secondCruiserSort.setRoad(string); secondCruiserSort.setValue(rsAvg); secondCruiserSort.setMac(mac); secondCruiserSort.setOrganizationId(organizationId); list1.add(secondCruiserSort); } } } secondCruiserSortMapper.insertAll(list1); } private BigDecimal numAvg(List<String> list , BigDecimal num){ int nums = 1; for (int i=0;i<list.size();i=i+2){ if(num.compareTo(BigDecimal.valueOf(Double.parseDouble(list.get(i))))>= 0 ){ return num.add(BigDecimal.valueOf(Double.parseDouble(list.get(i+1)))); } nums+=2; } return num; } } screen-job/src/main/java/com/moral/api/service/impl/SecondCruiserSortServiceImpl.java
New file @@ -0,0 +1,19 @@ package com.moral.api.service.impl; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.entity.SecondCruiserSort; import com.moral.api.mapper.SecondCruiserSortMapper; import com.moral.api.service.SecondCruiserSortService; /** * Description //todo * * @author swb * @ClassName SecondCruiserSortServiceImpl * @date 2024.06.26 14:29 */ @Service public class SecondCruiserSortServiceImpl extends ServiceImpl<SecondCruiserSortMapper, SecondCruiserSort> implements SecondCruiserSortService { } screen-job/src/main/java/com/moral/api/service/impl/SysDictTypeServiceImpl.java
New file @@ -0,0 +1,36 @@ package com.moral.api.service.impl; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; import java.util.List; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.entity.SysDictData; import com.moral.api.entity.SysDictType; import com.moral.api.mapper.SysDictTypeMapper; import com.moral.api.service.SysDictTypeService; /** * Description //todo * * @author swb * @ClassName SysDictTypeServiceImpl * @date 2024.06.25 14:10 */ @Service public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements SysDictTypeService { @Override public SysDictData listOne(String code, String dataKey) { List<SysDictData> list = this.baseMapper.selectCodeList(code,dataKey); SysDictData sysDictData = new SysDictData(); if (CollectionUtils.isNotEmpty(list)) { return list.get(0); } sysDictData.setDataValue("0"); return sysDictData; } } screen-job/src/main/java/com/moral/api/task/HistoryTableInsertTask.java
@@ -7,8 +7,10 @@ import com.moral.api.service.HistoryFiveMinutelyService; import com.moral.api.service.HistoryHourlyService; import com.moral.api.service.HistoryMonthlyService; import com.moral.api.service.HistorySecondCruiserService; import com.moral.api.service.HistoryWeeklyService; import com.moral.api.service.ManageCoordinateDetailService; import com.moral.api.service.impl.HistorySecondCruiserServiceImpl; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; @@ -37,6 +39,10 @@ @Autowired private ManageCoordinateDetailService manageCoordinateDetailService; @Autowired private HistorySecondCruiserService historySecondCruiserService; //5分钟数据统计 @XxlJob("insertHistoryFiveMinutely") @@ -165,4 +171,20 @@ } /** * 走航车路段排名 * @return */ @XxlJob("secondCruiserSort") public ReturnT secondCruiserSort(){ try { historySecondCruiserService.sort(null,null); } catch (Exception e) { XxlJobHelper.log(e.getMessage()); return new ReturnT(ReturnT.FAIL_CODE, e.getMessage()); } return ReturnT.SUCCESS; } } screen-job/src/main/resources/mapper/HistorySecondCruiserMapper.xml
New file @@ -0,0 +1,33 @@ <?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.moral.api.mapper.HistorySecondCruiserMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.HistorySecondCruiser"> <result column="mac" property="mac"/> <result column="time" property="time"/> <result column="value" property="value"/> <result column="organization_id" property="organizationId"/> <result column="batch" property="batch"/> </resultMap> <select id="getDusts" resultType="java.util.Map"> SELECT value ->>'$.flylat' as flyLat,value ->>'$.flylon' as flyLon,value ->>'$.dustld' as dustld, `time` FROM `history_second_cruiser` WHERE mac = #{mac} AND `time` <![CDATA[>=]]> #{startTime} AND `time` <![CDATA[<=]]> #{endTime} </select> <select id="getResult" resultType="com.moral.api.entity.HistorySecondCruiser"> SELECT distinct mac,organization_id FROM `history_second_cruiser` WHERE `time` <![CDATA[>=]]> #{startTime} AND `time` <![CDATA[<=]]> #{endTime} </select> </mapper> screen-job/src/main/resources/mapper/ManageCoordinateDetailMapper.xml
@@ -28,4 +28,17 @@ order by time </select> <select id="CompareTo" resultType="com.moral.api.entity.DustldDTO"> SELECT mc.start_point as name , md.longitude as flyLon, md.latitude as flyLat FROM manage_coordinate AS mc LEFT JOIN manage_coordinate_detail AS md ON mc.coordinate_id = md.coordinate_id WHERE mc.is_del =0 and mc.organization_id=#{orgId} </select> </mapper> screen-job/src/main/resources/mapper/OrganizationMapper.xml
@@ -26,4 +26,23 @@ <result column="is_delete" property="isDelete" /> </resultMap> <select id="orgIdSpecialDevList" resultType="java.lang.Integer"> select organization_id from special_device where organization_id in ( SELECT id FROM ( SELECT id, parent_id, name FROM organization WHERE id = #{organizationId} UNION ALL SELECT i.id, i.parent_id, i.name FROM organization i INNER JOIN ( SELECT * FROM ( SELECT id, parent_id, name FROM organization WHERE id = #{organizationId} UNION ALL SELECT id, parent_id, name FROM organization WHERE parent_id = #{organizationId} ) t1 ) t2 ON i.parent_id = t2.id where i.is_delete = 0 ) t3 ) and mac = #{mac} and is_delete = 0 </select> </mapper> screen-job/src/main/resources/mapper/SecondCruiserSortMapper.xml
New file @@ -0,0 +1,22 @@ <?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.moral.api.mapper.SecondCruiserSortMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.SecondCruiserSort"> <result column="road" property="road"/> <result column="time" property="time"/> <result column="value" property="value"/> <result column="mac" property="mac"/> <result column="organization_id" property="organizationId"/> </resultMap> <insert id="insertAll"> INSERT INTO second_cruiser_sort (road,time,value,mac,organization_id) VALUES <foreach collection="list" item="item" separator=","> (#{item.road},#{item.time},#{item.value},#{item.mac},#{item.organizationId}) </foreach> </insert> </mapper> screen-job/src/main/resources/mapper/SysDictTypeMapper.xml
New file @@ -0,0 +1,23 @@ <?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.moral.api.mapper.SysDictTypeMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.SysDictType"> <id column="id" property="id" /> <result column="name" property="name" /> <result column="desc" property="desc" /> <result column="system" property="system" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="is_delete" property="isDelete" /> </resultMap> <select id="selectCodeList" resultType="com.moral.api.entity.SysDictData"> select t1.id,t1.dict_type_id,t1.dataKey,t1.dataValue from sys_dict_type t left join sys_dict_data t1 on t1.dict_type_id = t.id where t.is_delete = 0 and t.name = #{code} and t1.dataKey = #{id} and t1.is_delete = 0 order by t1.create_time desc </select> </mapper>