20260228:联通微信梳理

This commit is contained in:
zhugongping 2026-02-28 21:29:37 +08:00
parent 4e7d595893
commit 0ad130fcc2
12 changed files with 76 additions and 65 deletions

View File

@ -21,6 +21,10 @@ public class AlertPushParams {
* 告警时间
*/
private String alertTime;
/**
* 设备ID
*/
private Long deviceId;
/**
* 设备名称
*/

View File

@ -26,6 +26,9 @@ public class ThingsModelSimpleItem {
*/
private String value;
/**
* 物模型名称
*/
private String name;
/**

View File

@ -14,12 +14,19 @@ public class ThingsModelValuesInput {
**/
private Long productId;
/**
* 设备ID
**/
private Long deviceId;
/**
* 设备ID
**/
private String deviceNumber;
/**
* 设备类型
**/
private Integer deviceType;
/**
@ -27,11 +34,6 @@ public class ThingsModelValuesInput {
**/
private List<ThingsModelSimpleItem> thingsModelSimpleItem;
/**
* 原始消息数据包(用于判断设备上电触发回包等)
**/
private Object sources;
public Long getDeviceId() {
return deviceId;
}
@ -63,12 +65,4 @@ public class ThingsModelValuesInput {
public void setThingsModelValueRemarkItem(List<ThingsModelSimpleItem> thingsModelSimpleItem) {
this.thingsModelSimpleItem = thingsModelSimpleItem;
}
public Object getSources() {
return sources;
}
public void setSources(Object sources) {
this.sources = sources;
}
}

View File

@ -95,15 +95,12 @@ public class SceneContext {
scene_logger.info("[{}]=====+>场景联动规则开始执行!", requestId);
scene_logger.info("[{}]=====+>规则引擎脚本配置:{},规则引擎上下文:{}", requestId, scriptTemplate, this);
//MDC.put("id", scriptTemplate.getChainName());
//触发器
// 触发器
if (scriptTemplate.getPurpose() == 2) {
// 触发器,检查静默时间
if (!checkSilent(scriptTemplate.getSilent(), scriptTemplate.getSceneId(), requestId, this.deviceNum)) {
// 触发条件为不满足时,返回true
if (scriptTemplate.getCond() == 3) {
return true;
}
return false;
return scriptTemplate.getCond() == 3;
}
if (scriptTemplate.getSource() == 1) {
// 设备触发
@ -112,7 +109,7 @@ public class SceneContext {
// 产品触发
return productTrigger(scriptTemplate);
}
//执行动作
// 执行动作
} else if (scriptTemplate.getPurpose() == 3) {
scene_logger.info("[{}]=====+>符合触发条件!", requestId);
if (scriptTemplate.getCheckdelay() != 0) {
@ -122,9 +119,9 @@ public class SceneContext {
}
} else {
// 执行动作,延迟执行,线程休眠 delay x 1000毫秒
Thread.sleep(scriptTemplate.getDelay() * 1000);
Thread.sleep(scriptTemplate.getDelay() * 1000L);
if (scriptTemplate.getSource() == 4) {
//存在相同未处理告警只记录 不触发告警通知和动作
// 存在相同未处理告警只记录 不触发告警通知和动作
if (checkDeviceAlerting(scriptTemplate.getSceneId(), requestId, this.deviceNum)) {
this.alert(scriptTemplate.getSceneId(), false);
} else {
@ -151,7 +148,7 @@ public class SceneContext {
private boolean deviceTrigger(ScriptTemplate scriptTemplate) {
String requestId = "scene/" + scriptTemplate.getChainName();
// 判断定制触发(执行一次)或设备上报
boolean isDeviceReport = StringUtils.isEmpty(deviceNum) ? false : true;
boolean isDeviceReport = !StringUtils.isEmpty(deviceNum);
if (isDeviceReport) {
// 1. 匹配设备编号
scene_logger.info("[{}]=====+>设备触发!", requestId);
@ -176,10 +173,7 @@ public class SceneContext {
scriptTemplate.getScriptId(), scriptTemplate.getSceneId(), scriptTemplate.getProductId(), deviceNum, matchItem.getRemark());
sceneThingsModelItems.add(sceneItem);
// 3.设备上报值匹配
boolean isMatch = matchValue(requestId, scriptTemplate.getOperator(), scriptTemplate.getValue(), matchItem.getValue());
if (isMatch) {
return true;
}
return matchValue(requestId, scriptTemplate.getOperator(), scriptTemplate.getValue(), matchItem.getValue());
}
} else {
@ -208,7 +202,7 @@ public class SceneContext {
// 定时触发/执行一次
int resultCount = 0;
// 3.查询设备最新上报值去匹配
for (String num : Arrays.asList(scriptTemplate.getDeviceNums().split(","))) {
for (String num : scriptTemplate.getDeviceNums().split(",")) {
// 数组类型,key去除前缀,值从逗号分隔的字符串获取
String id = "";
String value = "";
@ -248,7 +242,7 @@ public class SceneContext {
}
}
// 任意设备匹配成功返回true
return resultCount > 0 ? true : false;
return resultCount > 0;
}
return false;
}
@ -286,10 +280,7 @@ public class SceneContext {
scriptTemplate.getScriptId(), scriptTemplate.getSceneId(), scriptTemplate.getProductId(), deviceNum, matchItem.getRemark());
sceneThingsModelItems.add(sceneItem);
// 设备上报值匹配
boolean isMatch = matchValue(requestId, scriptTemplate.getOperator(), scriptTemplate.getValue(), matchItem.getValue());
if (isMatch) {
return true;
}
return matchValue(requestId, scriptTemplate.getOperator(), scriptTemplate.getValue(), matchItem.getValue());
}
} else {
@ -359,7 +350,7 @@ public class SceneContext {
}
}
// 任意设备匹配成功返回true
return resultCount > 0 ? true : false;
return resultCount > 0;
}
return false;
}
@ -367,10 +358,10 @@ public class SceneContext {
private void loadDelayTrigger(ScriptTemplate scriptTemplate) {
String requestId = "scene/" + scriptTemplate.getChainName();
String key = "CHECK_" + scriptTemplate.getSceneId() + deviceNum;
//默认上线执行告警恢复 在延迟匹配周期内不告警
// 默认上线执行告警恢复 在延迟匹配周期内不告警
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(() -> {
//设备未上线,则执行告警任务
// 设备未上线,则执行告警任务
if (scriptTemplate.getSource() == 4) {
// 告警
this.alert(scriptTemplate.getSceneId(), true);
@ -449,7 +440,7 @@ public class SceneContext {
*
* @param sceneId 场景ID
*/
private void alert(Long sceneId, boolean isNodify) {
private void alert(Long sceneId, boolean isNotify) {
Set<Long> sceneIdSet = sceneThingsModelItems.stream().map(SceneThingsModelItem::getSceneId).collect(Collectors.toSet());
List<SceneTerminalUserVO> sceneTerminalUserVOList = sceneService.selectTerminalUserBySceneIds(sceneIdSet);
Map<Long, SceneTerminalUserVO> sceneTerminalUserMap = sceneTerminalUserVOList.stream().collect(Collectors.toMap(SceneTerminalUserVO::getSceneId, Function.identity()));
@ -475,7 +466,7 @@ public class SceneContext {
// 获取告警关联模版id
for (AlertSceneSendVO alertSceneSendVO : sceneSendVOList) {
// 开启通知发送
if (isNodify) {
if (isNotify) {
AlertPushParams alertPushParams = buildAlertPushParams(device, sceneThingsModelItem);
List<AlertNotifyTemplate> alertNotifyTemplateList = alertService.listAlertNotifyTemplate(alertSceneSendVO.getAlertId());
alertPushParams.setAlertName(alertSceneSendVO.getAlertName());
@ -497,6 +488,7 @@ public class SceneContext {
private AlertPushParams buildAlertPushParams(Device device, SceneThingsModelItem sceneThingsModelItem) {
// 获取告警推送参数
AlertPushParams alertPushParams = new AlertPushParams();
alertPushParams.setDeviceId(device.getDeviceId());
alertPushParams.setDeviceName(device.getDeviceName());
alertPushParams.setSerialNumber(sceneThingsModelItem.getDeviceNumber());
// List<DeviceUser> deviceUserList = deviceUserService.getDeviceUserAndShare(device.getDeviceId());
@ -649,6 +641,7 @@ public class SceneContext {
return true;
}
// silent:scene_场景编号
scene_logger.info("[{}]=====+>检查静默时间!", requestId);
String key = "silent:" + "scene_" + sceneId + ":" + serialNumber;
Calendar calendar = Calendar.getInstance();
// 查询静默截止时间
@ -657,16 +650,10 @@ public class SceneContext {
// 添加场景静默时间
calendar.add(Calendar.MINUTE, silent);
redisCache.setCacheObject(key, calendar.getTimeInMillis());
scene_logger.info("[{}]=====+>检查静默时间!", requestId);
return true;
} else {
Long NowTimestamp = Calendar.getInstance().getTimeInMillis();
if (NowTimestamp > expireTime) {
scene_logger.info("[{}]=====+>检查静默时间!", requestId);
return true;
}
scene_logger.info("[{}]=====+>检查静默时间!", requestId);
return false;
long NowTimestamp = Calendar.getInstance().getTimeInMillis();
return NowTimestamp > expireTime;
}
}

View File

@ -96,14 +96,12 @@ public class DataHandlerImpl implements IDataHandler {
// 这里上报设备编号是转的大写,后面存缓存也是使用大写的,所以在查询物模型的值时添加把设备编号转大写后取值
input.setDeviceNumber(bo.getSerialNumber().toUpperCase());
input.setThingsModelValueRemarkItem(thingsModelSimpleItems);
// 传递原始消息数据包,用于判断设备上电触发回包等
input.setSources(bo.getSources());
List<ThingsModelSimpleItem> result = deviceService.reportDeviceThingsModelValue(input, bo.getType(), bo.isShadow());
// 只有设备上报进入规则引擎流程
// todo 只有设备上报进入规则引擎流程
if (bo.isRuleEngine() && !bo.getSerialNumber().startsWith("server-")) {
ruleEngine.ruleMatch(bo);
}
//发送至前端
// 发送至前端
PushMessageBo messageBo = new PushMessageBo();
messageBo.setTopic(topicsUtils.buildTopic(bo.getProductId(), bo.getSerialNumber(), TopicType.WS_SERVICE_INVOKE));
JSONObject pushObj = new JSONObject();

View File

@ -299,7 +299,7 @@ public class DeviceReportMessageServiceImpl implements IDeviceReportMessageServi
report.setDeviceName(message.getDeviceName());
report.setSources(message.getSources());
report.setGwDeviceBo(message.getGwDeviceBo());
//属性上报执行规则引擎
// 属性上报执行规则引擎
report.setRuleEngine(true);
dataHandler.reportData(report);
}

View File

@ -47,7 +47,7 @@ public class RuleEngineHandler implements IRuleEngine {
// 场景联动处理
this.sceneProcess(bo);
} catch (Exception e) {
log.error("场景联动规则执行异常 message={}", e, e.getMessage());
log.error("场景联动规则执行异常 message={}", e.getMessage(), e);
}
}

View File

@ -140,6 +140,7 @@ public class NotifySendServiceImpl implements NotifySendService {
NotifyChannel notifyChannel = notifyChannelService.selectNotifyChannelById(notifyTemplate.getChannelId());
NotifyChannelProviderEnum notifyChannelProviderEnum = NotifyChannelProviderEnum.getByChannelTypeAndProvider(notifyChannel.getChannelType(), notifyChannel.getProvider());
NotifyVO notifyVO = new NotifyVO();
notifyVO.setDeviceId(alertPushParams.getDeviceId());
notifyVO.setNotifyChannel(notifyChannel).setNotifyTemplate(notifyTemplate).setNotifyChannelProviderEnum(notifyChannelProviderEnum);
// 获取模版参数
JSONObject jsonMsgParams = JSONObject.parseObject(notifyVO.getNotifyTemplate().getMsgParams());

View File

@ -120,7 +120,8 @@ public class WeChatPushServiceImpl implements WeChatPushService {
weChatPublicAccountPushVO.setData(sendMap);
weChatPublicAccountPushVO.setTemplateId(wechatMsgParams.getTemplateId());
if (StringUtils.isNotEmpty(wechatMsgParams.getRedirectUrl())) {
weChatPublicAccountPushVO.setUrl(wechatMsgParams.getRedirectUrl());
String redirectUrl = wechatMsgParams.getRedirectUrl() + "pagesA/home/device/index?deviceId=" + notifyVO.getDeviceId();
weChatPublicAccountPushVO.setUrl(redirectUrl);
}
if (StringUtils.isNotEmpty(wechatMsgParams.getPagePath())) {
WeChatPublicAccountPushVO.MiniProgram miniProgram = new WeChatPublicAccountPushVO.MiniProgram();

View File

@ -18,8 +18,14 @@ import java.util.LinkedHashMap;
@Accessors(chain = true)
public class NotifyVO {
/**
* 通知渠道
*/
private NotifyChannel notifyChannel;
/**
* 通知模版
*/
private NotifyTemplate notifyTemplate;
/**
@ -27,7 +33,18 @@ public class NotifyVO {
*/
private String sendAccount;
/**
* 模板参数
*/
private LinkedHashMap<String, String> map;
/**
* 设备ID(用于精准跳转到设备详情页面)
*/
private Long deviceId;
/**
* 通道类型枚举
*/
private NotifyChannelProviderEnum notifyChannelProviderEnum;
}

View File

@ -151,7 +151,7 @@ public class WeChatController {
// 随机字符串
String echostr = request.getParameter("echostr");
// token
String token = "fastbee";
String token = "yackfastbeeiot";
boolean check = SignUtils.checkSignature(token, signature, timestamp, nonce);
PrintWriter writer = response.getWriter();
if (check) {
@ -175,7 +175,7 @@ public class WeChatController {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(responseStr);
} catch (final IOException e) {
log.error("微信回调回复信息回写失败:xmlStr:{},responseStr:{},e:{}", xmlStr, responseStr, e);
log.error("微信回调回复信息回写失败:xmlStr:{},responseStr:{},e:", xmlStr, responseStr, e);
}
}

View File

@ -5,7 +5,7 @@ import cn.hutool.core.util.XmlUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.fastbee.common.enums.SocialPlatformType;
import com.fastbee.common.utils.StringUtils;
import org.apache.commons.lang3.StringUtils;
import com.fastbee.common.utils.uuid.IdUtils;
import com.fastbee.common.utils.wechat.WechatUtils;
import com.fastbee.common.wechat.WeChatAppResult;
@ -20,7 +20,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
/**
@ -46,7 +45,7 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService {
Map<String, Object> map = XmlUtil.xmlToMap(xmlStr);
wxCallBackXmlBO = JSONObject.parseObject(JSON.toJSONString(map), WxCallBackXmlBO.class);
} catch (Exception e) {
log.error("微信回调传递的xml解析报错:{},{}", xmlStr, e);
log.error("微信回调传递的xml解析报错:{},e:", xmlStr, e);
return "";
}
if (ObjectUtil.isNull(wxCallBackXmlBO) || StringUtils.isEmpty(wxCallBackXmlBO.getMsgType())) {
@ -79,10 +78,10 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService {
private String handleEvent(WxCallBackXmlBO wxCallBackXmlBo) {
String resMsg = "";
//事件类型
// 事件类型
String eventStr = wxCallBackXmlBo.getEvent();
if (org.apache.commons.lang3.StringUtils.isNotBlank(eventStr)) {
switch (org.apache.commons.lang3.StringUtils.lowerCase(eventStr)) {
if (StringUtils.isNotBlank(eventStr)) {
switch (StringUtils.lowerCase(eventStr)) {
// 关键词
case "click":
break;
@ -114,7 +113,7 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService {
private String handleEventSubscribe(WxCallBackXmlBO wxCallBackXmlBo) {
// 获取微信公众号appid和secret
String sourceClient = SocialPlatformType.WECHAT_OPEN_PUBLIC_ACCOUNT.getSourceClient();
SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(SocialPlatformType.WECHAT_OPEN_PUBLIC_ACCOUNT.getSourceClient());
SocialPlatform socialPlatform = socialPlatformService.selectSocialPlatformByPlatform(sourceClient);
if (ObjectUtil.isNull(socialPlatform)) {
log.info("请先配置微信开放平台公众号!");
return "";
@ -137,10 +136,17 @@ public class WeChatCallbackServiceImpl implements WeChatCallbackService {
return "";
}
SocialUser socialUser = new SocialUser();
socialUser.setStatus("1").setSource(sourceClient).setSourceClient(sourceClient).setOpenId(openId)
.setUnionId(weChatUserInfo.getUnionId()).setAccessToken(accessToken).setAvatar(weChatUserInfo.getHeadImgUrl())
.setNickname(weChatUserInfo.getNickname()).setUuid(IdUtils.randomUUID()).setCreateBy("System");
socialUser.setCreateTime(new Date());
socialUser.setStatus("1")
.setSource(sourceClient)
.setSourceClient(sourceClient)
.setOpenId(openId)
.setUnionId(weChatUserInfo.getUnionId())
.setAccessToken(accessToken)
.setAvatar(weChatUserInfo.getHeadImgUrl())
.setNickname(weChatUserInfo.getNickname())
.setUuid(IdUtils.randomUUID())
.setCreateBy("System");
//socialUser.setCreateTime(new Date());
socialUserService.insertSocialUser(socialUser);
// 返回消息
return WechatUtils.responseText(wxCallBackXmlBo, socialPlatform.getRemark());