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