20260328:数据推送:优先推送红->黄->绿
This commit is contained in:
parent
eb45296a57
commit
518107ac04
@ -48,6 +48,7 @@ public class RedisKeyBuilder {
|
|||||||
/**
|
/**
|
||||||
* 物模型值命名缓存key
|
* 物模型值命名缓存key
|
||||||
* Key:TSLV:{productId}_{deviceNumber} HKey:{identity#V/identity#S/identity#M/identity#N}
|
* Key:TSLV:{productId}_{deviceNumber} HKey:{identity#V/identity#S/identity#M/identity#N}
|
||||||
|
* TSLV:209_508349495930
|
||||||
*/
|
*/
|
||||||
public static String buildTSLVCacheKey(Long productId, String serialNumber) {
|
public static String buildTSLVCacheKey(Long productId, String serialNumber) {
|
||||||
return FastBeeConstant.REDIS.DEVICE_PRE_KEY + productId + "_" + serialNumber.toUpperCase();
|
return FastBeeConstant.REDIS.DEVICE_PRE_KEY + productId + "_" + serialNumber.toUpperCase();
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
package com.fastbee.common.enums;
|
package com.fastbee.common.enums;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 物模型数据等级枚举
|
* 物模型数据等级枚举
|
||||||
* 绿色=正常,黄色=告警,红色=警报
|
* 绿色=正常,黄色=告警,红色=警报
|
||||||
@ -77,8 +79,8 @@ public enum DataLevelEnum {
|
|||||||
if (min == null && max == null) {
|
if (min == null && max == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
boolean lowerOk = (min == null) || v >= Double.parseDouble(min);
|
boolean lowerOk = StringUtils.isBlank(min) || v >= Double.parseDouble(min);
|
||||||
boolean upperOk = (max == null) || v <= Double.parseDouble(max);
|
boolean upperOk = StringUtils.isBlank(max) || v <= Double.parseDouble(max);
|
||||||
return lowerOk && upperOk;
|
return lowerOk && upperOk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,6 +34,7 @@ import org.springframework.stereotype.Component;
|
|||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -51,6 +52,8 @@ public class ThingsModelPushHandler {
|
|||||||
|
|
||||||
private static final RestTemplate REST_TEMPLATE = new RestTemplate();
|
private static final RestTemplate REST_TEMPLATE = new RestTemplate();
|
||||||
private static final Pattern VAR_PATTERN = Pattern.compile("\\{\\{([^}]+)}}");
|
private static final Pattern VAR_PATTERN = Pattern.compile("\\{\\{([^}]+)}}");
|
||||||
|
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private IThingsModelPushConfigService pushConfigService;
|
private IThingsModelPushConfigService pushConfigService;
|
||||||
@ -156,25 +159,38 @@ public class ThingsModelPushHandler {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
value = cacheValue;
|
value = cacheValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 没有值 直接跳过
|
||||||
|
if (StringUtils.isEmpty(value)) {
|
||||||
|
log.warn("[Push] configId={} sn={} item={} value={}为空,跳过",
|
||||||
|
config.getId(), serialNumber, item.getIdentifier(), value);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
DataLevelEnum level = DataLevelEnum.evaluate(
|
DataLevelEnum level = DataLevelEnum.evaluate(
|
||||||
value, item.getGreenMin(), item.getGreenMax(),
|
value, item.getGreenMin(), item.getGreenMax(),
|
||||||
item.getYellowMin(), item.getYellowMax());
|
item.getYellowMin(), item.getYellowMax());
|
||||||
|
|
||||||
String displayName = StringUtils.isNotEmpty(item.getModelName())
|
String text = item.getIdentifier() + "=" + value;
|
||||||
? item.getModelName() : item.getIdentifier();
|
//+ (StringUtils.isNotEmpty(item.getUnit()) ? item.getUnit() : "");
|
||||||
String text = displayName + "=" + value
|
|
||||||
+ (StringUtils.isNotEmpty(item.getUnit()) ? item.getUnit() : "");
|
|
||||||
levelTextMap.get(level).add(text);
|
levelTextMap.get(level).add(text);
|
||||||
}
|
}
|
||||||
|
// 优先发送 红 ——>> 黄 ——>? 蓝
|
||||||
for (Map.Entry<DataLevelEnum, List<String>> entry : levelTextMap.entrySet()) {
|
DataLevelEnum chosen = levelTextMap.entrySet().stream()
|
||||||
if (CollectionUtils.isEmpty(entry.getValue())) {
|
.filter(e -> CollectionUtils.isNotEmpty(e.getValue()))
|
||||||
continue;
|
.map(Map.Entry::getKey)
|
||||||
|
.max(Comparator.comparingInt(DataLevelEnum::getCode))
|
||||||
|
.orElse(null);
|
||||||
|
if (chosen == null) {
|
||||||
|
log.debug("[Push] configId={} sn={} 无有效分级数据,跳过发送",
|
||||||
|
config.getId(), serialNumber);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
DataLevelEnum level = entry.getKey();
|
String dataText = String.join(";", levelTextMap.get(chosen));
|
||||||
String dataText = String.join(";", entry.getValue());
|
if (dataText.length() > 32) {
|
||||||
sendTemplateMsg(config, msgParams, serialNumber, level, dataText, pushUrl, openIdMap);
|
dataText = dataText.substring(0, 29) + "...";
|
||||||
}
|
}
|
||||||
|
sendTemplateMsg(config, msgParams, serialNumber, chosen, dataText, pushUrl, openIdMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,26 +203,24 @@ public class ThingsModelPushHandler {
|
|||||||
String pushUrl, Map<Long, String> openIdMap) {
|
String pushUrl, Map<Long, String> openIdMap) {
|
||||||
List<String> varNames = extractVarNames(msgParams.getContent());
|
List<String> varNames = extractVarNames(msgParams.getContent());
|
||||||
|
|
||||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
Map<String, String> map = new LinkedHashMap<>();
|
||||||
String deviceDisplay = StringUtils.isNotEmpty(config.getDeviceName())
|
|
||||||
? config.getDeviceName() : serialNumber;
|
|
||||||
for (int i = 0; i < varNames.size(); i++) {
|
for (int i = 0; i < varNames.size(); i++) {
|
||||||
String varName = varNames.get(i);
|
String varName = varNames.get(i);
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
map.put(varName, deviceDisplay);
|
map.put(varName, serialNumber);
|
||||||
} else if (i == 1) {
|
} else if (i == 1) {
|
||||||
map.put(varName, level.getLabel());
|
map.put(varName, level.getLabel());
|
||||||
} else if (i == 2) {
|
} else if (i == 2) {
|
||||||
map.put(varName, dataText);
|
map.put(varName, dataText);
|
||||||
} else {
|
} else {
|
||||||
map.put(varName, "");
|
map.put(varName, simpleDateFormat.format(new Date()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 与微信模板消息要求保持一致的 map 迭代方式
|
// 与微信模板消息要求保持一致的 map 迭代方式
|
||||||
Map<String, Object> sendMap = new LinkedHashMap<>();
|
Map<String, Object> sendMap = new LinkedHashMap<>();
|
||||||
for (Map.Entry<String, String> m : map.entrySet()) {
|
for (Map.Entry<String, String> m : map.entrySet()) {
|
||||||
sendMap.put(m.getKey(), new TemplateDataVo(m.getValue(), level.getColor()));
|
sendMap.put(m.getKey(), new TemplateDataVo(m.getValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<Long, String> userEntry : openIdMap.entrySet()) {
|
for (Map.Entry<Long, String> userEntry : openIdMap.entrySet()) {
|
||||||
@ -216,7 +230,7 @@ public class ThingsModelPushHandler {
|
|||||||
vo.setTemplateId(msgParams.getTemplateId());
|
vo.setTemplateId(msgParams.getTemplateId());
|
||||||
vo.setData(sendMap);
|
vo.setData(sendMap);
|
||||||
if (StringUtils.isNotEmpty(msgParams.getRedirectUrl())) {
|
if (StringUtils.isNotEmpty(msgParams.getRedirectUrl())) {
|
||||||
vo.setUrl(msgParams.getRedirectUrl());
|
vo.setUrl(msgParams.getRedirectUrl() + "pagesA/home/device/index?deviceId=" + config.getDeviceId());
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
NotifySendResponse resp = doPost(JSON.toJSONString(vo), pushUrl);
|
NotifySendResponse resp = doPost(JSON.toJSONString(vo), pushUrl);
|
||||||
@ -252,10 +266,22 @@ public class ThingsModelPushHandler {
|
|||||||
String body = result.getBody();
|
String body = result.getBody();
|
||||||
resp.setResultContent(body);
|
resp.setResultContent(body);
|
||||||
try {
|
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) {
|
} catch (Exception e) {
|
||||||
resp.setStatus(0);
|
resp.setStatus(0);
|
||||||
}
|
}
|
||||||
return resp;
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,7 +53,7 @@ public class ThingsModelPushJob {
|
|||||||
* push_interval=0 时不自动推送(仅手动)
|
* push_interval=0 时不自动推送(仅手动)
|
||||||
*/
|
*/
|
||||||
private boolean isDue(ThingsModelPushConfig config, long nowMs) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
Date lastPush = config.getLastPushTime();
|
Date lastPush = config.getLastPushTime();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user