谭斌 2 лет назад
Родитель
Сommit
6055e76577

+ 19 - 0
device-api-cloud/src/main/java/com/xy/feign/DeviceBluetoothAuthFeign.java

@@ -0,0 +1,19 @@
+package com.xy.feign;
+
+import com.xy.service.DeviceBluetoothAuthService;
+import com.xy.FeignInterceptor;
+import com.xy.consts.ServiceConsts;
+import org.springframework.cloud.openfeign.FeignClient;
+
+/**
+ * <p>
+ * 设备蓝牙授权 feign
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-24
+ */
+@FeignClient(value = ServiceConsts.SERVICE_NAME, configuration = FeignInterceptor.class)
+public interface DeviceBluetoothAuthFeign extends DeviceBluetoothAuthService {
+
+}

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

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xy.annotate.RestMappingController;
+import com.xy.dto.DeviceBluetoothAuthDto;
 import com.xy.dto.DeviceInfoDto;
 import com.xy.dto.DeviceStatusDto;
 import com.xy.dto.MercMiniDeviceDto;
@@ -11,17 +12,17 @@ import com.xy.dto.be.MercDto;
 import com.xy.dto.common.MercLineDto;
 import com.xy.dto.common.MercPlaceDto;
 import com.xy.dto.mini.MiniMercRegionDto;
+import com.xy.entity.DeviceBluetoothAuth;
 import com.xy.entity.DeviceInfo;
 import com.xy.enums.MercStatus;
+import com.xy.service.DeviceBluetoothAuthServiceImpl;
 import com.xy.service.DeviceInfoServiceImpl;
 import com.xy.service.be.MercFeignService;
 import com.xy.service.common.MercLineService;
 import com.xy.service.common.MercPlaceService;
-import com.xy.utils.Emptys;
-import com.xy.utils.MercAuthUtils;
-import com.xy.utils.PageBean;
-import com.xy.utils.R;
+import com.xy.utils.*;
 import com.xy.utils.enums.DeviceActiveStateEnum;
+import com.xy.utils.enums.DeviceAuthCodeUseStatus;
 import com.xy.utils.enums.DeviceNetSateType;
 import com.xy.utils.enums.DictSonEnum;
 import io.swagger.annotations.Api;
@@ -36,6 +37,7 @@ import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
 
 import static com.xy.utils.Beans.copy;
@@ -59,6 +61,8 @@ public class MercMiniDeviceController {
     private final MercPlaceService mercPlaceService;
     private final MercLineService mercLineService;
 
+    private final DeviceBluetoothAuthServiceImpl deviceBluetoothAuthService;
+
 
     @ApiOperation("商户设备首页统计")
     @PostMapping("mercHomeStatistical")
@@ -174,6 +178,12 @@ public class MercMiniDeviceController {
         return R.ok(getMyDevices());
     }
 
+
+    /**
+     * 获取登录人的设备
+     *
+     * @return
+     */
     List<Long> getMyDevices() {
         boolean mercAdmin = MercAuthUtils.isMercAdmin();
         Long mercId = MercAuthUtils.getMercId();
@@ -191,5 +201,104 @@ public class MercMiniDeviceController {
 
     }
 
+    @PostMapping("genCode")
+    @ApiOperation("蓝牙开门-生成授权码")
+    public R<Boolean> genCode(@RequestBody @Validated DeviceBluetoothAuthDto.GenCode dto) {
+        Long deviceId = dto.getDeviceId();
+        List<Long> myDevices = getMyDevices();
+        if (!myDevices.contains(deviceId)) {
+            R.fail("抱歉!您无权对此设备进行授权!");
+        }
+        Long mercId = MercAuthUtils.getMercId();
+        DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.<DeviceBluetoothAuth>lambdaQuery()
+                .eq(DeviceBluetoothAuth::getDeviceId, deviceId)
+                .eq(DeviceBluetoothAuth::getMercId, mercId)
+                .eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
+        );
+        String cacheAuthCode = getCacheAuthCode(deviceId);
+        if (deviceBluetoothAuth != null) {
+            if (StrUtil.isNotEmpty(cacheAuthCode)) {
+                R.fail("此设备尚有未使用的授权码:【" + cacheAuthCode + "】,请使用后再来生成!");
+            } else {
+                //已失效了
+                deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.TIME_OUT.getCode()));
+            }
+
+        }
+
+        //授权码生成
+        String authCode = getAuthCode();
+        //缓存
+        setCacheAuthCode(deviceId, authCode);
+        DeviceBluetoothAuth saveInfo = new DeviceBluetoothAuth()
+                .setDeviceId(deviceId)
+                .setMercId(mercId)
+                .setDeviceId(deviceId).setAuthCode(authCode);
+        return R.ok(deviceBluetoothAuthService.save(saveInfo));
+    }
+
+
+    @PostMapping("verificationCode")
+    @ApiOperation("蓝牙开门-校验并使用授权码")
+    public R<Boolean> verificationCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCode dto) {
+        Long deviceId = dto.getDeviceId();
+        String authCode = dto.getAuthCode();
+        String cacheAuthCode = getCacheAuthCode(deviceId);
+        if (!authCode.equals(cacheAuthCode)) {
+            return R.fail("您输入的授权码有误或者无效!");
+        }
+        //验证通过,缓存去掉授权码,并更新状态
+        Long mercId = MercAuthUtils.getMercId();
+        DeviceBluetoothAuth deviceBluetoothAuth = deviceBluetoothAuthService.getOne(Wrappers.<DeviceBluetoothAuth>lambdaQuery()
+                .eq(DeviceBluetoothAuth::getDeviceId, deviceId)
+                .eq(DeviceBluetoothAuth::getAuthCode, authCode)
+                .eq(DeviceBluetoothAuth::getMercId, mercId)
+                .eq(DeviceBluetoothAuth::getUseStatus, DeviceAuthCodeUseStatus.UN_USED.getCode())
+        );
+        if (deviceBluetoothAuth == null) {
+            return R.fail("您输入的授权码无效!");
+        }
+        //缓存去掉授权码
+        delCacheAuthCode(deviceId);
+        deviceBluetoothAuth.setUseStatus(DeviceAuthCodeUseStatus.USED.getCode());
+        deviceBluetoothAuth.setUseUser(AuthorizeUtils.getLoginId(Long.class));
+        deviceBluetoothAuth.setUseTime(LocalDateTime.now());
+        return R.ok(deviceBluetoothAuthService.saveOrUpdate(deviceBluetoothAuth));
+    }
+
+
+    public static final String BASE_NUMBER = "0123456789";
+
+    /**
+     * auth-code有效期30分钟,单位:s ,
+     */
+    public static final Integer AUTH_CODE_TIMEOUT = 1800;
+
+    /**
+     * 随机6位数生成
+     */
+    public static String getAuthCode() {
+        StringBuilder sb = new StringBuilder(6);
+        for (int i = 0; i < 6; i++) {
+            int num = ThreadLocalRandom.current().nextInt(BASE_NUMBER.length());
+            sb.append(BASE_NUMBER.charAt(num));
+        }
+        return sb.toString();
+    }
+
+    public static void setCacheAuthCode(Long deviceId, String code) {
+        RedisService<String> redisService = SpringBeanUtils.getBean(RedisService.class);
+        redisService.set("device:auth:code:" + deviceId, code, AUTH_CODE_TIMEOUT);
+    }
+
+    public static String getCacheAuthCode(Long deviceId) {
+        RedisService<String> redisService = SpringBeanUtils.getBean(RedisService.class);
+        return redisService.get("device:auth:code:" + deviceId);
+    }
+
+    public static void delCacheAuthCode(Long deviceId) {
+        RedisService<String> redisService = SpringBeanUtils.getBean(RedisService.class);
+        redisService.remove("device:auth:code:" + deviceId);
+    }
 
 }

+ 71 - 0
device-api-service/src/main/java/com/xy/entity/DeviceBluetoothAuth.java

@@ -0,0 +1,71 @@
+package com.xy.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备蓝牙授权
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "DeviceBluetoothAuth对象", description = "设备蓝牙授权")
+public class DeviceBluetoothAuth implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    @ApiModelProperty(value = "设备ID")
+    private Long deviceId;
+
+    @ApiModelProperty(value = "商户id")
+    private Long mercId;
+
+    @ApiModelProperty(value = "授权码")
+    private String authCode;
+
+    @ApiModelProperty(value = "使用时间")
+    private LocalDateTime useTime;
+
+    @ApiModelProperty(value = "使用人")
+    private Long useUser;
+
+    @ApiModelProperty(value = "使用状态")
+    private String useStatus;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "更新人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long updateUser;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private LocalDateTime updateTime;
+
+
+}

+ 16 - 0
device-api-service/src/main/java/com/xy/mapper/DeviceBluetoothAuthMapper.java

@@ -0,0 +1,16 @@
+package com.xy.mapper;
+
+import com.xy.entity.DeviceBluetoothAuth;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 设备蓝牙授权 Mapper 接口
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-24
+ */
+public interface DeviceBluetoothAuthMapper extends BaseMapper<DeviceBluetoothAuth> {
+
+}

+ 20 - 0
device-api-service/src/main/java/com/xy/mapper/mapper/DeviceBluetoothAuthMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xy.mapper.DeviceBluetoothAuthMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.xy.entity.DeviceBluetoothAuth">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="merc_id" property="mercId" />
+        <result column="auth_code" property="authCode" />
+        <result column="use_time" property="useTime" />
+        <result column="use_user" property="useUser" />
+        <result column="use_status" property="useStatus" />
+        <result column="create_user" property="createUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+</mapper>

+ 25 - 0
device-api-service/src/main/java/com/xy/service/DeviceBluetoothAuthServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xy.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xy.entity.DeviceBluetoothAuth;
+import com.xy.mapper.DeviceBluetoothAuthMapper;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 设备蓝牙授权 服务实现类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-24
+ */
+@Service
+@AllArgsConstructor
+@Api(tags = "设备蓝牙授权", hidden = true)
+public class DeviceBluetoothAuthServiceImpl extends ServiceImpl<DeviceBluetoothAuthMapper, DeviceBluetoothAuth> implements DeviceBluetoothAuthService {
+
+
+}

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

@@ -0,0 +1,117 @@
+package com.xy.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xy.utils.PageBean;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 设备蓝牙授权
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-24
+ */
+public class DeviceBluetoothAuthDto {
+
+    @Data
+    @Accessors(chain = true)
+    public static class SelectList extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Page extends Vo {
+
+        @ApiModelProperty(value = "分页对象", required = true)
+        private PageBean page;
+
+    }
+
+
+    @Data
+    @Accessors(chain = true)
+    public static class GenCode {
+        @NotNull(message = "设备ID不可为空")
+        @ApiModelProperty(value = "设备ID")
+        private Long deviceId;
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class VerificationCode {
+        @NotNull(message = "设备ID不可为空")
+        @ApiModelProperty(value = "设备ID")
+        private Long deviceId;
+
+
+        @NotNull(message = "授权码不可为空")
+        @ApiModelProperty(value = "授权码")
+        private String authCode;
+
+    }
+
+
+    @Data
+    @Accessors(chain = true)
+    public static class Save extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Update extends Vo {
+
+    }
+
+    @Data
+    @Accessors(chain = true)
+    public static class Vo {
+
+        @ApiModelProperty(value = "id")
+        private Long id;
+
+        @ApiModelProperty(value = "设备ID")
+        private Long deviceId;
+
+        @ApiModelProperty(value = "商户id")
+        private Long mercId;
+
+        @ApiModelProperty(value = "授权码")
+        private String authCode;
+
+        @ApiModelProperty(value = "使用时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime useTime;
+
+        @ApiModelProperty(value = "使用人")
+        private Long useUser;
+
+        @ApiModelProperty(value = "使用状态")
+        private String useStatus;
+
+        @ApiModelProperty(value = "创建人")
+        private Long createUser;
+
+        @ApiModelProperty(value = "创建时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime createTime;
+
+        @ApiModelProperty(value = "更新人")
+        private Long updateUser;
+
+        @ApiModelProperty(value = "更新时间")
+        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+        private LocalDateTime updateTime;
+
+
+    }
+
+}

+ 16 - 0
device-api/src/main/java/com/xy/service/DeviceBluetoothAuthService.java

@@ -0,0 +1,16 @@
+package com.xy.service;
+
+import com.xy.annotate.RestMappingController;
+
+/**
+ * <p>
+ * 设备蓝牙授权 服务类
+ * </p>
+ *
+ * @author 谭斌
+ * @since 2023-03-24
+ */
+@RestMappingController("/device-bluetooth-auth")
+public interface DeviceBluetoothAuthService {
+
+}

+ 49 - 0
device-api/src/main/java/com/xy/utils/enums/DeviceAuthCodeUseStatus.java

@@ -0,0 +1,49 @@
+package com.xy.utils.enums;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.ToString;
+
+/**
+ * 设备授权码使用状态
+ *
+ * @author 谭斌
+ */
+@Getter
+@ToString
+@AllArgsConstructor
+public enum DeviceAuthCodeUseStatus {
+
+
+    UN_USED("1", "未使用"),
+    USED("2", "已使用"),
+    TIME_OUT("3", "已失效");
+
+    /**
+     * 编码值
+     */
+    private String code;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+
+    /**
+     * 通过code获取enum
+     *
+     * @param code
+     * @return
+     */
+    public static DeviceAuthCodeUseStatus getEnumByCode(String code) {
+        DeviceAuthCodeUseStatus[] values = values();
+        for (DeviceAuthCodeUseStatus value : values) {
+            if (value.getCode().equals(code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 43 - 0
device-start/src/main/java/com/xy/GenCode.java

@@ -0,0 +1,43 @@
+package com.xy;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.xy.utils.MybatisGenerator2;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * 自动生成代码
+ */
+@Slf4j
+@Component
+public class GenCode {
+
+    public static void main(String[] args) {
+
+//        MybatisGenerator.Generator.builder().build().create();
+        gen2();
+
+    }
+
+    public static void gen2() {
+        MybatisGenerator2.Generator.builder()
+                .author("谭斌")
+                .commPath("D:\\xy_workspace\\xy-new\\xy-device")
+                .dtoModule("device-api")
+                .dtoPackage("com.xy")
+                .serviceModule("device-api")
+                .servicePackage("com.xy")
+                .implModule("device-api-service")
+                .implPackage("com.xy")
+                .mapperModule("device-api-service")
+                .mapperPackage("com.xy")
+                .feignModule("device-api-cloud")
+                .feignPackage("com.xy")
+                .entityModule("device-api-service")
+                .entityPackage("com.xy")
+                .idType(IdType.ASSIGN_ID)
+                .autoFill(true)
+//                .deleteFieldName("deleted")
+                .build().create();
+    }
+}