diff --git a/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java b/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java index 76a8983a..6820483a 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java +++ b/fastbee-common/src/main/java/com/fastbee/common/core/redis/RedisKeyBuilder.java @@ -48,6 +48,7 @@ public class RedisKeyBuilder { /** * 物模型值命名缓存key * Key:TSLV:{productId}_{deviceNumber} HKey:{identity#V/identity#S/identity#M/identity#N} + * TSLV:209_508349495930 */ public static String buildTSLVCacheKey(Long productId, String serialNumber) { return FastBeeConstant.REDIS.DEVICE_PRE_KEY + productId + "_" + serialNumber.toUpperCase(); diff --git a/fastbee-common/src/main/java/com/fastbee/common/enums/DataLevelEnum.java b/fastbee-common/src/main/java/com/fastbee/common/enums/DataLevelEnum.java index c34174b6..cecd79b3 100644 --- a/fastbee-common/src/main/java/com/fastbee/common/enums/DataLevelEnum.java +++ b/fastbee-common/src/main/java/com/fastbee/common/enums/DataLevelEnum.java @@ -1,5 +1,7 @@ package com.fastbee.common.enums; +import org.apache.commons.lang3.StringUtils; + /** * 物模型数据等级枚举 * 绿色=正常,黄色=告警,红色=警报 @@ -77,8 +79,8 @@ public enum DataLevelEnum { if (min == null && max == null) { return false; } - boolean lowerOk = (min == null) || v >= Double.parseDouble(min); - boolean upperOk = (max == null) || v <= Double.parseDouble(max); + boolean lowerOk = StringUtils.isBlank(min) || v >= Double.parseDouble(min); + boolean upperOk = StringUtils.isBlank(max) || v <= Double.parseDouble(max); return lowerOk && upperOk; } } diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushHandler.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushHandler.java index ea2df679..687b7c1f 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushHandler.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushHandler.java @@ -34,6 +34,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; +import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -51,6 +52,8 @@ public class ThingsModelPushHandler { private static final RestTemplate REST_TEMPLATE = new RestTemplate(); private static final Pattern VAR_PATTERN = Pattern.compile("\\{\\{([^}]+)}}"); + private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + @Resource private IThingsModelPushConfigService pushConfigService; @@ -156,25 +159,38 @@ public class ThingsModelPushHandler { } catch (Exception e) { value = cacheValue; } + + // 没有值 直接跳过 + if (StringUtils.isEmpty(value)) { + log.warn("[Push] configId={} sn={} item={} value={}为空,跳过", + config.getId(), serialNumber, item.getIdentifier(), value); + continue; + } + DataLevelEnum level = DataLevelEnum.evaluate( value, item.getGreenMin(), item.getGreenMax(), item.getYellowMin(), item.getYellowMax()); - String displayName = StringUtils.isNotEmpty(item.getModelName()) - ? item.getModelName() : item.getIdentifier(); - String text = displayName + "=" + value - + (StringUtils.isNotEmpty(item.getUnit()) ? item.getUnit() : ""); + String text = item.getIdentifier() + "=" + value; + //+ (StringUtils.isNotEmpty(item.getUnit()) ? item.getUnit() : ""); levelTextMap.get(level).add(text); } - - for (Map.Entry> entry : levelTextMap.entrySet()) { - if (CollectionUtils.isEmpty(entry.getValue())) { - continue; - } - DataLevelEnum level = entry.getKey(); - String dataText = String.join(";", entry.getValue()); - sendTemplateMsg(config, msgParams, serialNumber, level, dataText, pushUrl, openIdMap); + // 优先发送 红 ——>> 黄 ——>? 蓝 + DataLevelEnum chosen = levelTextMap.entrySet().stream() + .filter(e -> CollectionUtils.isNotEmpty(e.getValue())) + .map(Map.Entry::getKey) + .max(Comparator.comparingInt(DataLevelEnum::getCode)) + .orElse(null); + if (chosen == null) { + log.debug("[Push] configId={} sn={} 无有效分级数据,跳过发送", + config.getId(), serialNumber); + return; } + String dataText = String.join(";", levelTextMap.get(chosen)); + if (dataText.length() > 32) { + dataText = dataText.substring(0, 29) + "..."; + } + sendTemplateMsg(config, msgParams, serialNumber, chosen, dataText, pushUrl, openIdMap); } /** @@ -187,26 +203,24 @@ public class ThingsModelPushHandler { String pushUrl, Map openIdMap) { List varNames = extractVarNames(msgParams.getContent()); - LinkedHashMap map = new LinkedHashMap<>(); - String deviceDisplay = StringUtils.isNotEmpty(config.getDeviceName()) - ? config.getDeviceName() : serialNumber; + Map map = new LinkedHashMap<>(); for (int i = 0; i < varNames.size(); i++) { String varName = varNames.get(i); if (i == 0) { - map.put(varName, deviceDisplay); + map.put(varName, serialNumber); } else if (i == 1) { map.put(varName, level.getLabel()); } else if (i == 2) { map.put(varName, dataText); } else { - map.put(varName, ""); + map.put(varName, simpleDateFormat.format(new Date())); } } // 与微信模板消息要求保持一致的 map 迭代方式 Map sendMap = new LinkedHashMap<>(); for (Map.Entry m : map.entrySet()) { - sendMap.put(m.getKey(), new TemplateDataVo(m.getValue(), level.getColor())); + sendMap.put(m.getKey(), new TemplateDataVo(m.getValue())); } for (Map.Entry userEntry : openIdMap.entrySet()) { @@ -216,7 +230,7 @@ public class ThingsModelPushHandler { vo.setTemplateId(msgParams.getTemplateId()); vo.setData(sendMap); if (StringUtils.isNotEmpty(msgParams.getRedirectUrl())) { - vo.setUrl(msgParams.getRedirectUrl()); + vo.setUrl(msgParams.getRedirectUrl() + "pagesA/home/device/index?deviceId=" + config.getDeviceId()); } try { NotifySendResponse resp = doPost(JSON.toJSONString(vo), pushUrl); @@ -252,10 +266,22 @@ public class ThingsModelPushHandler { String body = result.getBody(); resp.setResultContent(body); try { - resp.setStatus("0".equals(JSONObject.parseObject(body).get("errcode").toString()) ? 1 : 0); + JSONObject responseJson = JSONObject.parseObject(body); + boolean errcode = "0".equals(responseJson.get("errcode").toString()); + if (!errcode) { + log.warn("[Call Wechat Request] json={}", JSON.toJSONString(json)); + log.warn("[Call Wechat Response] body={}", responseJson); + } + resp.setStatus(errcode ? 1 : 0); } catch (Exception e) { resp.setStatus(0); } return resp; } + + public static void main(String[] args) { + String value = "WaterT=1.76;WaterVol=-6.34;T=20"; + String value1 = "[修正]参术儿康糖浆10ml*10支1盒装儿童小..."; + System.out.println("value.length() = " + value.length()); + } } diff --git a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushJob.java b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushJob.java index e729e95f..41603060 100644 --- a/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushJob.java +++ b/fastbee-iot-data/src/main/java/com/fastbee/iot/data/push/ThingsModelPushJob.java @@ -53,7 +53,7 @@ public class ThingsModelPushJob { * push_interval=0 时不自动推送(仅手动) */ private boolean isDue(ThingsModelPushConfig config, long nowMs) { - if (config.getPushInterval() == null || config.getPushInterval() <= 0) { + if (config.getPushInterval() == null || config.getPushInterval() <= 0 || config.getStatus() == 0) { return false; } Date lastPush = config.getLastPushTime();