ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/task/PlatformTask.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java
New file @@ -0,0 +1,40 @@ package com.ycl.platform.domain.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.time.LocalDate; import java.util.Date; import com.ycl.platform.base.AbsEntity; import lombok.Data; /** * 平台在线率 * * @author xp * @since 2024-08-03 */ @Data @TableName("t_platform_online") public class PlatformOnline extends AbsEntity { private static final long serialVersionUID = 1L; @TableField("platform_name") /** 平台名称 */ private String platformName; @TableField("platform_ip") /** 平台ip/域名 */ private String platformIp; @TableField("create_date") /** 统计的日期 */ private Date createDate; @TableField("today_outline_sed") /** 今日离线时长/秒 */ private Integer todayOutlineSed; } ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java
New file @@ -0,0 +1,17 @@ package com.ycl.platform.domain.query; import com.ycl.platform.base.AbsQuery; import io.swagger.annotations.ApiModel; import lombok.Data; /** * 平台在线率查询 * * @author xp * @since 2024-08-03 */ @Data @ApiModel(value = "PlatformOnline查询", description = "平台在线率查询") public class PlatformOnlineQuery extends AbsQuery { } ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java
New file @@ -0,0 +1,48 @@ package com.ycl.platform.domain.vo; import com.ycl.platform.base.AbsVo; import com.ycl.platform.domain.entity.PlatformOnline; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import lombok.Data; import java.util.Date; /** * 平台在线率展示 * * @author xp * @since 2024-08-03 */ @Data public class PlatformOnlineVO extends AbsVo { /** 平台名称 */ private String platformName; /** 平台ip/域名 */ private String platformIp; /** 统计的日期 */ private Date createDate; /** 今日离线时长/秒 */ private Integer todayOutlineSed; /** 当前是否在线 */ private Boolean currentOnline; /** */ private Date updateTime; /** */ private Date createTime; public static PlatformOnlineVO getVoByEntity(@NonNull PlatformOnline entity, PlatformOnlineVO vo) { if(vo == null) { vo = new PlatformOnlineVO(); } BeanUtils.copyProperties(entity, vo); return vo; } } ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java
@@ -1,9 +1,13 @@ package com.ycl.platform.controller; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.query.PlatformOnlineQuery; import com.ycl.platform.service.DataCenterService; import com.ycl.platform.service.PlatformOnlineService; import com.ycl.system.Result; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,6 +24,20 @@ public class DataCenterController { private final DataCenterService dataCenterService; private final PlatformOnlineService platformOnlineService; /** * 平台在线率 * * @param query * @return */ @GetMapping("/platformOnlineRate") @ApiOperation(value = "平台在线率", notes = "平台在线率") @PreAuthorize("hasAuthority('platformOnline:page')") public Result platformOnlineRate(DataCenterQuery query) { return platformOnlineService.page(query); } /** * 视频:点位在线率 ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java
New file @@ -0,0 +1,34 @@ package com.ycl.platform.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.platform.domain.entity.PlatformOnline; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.query.PlatformOnlineQuery; import com.ycl.platform.domain.vo.PlatformOnlineVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * 平台在线率 Mapper 接口 * * @author xp * @since 2024-08-03 */ @Mapper public interface PlatformOnlineMapper extends BaseMapper<PlatformOnline> { /** * id查找平台在线率 * @param id * @return */ PlatformOnlineVO getById(Integer id); /** * 分页 */ IPage getPage(IPage page, @Param("query") DataCenterQuery query); } ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java
New file @@ -0,0 +1,32 @@ package com.ycl.platform.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.platform.domain.entity.PlatformOnline; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.query.PlatformOnlineQuery; import com.ycl.system.Result; import java.util.List; /** * 平台在线率 服务类 * * @author xp * @since 2024-08-03 */ public interface PlatformOnlineService extends IService<PlatformOnline> { /** * 批量删除 * @param ids * @return */ Result remove(List<String> ids); /** * 分页查询 * @param query * @return */ Result page(DataCenterQuery query); } ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java
New file @@ -0,0 +1,53 @@ package com.ycl.platform.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.domain.entity.PlatformOnline; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.vo.PlatformOnlineVO; import com.ycl.platform.mapper.PlatformOnlineMapper; import com.ycl.platform.service.PlatformOnlineService; import com.ycl.system.Result; import com.ycl.system.page.PageUtil; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import java.util.List; /** * 平台在线率 服务实现类 * * @author xp * @since 2024-08-03 */ @Service @RequiredArgsConstructor public class PlatformOnlineServiceImpl extends ServiceImpl<PlatformOnlineMapper, PlatformOnline> implements PlatformOnlineService { private final PlatformOnlineMapper platformOnlineMapper; /** * 批量删除 * @param ids * @return */ @Override public Result remove(List<String> ids) { baseMapper.deleteBatchIds(ids); return Result.ok("删除成功"); } /** * 分页查询 * @param query * @return */ @Override public Result page(DataCenterQuery query) { Page<PlatformOnlineVO> page = new Page<>(query.getPageNum(), query.getPageSize()); baseMapper.getPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } } ycl-server/src/main/java/com/ycl/task/PlatformTask.java
New file @@ -0,0 +1,116 @@ package com.ycl.task; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.platform.domain.entity.PlatformOnline; import com.ycl.platform.service.PlatformOnlineService; import com.ycl.system.entity.SysDictData; import com.ycl.system.service.impl.SysDictTypeServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.io.IOException; import java.net.InetAddress; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 平台在线率定时任务 * * @author:xp * @date:2024/8/3 13:26 */ @Slf4j @RequiredArgsConstructor @Component("platformTask") public class PlatformTask { private final RedisTemplate redisTemplate; private final SysDictTypeServiceImpl dictTypeService; private final PlatformOnlineService platformOnlineService; /** * 该定时任务需要使用redis存储离线时长,并定期同步到mysql中 */ private static final String REDIS_KEY_PREFIX = "platform_online_"; private static final String DICT_TYPE = "platform_online"; private static final ExecutorService executorService = new ThreadPoolExecutor(8, 24, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadPoolExecutor.CallerRunsPolicy() ); /** * ping平台是否在线 * * @throws IOException */ public void ping() { List<SysDictData> platformList = dictTypeService.selectDictDataByType(DICT_TYPE); for (SysDictData platform : platformList) { executorService.submit(() -> { try { Boolean reachable = Boolean.FALSE; for (int tryTimes = 1; tryTimes < 3; tryTimes++) { // 三秒未ping通重试一次,如果不行才扣分 reachable = InetAddress.getByName(platform.getDictValue()).isReachable(3000); if (! reachable && tryTimes == 0) { continue; } if (! reachable) { // 如果ping不通,离线时长加5秒 redisTemplate.opsForValue().increment(REDIS_KEY_PREFIX + platform.getDictValue(), 5); log.warn(platform.getDictLabel() + "平台未ping通"); } } } catch (Exception e) { log.error("检查平台连通性时发生错误", e); } }); } } /** * 每小时将redis中的平台离线数据同步到mysql * */ public void synToMySQL() { List<SysDictData> platformList = dictTypeService.selectDictDataByType(DICT_TYPE); // 将java.util.Date转换为java.sql.Date java.sql.Date sqlDate = new java.sql.Date(new Date().getTime()); for (SysDictData platform : platformList) { Object outLineTime = redisTemplate.opsForValue().get(REDIS_KEY_PREFIX + platform.getDictValue()); Integer outlineTimeSed = Objects.isNull(outLineTime) ? 0 : (Integer) outLineTime; PlatformOnline one = new LambdaQueryChainWrapper<>(platformOnlineService.getBaseMapper()) .eq(PlatformOnline::getPlatformIp, platform.getDictValue()) .eq(PlatformOnline::getCreateDate, sqlDate) .one(); if (Objects.isNull(one)) { one = new PlatformOnline(); one.setPlatformIp(platform.getDictValue()); one.setPlatformName(platform.getDictLabel()); one.setCreateDate(sqlDate); one.setTodayOutlineSed(outlineTimeSed); } else { one.setTodayOutlineSed(one.getTodayOutlineSed() + outlineTimeSed); } one.setPlatformIp(platform.getDictValue()); one.setPlatformName(platform.getDictLabel()); one.setCreateDate(sqlDate); platformOnlineService.saveOrUpdate(one); } log.info("同步平台离线信息完成"); } } ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml
New file @@ -0,0 +1,55 @@ <?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.ycl.platform.mapper.PlatformOnlineMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ycl.platform.domain.vo.PlatformOnlineVO"> <result column="platform_name" property="platformName" /> <result column="platform_ip" property="platformIp" /> <result column="create_date" property="createDate" /> <result column="today_outline_sed" property="todayOutlineSed" /> <result column="update_time" property="updateTime" /> <result column="create_time" property="createTime" /> </resultMap> <select id="getById" resultMap="BaseResultMap"> SELECT TPO.platform_name, TPO.platform_ip, TPO.create_date, TPO.today_outline_sed, TPO.update_time, TPO.create_time, TPO.id FROM t_platform_online TPO WHERE TPO.id = #{id} AND TPO.deleted = 0 </select> <select id="getPage" resultMap="BaseResultMap"> SELECT TPO.platform_name, TPO.platform_ip, TPO.create_date, TPO.today_outline_sed, TPO.update_time, TPO.create_time, TPO.id FROM t_platform_online TPO WHERE TPO.deleted = 0 <if test="query.startTime != null and query.endTime != null"> AND TPO.create_date between #{query.startTime} and #{query.endTime} </if> </select> </mapper>