瀏覽代碼

add
加密

18339543638 5 月之前
父節點
當前提交
2f0585c85d

+ 2 - 0
tr-modules-api/tr-module-system-api/src/main/java/cn/tr/module/api/sys/tenant/SysTenantApi.java

@@ -10,4 +10,6 @@ import java.util.*;
 
 
 public interface SysTenantApi {
 public interface SysTenantApi {
     List<SysTenantPojo> selectAll();
     List<SysTenantPojo> selectAll();
+
+    SysTenantPojo selectByCode(String code);
 }
 }

+ 5 - 0
tr-modules-api/tr-module-system-api/src/main/java/cn/tr/module/api/sys/tenant/SysTenantPojo.java

@@ -29,6 +29,11 @@ public class SysTenantPojo implements Serializable {
      */
      */
     private String type;
     private String type;
 
 
+    /*
+    密码
+     */
+    private String password;
+
     /**
     /**
      * 租户状态 0、开启 1、关闭
      * 租户状态 0、开启 1、关闭
      */
      */

+ 17 - 27
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/controller/BizDeviceController.java

@@ -1,9 +1,12 @@
 package cn.tr.module.airway.controller;
 package cn.tr.module.airway.controller;
 
 
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.crypto.symmetric.AES;
+import cn.tr.core.annotation.TenantIgnore;
+import cn.tr.module.airway.dto.BizCommonCipherDTO;
+import cn.tr.module.airway.dto.BizDeviceAutoRegisterDTO;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.tr.core.validation.Insert;
-import cn.tr.core.validation.Update;
 import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.CommonResult;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
@@ -19,7 +22,6 @@ import cn.tr.module.airway.dto.BizDeviceQueryDTO;
 import java.util.*;
 import java.util.*;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.mybatis.base.BaseController;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
-import cn.tr.module.api.sys.log.annotation.OperateLog;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.pojo.TableDataInfo;
 /**
 /**
  * 安卓设备控制器
  * 安卓设备控制器
@@ -51,30 +53,18 @@ public class BizDeviceController extends BaseController{
         return CommonResult.success(bizDeviceService.selectBizDeviceById(id));
         return CommonResult.success(bizDeviceService.selectBizDeviceById(id));
     }
     }
 
 
-    @ApiOperationSupport(author = "lf",order = 3)
-    @ApiOperation(value="添加安卓设备",notes = "权限: airway:device:add")
-    @PostMapping("/add")
-    @OperateLog
-    @SaCheckPermission("airway:device:add")
-    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) BizDeviceDTO source) {
-        return CommonResult.success(bizDeviceService.insertBizDevice(source));
-    }
 
 
-    @ApiOperationSupport(author = "lf",order = 4)
-    @ApiOperation(value="通过主键id编辑安卓设备",notes = "权限: airway:device:edit")
-    @PostMapping("/edit")
-    @OperateLog
-    @SaCheckPermission("airway:device:edit")
-    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) BizDeviceDTO source) {
-        return CommonResult.success(bizDeviceService.updateBizDeviceById(source));
-    }
-
-    @ApiOperationSupport(author = "lf",order = 5)
-    @ApiOperation(value="删除安卓设备",notes = "权限: airway:device:remove")
-    @PostMapping("/removeByIds")
-    @OperateLog
-    @SaCheckPermission("airway:device:remove")
-    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
-        return CommonResult.success(bizDeviceService.removeBizDeviceByIds(ids));
+    /**
+     * 对称+非对称
+     * @param source
+     * @return
+     */
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="设备端自动注册",notes = "设备注册完成后,加密参数")
+    @PostMapping("/autoRegister")
+    @SaIgnore
+    @TenantIgnore
+    public CommonResult<Boolean> autoRegister(@RequestBody@Validated BizDeviceAutoRegisterDTO source) {
+        return CommonResult.success(bizDeviceService.autoRegisterOrUpdate(source));
     }
     }
 }
 }

+ 20 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizCommonCipherDTO.java

@@ -0,0 +1,20 @@
+package cn.tr.module.airway.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@ApiModel("加密数据传输")
+@Data
+public class BizCommonCipherDTO implements Serializable {
+    @ApiModelProperty(value = "医院编码",required = true)
+    @NotBlank(message = "医院编码不能为空")
+    private String hospitalCode;
+
+    @ApiModelProperty(value = "加密数据",required = true)
+    @NotBlank(message = "加密数据不能为空")
+    private String encryptData;
+}

+ 35 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/dto/BizDeviceAutoRegisterDTO.java

@@ -0,0 +1,35 @@
+package cn.tr.module.airway.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 安卓设备传输对象
+ *
+ * @author lf
+ * @date  2025/06/30 13:36
+ **/
+@Data
+@ApiModel("安卓设备自动注册及更新传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class BizDeviceAutoRegisterDTO extends BizCommonCipherDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "加密参数-设备唯一标识", position = 2,accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private String deviceCode;
+
+    @ApiModelProperty(value = "加密参数-安卓版本号", position = 3,accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private String androidType;
+
+    @ApiModelProperty(value = "加密参数-气道软件版本号", position = 4,accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private String airwayType;
+
+    @ApiModelProperty(value = "加密参数-设备型号", position = 5,accessMode = ApiModelProperty.AccessMode.READ_ONLY)
+    private String deviceType;
+}

+ 3 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/mapper/BizDeviceMapper.java

@@ -1,5 +1,6 @@
 package cn.tr.module.airway.mapper;
 package cn.tr.module.airway.mapper;
 
 
+import cn.tr.module.airway.dto.BizDeviceAutoRegisterDTO;
 import cn.tr.module.airway.po.BizDevicePO;
 import cn.tr.module.airway.po.BizDevicePO;
 import cn.tr.module.airway.dto.BizDeviceDTO;
 import cn.tr.module.airway.dto.BizDeviceDTO;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapper;
@@ -19,6 +20,8 @@ public interface BizDeviceMapper {
 
 
     BizDevicePO convertPO(BizDeviceDTO source);
     BizDevicePO convertPO(BizDeviceDTO source);
 
 
+    BizDevicePO convertPO(BizDeviceAutoRegisterDTO source);
+
     BizDeviceDTO convertDto(BizDevicePO source);
     BizDeviceDTO convertDto(BizDevicePO source);
 
 
     List<BizDeviceDTO> convertDtoList(List<BizDevicePO> source);
     List<BizDeviceDTO> convertDtoList(List<BizDevicePO> source);

+ 3 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/IBizDeviceService.java

@@ -1,5 +1,6 @@
 package cn.tr.module.airway.service;
 package cn.tr.module.airway.service;
 
 
+import cn.tr.module.airway.dto.BizDeviceAutoRegisterDTO;
 import cn.tr.module.airway.dto.BizDeviceDTO;
 import cn.tr.module.airway.dto.BizDeviceDTO;
 import cn.tr.module.airway.dto.BizDeviceQueryDTO;
 import cn.tr.module.airway.dto.BizDeviceQueryDTO;
 import java.util.*;
 import java.util.*;
@@ -51,4 +52,6 @@ public interface IBizDeviceService{
      * @date    2025/06/30 13:36
      * @date    2025/06/30 13:36
      */
      */
     int removeBizDeviceByIds(Collection<String> ids);
     int removeBizDeviceByIds(Collection<String> ids);
+
+    Boolean autoRegisterOrUpdate(BizDeviceAutoRegisterDTO source);
 }
 }

+ 39 - 1
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/service/impl/BizDeviceServiceImpl.java

@@ -1,6 +1,11 @@
 package cn.tr.module.airway.service.impl;
 package cn.tr.module.airway.service.impl;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.airway.dto.BizDeviceAutoRegisterDTO;
+import cn.tr.module.airway.utils.AESUtil;
+import cn.tr.module.api.sys.tenant.SysTenantApi;
+import cn.tr.module.api.sys.tenant.SysTenantPojo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
@@ -11,6 +16,8 @@ import cn.tr.module.airway.repository.BizDeviceRepository;
 import cn.tr.module.airway.po.BizDevicePO;
 import cn.tr.module.airway.po.BizDevicePO;
 import cn.tr.module.airway.dto.BizDeviceDTO;
 import cn.tr.module.airway.dto.BizDeviceDTO;
 import cn.tr.module.airway.dto.BizDeviceQueryDTO;
 import cn.tr.module.airway.dto.BizDeviceQueryDTO;
+
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.*;
 import cn.tr.module.airway.service.IBizDeviceService;
 import cn.tr.module.airway.service.IBizDeviceService;
 import cn.tr.module.airway.mapper.BizDeviceMapper;
 import cn.tr.module.airway.mapper.BizDeviceMapper;
@@ -25,6 +32,8 @@ public class BizDeviceServiceImpl implements IBizDeviceService {
     @Autowired
     @Autowired
     private BizDeviceRepository baseRepository;
     private BizDeviceRepository baseRepository;
 
 
+    @Autowired
+    private SysTenantApi tenantApi;
 
 
     /**
     /**
     * 根据条件查询安卓设备
     * 根据条件查询安卓设备
@@ -88,5 +97,34 @@ public class BizDeviceServiceImpl implements IBizDeviceService {
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
         }
         }
         return baseRepository.deleteBatchIds(ids);
         return baseRepository.deleteBatchIds(ids);
-    };
+    }
+
+    @Override
+    public Boolean autoRegisterOrUpdate(BizDeviceAutoRegisterDTO source) {
+        String encryptData = source.getEncryptData();
+        String hospitalCode = source.getHospitalCode();
+        SysTenantPojo tenant = tenantApi.selectByCode(hospitalCode);
+        if(ObjectUtil.isNull(tenant)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"医院编码不存在");
+        }
+        try {
+            BizDeviceAutoRegisterDTO parseBean = AESUtil.decryptDataParseBody(encryptData, tenant.getPassword().getBytes(StandardCharsets.UTF_8), BizDeviceAutoRegisterDTO.class);
+            BizDevicePO device = BizDeviceMapper.INSTANCE.convertPO(parseBean);
+            device.setTenantId(tenant.getTenantId());
+            BizDevicePO exist = baseRepository.selectOne(new LambdaQueryWrapper<BizDevicePO>()
+                    .eq(BizDevicePO::getDeviceCode, device.getDeviceCode())
+                    .last("limit 1"));
+            if(ObjectUtil.isNotNull(exist)){
+                device.setId(exist.getId());
+                baseRepository.updateById(device);
+            }else {
+                baseRepository.insert(device);
+            }
+        }catch (Exception e){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"医院密码错误");
+        }
+        return Boolean.TRUE;
+    }
+
+    ;
 }
 }

+ 59 - 0
tr-modules/tr-modeul-airway/src/main/java/cn/tr/module/airway/utils/AESUtil.java

@@ -0,0 +1,59 @@
+package cn.tr.module.airway.utils;
+
+import cn.hutool.json.JSONUtil;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+public class AESUtil {
+    private static final String ALGORITHM = "AES";
+    private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
+
+    public static String encryptData(String plaintext, byte[] key) throws Exception {
+        // 创建 AES 加密器
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+        SecretKeySpec secretKeySpec = new SecretKeySpec(key, ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
+
+        // 加密数据
+        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
+
+        // 将加密后的字节数组转换为 Base64 编码的字符串
+        return Base64.getEncoder().encodeToString(encryptedBytes);
+    }
+
+    public static String decryptData(String encryptedBase64, byte[] key) throws Exception {
+        // 将 Base64 编码的字符串转换为字节数组
+        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedBase64);
+
+        // 创建 AES 解密器
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+        SecretKeySpec secretKeySpec = new SecretKeySpec(key, ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
+
+        // 解密数据
+        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
+
+        // 将解密后的字节数组转换为字符串
+        return new String(decryptedBytes, StandardCharsets.UTF_8);
+    }
+
+    public static <T>T decryptDataParseBody(String encryptedBase64, byte[] key,Class<T> tClass) throws Exception {
+        // 将 Base64 编码的字符串转换为字节数组
+        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedBase64);
+
+        // 创建 AES 解密器
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+        SecretKeySpec secretKeySpec = new SecretKeySpec(key, ALGORITHM);
+        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
+
+        // 解密数据
+        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
+
+        // 将解密后的字节数组转换为字符串
+        String s = new String(decryptedBytes, StandardCharsets.UTF_8);
+        return JSONUtil.toBean(s, tClass);
+    }
+}

+ 7 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/mapper/SysTenantMapper.java

@@ -38,6 +38,13 @@ public interface SysTenantMapper {
     )
     )
     List<SysTenantPojo> toPojoList(List<SysTenantPO> source);
     List<SysTenantPojo> toPojoList(List<SysTenantPO> source);
 
 
+    @Mappings(
+            {
+                    @Mapping(target = "tenantId",source = "id")
+            }
+    )
+    SysTenantPojo toPojo(SysTenantPO source);
+
     SysTenantPO toPO(SysTenantAndRoleAddDTO source);
     SysTenantPO toPO(SysTenantAndRoleAddDTO source);
     SysTenantPO toPONoPackage(SysTenantAddNoPackageDTO source);
     SysTenantPO toPONoPackage(SysTenantAddNoPackageDTO source);
 }
 }

+ 6 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/po/SysTenantPO.java

@@ -18,6 +18,12 @@ public class SysTenantPO extends BasePO {
     @ApiModelProperty("租户id")
     @ApiModelProperty("租户id")
     private String id;
     private String id;
 
 
+    @ApiModelProperty("医院编码")
+    private String code;
+
+    @ApiModelProperty("医院密码")
+    private String password;
+
     @ApiModelProperty("租户名称")
     @ApiModelProperty("租户名称")
     private String name;
     private String name;
 
 

+ 8 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/provider/SysTenantApiProvider.java

@@ -3,6 +3,7 @@ package cn.tr.module.sys.user.provider;
 import cn.tr.module.api.sys.tenant.SysTenantApi;
 import cn.tr.module.api.sys.tenant.SysTenantApi;
 import cn.tr.module.api.sys.tenant.SysTenantPojo;
 import cn.tr.module.api.sys.tenant.SysTenantPojo;
 import cn.tr.module.sys.tenant.mapper.SysTenantMapper;
 import cn.tr.module.sys.tenant.mapper.SysTenantMapper;
+import cn.tr.module.sys.tenant.po.SysTenantPO;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,4 +25,11 @@ public class SysTenantApiProvider implements SysTenantApi {
     public List<SysTenantPojo> selectAll() {
     public List<SysTenantPojo> selectAll() {
         return SysTenantMapper.INSTANCE.toPojoList(repository.selectList(new LambdaQueryWrapper<>()));
         return SysTenantMapper.INSTANCE.toPojoList(repository.selectList(new LambdaQueryWrapper<>()));
     }
     }
+
+    @Override
+    public SysTenantPojo selectByCode(String code) {
+        return SysTenantMapper.INSTANCE.toPojo(repository.selectOne(new LambdaQueryWrapper<SysTenantPO>()
+                .eq(SysTenantPO::getCode,code)
+                .last("limit 1")));
+    }
 }
 }

+ 1 - 1
tr-test/src/main/resources/application-doc.yml

@@ -1,5 +1,5 @@
 knife4j:
 knife4j:
-  enable: true
+  enable: false
   openapi:
   openapi:
     title: 气道监测
     title: 气道监测
     description: 该接口文档用于开发基础功能
     description: 该接口文档用于开发基础功能