Răsfoiți Sursa

Merge remote-tracking branch 'origin/master' into prod

tanbin 2 luni în urmă
părinte
comite
f9a7662fed

+ 45 - 0
device-api-service-merc-mini/src/main/java/com/xy/controller/MercMiniDeviceController.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yitter.idgen.YitIdHelper;
 import com.xy.annotate.RestMappingController;
 import com.xy.annotation.LogOperate;
 import com.xy.collections.list.JArrayList;
@@ -469,6 +470,50 @@ public class MercMiniDeviceController {
         return R.ok(deviceBluetoothAuthService.save(saveInfo));
     }
 
+    @PostMapping("genCodeByAdmin")
+    @ApiOperation("蓝牙开门-平台管理员生成授权码(通用码)")
+    public R<Long> genCodeByAdmin(@RequestBody @Validated DeviceBluetoothAuthDto.GenCodeByAdmin dto) {
+
+        long deviceId = YitIdHelper.nextId();
+
+        // 缓存
+        setCacheAuthCode(deviceId, String.valueOf(deviceId));
+        DeviceBluetoothAuth saveInfo = new DeviceBluetoothAuth()
+                .setDeviceId(deviceId)
+                .setMercId(0L)
+                .setDeviceId(deviceId).setAuthCode(String.valueOf(deviceId));
+        deviceBluetoothAuthService.save(saveInfo);
+        return R.ok(deviceId);
+    }
+
+    @PostMapping("verificationBlueCode")
+    @ApiOperation("蓝牙开门-校验并使用授权码(平台管理员生成)")
+    public R<Boolean> verificationBlueCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCodeByAdmin dto) {
+        String authCode = dto.getAuthCode();
+        String cacheAuthCode = getCacheAuthCode(Long.valueOf(authCode));
+        if (!authCode.equals(cacheAuthCode)) {
+            return R.fail("您输入的授权码有误或者无效!");
+        }
+        // 验证通过,缓存去掉授权码,并更新状态
+//        Long mercId = MercAuthUtils.getMercId();
+        DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.<DeviceBluetoothAuth>lambdaQuery()
+                        .eq(DeviceBluetoothAuth::getDeviceId, Long.valueOf(authCode))
+                        .eq(DeviceBluetoothAuth::getAuthCode, authCode)
+                        .eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
+        );
+        if (deviceBluetoothAuth == null) {
+            return R.fail("您输入的授权码无效!");
+        }
+        // 缓存去掉授权码
+        delCacheAuthCode(Long.valueOf(authCode));
+        deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.USED.getCode());
+        deviceBluetoothAuth.setUseUser(AuthorizeUtils.getLoginId(Long.class));
+        deviceBluetoothAuth.setUseTime(LocalDateTime.now());
+        return R.ok(deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth));
+    }
+
+
+
     @PostMapping("verificationCode")
     @ApiOperation("蓝牙开门-校验并使用授权码")
     public R<Boolean> verificationCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCode dto) {

+ 65 - 7
device-api-service/src/main/java/com/xy/service/DeviceAnnualFeeServiceImpl.java

@@ -17,6 +17,7 @@ import com.xy.collections.list.JList;
 import com.xy.collections.map.JHashMap;
 import com.xy.collections.map.JMap;
 import com.xy.config.DeviceThreadPoolConfig;
+import com.xy.dto.CommandMqtt;
 import com.xy.dto.DeviceAnnualFeeDto;
 import com.xy.dto.MqttUserDto;
 import com.xy.dto.be.MercDto;
@@ -44,10 +45,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static com.xy.utils.PlusBeans.toIPage;
 import static com.xy.utils.PlusBeans.toPageBean;
@@ -83,6 +81,8 @@ public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMappe
 
     private MercService mercService;
 
+    private MqttService mqttService;
+
     @PostMapping("check")
     @ApiOperation("检查")
     public R<String> check(@RequestBody @Validated DeviceAnnualFeeDto.Check check) {
@@ -140,7 +140,7 @@ public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMappe
         if (sysDictRedis == null) {
             return R.fail("code未配置商家");
         }
-        page.setMercId(Long.valueOf(sysDictRedis.getValue()));
+        page.setMercId(Long.valueOf(sysDictRedis.getValue())).setRegisterStatus(true);
         return page(page);
     }
 
@@ -292,6 +292,8 @@ public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMappe
         //发送请求
         FunctionUtils.ParamsNoResult<Map<Long, JSONObject>> sendPost = jsonObjects -> {
             LocalDateTime now = LocalDateTime.now();
+            Map<String, SysDictRedis> map = SysDictUtils.get("mqtt_cmd_templet_task");
+            String value = map.get("env").getValue();
             ThreadPoolUtils.Execute execute = ThreadPoolUtils.excPoll(DeviceThreadPoolConfig.DEVICE_COMMON_POLL, deviceIds.size());
             //多线程逐条发送,发送集合担心参数体过大
             deviceIds.forEach(deviceId -> execute.execute(() -> {
@@ -300,14 +302,24 @@ public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMappe
                                     return;
                                 }
                                 SysDictRedis sysDictRedis = stringSysDictRedisMap.get(String.valueOf(deviceAnnualFee.getMercId()));
-                                String url = JSONUtil.parseObj(sysDictRedis.getValue()).getStr("device_send_url");
+                                JSONObject obj = JSONUtil.parseObj(sysDictRedis.getValue());
+                                String url = obj.getStr("domain");
                                 JSONObject jsonObject = jsonObjects.get(deviceId);
-                                JSONObject result = send(url, jsonObject, "发送设备数据到商家平台");
+                                JSONObject result = send(url + "/device/device-annual-fee/receiveDeviceInfo", jsonObject, "发送设备数据到商家平台");
                                 //修改设备年费注册信息
                                 if (result.getInt("code") == 200) {
                                     deviceAnnualFee.setRegisterStatus(true)
                                             .setRegisterTime(now);
                                     updateById(deviceAnnualFee);
+                                    //发送环境切换指令
+                                    JSONObject env = JSONUtil.parseObj(value);
+                                    JSONObject data = env.getJSONObject("data")
+                                            .set("env", obj.getStr("env"));
+                                    env.set("data", data);
+                                    CommandMqtt commandMqtt = new CommandMqtt()
+                                            .setDeviceId(deviceId)
+                                            .setTemplet(env);
+                                    mqttService.senCommand(Collections.singletonList(commandMqtt));
                                 }
                             })
                             .error(e -> log.error("", e))
@@ -351,6 +363,8 @@ public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMappe
             if (byId != null) {
                 return;
             }
+            MercDto.Vo merc = mercService.obj(new MercDto.Vo().setId(deviceInfo.getMercId())).getData();
+            deviceInfo.setMercName(merc.getName());
             deviceInfoService.save(deviceInfo);
         };
         //设备系统信息
@@ -421,6 +435,50 @@ public class DeviceAnnualFeeServiceImpl extends ServiceImpl<DeviceAnnualFeeMappe
                 });
     }
 
+    @PostMapping("evn")
+    @ApiOperation("切换环境")
+    public R evn(@RequestBody @Validated DeviceAnnualFeeDto.Evn evn) {
+        DeviceInfo deviceInfo = deviceInfoService.getById(evn.getDeviceId());
+        Map<String, SysDictRedis> stringSysDictRedisMap = SysDictUtils.get("merc_device_annual_fee");
+        SysDictRedis sysDictRedis = stringSysDictRedisMap.get(String.valueOf(deviceInfo.getMercId()));
+        JSONObject obj = JSONUtil.parseObj(sysDictRedis.getValue());
+        //切换到商家系统
+        if (evn.getType() == 2) {
+            Map<String, SysDictRedis> map = SysDictUtils.get("mqtt_cmd_templet_task");
+            //发送环境切换指令
+            JSONObject env = JSONUtil.parseObj(map.get("env").getValue());
+            JSONObject data = env.getJSONObject("data")
+                    .set("env", obj.getStr("env"));
+            env.set("data", data);
+            CommandMqtt commandMqtt = new CommandMqtt()
+                    .setDeviceId(evn.getDeviceId())
+                    .setTemplet(env);
+            mqttService.senCommand(Collections.singletonList(commandMqtt));
+        }
+        //切换到兴元系统
+        if (evn.getType() == 1) {
+            String url = obj.getStr("domain");
+            HttpUtils.send(url + "/device/device-annual-fee/evnXy", new JSONObject().set("deviceId", deviceInfo.getDeviceId()), "切换到兴元系统");
+        }
+        return R.ok();
+    }
+
+    @PostMapping("evnXy")
+    @ApiOperation("切换环境到兴元(无token)")
+    public R evnXy(@RequestBody DeviceAnnualFeeDto.Evn evn) {
+        //发送环境切换指令
+        Map<String, SysDictRedis> map = SysDictUtils.get("mqtt_cmd_templet_task");
+        JSONObject env = JSONUtil.parseObj(map.get("env").getValue());
+        JSONObject data = env.getJSONObject("data")
+                .set("env", "prod");
+        env.set("data", data);
+        CommandMqtt commandMqtt = new CommandMqtt()
+                .setDeviceId(evn.getDeviceId())
+                .setTemplet(env);
+        mqttService.senCommand(Collections.singletonList(commandMqtt));
+        return R.ok();
+    }
+
     private JSONObject send(String url, JSONObject params, String msg) {
         return send(url, params, msg, 5000);
     }

+ 48 - 0
device-api-service/src/main/java/com/xy/utils/HttpUtils.java

@@ -0,0 +1,48 @@
+package com.xy.utils;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.xy.error.CommRuntimeException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Map;
+
+@Slf4j
+public class HttpUtils {
+
+    public static JSONObject send(String url, JSONObject params, String msg) {
+        return request(url, params.toString(), msg, null);
+    }
+
+    public static JSONObject send(String url, JSONObject params, String msg, Map<String, String> headers) {
+        return request(url, params.toString(), msg, headers);
+    }
+
+    public static JSONObject send(String url, String body, String msg) {
+        return request(url, body, msg, null);
+    }
+
+    public static JSONObject send(String url, String body, String msg, Map<String, String> headers) {
+        return request(url, body, msg, headers);
+    }
+
+    private static JSONObject request(String url, String body, String msg, Map<String, String> headers) {
+        log.info("{}请求参数:{}", msg, body);
+        String result = HttpRequest.post(url)
+                .body(body)
+                .addHeaders(headers)
+                .timeout(5000)
+                .execute()
+                .body();
+        log.info("{}响应参数:{}", msg, result);
+        JSONObject jsonObject;
+        try {
+            jsonObject = JSONUtil.parseObj(result);
+        } catch (Exception e) {
+            throw new CommRuntimeException(msg + "失败");
+        }
+        return jsonObject;
+    }
+
+}

+ 14 - 0
device-api/src/main/java/com/xy/dto/DeviceAnnualFeeDto.java

@@ -65,6 +65,20 @@ public class DeviceAnnualFeeDto {
 
     }
 
+    @Data
+    @Accessors(chain = true)
+    public static class Evn {
+
+        @NotNull(message = "deviceId不能为空")
+        @ApiModelProperty(value = "设备ID", required = true)
+        private Long deviceId;
+
+        @NotNull(message = "type不能为空")
+        @ApiModelProperty(value = "类型 1=兴元系统 2=商家系统", required = true)
+        private Integer type;
+
+    }
+
     @Data
     @Accessors(chain = true)
     public static class Vo {

+ 19 - 0
device-api/src/main/java/com/xy/dto/DeviceBluetoothAuthDto.java

@@ -48,6 +48,25 @@ public class DeviceBluetoothAuthDto {
         @ApiModelProperty(value = "授权码")
         private String authCode;
 
+    }
+    @Data
+    @Accessors(chain = true)
+    public static class GenCodeByAdmin {
+
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class VerificationCodeByAdmin {
+
+
+
+
+        @NotNull(message = "授权码不可为空")
+        @ApiModelProperty(value = "授权码")
+        private String authCode;
+
     }
 
     @Data

BIN
device-start/src/main/resources/device_annual_fee_templet.xlsx