From cb312b1a74f216068a6d49dc16e3e45f6ab35232 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 9 Jul 2025 16:34:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5n9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ycwl/basic/mapper/ExtraDeviceMapper.java | 11 +++ .../mobile/impl/AppScenicServiceImpl.java | 24 +++++++ .../java/com/ycwl/basic/task/N9eSyncTask.java | 70 +++++++++++++++++++ .../resources/mapper/ExtraDeviceMapper.xml | 11 +++ 4 files changed, 116 insertions(+) create mode 100644 src/main/java/com/ycwl/basic/mapper/ExtraDeviceMapper.java create mode 100644 src/main/java/com/ycwl/basic/task/N9eSyncTask.java create mode 100644 src/main/resources/mapper/ExtraDeviceMapper.xml diff --git a/src/main/java/com/ycwl/basic/mapper/ExtraDeviceMapper.java b/src/main/java/com/ycwl/basic/mapper/ExtraDeviceMapper.java new file mode 100644 index 0000000..59cc2e3 --- /dev/null +++ b/src/main/java/com/ycwl/basic/mapper/ExtraDeviceMapper.java @@ -0,0 +1,11 @@ +package com.ycwl.basic.mapper; + +import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ExtraDeviceMapper { + List listExtraDeviceByScenicId(Long scenicId); +} diff --git a/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java index 5e4b310..85942d3 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java @@ -22,7 +22,9 @@ import com.ycwl.basic.service.pc.ScenicAccountService; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.JwtTokenUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -51,6 +53,10 @@ public class AppScenicServiceImpl implements AppScenicService { private ScenicAccountService scenicAccountService; @Autowired private DeviceRepository deviceRepository; + @Autowired + private ExtraDeviceMapper extraDeviceMapper; + @Autowired + private RedisTemplate redisTemplate; @Override public ApiResponse> pageQuery(ScenicReqQuery scenicReqQuery) { @@ -126,6 +132,24 @@ public class AppScenicServiceImpl implements AppScenicService { deviceRespVO.setUpdateAt(null); } } + List extraDeviceList = extraDeviceMapper.listExtraDeviceByScenicId(scenicId); + for (DeviceRespVO deviceRespVO : extraDeviceList) { + if (redisTemplate.hasKey("ext_device:online:"+deviceRespVO.getNo())) { + String onlineTs = redisTemplate.opsForValue().get("ext_device:online:"+deviceRespVO.getNo()); + if (!StringUtils.isNumeric(onlineTs)) { + deviceRespVO.setOnline(0); + continue; + } + Long ts = Long.parseLong(onlineTs); + Date keepaliveAt = new Date(ts*1000); + deviceRespVO.setUpdateAt(keepaliveAt); + deviceRespVO.setKeepaliveAt(keepaliveAt); + deviceRespVO.setOnline(keepaliveAt.getTime() > System.currentTimeMillis()-1000*60*5 ? 1 : 0); + } else { + deviceRespVO.setOnline(0); + } + } + deviceRespVOList.addAll(0, extraDeviceList); return ApiResponse.success(deviceRespVOList); } } diff --git a/src/main/java/com/ycwl/basic/task/N9eSyncTask.java b/src/main/java/com/ycwl/basic/task/N9eSyncTask.java new file mode 100644 index 0000000..ff15bb4 --- /dev/null +++ b/src/main/java/com/ycwl/basic/task/N9eSyncTask.java @@ -0,0 +1,70 @@ +package com.ycwl.basic.task; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import cn.hutool.http.HttpResponse; + +import java.util.Date; +import java.util.concurrent.TimeUnit; + + +@Slf4j +@Component +@EnableScheduling +public class N9eSyncTask { + @Autowired + private RedisTemplate redisTemplate; + + @Scheduled(fixedRate = 1000 * 60L) + public void syncN9e() { + // 构建Basic认证头 + String auth = "Basic " + Base64.encode("user001:ccc26da7b9aba533cbb263a36c07dcc4"); + + // 构建请求体 + JSONObject requestBody = new JSONObject(); + JSONArray queries = new JSONArray(); + JSONObject query = new JSONObject(); + query.put("key", "group_ids"); + query.put("op", "=="); + JSONArray values = new JSONArray(); + values.add(4); + query.put("values", values); + queries.add(query); + requestBody.put("queries", queries); + + // 发送POST请求 + HttpResponse response = HttpUtil.createPost("https://n9e.jerryyan.top/v1/n9e/target/list") + .header("Authorization", auth) + .header("Content-Type", "application/json") + .body(requestBody.toJSONString()) + .execute(); + JSONObject respData = JSON.parseObject(response.body()); + if (StringUtils.isNotBlank(respData.getString("err"))) { + log.warn("N9E信息获取失败"); + return; + } + JSONObject data = respData.getJSONObject("dat"); + if (data.getInteger("total") <= 0) { + log.warn("N9E信息为空"); + return; + } + JSONArray list = data.getJSONArray("list"); + list.forEach(item -> { + JSONObject itemObj = (JSONObject) item; + String ident = itemObj.getString("ident"); + Long updateAt = itemObj.getLong("update_at"); + redisTemplate.opsForValue().set("ext_device:online:" + ident, updateAt.toString(), 1, TimeUnit.DAYS); + }); + } +} diff --git a/src/main/resources/mapper/ExtraDeviceMapper.xml b/src/main/resources/mapper/ExtraDeviceMapper.xml new file mode 100644 index 0000000..c892440 --- /dev/null +++ b/src/main/resources/mapper/ExtraDeviceMapper.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file