فهرست منبع

feat:新增获取微信公众号access_token方法
feat:新增获取微信user_info方法
feat:新增根据监控设备id获取监控点位列表接口
feat:新增根据传感器类型获取监控设备型号方法
feat:新增获取监控设备列表方法中根据传感器类型进行查询功能

黄渊昊 6 ماه پیش
والد
کامیت
d323271f36
17فایلهای تغییر یافته به همراه312 افزوده شده و 14 حذف شده
  1. 2 2
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/controller/MonitorDeviceController.java
  2. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/MonitorDeviceService.java
  3. 13 5
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java
  4. 2 2
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/controller/MonitorDeviceTypeController.java
  5. 2 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/service/MonitorDeviceTypeService.java
  6. 9 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/service/impl/MonitorDeviceTypeServiceImpl.java
  7. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/controller/MonitorTargetController.java
  8. 10 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/controller/MonitorTargetRegionController.java
  9. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/entity/MonitorTargetRegion.java
  10. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/param/MonitorTargetRegionPageParam.java
  11. 5 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/MonitorTargetRegionService.java
  12. 9 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java
  13. 31 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/config/PushConfigure.java
  14. 85 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/entity/WeChatUser.java
  15. 34 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/utils/PushUtil.java
  16. 104 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/utils/WeChatUtil.java
  17. 2 1
      snowy-web-app/src/main/resources/application.properties

+ 2 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/controller/MonitorDeviceController.java

@@ -130,8 +130,8 @@ public class MonitorDeviceController {
     @Operation(summary = "获取监控设备列表")
     @SaCheckPermission("/coldchain/monitordevice/list")
     @GetMapping("/coldchain/monitordevice/list")
-    public CommonResult<List<MonitorDevice>> list(Boolean isAll) {
-        return CommonResult.data(monitorDeviceService.myList(isAll));
+    public CommonResult<List<MonitorDevice>> list(Boolean isAll,String sensorType) {
+        return CommonResult.data(monitorDeviceService.myList(isAll,sensorType));
     }
 
     /**

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/MonitorDeviceService.java

@@ -100,7 +100,7 @@ public interface MonitorDeviceService extends IService<MonitorDevice> {
 
     List<SensorData> querySensorData(String deviceId, int roads, Instant startTime, Instant endTime, List<QueryCondition> queryConditions);
 
-    List<MonitorDevice> myList(Boolean isAll);
+    List<MonitorDevice> myList(Boolean isAll,String sensorType);
 
     boolean getByDeviceName(String deviceName);
 

+ 13 - 5
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -250,14 +250,22 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
 
 
     @Override
-    public List<MonitorDevice> myList(Boolean isAll) {
-        LambdaQueryWrapper<MonitorDevice> queryWrapper = new LambdaQueryWrapper<>();
+    public List<MonitorDevice> myList(Boolean isAll,String sensorType) {
+        LambdaQueryWrapper<MonitorDevice> deviceQueryWrapper = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<MonitorDeviceType> typeQueryWrapper = new LambdaQueryWrapper<>();
+        if (sensorType != null) {
+            typeQueryWrapper.eq(MonitorDeviceType::getSensorType, sensorType).eq(MonitorDeviceType::getDeleteFlag,CommonDeleteFlagEnum.NOT_DELETE);
+        }
+        List<MonitorDeviceType> list = monitorDeviceTypeService.list(typeQueryWrapper);
+        for (MonitorDeviceType deviceType : list) {
+            deviceQueryWrapper.or().eq(MonitorDevice::getModelName,deviceType.getId());
+        }
         if (!isAll) {
-            queryWrapper.eq(MonitorDevice::getStatus, MonitorDeviceStatusEnum.NORMAL.getValue())
+            deviceQueryWrapper.eq(MonitorDevice::getStatus, MonitorDeviceStatusEnum.NORMAL.getValue())
                     .orderByAsc(MonitorDevice::getSortCode);
         }
-        queryWrapper.eq(MonitorDevice::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
-        return list(queryWrapper);
+        deviceQueryWrapper.eq(MonitorDevice::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+        return list(deviceQueryWrapper);
     }
 
     // 通用更新方法,避免代码重复,并处理 timestamp 为空的情况

+ 2 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/controller/MonitorDeviceTypeController.java

@@ -127,8 +127,8 @@ public class MonitorDeviceTypeController {
     @Operation(summary = "获取监控设备类型列表")
     @SaCheckPermission("/coldchain/monitordevicetype/list")
     @GetMapping("/coldchain/monitordevicetype/list")
-    public CommonResult<List<MonitorDeviceType>> list() {
-        return CommonResult.data(monitorDeviceTypeService.list());
+    public CommonResult<List<MonitorDeviceType>> list(String sensorType) {
+        return CommonResult.data(monitorDeviceTypeService.myList(sensorType));
     }
 
     /**

+ 2 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/service/MonitorDeviceTypeService.java

@@ -81,4 +81,6 @@ public interface MonitorDeviceTypeService extends IService<MonitorDeviceType> {
     boolean getByName(String name);
 
     boolean getByCode(String code);
+
+    List<MonitorDeviceType> myList(String sensorType);
 }

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/service/impl/MonitorDeviceTypeServiceImpl.java

@@ -95,6 +95,15 @@ public class MonitorDeviceTypeServiceImpl extends ServiceImpl<MonitorDeviceTypeM
         return !types.isEmpty();
     }
 
+    @Override
+    public List<MonitorDeviceType> myList(String sensorType) {
+        LambdaQueryWrapper<MonitorDeviceType> queryWrapper = new LambdaQueryWrapper<>();
+        if (sensorType != null) {
+            queryWrapper.eq(MonitorDeviceType::getSensorType, sensorType);
+        }
+        return list(queryWrapper);
+    }
+
     public List<MonitorDeviceType> getTypeByName(String name) {
         return this.list(new LambdaQueryWrapper<MonitorDeviceType>()
                 .eq(MonitorDeviceType::getName, name).eq(MonitorDeviceType::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE));

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/controller/MonitorTargetController.java

@@ -148,7 +148,7 @@ public class MonitorTargetController {
     @Operation(summary = "获取监控对象列表")
     @SaCheckPermission("/coldchain/monitortarget/list")
     @GetMapping("/coldchain/monitortarget/list")
-    public CommonResult<List<MonitorTarget>> list(Boolean isAll) {
+    public CommonResult<List<MonitorTarget>> list(Boolean isAll,String sensorType) {
         return CommonResult.data(monitorTargetService.myList(isAll));
     }
 }

+ 10 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/controller/MonitorTargetRegionController.java

@@ -141,4 +141,14 @@ public class MonitorTargetRegionController {
     public CommonResult<List<MonitorTargetRegion>> listByTargetId(String targetId) {
         return CommonResult.data(monitorTargetRegionService.listByTargetId(targetId));
     }
+
+    /**
+     * 根据检测设备id获取监测点位列表
+     */
+    @Operation(summary = "根据检测设备id获取监测点位列表")
+    @SaCheckPermission("/coldchain/monitordevice/getRegionByDeviceId")
+    @GetMapping("/coldchain/monitordevice/getRegionByDeviceId")
+    public CommonResult<List<MonitorTargetRegion>> listByDeviceId(String deviceId) {
+        return CommonResult.data(monitorTargetRegionService.listByDeviceId(deviceId));
+    }
 }

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/entity/MonitorTargetRegion.java

@@ -168,7 +168,7 @@ public class MonitorTargetRegion extends CommonEntity {
      */
     @Schema(description = "告警接收人,存储告警通知的接收用户信息")
     @TableField(value = "alarm_users", typeHandler = SensorAlarmUserTypeHandler.class)
-    @JsonIgnore
+//    @JsonIgnore
     private List<SensorAlarmUser> alarmUsers = Lists.newArrayList();
 
     /**

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/param/MonitorTargetRegionPageParam.java

@@ -65,7 +65,7 @@ public class MonitorTargetRegionPageParam {
     /**
      * 监控监控对象
      */
-    @Schema(description = "监控监控对象")
+    @Schema(description = "监控对象")
     private String monitorTargetId;
 
 }

+ 5 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/MonitorTargetRegionService.java

@@ -106,4 +106,9 @@ public interface MonitorTargetRegionService extends IService<MonitorTargetRegion
      * 获取已使用总路数
      */
     Integer getUsedSensorCount();
+
+    /**
+     * 根据检测设备id获取监测点位列表
+     */
+    List<MonitorTargetRegion> listByDeviceId(String deviceId);
 }

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java

@@ -210,6 +210,15 @@ public class MonitorTargetRegionServiceImpl extends ServiceImpl<MonitorTargetReg
         return (int)count();
     }
 
+    @Override
+    public List<MonitorTargetRegion> listByDeviceId(String deviceId) {
+        LambdaQueryWrapper<MonitorTargetRegion> queryWrapper = new LambdaQueryWrapper<>();
+        if (deviceId != null) {
+            queryWrapper.eq(MonitorTargetRegion::getMonitorDeviceId, deviceId);
+        }
+        return list(queryWrapper);
+    }
+
     private void fillParentLocationInfo(List<MonitorTargetRegion> resourceList) {
         if (CollUtil.isNotEmpty(resourceList)) {
             List<MonitorTargetRegion> locationTypes = resourceList.stream().filter(distinctByKey(MonitorTargetRegion::getParentId)).collect(Collectors.toList());

+ 31 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/config/PushConfigure.java

@@ -35,6 +35,12 @@ public class PushConfigure {
      */
     private static String pagePath;
 
+//    private static String redirectUrl;
+
+    private static String accessTokenUrl;
+
+    private static String userInfoUrl;
+
     public static String getAppId() {
         return appId;
     }
@@ -74,4 +80,29 @@ public class PushConfigure {
     public void setPagePath(String pagePath) {
         PushConfigure.pagePath = pagePath;
     }
+
+//    public static String getRedirectUrl() {
+//        return redirectUrl;
+//    }
+//
+//    public void setRedirectUrl(String redirectUrl) {
+//        PushConfigure.redirectUrl = redirectUrl;
+//    }
+
+    public static String getAccessTokenUrl() {
+        return accessTokenUrl;
+    }
+
+    public void setAccessTokenUrl(String getAccessTokenUrl) {
+        PushConfigure.accessTokenUrl = getAccessTokenUrl;
+    }
+
+    public static String getUserInfoUrl() {
+        return userInfoUrl;
+    }
+
+    public void setUserInfoUrl(String getUserInfoUrl) {
+        PushConfigure.userInfoUrl = getUserInfoUrl;
+    }
+
 }

+ 85 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/entity/WeChatUser.java

@@ -0,0 +1,85 @@
+package vip.xiaonuo.coldchain.modular.push.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+@Getter
+@Setter
+public class WeChatUser {
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 用户唯一标识
+     */
+    private String openid;
+
+    /**
+     * access_token
+     */
+    private String accessToken;
+
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+
+    /**
+     * 性别(0未知,1男性,2女性)
+     */
+    private String sex;
+
+    /**
+     * 用户省份
+     */
+    private String province;
+
+    /**
+     * 用户城市
+     */
+    private String city;
+
+    /**
+     * 国家
+     */
+    private String country;
+
+    /**
+     * 用户头像
+     */
+    private String avatar;
+
+    /**
+     * 用户特权信息,json 数组
+     */
+    private String privilege;
+
+    /**
+     * unionid
+     */
+    private String unionid;
+
+    /**
+     * 创建用户
+     */
+    private String createUser;
+
+    /**
+     * 更新用户
+     */
+    private String updateUser;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createDate;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateDate;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/utils/PushUtil.java

@@ -2,6 +2,8 @@ package vip.xiaonuo.coldchain.modular.push.utils;
 
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
 import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
@@ -9,15 +11,27 @@ import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 import me.chanjar.weixin.mp.config.WxMpConfigStorage;
 import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
 import vip.xiaonuo.coldchain.modular.push.config.PushConfigure;
+import vip.xiaonuo.coldchain.modular.push.entity.WeChatUser;
 import vip.xiaonuo.coldchain.modular.push.param.PushParam;
 
+import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.Map;
 import java.util.Objects;
 
 /**
  * 推送类
  */
 public class PushUtil {
+    private final static String TOKEN = "abcd1234";
+    private final static String ENCODING = "UTF-8";
+    private final static String ACCESS_TOKEN = "access_token";
+    private final static String REFRESH_TOKEN = "refresh_token";
+    private final static String OPEN_ID = "openid";
+    private final static String NICK_NAME = "nickname";
+    private final static String SEX = "sex";
+    private final static String HEAD_IMG_URL = "headimgurl";
+
     private static WxMpConfigStorage wxMpConfigStorage() {
         WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
         config.setAppId(PushConfigure.getAppId());
@@ -81,4 +95,24 @@ public class PushUtil {
         }
         return pushCode;
     }
+
+    public static WeChatUser getUserInfo(String code) {
+        Map<?, ?> result = WeChatUtil.getAccessToken(code);
+        String accessToken = result.get(ACCESS_TOKEN).toString();
+        String openid = result.get(OPEN_ID).toString();
+        String userInfoJsom = WeChatUtil.getUserInfo(accessToken, openid);
+        // 解析JSON数据
+        JSONObject jsonObject = new JSONObject(userInfoJsom);
+
+        // 设置相关实体属性
+        WeChatUser weChatUser = new WeChatUser();
+        weChatUser.setAccessToken(accessToken);
+        weChatUser.setCreateDate(LocalDateTime.now());
+        weChatUser.setUpdateDate(LocalDateTime.now());
+        weChatUser.setOpenid(openid);
+        weChatUser.setNickname(jsonObject.getStr(NICK_NAME));
+        weChatUser.setSex(jsonObject.getStr(SEX));
+        weChatUser.setAvatar(jsonObject.getStr(HEAD_IMG_URL));
+        return weChatUser;
+    }
 }

+ 104 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/utils/WeChatUtil.java

@@ -0,0 +1,104 @@
+package vip.xiaonuo.coldchain.modular.push.utils;
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import vip.xiaonuo.coldchain.modular.push.config.PushConfigure;
+
+import java.util.Map;
+
+
+
+/**
+ * 微信登录工具类
+ *
+ */
+public class WeChatUtil {
+
+    private final static String ERROR_CODE = "errcode";
+    private final static String accessTokenUrl = PushConfigure.getAccessTokenUrl();
+    private final static String appId = PushConfigure.getAppId();
+    private final static String secret = PushConfigure.getSecret();
+    private final static String userInfoUrl = PushConfigure.getUserInfoUrl();
+
+    /**
+     * 获取微信授权code
+     *
+     * @param state state信息
+     * @return 返回微信授权code的URL
+     */
+//    public static String getUrl() {
+//
+//        try {
+//            StringBuffer url = new StringBuffer();
+//            url.append(GET_CODE_URL)
+//                    .append("?appid=")
+//                    .append(APPID)
+//                    .append("&redirect_uri=")
+//                    .append(URLEncoder.encode(REDIRECT_URL, "UTF-8"))
+//                    .append("&response_type=code&scope=snsapi_userinfo&state=STATE")
+//                    .append("#wechat_redirect");
+//            return url.toString();
+//        } catch (UnsupportedEncodingException e) {
+//            throw new RuntimeException("URL格式化异常");
+//        }
+//
+//    }
+
+    /**
+     * 获取微信AccessToken
+     *
+     * @param code 用户code
+     * @return 返回包含微信AccessToken的Map
+     */
+    public static Map<?, ?> getAccessToken(String code) {
+        StringBuffer url = new StringBuffer();
+        url.append(accessTokenUrl)
+                .append("?appid=").append(appId)
+                .append("&secret=").append(secret)
+                .append("&code=").append(code)
+                .append("&grant_type=authorization_code");
+        String rs = HttpUtil.get(url.toString());
+        Map<?, ?> map = JSONObject.parseObject(rs, Map.class);
+        if (null == map.get(ERROR_CODE)) {
+            return map;
+        } else {
+            throw new RuntimeException("获取access_token出错");
+        }
+    }
+
+    /**
+     * 刷新AccessToken
+     *
+     * @param refreshToken 用户刷新token
+     * @return 返回包含刷新后的微信AccessToken的Map
+     */
+//    public static Map<?, ?> refreshToken(String refreshToken) {
+//        StringBuffer url = new StringBuffer();
+//        url.append(REFRESH_TOKEN_URL)
+//                .append("?appid=").append(APPID)
+//                .append("&grant_type=refresh_token&refresh_token=").append(refreshToken);
+//        String rs = HttpUtil.get(url.toString());
+//        Map<?, ?> map = JSONObject.parseObject(rs, Map.class);
+//        if (null == map.get(ERROR_CODE)) {
+//            return map;
+//        } else {
+//            throw new RuntimeException("刷新access_token出错");
+//        }
+//    }
+
+    /**
+     * 获取用户信息
+     *
+     * @param accessToken 微信AccessToken
+     * @param openid 用户的openid
+     * @return 返回包含用户信息的JSON字符串
+     */
+    public static String getUserInfo(String accessToken, String openid) {
+        StringBuffer url = new StringBuffer();
+        url.append(userInfoUrl)
+                .append("?access_token=").append(accessToken)
+                .append("&openid=").append(openid)
+                .append("&lang=zh_CN");
+        return HttpUtil.get(url.toString());
+    }
+}

+ 2 - 1
snowy-web-app/src/main/resources/application.properties

@@ -243,4 +243,5 @@ wechat.appID=wx49b1fb6f9c0d0b8d
 wechat.secret=6b177348efc2b21da105fc126b933db9
 wechat.templateId=WgKOAJrnNhnr2lIkfI_vppfY--7oImjddrd4GPnE_UA
 wechat.miniProgram=wx1eebc072a607c055
-wechat.pagePath=/pages/message/message
+wechat.getAccessTokenUrl=https://api.weixin.qq.com/sns/oauth2/access_token
+wechat.getUserInfoUrl=https://api.weixin.qq.com/sns/userinfo