From 0553d847853cf5579ac91381fd1981f63725cff0 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期六, 03 八月 2024 14:38:49 +0800
Subject: [PATCH] 平台在线率表、定时任务ping、同步
---
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java | 40 +++++
ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java | 17 ++
ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java | 34 ++++
ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java | 32 ++++
ycl-server/src/main/java/com/ycl/task/PlatformTask.java | 116 ++++++++++++++++
ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml | 55 +++++++
ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java | 53 +++++++
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java | 48 ++++++
ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java | 18 ++
9 files changed, 413 insertions(+), 0 deletions(-)
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java
new file mode 100644
index 0000000..712abdc
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java
@@ -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;
+
+
+}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java
new file mode 100644
index 0000000..3516566
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java
@@ -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 {
+}
+
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java
new file mode 100644
index 0000000..381b8a0
--- /dev/null
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java
@@ -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;
+ }
+
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java b/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java
index f7e36e5..7f8a7bb 100644
--- a/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java
+++ b/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);
+ }
/**
* 瑙嗛锛氱偣浣嶅湪绾跨巼
diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java
new file mode 100644
index 0000000..24bf22f
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java
@@ -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);
+
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java b/ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java
new file mode 100644
index 0000000..7f86c2d
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java
@@ -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);
+}
diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java
new file mode 100644
index 0000000..94d1a88
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java
@@ -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());
+ }
+
+}
diff --git a/ycl-server/src/main/java/com/ycl/task/PlatformTask.java b/ycl-server/src/main/java/com/ycl/task/PlatformTask.java
new file mode 100644
index 0000000..e0ed630
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/task/PlatformTask.java
@@ -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锛歺p
+ * @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;
+
+ /**
+ * 璇ュ畾鏃朵换鍔¢渶瑕佷娇鐢╮edis瀛樺偍绂荤嚎鏃堕暱锛屽苟瀹氭湡鍚屾鍒癿ysql涓�
+ */
+ 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++) {
+ // 涓夌鏈猵ing閫氶噸璇曚竴娆★紝濡傛灉涓嶈鎵嶆墸鍒�
+ 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() + "骞冲彴鏈猵ing閫�");
+ }
+ }
+ } catch (Exception e) {
+ log.error("妫�鏌ュ钩鍙拌繛閫氭�ф椂鍙戠敓閿欒", e);
+ }
+ });
+ }
+ }
+
+ /**
+ * 姣忓皬鏃跺皢redis涓殑骞冲彴绂荤嚎鏁版嵁鍚屾鍒癿ysql
+ *
+ */
+ public void synToMySQL() {
+ List<SysDictData> platformList = dictTypeService.selectDictDataByType(DICT_TYPE);
+ // 灏唈ava.util.Date杞崲涓簀ava.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("鍚屾骞冲彴绂荤嚎淇℃伅瀹屾垚");
+ }
+}
diff --git a/ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml
new file mode 100644
index 0000000..94c67ad
--- /dev/null
+++ b/ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml
@@ -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>
--
Gitblit v1.8.0