diff --git a/fys-admin/pom.xml b/fys-admin/pom.xml index 26a0b0ee..bb8fe450 100644 --- a/fys-admin/pom.xml +++ b/fys-admin/pom.xml @@ -146,12 +146,6 @@ 3.3.1 --> - - ws.schild - jave-all-deps - 3.1.1 - compile - diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java index 0053ce44..49963e3d 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/device/bjq/AppDeviceHBY100JController.java @@ -137,7 +137,7 @@ public class AppDeviceHBY100JController extends BaseController { */ private Integer voiceStrobeAlarm; /** - * 0 公安,1消防,2应急,3交警,4 市政,5 铁路,6 医疗,7部队,8 水利,9 语音 + * 0 公安,1消防,2应急,3交警,4 市政,5 铁路,6 医疗,7语音 */ private Integer mode; diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java index 413ab83d..c76c0664 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsClient.java @@ -47,22 +47,25 @@ public class HttpTtsClient { /** * 使用HTTP POST方式调用阿里云TTS服务生成MP3格式语音 */ - public byte[] synthesizeTextToMp3(String text) throws IOException { + public byte[] synthesizeTextToMp3(String text,String fileSuffix) throws IOException { String endpoint = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts"; // 构建请求体 // String requestBody = String.format( // "{\"appkey\":\"%s\",\"text\":\"%s\",\"voice\":\"zhifeng\",\"format\":\"MP3\",\"sample_rate\":24000,\"volume\":50,\"speech_rate\":0,\"pitch_rate\":0}", // appKey, -// text.replace("\"", "\\\"") +// text.replace("\"", "\\\"")zhide // ); String token = refreshAccessToken(); String requestBody = " {\n" + " \"appkey\":\""+appKey+"\",\n" + + " \"voice\":\"zhide\",\n" + " \"text\":\""+text+"\",\n" + " \"token\":\""+token+"\",\n" + - " \"format\":\"mp3\"\n" + + " \"volume\": 100,\n" + + " \"pitch_rate\": 0,\n" + + " \"format\":\""+fileSuffix+"\"\n" + " }"; URL url = new URL(endpoint); @@ -119,7 +122,7 @@ public class HttpTtsClient { * 保存MP3到文件 */ public String saveMp3ToFile(String text, String outputPath) throws IOException { - byte[] mp3Data = synthesizeTextToMp3(text); + byte[] mp3Data = synthesizeTextToMp3(text,"mp3"); try (FileOutputStream fos = new FileOutputStream(outputPath)) { fos.write(mp3Data); diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java index 5644474c..974afb69 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/http/HttpTtsExample.java @@ -19,8 +19,8 @@ public class HttpTtsExample { // 使用HTTP方式调用 HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey); - String text = "大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。"; - String outputPath = "D:\\http_output9.mp3"; + String text = "前方拥堵,请绕道而行。"; + String outputPath = "D:\\http_output11.mp3"; String resultFile = httpClient.saveMp3ToFile(text, outputPath); System.out.println("MP3音频已保存至: " + resultFile); diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java index d812dfd4..aa651624 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AudioProcessService.java @@ -454,7 +454,7 @@ public class AudioProcessService { // 使用HTTP方式调用 HttpTtsClient httpClient = new HttpTtsClient(accessKeyId, accessKeySecret, appKey); // - byte[] mp3Data = httpClient.synthesizeTextToMp3(text); + byte[] mp3Data = httpClient.synthesizeTextToMp3(text,fileSuffix); // byte[] mp3Data = alibabaTTSUtil.synthesizeTextToMp3(text); SysOssVo upload = ossService.upload(mp3Data, generateRandomFileName(fileSuffix)); diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java index e5563611..f67b24dc 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType3Location.java @@ -2,15 +2,23 @@ package com.fuyuanshen.global.mqtt.rule.hby100j; import com.alibaba.fastjson2.JSONObject; import com.fuyuanshen.common.core.constant.GlobalConstants; +import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.json.utils.JsonUtils; import com.fuyuanshen.common.redis.utils.RedisUtils; +import com.fuyuanshen.equipment.utils.map.GetAddressFromLatUtil; +import com.fuyuanshen.equipment.utils.map.LngLonUtil; import com.fuyuanshen.global.mqtt.base.NewMqttMessageRule; import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext; +import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; +import com.fuyuanshen.global.mqtt.rule.hby100j.domin.FunctionType3LocationReport; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.LinkedHashMap; import java.util.Map; import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX; /** * 获取设备位置信息(设备下发返回响应数据、设备定时主动上报) @@ -34,10 +42,167 @@ public class FuncType3Location implements NewMqttMessageRule { Map payloadDict = context.getPayloadDict(); if (payloadDict != null) { - RedisUtils.setCacheObject(redisKey, JSONObject.toJSONString(payloadDict)); +// RedisUtils.setCacheObject(redisKey, JSONObject.toJSONString(payloadDict)); + String jsonString = JSONObject.toJSONString(payloadDict); + FunctionType3LocationReport data = JSONObject.parseObject(jsonString, FunctionType3LocationReport.class); + FunctionType3LocationReport.Data data1 = data.getData(); + if (data1 != null) { + Double latitude = data1.getLatitude(); + Double longitude = data1.getLongitude(); + asyncSendLocationToRedisWithFuture(context.getDeviceImei(), latitude.toString(), longitude.toString()); + } } } catch (Exception e) { log.error("HBY100J获取设备位置信息失败", e); } } + + /** 位置未发生明显变化的距离阈值(米),可通过配置中心动态调整 */ + private final double MOVEMENT_THRESHOLD_METER = 10.0; + + /** + * 异步发送位置信息到Redis(使用CompletableFuture) + * + * @param deviceImei 设备IMEI + * @param latitude 纬度 + * @param longitude 经度 + */ + public void asyncSendLocationToRedisWithFuture(String deviceImei, String latitude, String longitude) { + try { + if (latitude == null || longitude == null) { + return; + } + if (StringUtils.isAnyBlank(deviceImei, latitude, longitude)) { + log.warn("位置上报参数为空,deviceImei={}", deviceImei); + return; + } + //log.info("位置上报,deviceImei={}, lat={}, lon={}", deviceImei, latitude, longitude); + // 1. 解析当前上报的经纬度 + Double curLat = parseDoubleSafe(latitude.trim()); + Double curLon = parseDoubleSafe(longitude.trim()); + if (curLat == null || curLon == null) { + log.warn("经纬度格式错误,直接更新,deviceImei={}, lat={}, lon={}", deviceImei, latitude, longitude); +// doSaveLocation(deviceImei, latitude, longitude); + return; + } + + // 2. 读取 Redis 中缓存的上一次位置 + String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + deviceImei + DEVICE_LOCATION_KEY_PREFIX; + String cachedJson = RedisUtils.getCacheObject(redisKey); + + if (StringUtils.isNotBlank(cachedJson)) { + com.alibaba.fastjson2.JSONObject cachedObj = com.alibaba.fastjson2.JSONObject.parseObject(cachedJson); + String cachedWgs84Lat = cachedObj.getString("wgs84_latitude"); + String cachedWgs84Lon = cachedObj.getString("wgs84_longitude"); + + Double oldLat = parseDoubleSafe(cachedWgs84Lat); + Double oldLon = parseDoubleSafe(cachedWgs84Lon); + + if (oldLat != null && oldLon != null) { + double distance = haversine(oldLat, oldLon, curLat, curLon); + if (distance <= MOVEMENT_THRESHOLD_METER) { + log.info("位置未发生明显变化({}米 <= {}米),不更新 Redis,deviceImei={}, lat={}, lon={}", + distance, MOVEMENT_THRESHOLD_METER, deviceImei, latitude, longitude); + return; + } + } + } +// String[] latArr = latitude.split("\\."); +// String[] lonArr = longitude.split("\\."); +// // 将位置信息存储到Redis中 +// String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + deviceImei + DEVICE_LOCATION_KEY_PREFIX; +// String redisObj = RedisUtils.getCacheObject(redisKey); +// JSONObject jsonOBj = JSONObject.parseObject(redisObj); +// if(jsonOBj != null){ +// String str1 = latArr[0] +"."+ latArr[1].substring(0,4); +// String str2 = lonArr[0] +"."+ lonArr[1].substring(0,4); +// +// String cacheLatitude = jsonOBj.getString("wgs84_latitude"); +// String cacheLongitude = jsonOBj.getString("wgs84_longitude"); +// String[] latArr1 = cacheLatitude.split("\\."); +// String[] lonArr1 = cacheLongitude.split("\\."); +// +// String cacheStr1 = latArr1[0] +"."+ latArr1[1].substring(0,4); +// String cacheStr2 = lonArr1[0] +"."+ lonArr1[1].substring(0,4); +// if(str1.equals(cacheStr1) && str2.equals(cacheStr2)){ +// log.info("位置信息未发生变化: device={}, lat={}, lon={}", deviceImei, latitude, longitude); +// return; +// } +// } + + // 构造位置信息对象 + Map locationInfo = new LinkedHashMap<>(); + double[] doubles = LngLonUtil.gps84_To_Gcj02(Double.parseDouble(latitude), Double.parseDouble(longitude)); + locationInfo.put("deviceImei", deviceImei); + locationInfo.put("latitude", doubles[0]); + locationInfo.put("longitude", doubles[1]); + locationInfo.put("wgs84_latitude", latitude); + locationInfo.put("wgs84_longitude", longitude); + + + String address = GetAddressFromLatUtil.getAdd(String.valueOf(doubles[1]), String.valueOf(doubles[0])); + locationInfo.put("address", address); + locationInfo.put("timestamp", System.currentTimeMillis()); + + + String locationJson = JsonUtils.toJsonString(locationInfo); + + // 存储到Redis + RedisUtils.setCacheObject(redisKey, locationJson); + + // 存储到一个列表中,保留历史位置信息 +// String locationHistoryKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_LOCATION_HISTORY_KEY_PREFIX + deviceImei; +// RedisUtils.addCacheList(locationHistoryKey, locationJson); +// RedisUtils.expire(locationHistoryKey, Duration.ofDays(90)); + storeDeviceTrajectoryWithSortedSet(deviceImei, locationJson); + log.info("位置信息已异步发送到Redis: device={}, lat={}, lon={}", deviceImei, latitude, longitude); + } catch (Exception e) { + log.error("异步发送位置信息到Redis时出错: device={}, error={}", deviceImei, e.getMessage(), e); + } + } + /** 安全解析 double,解析失败返回 null */ + private Double parseDoubleSafe(String str) { + if (StringUtils.isBlank(str)) return null; + try { + return Double.parseDouble(str.trim()); + } catch (NumberFormatException e) { + return null; + } + } + /** Haversine 公式计算两点球面距离(米) */ + private double haversine(double lat1, double lon1, double lat2, double lon2) { + double dLat = Math.toRadians(lat2 - lat1); + double dLon = Math.toRadians(lon2 - lon1); + double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * + Math.sin(dLon / 2) * Math.sin(dLon / 2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + /** 地球平均半径(米) */ + double EARTH_RADIUS = 6371_393.0; + return EARTH_RADIUS * c; + } + + /** + * 存储设备30天历史轨迹到Redis (使用Sorted Set) + */ + public void storeDeviceTrajectoryWithSortedSet(String deviceImei, String locationJson) { + try { + String trajectoryKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + deviceImei + DeviceRedisKeyConstants.DEVICE_LOCATION_HISTORY_KEY_PREFIX; +// String trajectoryKey = "device:trajectory:zset:" + deviceImei; +// String locationJson = JsonUtils.toJsonString(locationInfo); + long timestamp = System.currentTimeMillis(); + + // 添加到Sorted Set,使用时间戳作为score + RedisUtils.zAdd(trajectoryKey, locationJson, timestamp); + +// // 设置30天过期时间 +// RedisUtils.expire(trajectoryKey, Duration.ofDays(30)); + + // 清理30天前的数据(冗余保护) + long thirtyDaysAgo = System.currentTimeMillis() - (7L * 24 * 60 * 60 * 1000); + RedisUtils.zRemoveRangeByScore(trajectoryKey, 0, thirtyDaysAgo); + } catch (Exception e) { + log.error("存储设备轨迹到Redis(ZSet)失败: device={}, error={}", deviceImei, e.getMessage(), e); + } + } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java index 3cc5ede4..21252cbb 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType4PowerStatus.java @@ -2,15 +2,21 @@ package com.fuyuanshen.global.mqtt.rule.hby100j; import com.alibaba.fastjson2.JSONObject; import com.fuyuanshen.common.core.constant.GlobalConstants; +import com.fuyuanshen.common.json.utils.JsonUtils; import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.global.mqtt.base.NewMqttMessageRule; import com.fuyuanshen.global.mqtt.base.NewMqttRuleContext; +import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants; +import com.fuyuanshen.global.mqtt.rule.hby100j.domin.FunctionType4PowerStatusReport; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.LinkedHashMap; import java.util.Map; +import static com.fuyuanshen.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY; import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_KEY_PREFIX; +import static com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX; /** * 获取设备电源状态(设备下发返回响应数据、设备定时主动上报) @@ -29,12 +35,32 @@ public class FuncType4PowerStatus implements NewMqttMessageRule { log.info("HBY100J获取设备电源状态,消息负载:{}", context.getPayloadDict()); try { - String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + - context.getDeviceImei() + ":powerStatus"; + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX); +// String redisKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + +// context.getDeviceImei() + ":powerStatus"; Map payloadDict = context.getPayloadDict(); if (payloadDict != null) { - RedisUtils.setCacheObject(redisKey, JSONObject.toJSONString(payloadDict)); + + String str = JSONObject.toJSONString(payloadDict); + FunctionType4PowerStatusReport powerStatusReport =JSONObject.parseObject(str,FunctionType4PowerStatusReport.class); + + FunctionType4PowerStatusReport.Data data = powerStatusReport.getData(); + if(data != null){ + // 构造设备状态信息对象 + Map deviceInfo = new LinkedHashMap<>(); + deviceInfo.put("batteryPercentage", data.getLevel()); + deviceInfo.put("chargeState", data.getCharge()); + deviceInfo.put("batteryRemainingTime", data.getBatteryRemainingTime()); + + // 将设备状态信息存储到Redis中 + String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+ DeviceRedisKeyConstants.DEVICE_KEY_PREFIX + context.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX; + String deviceInfoJson = JsonUtils.toJsonString(deviceInfo); + + // 存储到Redis + RedisUtils.setCacheObject(deviceRedisKey, deviceInfoJson); + } + } } catch (Exception e) { log.error("HBY100J获取设备电源状态失败", e); diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java index 75a53dca..15e36bdc 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/FuncType6VoicePlay.java @@ -21,7 +21,7 @@ public class FuncType6VoicePlay implements NewMqttMessageRule { @Override public String getCommandType() { - return "HBY100_9"; + return "HBY100_6"; } @Override diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java index 6623f83d..6bd08597 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType12ForceAudioRequest.java @@ -44,6 +44,7 @@ public class FuncType12ForceAudioRequest { /** * 语音报警0关闭,1开启 */ + @JsonProperty("voice_strobe_alarm") private Integer voiceStrobeAlarm; //语音模式0公安,1消防,2应急,3交警,4市政,5铁路,6医疗,7部队,8水利 private Integer mode; diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java index abf346a4..58bc0cef 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType5UpdateVoiceRequest.java @@ -49,12 +49,14 @@ public class FuncType5UpdateVoiceRequest { * 2 - 紧急语音 * (具体含义需依据设备协议定义) */ + @JsonProperty("voice_type") private Integer voiceType; /** * 语音资源URL(MP3等音频文件地址) * 示例:http://8.129.5.250:10001/voice/01.mp3 */ + @JsonProperty("voice_resource") private String voiceResource; } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java index c125c728..d5bf3754 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FuncType6VoicePlayRequest.java @@ -44,6 +44,7 @@ public class FuncType6VoicePlayRequest { /** * 语音报警0关闭,1开启 */ + @JsonProperty("voice_broadcast") private Integer voiceBroadcast; } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java index ceda1f4a..eea9e849 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType3LocationReport.java @@ -52,7 +52,5 @@ public class FunctionType3LocationReport { */ @JsonProperty("latitude") private Double latitude; - - private String address; } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java index 6d6367e3..b74cb2ff 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java +++ b/fys-admin/src/main/java/com/fuyuanshen/global/mqtt/rule/hby100j/domin/FunctionType4PowerStatusReport.java @@ -70,5 +70,8 @@ public class FunctionType4PowerStatusReport { */ @JsonProperty("12v_power") private Integer twelveVPower; + + @JsonProperty("battery_remaining_time") + private Integer batteryRemainingTime; } } diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java index 09941325..8dfcdbbc 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceBizService.java @@ -97,6 +97,7 @@ public class DeviceBizService { } else { item.setOnlineStatus(0); } + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + item.getDeviceImei() + DEVICE_STATUS_KEY_PREFIX); // 获取电量 if (StringUtils.isNotBlank(deviceStatus)) { diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java index c6654a98..8d312baf 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/device/DeviceHBY100JBizService.java @@ -130,17 +130,21 @@ public class DeviceHBY100JBizService { } else { vo.setOnlineStatus(0); } + String deviceStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX); // 获取电量 if (StringUtils.isNotBlank(deviceStatus)) { JSONObject jsonObject = JSONObject.parseObject(deviceStatus); - vo.setBatteryPercentage(jsonObject.getString("level")); - vo.setChargeState(jsonObject.getString("charge")); + vo.setBatteryPercentage(jsonObject.getInteger("batteryPercentage")); + vo.setChargeState(jsonObject.getInteger("chargeState")); + vo.setBatteryRemainingTime(jsonObject.getInteger("batteryRemainingTime")); } else { - vo.setBatteryPercentage("0"); + vo.setBatteryPercentage(0); + vo.setBatteryRemainingTime(0); } + String reportStatus = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + ":report"); if (StringUtils.isNotBlank(reportStatus)) { FuncType14StatusReport report = JSONObject.parseObject(reportStatus,FuncType14StatusReport.class); @@ -160,33 +164,26 @@ public class DeviceHBY100JBizService { Integer voiceBroadcast = data.getVoiceBroadcast(); - if(voiceBroadcast != null && voiceBroadcast == 1){ - vo.setAlarmMode(9); - vo.setVoiceStrobeAlarm(1); - }else { - FuncType14StatusReport.SirenAlarm sirenAlarm = data.getSirenAlarm(); - if(sirenAlarm != null){ - vo.setVoiceStrobeAlarm(sirenAlarm.getEnable()); - vo.setAlarmMode(sirenAlarm.getMode()); - } + if(voiceBroadcast != null){ + vo.setVoiceBroadcast(voiceBroadcast); + } + FuncType14StatusReport.SirenAlarm sirenAlarm = data.getSirenAlarm(); + if(sirenAlarm != null){ + vo.setVoiceStrobeAlarm(sirenAlarm.getEnable()); + vo.setAlarmMode(sirenAlarm.getMode()); } } // 获取经度纬度 - String locationKey = GlobalConstants.GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DeviceRedisKeyConstants.DEVICE_LOCATION_KEY_PREFIX; - String locationInfo = RedisUtils.getCacheObject(locationKey); - if (StringUtils.isNotBlank(locationInfo)) { - FunctionType3LocationReport locationReport = JSONObject.parseObject(locationInfo,FunctionType3LocationReport.class); - if(locationReport != null){ - FunctionType3LocationReport.Data data = locationReport.getData(); - if(data != null){ - vo.setLongitude(data.getLongitude().toString()); - vo.setLatitude(data.getLatitude().toString()); - vo.setAddress(data.getAddress()); - } - } - + + String location = RedisUtils.getCacheObject(GLOBAL_REDIS_KEY + DEVICE_KEY_PREFIX + device.getDeviceImei() + DEVICE_LOCATION_KEY_PREFIX); + if (StringUtils.isNotBlank(location)) { + JSONObject jsonObject = JSONObject.parseObject(location); + vo.setLatitude(jsonObject.getString("latitude")); + vo.setLongitude(jsonObject.getString("longitude")); + vo.setAddress(jsonObject.getString("address")); } + QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("business_id", device.getId()); queryWrapper.eq("file_type", 3); @@ -217,9 +214,9 @@ public class DeviceHBY100JBizService { LoginUser loginUser = LoginHelper.getLoginUser(); bo.getDeviceIds().forEach(deviceId -> { Device deviceObj = deviceMapper.selectById(deviceId); -// if (getDeviceStatus(deviceObj.getDeviceImei())) { -// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); -// } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } FuncType12ForceAudioRequest request = new FuncType12ForceAudioRequest(); request.setRequestId(GenerateIdUtil.generateNumericId()); @@ -245,9 +242,9 @@ public class DeviceHBY100JBizService { throw new ServiceException("文件不存在"); } Device deviceObj = deviceMapper.selectById(appBusinessFileVo.getBusinessId()); -// if (getDeviceStatus(deviceObj.getDeviceImei())) { -// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); -// } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } LoginUser loginUser = LoginHelper.getLoginUser(); SysOssVo sysOssVo = sysOssMapper.selectVoById(appBusinessFileVo.getFileId()); @@ -282,9 +279,9 @@ public class DeviceHBY100JBizService { public void strobeMode(AppDeviceHBY100JController.HBY100JStrobeModeDto params) { Device deviceObj = deviceMapper.selectById(params.getDeviceId()); -// if (getDeviceStatus(deviceObj.getDeviceImei())) { -// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); -// } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } FuncType10StrobeModeRequest request = new FuncType10StrobeModeRequest(); request.setRequestId(GenerateIdUtil.generateNumericId()); request.setImei(deviceObj.getDeviceImei()); @@ -301,9 +298,12 @@ public class DeviceHBY100JBizService { public void lightAdjustment(AppDeviceHBY100JController.HBY100JLightAdjustmentDto params) { log.info("HBY100J灯光调节,请求参数:{}", params); Device deviceObj = deviceMapper.selectById(params.getDeviceId()); -// if (getDeviceStatus(deviceObj.getDeviceImei())) { -// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); -// } + if (deviceObj == null) { + throw new ServiceException("设备不存在"); + } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } FuncType13BrightnessRequest request = new FuncType13BrightnessRequest(); request.setRequestId(GenerateIdUtil.generateNumericId()); request.setImei(deviceObj.getDeviceImei()); @@ -320,9 +320,12 @@ public class DeviceHBY100JBizService { public void strobeFrequency(AppDeviceHBY100JController.HBY100JStrobeFrequencyDto params) { Device deviceObj = deviceMapper.selectById(params.getDeviceId()); -// if (getDeviceStatus(deviceObj.getDeviceImei())) { -// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); -// } + if (deviceObj == null) { + throw new ServiceException("设备不存在"); + } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } FuncType11FrequencyRequest request = new FuncType11FrequencyRequest(); request.setRequestId(GenerateIdUtil.generateNumericId()); request.setImei(deviceObj.getDeviceImei()); @@ -337,9 +340,12 @@ public class DeviceHBY100JBizService { public void updateVolume(AppDeviceHBY100JController.HBY100JUpdateVolumeDto params) { Device deviceObj = deviceMapper.selectById(params.getDeviceId()); -// if (getDeviceStatus(deviceObj.getDeviceImei())) { -// throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); -// } + if (deviceObj == null) { + throw new ServiceException("设备不存在"); + } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } FuncType9UpdateVolumeRequest request = new FuncType9UpdateVolumeRequest(); request.setRequestId(GenerateIdUtil.generateNumericId()); request.setImei(deviceObj.getDeviceImei()); @@ -354,6 +360,12 @@ public class DeviceHBY100JBizService { public void voiceBroadcast(AppDeviceHBY100JController.HBY100JVoiceBroadcastDto params) { Device deviceObj = deviceMapper.selectById(params.getDeviceId()); + if (deviceObj == null) { + throw new ServiceException("设备不存在"); + } + if (getDeviceStatus(deviceObj.getDeviceImei())) { + throw new ServiceException(deviceObj.getDeviceName() + ",设备已断开连接"); + } FuncType6VoicePlayRequest request = new FuncType6VoicePlayRequest(); request.setRequestId(GenerateIdUtil.generateNumericId()); request.setImei(deviceObj.getDeviceImei()); diff --git a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java index dddeb37a..14d4765b 100644 --- a/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java +++ b/fys-modules/fys-app/src/main/java/com/fuyuanshen/app/domain/vo/AppDeviceHBY100JDetailVo.java @@ -54,10 +54,16 @@ public class AppDeviceHBY100JDetailVo implements Serializable { private String bluetoothName; //电量百分比 - private String batteryPercentage; + /** + * 电量百分比 + */ + private Integer batteryPercentage; //充电状态(0没有充电,1正在充电,2为已充满) - private String chargeState; + /** + * 充电状态(0没有充电,1正在充电,2为已充满) + */ + private Integer chargeState; /** * 在线状态(0离线,1在线) @@ -65,18 +71,33 @@ public class AppDeviceHBY100JDetailVo implements Serializable { private Integer onlineStatus; // 经度 + /** + * 经度 + */ private String longitude; // 纬度 + /** + * 纬度 + */ private String latitude; // 逆解析地址 + /** + * 逆解析地址 + */ private String address; // 亮度 + /** + * 亮度 + */ private Integer lightBrightness; // 音量 + /** + * 音量 + */ private Integer volume; @@ -85,10 +106,16 @@ public class AppDeviceHBY100JDetailVo implements Serializable { */ private String voiceResource; - // 报警模式 0公安,1 消防,2应急,3交警,4 市政,5 铁路,6 医疗,7 部队,8 水利 + // 报警模式 0公安,1 消防,2应急,3交警,4 市政,5 铁路,6 医疗,7 自定义语音 + /** + * 报警模式 0公安,1 消防,2应急,3交警,4 市政,5 铁路,6 医疗,7 自定义语音 + */ private Integer alarmMode; // 强制报警开关: 0 关闭, 1开启 + /** + * 强制报警开关: 0 关闭, 1开启 + */ private Integer voiceStrobeAlarm; /** @@ -110,4 +137,9 @@ public class AppDeviceHBY100JDetailVo implements Serializable { * 语音播报0 关闭, 1开启 */ private Integer voiceBroadcast; + + /** + * 续航时间(分钟) + */ + private Integer batteryRemainingTime; }