Просмотр исходного кода

feat:微信公众号关注/取消关注事件监听

陈长荣 5 месяцев назад
Родитель
Сommit
23db183245

+ 7 - 4
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/alarmuser/entity/AlarmUser.java

@@ -12,16 +12,14 @@
  */
 package vip.xiaonuo.coldchain.modular.alarmuser.entity;
 
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.influxdb.annotations.Column;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
 import vip.xiaonuo.common.pojo.OrgEntity;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
 /**
  * 报警接收人实体
  *
@@ -97,4 +95,9 @@ public class AlarmUser extends OrgEntity {
     @Schema(description = "unionId")
     @Column(name = "union_id")
     private String unionId;
+
+    /**
+     * 是否订阅:0否 1是
+     */
+    private String subscribed;
 }

+ 10 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/alarmuser/enums/AlarmUserEnum.java

@@ -18,13 +18,20 @@ import lombok.Getter;
  * 报警接收人枚举
  *
  * @author 黄渊昊
- * @date  2024/12/02 15:41
+ * @date 2024/12/02 15:41
  **/
 @Getter
 public enum AlarmUserEnum {
 
-    /** 测试 */
-    TEST("TEST");
+    /**
+     * 关注
+     */
+    SUBSCRIBE("1"),
+    /**
+     * 取消关注
+     */
+    UNSUBSCRIBE("0"),
+    ;
 
     private final String value;
 

+ 10 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/alarmuser/service/AlarmUserService.java

@@ -89,4 +89,14 @@ public interface AlarmUserService extends IService<AlarmUser> {
      * @param code
      */
     String getUserInfo(String code, String orgId, String name);
+
+    /**
+     * 关注微信号
+     */
+    AlarmUser subscribe(String openid);
+
+    /**
+     * 取消关注微信号
+     */
+    void unsubscribe(String openid);
 }

+ 25 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/alarmuser/service/impl/AlarmUserServiceImpl.java

@@ -21,6 +21,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -33,6 +34,7 @@ import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.modular.alarmuser.dto.ExtendUserDTO;
 import vip.xiaonuo.coldchain.modular.alarmuser.entity.AlarmUser;
+import vip.xiaonuo.coldchain.modular.alarmuser.enums.AlarmUserEnum;
 import vip.xiaonuo.coldchain.modular.alarmuser.mapper.AlarmUserMapper;
 import vip.xiaonuo.coldchain.modular.alarmuser.param.AlarmUserAddParam;
 import vip.xiaonuo.coldchain.modular.alarmuser.param.AlarmUserEditParam;
@@ -57,7 +59,10 @@ import vip.xiaonuo.sys.modular.user.enums.SysUserStatusEnum;
 import vip.xiaonuo.sys.modular.user.service.SysUserService;
 import vip.xiaonuo.sys.modular.user.service.impl.SysUserServiceImpl;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -254,6 +259,25 @@ public class AlarmUserServiceImpl extends ServiceImpl<AlarmUserMapper, AlarmUser
         return "您已绑定过该组织,已为您更新个人信息";
     }
 
+    @Override
+    public AlarmUser subscribe(String openid) {
+        log.info("用户关注公众号 openid={}", openid);
+        AlarmUser alarmUser = new AlarmUser();
+        alarmUser.setSubscribed(AlarmUserEnum.SUBSCRIBE.getValue());
+        update(alarmUser, new LambdaUpdateWrapper<>(AlarmUser.class).eq(AlarmUser::getOpenId, openid));
+
+        List<AlarmUser> users = getByOpenId(openid);
+        return users.isEmpty() ? null : users.get(0);
+    }
+
+    @Override
+    public void unsubscribe(String openid) {
+        log.info("用户取消关注公众号 openid={}", openid);
+        AlarmUser alarmUser = new AlarmUser();
+        alarmUser.setSubscribed(AlarmUserEnum.UNSUBSCRIBE.getValue());
+        update(alarmUser, new LambdaUpdateWrapper<>(AlarmUser.class).eq(AlarmUser::getOpenId, openid));
+    }
+
     private List<AlarmUser> getByOpenId(String openId) {
         LambdaQueryWrapper<AlarmUser> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(AlarmUser::getOpenId, openId)

+ 22 - 0
snowy-web-app/src/main/java/vip/xiaonuo/weixin/gongzhong/config/WxMpConfiguration.java

@@ -19,6 +19,7 @@ import me.chanjar.weixin.mp.config.impl.WxMpMapConfigImpl;
 import me.chanjar.weixin.mp.enums.WxMpApiUrl;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import vip.xiaonuo.coldchain.modular.alarmuser.entity.AlarmUser;
 import vip.xiaonuo.coldchain.modular.alarmuser.service.AlarmUserService;
 import vip.xiaonuo.coldchain.modular.push.config.PushConfigure;
 import vip.xiaonuo.dev.modular.config.service.DevConfigService;
@@ -102,6 +103,14 @@ public class WxMpConfiguration {
                     @Override
                     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
                         log.info("用户关注 {}", wxMessage);
+                        AlarmUser alarmUser = alarmUserService.subscribe(wxMessage.getFromUser());
+                        if (alarmUser != null) {
+                            return WxMpXmlOutMessage.TEXT()
+                                    .content("【冷链驿站】欢迎回来," + alarmUser.getNickName())
+                                    .fromUser(wxMessage.getToUser())
+                                    .toUser(wxMessage.getFromUser())
+                                    .build();
+                        }
 
                         return WxMpXmlOutMessage.TEXT()
                                 .content("【冷链驿站】为您提供温湿度、二氧化碳等环境监控数据查询及实时报警通知服务。请先<a href=\"" + getAuthUrl() + "\">完善信息</a>")
@@ -118,6 +127,7 @@ public class WxMpConfiguration {
                     @Override
                     public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) {
                         log.info("用户取消关注 {}", wxMessage);
+                        alarmUserService.unsubscribe(wxMessage.getFromUser());
                         return null;
                     }
                 })
@@ -154,6 +164,18 @@ public class WxMpConfiguration {
                 })
                 .end();
 
+        // 发送文字事件
+        router.rule().async(false).msgType(WxConsts.XmlMsgType.TEXT)
+                .handler(new WxMpMessageHandler() {
+                    @Override
+                    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService, WxSessionManager sessionManager) {
+                        log.info("用户发送文字事件 {}", wxMessage);
+                        log.info("用户[{}]发送了:{}", wxMessage.getFromUser(), wxMessage.getContent());
+                        return null;
+                    }
+                })
+                .end();
+
         return router;
     }
 }

+ 8 - 2
snowy-web-app/src/main/java/vip/xiaonuo/weixin/gongzhong/controller/WxMpController.java

@@ -64,7 +64,13 @@ public class WxMpController {
             //检查用户的组织机构
             long count = userList.stream().filter(x -> StrUtil.isNotBlank(x.getCreateOrg())).count();
             if (count > 0) {
-                response.getWriter().println("您已授权!\\^o^/");
+                String redirect = devConfigService.getValueByKey("wx_front_authed_page");
+                if (StrUtil.isNotBlank(redirect)) {
+                    response.sendRedirect(redirect);
+                } else {
+                    response.setCharacterEncoding("UTF-8");
+                    response.getWriter().println("您已授权!\\^o^/");
+                }
                 return;
             }
             alarmUser = userList.get(0);
@@ -79,7 +85,7 @@ public class WxMpController {
                     .last("limit 1"));
         }
 
-        String redirect = devConfigService.getValueByKey("wx_front_auth_page") + "?id=" + alarmUser.getId();
+        String redirect = devConfigService.getValueByKey("wx_front_not_auth_page") + "?id=" + alarmUser.getId();
         log.info("进入用户授权页面 {}", redirect);
         response.sendRedirect(redirect);
     }