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