ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java
@@ -71,6 +71,10 @@ @TableField("dept_tag") private Boolean deptTag; @ApiModelProperty("是否在线:true 在线") @TableField("online") private Boolean online; @TableField("serial_number") private String serialNumber; @@ -83,6 +87,5 @@ @TableField("recovery_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date recoveryTime; } ycl-pojo/src/main/java/com/ycl/platform/domain/vo/UpdateOnlineVO.java
New file @@ -0,0 +1,21 @@ package com.ycl.platform.domain.vo; import lombok.Data; import java.util.Date; /** * @author:xp * @date:2024/9/6 14:48 */ @Data public class UpdateOnlineVO { /** ip */ private String ip; /** 是否在线 */ private Boolean online; private Date updateTime; } ycl-server/src/main/java/com/ycl/config/RestTemplateConfig.java
New file @@ -0,0 +1,19 @@ package com.ycl.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author xp * @date 2022/11/16 */ @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -7,6 +7,7 @@ import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.query.HomeQuery; import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.domain.vo.UpdateOnlineVO; import com.ycl.platform.domain.vo.screen.MonitorRateVO; import com.ycl.platform.domain.vo.screen.MonitorTotalVO; import org.apache.ibatis.annotations.Mapper; @@ -148,4 +149,17 @@ * @return */ List<String> getGBbyGB(@Param("gbList") List<String> gbList); /** * 查出设备ip集合 * * @return */ List<String> getDistinctIP(); /** * 根据ip修改点位表的是否在线字段 * @param online */ void updateOnline(@Param("online") UpdateOnlineVO online); } ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
@@ -57,13 +57,6 @@ private final SysDeptMapper sysDeptMapper; private final TMonitorMapper monitorMapper; private static final ExecutorService executorService = new ThreadPoolExecutor(8, 24, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadPoolExecutor.CallerRunsPolicy() ); /** * 添加 ycl-server/src/main/java/com/ycl/task/OsdTask.java
@@ -73,8 +73,8 @@ //需要考核的数据 List<String> serialNumbers = oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(serialNumbers)) { ExecutorService executorService = new ThreadPoolExecutor(8, 24, ExecutorService executorService = new ThreadPoolExecutor(16, 128, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), ycl-server/src/main/java/com/ycl/task/PlatformTask.java
@@ -44,11 +44,11 @@ private static final String DICT_TYPE = "platform_online"; private static final ExecutorService executorService = new ThreadPoolExecutor(8, 24, private static final ExecutorService executorService = new ThreadPoolExecutor(16, 128, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ArrayBlockingQueue<>(1000), new ThreadPoolExecutor.CallerRunsPolicy() ); @@ -81,7 +81,6 @@ log.error("检查平台连通性时发生错误", e); } }); executorService.shutdown(); } } ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -3,12 +3,17 @@ import com.alibaba.fastjson2.JSONObject; import com.mongodb.client.result.DeleteResult; import com.ycl.feign.UYClient; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.param.UY.*; import com.ycl.platform.domain.result.UY.RecordMetaDSumResult; import com.ycl.platform.domain.result.UY.*; import com.ycl.platform.domain.vo.UpdateOnlineVO; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.platform.service.UYErrorTypeCheckService; import com.ycl.platform.service.YwPointService; import com.ycl.utils.DateUtils; import com.ycl.utils.http.HttpUtils; import com.ycl.utils.http.SelfHttpUtil; import constant.ApiConstants; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -16,14 +21,23 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.io.IOException; import java.net.InetAddress; import java.text.SimpleDateFormat; import java.util.Calendar; 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; //优云对接数据任务 @Slf4j @@ -35,6 +49,8 @@ private final UYClient uyClient; private final UYErrorTypeCheckService uyErrorTypeCheckService; private final YwPointService pointService; private final TMonitorMapper monitorMapper; private final SelfHttpUtil selfHttpUtil; @Value("${youYun.tenantId}") private String tenantId; @@ -46,6 +62,14 @@ private String email; @Value("${youYun.passwd}") private String passwd; private static final ExecutorService executorService = new ThreadPoolExecutor(16, 128, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), new ThreadPoolExecutor.CallerRunsPolicy() ); // 图像检测 public void imageDetection() { @@ -143,6 +167,49 @@ log.info("结束一机一档合格率数据同步"); } /** * 点位在线检测 */ public void pointOnline() { log.info("开始检测点位在线"); // 先查出设备IP集合 List<String> ipList = monitorMapper.getDistinctIP(); String prefix = "http://"; Date now = new Date(); for (String ip : ipList) { executorService.submit(() -> { // 先检测能否访问该ip的网页 ResponseEntity<Object> res = null; UpdateOnlineVO online = new UpdateOnlineVO(); online.setIp(ip); if ("127.0.0.1".equals(ip)) { online.setOnline(Boolean.FALSE); monitorMapper.updateOnline(online); return; } try { res = selfHttpUtil.get(prefix + ip, null, null); online.setOnline(Objects.nonNull(res) && HttpStatus.OK == res.getStatusCode()); } catch (Exception e) { online.setOnline(Boolean.FALSE); } online.setUpdateTime(now); // 如果http得到的不在线,那么再ping一下 boolean reachable = false; if (! online.getOnline()) { try { reachable = InetAddress.getByName(ip).isReachable(3000); } catch (IOException e) { e.printStackTrace(); } online.setOnline(reachable); } monitorMapper.updateOnline(online); }); } } //点位在线率 public void videoOnlineTask() { //视频图像质量 ycl-server/src/main/java/com/ycl/task/WorkOrderImgTask.java
@@ -40,7 +40,7 @@ private final WorkOrderCheckImgMapper workOrderCheckImgMapper; private static final ExecutorService executorService = new ThreadPoolExecutor(16, 32, 128, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), @@ -78,7 +78,6 @@ } }); } executorService.shutdown(); } } ycl-server/src/main/java/com/ycl/utils/http/SelfHttpUtil.java
New file @@ -0,0 +1,122 @@ package com.ycl.utils.http; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; /** * @author xp * @date 2022/11/16 */ @Component @RequiredArgsConstructor public class SelfHttpUtil { private final RestTemplate httpClient; /** * post * * @param url 请求连接(ps: post请求如果要传url参数,请先拼接好再传入url) * @param data 请求体数据 * @param header 请求头(有token就放里面) * @return */ public Object post(String url, @Nullable Object data, @Nullable MultiValueMap header) { ResponseEntity<Object> response = httpClient.exchange( url, HttpMethod.POST, getHttpEntity(data, header), Object.class ); return response.getBody(); } /** * @param url 请求连接 (ps: post请求如果要传url参数,请先拼接好再传入url) * @param data 请求体数据 * @param token * @return */ public Object post(String url, String token, @Nullable Object data) { ResponseEntity<Object> response = httpClient.exchange( url, HttpMethod.POST, getHttpEntity(data, token), Object.class ); return response.getBody(); } /** * get * * @param url RestTemplate 如果有url参数,必须要在url中使用占位符,如:https://www.easyblog.vip?name={name} 传参:String name = xp,才能拼上这个参数 * @param token * @param params * @return */ // public Object get(String url, String token, @Nullable Object... params) { // ResponseEntity<Object> response = httpClient.exchange( // url, // HttpMethod.GET, // getHttpEntity(null, token), // Object.class, // params // ); // return response.getBody(); // } /** * get * * @param url 请求连接 RestTemplate 如果有url参数,必须要在url中使用占位符,如:https://www.easyblog.vip?name={name} 传参:String name = xp,才能拼上这个参数 * @param header 请求头(有token就放里面) * @param params * @return */ public ResponseEntity<Object> get(String url, @Nullable MultiValueMap header, @Nullable Object... params) { ResponseEntity<Object> response = httpClient.exchange( url, HttpMethod.GET, getHttpEntity(null, header), Object.class, params ); return response; } /** * 构建带请求头和请求体的httpEntity * * @param data * @param token * @return */ protected HttpEntity getHttpEntity(Object data, String token) { MultiValueMap<String, String> header = new HttpHeaders(); header.add("Authorization", token); HttpEntity httpEntity = new HttpEntity(data, header); return httpEntity; } /** * 直接传入header * * @param data * @param header * @return */ protected HttpEntity getHttpEntity(Object data, MultiValueMap header) { HttpEntity httpEntity = new HttpEntity(data, header); return httpEntity; } } ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -580,6 +580,19 @@ FROM t_monitor WHERE deleted = 0 AND serial_number in <foreach collection="gbList" open="(" separator="," close=")" item="no">#{no}</foreach> serial_number in <foreach collection="gbList" open="(" separator="," close=")" item="no">#{no}</foreach> </select> <select id="getDistinctIP" resultType="string"> SELECT DISTINCT ip FROM t_monitor </select> <update id="updateOnline"> update t_yw_ponit set online = #{online.online}, update_time = #{online.updateTime} WHERE EXISTS ( SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number ); </update> </mapper>