Переглянути джерело

feature: 卡务中心->卡务操作模块
1.PtBagBo.java增加了操作金额、操作模式属性,以方便处理充值与退款的逻辑
2.增加了对系统注册信息处理,ISysRegisterInfo
3.增加了对注册与卡余的加解密的通用方法
3.将注册信息与加密key写入缓存

luoyb 1 рік тому
батько
коміт
8584c5e349

+ 14 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -70,4 +70,18 @@ public interface CacheNames {
      */
     String ONLINE_TOKEN = "online_tokens";
 
+    /**
+     * 客户公钥
+     */
+    String CUSTOM_PUB_KEY = "customer_pub_key#30d";
+    /**
+     * 客户私钥
+     */
+    String CUSTOM_PRI_KEY = "customer_pri_key#30d";
+
+    /**
+     * 用户卡余加解密密钥
+     */
+    String USER_SECRET_KEY = "user_secret_key#30d";
+
 }

+ 92 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/BalanceUpdateEnum.java

@@ -0,0 +1,92 @@
+package org.dromara.common.core.enums;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * name: BalanceUpdateEnum
+ * package: org.dromara.common.core.enums
+ * description: 钱包余额更改操作枚举
+ * date: 2024-08-18 20:57:35 20:57
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public enum BalanceUpdateEnum {
+    /**
+     * 充值
+     */
+    RECHARGE(0,"充值"),
+    /**
+     * 退款
+     */
+    REFUND(1,"退款"),
+    /**
+     * 消费
+     */
+    CONSUME(2,"消费"),
+    /**
+     * 更新
+     */
+    RECOVER(3,"更新");
+
+    private final Integer code;
+    private final String message;
+
+    BalanceUpdateEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public static String getMessage(String name) {
+        for (BalanceUpdateEnum item : BalanceUpdateEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.message;
+            }
+        }
+        return name;
+    }
+    public static String getMessage(int code) {
+        for (BalanceUpdateEnum item : BalanceUpdateEnum.values()) {
+            if (item.code().equals(code)) {
+                return item.message;
+            }
+        }
+        return "未知";
+    }
+    public static Integer getCode(String name) {
+        for (BalanceUpdateEnum item : BalanceUpdateEnum.values()) {
+            if (item.name().equals(name)) {
+                return item.code;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return this.name();
+    }
+
+    /***
+     * 校验重复的code值
+     */
+    public static void main(String[] args) {
+        BalanceUpdateEnum[] thisEnums = BalanceUpdateEnum.values();
+        List<Integer> codeList = new ArrayList<>();
+        for (BalanceUpdateEnum thisEnum : thisEnums) {
+            if (!codeList.contains(thisEnum.code)) {
+                codeList.add(thisEnum.code());
+            }
+        }
+    }
+}

+ 4 - 0
ruoyi-common/ruoyi-common-encrypt/pom.xml

@@ -52,6 +52,10 @@
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-redis</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 17 - 26
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/EncryptUtils.java

@@ -5,9 +5,8 @@ import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.SmUtil;
-import cn.hutool.crypto.asymmetric.KeyType;
-import cn.hutool.crypto.asymmetric.RSA;
-import cn.hutool.crypto.asymmetric.SM2;
+import cn.hutool.crypto.asymmetric.*;
+import cn.hutool.crypto.digest.MD5;
 import org.apache.commons.codec.digest.DigestUtils;
 
 import java.nio.charset.StandardCharsets;
@@ -117,7 +116,6 @@ public class EncryptUtils {
         if (StrUtil.isBlank(password)) {
             throw new IllegalArgumentException("DESede需要传入秘钥信息");
         }
-        byte[] temp = password.getBytes(StandardCharsets.UTF_8);
         return SecureUtil.desede(password.getBytes(StandardCharsets.UTF_8)).decryptStr(data, StandardCharsets.UTF_8);
     }
     /**
@@ -307,20 +305,6 @@ public class EncryptUtils {
         RSA rsa = SecureUtil.rsa(privateKey, null);
         return rsa.decryptStr(data, KeyType.PrivateKey, StandardCharsets.UTF_8);
     }
-    /**
-     * rsa私钥解密
-     *
-     * @param data       待加密数据
-     * @param publicKey 公钥
-     * @return 解密后字符串
-     */
-    public static String decryptByRsaPublicKey(String data, String publicKey) {
-        if (StrUtil.isBlank(publicKey)) {
-            throw new IllegalArgumentException("RSA需要传入公钥进行解密");
-        }
-        RSA rsa = SecureUtil.rsa(null, publicKey);
-        return rsa.decryptStr(data, KeyType.PublicKey, StandardCharsets.UTF_8);
-    }
 
     /**
      * md5加密
@@ -351,13 +335,20 @@ public class EncryptUtils {
     public static String encryptBySm3(String data) {
         return SmUtil.sm3(data);
     }
-    public static byte[] hex(String key) {
-        String f = DigestUtils.md5Hex(key);
-        int enkLength = 24;
-        byte[] bKeys = f.getBytes();
-        byte[] enk = new byte[enkLength];
-        System.arraycopy(bKeys, 0, enk, 0, enkLength);
-        return enk;
-//        return new byte[1];
+
+    /**
+     * DESede(3Des解密)解密
+     *
+     * @param data     待解密数据
+     * @param password 秘钥字符串
+     * @return 解密后字符串
+     */
+    public static String encryptByDESede(String data, byte[] password) {
+        //if (password.length!=24) {
+        //    throw new IllegalArgumentException("DESede需要传入秘钥信息");
+        //}
+
+        return SecureUtil.desede(password).encryptHex(data, StandardCharsets.UTF_8);
     }
+
 }

+ 233 - 0
ruoyi-common/ruoyi-common-encrypt/src/main/java/org/dromara/common/encrypt/utils/YcEncryptUtil.java

@@ -0,0 +1,233 @@
+package org.dromara.common.encrypt.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.crypto.asymmetric.RSA;
+import cn.hutool.crypto.digest.MD5;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.redis.utils.RedisUtils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * name: YcEncryptUtil
+ * package: org.dromara.common.encrypt.utils
+ * description: 安全相关工具类
+ * date: 2024-08-17 22:27:12 22:27
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public class YcEncryptUtil extends EncryptUtils {
+    private static final String defaultCharset = "UTF-8";
+    private static final String KEY_AES = "AES";
+
+    // 加解密 默认向量
+    private static byte[] IVS = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+        0x0E, 0x0F};
+    // 加解密 默认密钥
+    private static byte[] KEYS = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+        0x0E, 0x0F};
+
+    /**
+     * rsa公钥分段解密,一卡通注册信息解密用
+     *
+     * @param data      待解密数据
+     * @param publicKey 公钥
+     * @return 解密后字符串
+     */
+    public static String decryptByRsaPublicKeySection(String data, String publicKey) {
+        if (StrUtil.isBlank(publicKey)) {
+            throw new IllegalArgumentException("RSA需要传入公钥进行解密");
+        }
+
+        RSA rsa = SecureUtil.rsa(null, hexToByte(publicKey));
+        return rsa.decryptStr(data, KeyType.PublicKey, StandardCharsets.UTF_8);
+    }
+
+    /**
+     * 生成Md5摘要计算结果
+     *
+     * @param key 待计算的数据
+     * @return 计算后的结果
+     */
+    public static String getMd5DigestData(String key) {
+        return MD5.create().digestHex(key);
+    }
+
+    /**
+     * 基于Md5摘要计算的AES加密
+     *
+     * @param md5key 客户公钥(对客户公钥进行Md5摘要计算后的16进制字符串)
+     * @param data   人员Id
+     * @return 加密后的结果
+     */
+    public static String encryptByMd5WidthAes(String data, String md5key) {
+        return encryptByMd5WidthAes(data, md5key, true);
+    }
+
+    /**
+     * 基于Md5摘要计算的AES加密
+     *
+     * @param md5key   客户公钥(对客户公钥进行Md5摘要计算后的16进制字符串)
+     * @param data     人员Id
+     * @param isPrefix 是否带前缀
+     * @return 加密后的结果
+     */
+    public static String encryptByMd5WidthAes(String data, String md5key, boolean isPrefix) {
+        try {
+            if (StrUtil.isEmpty(data) || StrUtil.isEmpty(md5key)) {
+                return "";
+            }
+            byte[] content;
+
+            content = data.getBytes(defaultCharset);
+
+            // 构造一个密钥
+            byte[] md5Keys = parseHexStr2Byte(md5key);
+            SecretKeySpec keySpec = new SecretKeySpec(md5Keys, KEY_AES);
+
+            // 创建密码器
+            Cipher cipher = Cipher.getInstance(KEY_AES);
+            // 初始化
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
+            // 加密
+            byte[] result = cipher.doFinal(content);
+
+            return parseByte2HexStr(result, isPrefix);
+
+        } catch (Exception e) {
+            System.out.println("AES 密文处理异常:" + e.getMessage());
+        }
+        return "";
+    }
+
+    /**
+     * 生成指定用户的卡余加密密钥
+     *
+     * @param publicKey 客户公钥(对客户公钥进行Md5摘要计算后的16进制字符串)
+     * @param data      人员Id
+     * @return 生成的密钥
+     */
+    public static String getBalanceSecretKey(String publicKey, String data) {
+        String secretKey;
+        String cacheKey = StrUtil.replace(CacheNames.USER_SECRET_KEY, "30d", data);
+        if (ObjectUtil.isNotNull(RedisUtils.getCacheObject(cacheKey))) {
+            secretKey = RedisUtils.getCacheObject(cacheKey).toString();
+        } else {
+            String md5DigestData = getMd5DigestData(publicKey);
+            secretKey = encryptByMd5WidthAes(data, md5DigestData, false);
+            RedisUtils.setCacheObject(cacheKey, secretKey);
+        }
+
+        return secretKey;
+    }
+
+    /**
+     * 加密卡余
+     *
+     * @param data      待加密余额
+     * @param userId    待加密余额的用户Id
+     * @param publicKey 客户公钥(对客户公钥进行Md5摘要计算后的16进制字符串)
+     * @return 加密后的余额(16进制字符串)
+     */
+    public static String encryptBagBalance(String data, String userId, String publicKey) {
+        String secretKey = getBalanceSecretKey(publicKey, userId);
+        byte[] key = hex(secretKey);
+
+        return SecureUtil.desede(key).encryptHex(data, StandardCharsets.UTF_8);
+    }
+
+    /**
+     * 解密卡余
+     *
+     * @param data      待解密余额
+     * @param userId    待解密余额的用户Id
+     * @param publicKey 客户公钥(对客户公钥进行Md5摘要计算后的16进制字符串)
+     * @return 解密后的余额(16进制字符串)
+     */
+    public static String decryptBagBalance(String data, String userId, String publicKey) {
+        String secretKey = getBalanceSecretKey(publicKey, userId);
+        byte[] key = hex(secretKey);
+
+        return SecureUtil.desede(key).decryptStr(data, StandardCharsets.UTF_8);
+    }
+
+    /**
+     * 16进制字符串转字节码
+     *
+     * @param key 16进制字符串
+     * @return 字节数组
+     */
+    public static byte[] hex(String key) {
+        String f = DigestUtils.md5Hex(key);
+        int enkLength = 24;
+        byte[] bKeys = f.getBytes();
+        byte[] enk = new byte[enkLength];
+        System.arraycopy(bKeys, 0, enk, 0, enkLength);
+        return enk;
+    }
+
+    /**
+     * 16进制字符串转字节码
+     *
+     * @param s 16进制字符串
+     * @return 字节数组
+     */
+    public static byte[] hexToByte(String s) {
+        int i = s.length() / 2;
+        byte[] bt = new byte[i];
+        for (int j = 0; j < i; ++j) {
+            String s1 = s.substring(j * 2, j * 2 + 2);
+            bt[j] = (byte) Integer.parseInt(s1, 16);
+        }
+        return bt;
+    }
+
+    /**
+     * 16进制字符串转字节码(高位在前,低位在后)
+     *
+     * @param hexStr 16进制字符串
+     * @return 字节数组
+     */
+    public static byte[] parseHexStr2Byte(String hexStr) {
+        if (StrUtil.isBlank(hexStr)) {
+            throw new IllegalArgumentException("待转换的16进制字符串丢失");
+        }
+
+        byte[] result = new byte[hexStr.length() / 2];
+        for (int i = 0; i < hexStr.length() / 2; i++) {
+            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
+            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
+            result[i] = (byte) (high * 16 + low);
+        }
+        return result;
+    }
+
+    /**
+     * 将二进制转换成16进制,并且前面是否加前缀
+     *
+     * @param buf      待转换字节数组
+     * @param isPrefix 是否添加0x前缀
+     * @return 字节数组
+     */
+    public static String parseByte2HexStr(byte[] buf, boolean isPrefix) {
+        StringBuilder sb = new StringBuilder();
+        if (isPrefix)
+            sb.append("0x");
+        for (int i = 0; i < buf.length; i++) {
+            String hex = Integer.toHexString(buf[i] & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex.toUpperCase());
+        }
+        return sb.toString();
+    }
+}

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/PtBag.java

@@ -46,7 +46,7 @@ public class PtBag extends TenantEntity {
     /**
      * 钱包加密余额
      */
-    private byte[] encryptBalance;
+    private String encryptBalance;
 
     /**
      * 消费总金额

+ 12 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtBagBo.java

@@ -1,6 +1,7 @@
 package org.dromara.backstage.payment.domain.bo;
 
 import org.dromara.backstage.payment.domain.PtBag;
+import org.dromara.common.core.enums.BalanceUpdateEnum;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -49,7 +50,7 @@ public class PtBagBo extends BaseEntity {
     /**
      * 钱包加密余额
      */
-    private byte[] encryptBalance;
+    private String encryptBalance;
 
     /**
      * 消费总金额
@@ -81,4 +82,14 @@ public class PtBagBo extends BaseEntity {
      */
    private String commission;
 
+    /**
+     * 充值/退款/重置余额时的操作金额
+     */
+   private BigDecimal operationMoney;
+
+    /**
+     * 卡余的操作类型
+     */
+   private BalanceUpdateEnum operationMode;
+
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/vo/PtBagVo.java

@@ -58,7 +58,7 @@ public class PtBagVo implements Serializable {
      * 钱包加密余额
      */
     @ExcelProperty(value = "钱包加密余额")
-    private byte[] encryptBalance;
+    private String encryptBalance;
 
     /**
      * 消费总金额

+ 41 - 6
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/service/impl/PtBagServiceImpl.java

@@ -1,23 +1,25 @@
 package org.dromara.backstage.payment.service.impl;
 
 import cn.hutool.core.convert.Convert;
-import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
-import org.dromara.backstage.cardCenter.domain.PtCard;
 import org.dromara.backstage.payment.domain.PtBag;
 import org.dromara.backstage.payment.domain.bo.PtBagBo;
 import org.dromara.backstage.payment.domain.vo.PtBagVo;
 import org.dromara.backstage.payment.mapper.PtBagMapper;
 import org.dromara.backstage.payment.service.IPtBagService;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.utils.YcEncryptUtil;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -97,7 +99,9 @@ public class PtBagServiceImpl implements IPtBagService {
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
-            bo.setBagId(add.getBagId());
+            if (add != null) {
+                bo.setBagId(add.getBagId());
+            }
         }
         return flag;
     }
@@ -111,8 +115,15 @@ public class PtBagServiceImpl implements IPtBagService {
     @Override
     public Boolean updateByBo(PtBagBo bo) {
         PtBag update = MapstructUtils.convert(bo, PtBag.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+
+        if (update != null && validBalance(update)) {
+            String encryptValue = YcEncryptUtil.encryptBagBalance(bo.getBalance().toString(),
+                bo.getUserId().toString(), RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY).toString());
+            update.setEncryptBalance(encryptValue);
+            return baseMapper.updateById(update) > 0;
+        } else {
+            return false;
+        }
     }
 
     /**
@@ -122,6 +133,26 @@ public class PtBagServiceImpl implements IPtBagService {
         //TODO 做一些数据校验,如唯一约束
     }
 
+    /**
+     * 校验账户钱包余额
+     * 校验规则:获取钱包的明文和密文卡余,如果两者一致则通过
+     *
+     * @param data 账户钱包
+     * @return 校给是否成功
+     */
+    private boolean validBalance(PtBag data) {
+        PtBag entity = baseMapper.selectOne(Wrappers.<PtBag>lambdaQuery()
+            .eq(PtBag::getBagCode, data.getBagCode())
+            .eq(PtBag::getUserId, data.getUserId()));
+
+        BigDecimal entryptValue = BigDecimal.ZERO;
+        if (StrUtil.isNotBlank(entity.getEncryptBalance())) {
+            String decryptValue = YcEncryptUtil.decryptBagBalance(entity.getEncryptBalance(), entity.getUserId().toString(), RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY).toString());
+            entryptValue = new BigDecimal(decryptValue);
+        }
+        return entryptValue.compareTo(entity.getBalance()) == 0;
+    }
+
     /**
      * 校验并批量删除账户钱包信息
      *
@@ -217,9 +248,13 @@ public class PtBagServiceImpl implements IPtBagService {
      */
     @Override
     public Boolean updateBalanceByBo(PtBagBo bo) {
+        //加密卡余
+        String encryptValue = YcEncryptUtil.encryptBagBalance(bo.getBalance().toString(),
+            bo.getUserId().toString(), RedisUtils.getCacheObject(CacheNames.CUSTOM_PUB_KEY).toString());
+
         return baseMapper.update(null, new LambdaUpdateWrapper<PtBag>()
             .set(PtBag::getBalance, bo.getBalance())
-            .set(PtBag::getEncryptBalance, bo.getEncryptBalance())
+            .set(PtBag::getEncryptBalance,encryptValue)
             .eq(PtBag::getBagCode, bo.getBagCode())
             .eq(PtBag::getUserId, bo.getUserId())) > 0;
     }

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRegisterInfoVo.java

@@ -24,6 +24,10 @@ public class SysRegisterInfoVo implements Serializable {
     @Serial
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 客户Id
+     */
+    private String customerId;
     /**
      * 客户名
      */

+ 57 - 31
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRegisterInfoServiceImpl.java

@@ -1,31 +1,32 @@
 package org.dromara.system.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.encrypt.utils.EncryptUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.encrypt.utils.YcEncryptUtil;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.system.domain.SysRegisterinfo;
+import org.dromara.system.domain.bo.SysRegisterinfoBo;
 import org.dromara.system.domain.vo.SysRegisterInfoVo;
+import org.dromara.system.mapper.SysRegisterinfoMapper;
+import org.dromara.system.service.ISysRegisterInfoService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
-import org.dromara.system.domain.bo.SysRegisterinfoBo;
-import org.dromara.system.domain.SysRegisterinfo;
-import org.dromara.system.mapper.SysRegisterinfoMapper;
-import org.dromara.system.service.ISysRegisterInfoService;
 
 import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * 注册信息Service业务层处理
@@ -47,7 +48,7 @@ public class SysRegisterInfoServiceImpl implements ISysRegisterInfoService {
      * @return 注册信息
      */
     @Override
-    public SysRegisterInfoVo queryById(Long registerId){
+    public SysRegisterInfoVo queryById(Long registerId) {
         return baseMapper.selectVoById(registerId);
     }
 
@@ -123,7 +124,7 @@ public class SysRegisterInfoServiceImpl implements ISysRegisterInfoService {
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(SysRegisterinfo entity){
+    private void validEntityBeforeSave(SysRegisterinfo entity) {
         //TODO 做一些数据校验,如唯一约束
     }
 
@@ -136,7 +137,7 @@ public class SysRegisterInfoServiceImpl implements ISysRegisterInfoService {
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
+        if (isValid) {
             //TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
@@ -150,9 +151,10 @@ public class SysRegisterInfoServiceImpl implements ISysRegisterInfoService {
     @SuppressWarnings("unchecked")
     @Override
     public SysRegisterInfoVo queryRegisterInfo() {
+
         List<SysRegisterinfo> list = baseMapper.selectList();
-        SysRegisterInfoVo vo = new SysRegisterInfoVo();
-        list.stream().findFirst().ifPresent(p-> {
+        AtomicReference<SysRegisterInfoVo> vo = new AtomicReference<>(new SysRegisterInfoVo());
+        list.stream().findFirst().ifPresent(p -> {
 
             String base64Info = p.getRegisterInfo();
             byte[] result = Base64.getDecoder().decode(base64Info.getBytes());
@@ -162,29 +164,53 @@ public class SysRegisterInfoServiceImpl implements ISysRegisterInfoService {
             String dealerNo = dataMap.get("dealerNo").toString();
             // 经销商公钥(使用经销商编号对公钥进行3DES加密后的密文)
             String dealerPublicKey3des = dataMap.get("dealerPublicKey").toString();
-            log.info("dealerNo={}", dealerNo);
+
             // 客户公钥(使用经销商私钥对客户公钥进行RSA加密后的密文)
             String customerPublicKeyRsa = dataMap.get("customerPublicKey").toString();
+            // 客户私钥(使用经销商私钥对客户私钥进行RSA加密后的密文)
+            String customerPrivateKeyRSA = dataMap.get("customerPrivateKey").toString();
             // 客户ID,明文
             String customerId = dataMap.get("customerId").toString();
             // 授权加密信息(使用customId对客户的授权信息进行3DES加密,再使用客户的私钥分别对数据进行RAS加密)
             String warrantInfoRsa = dataMap.get("warrantInfo").toString();
 
-            // 解密授权信息
-            String warrantInfo3DES = "";
             // 解密经销商公钥
-            String dealerPubKey = EncryptUtils.decryptByDESede(dealerPublicKey3des,EncryptUtils.hex(dealerNo));
-            log.info("dealerPubKey={}", dealerPubKey);
+            String dealerPubKey = YcEncryptUtil.decryptByDESede(dealerPublicKey3des, YcEncryptUtil.hex(dealerNo));
+
             // 解密客户公钥
-            String customerPublicKey = EncryptUtils.decryptByRsaPublicKey(customerPublicKeyRsa,dealerPubKey);
+            String customerPublicKey = null;
+            customerPublicKey = YcEncryptUtil.decryptByRsaPublicKeySection(customerPublicKeyRsa, dealerPubKey);
+
+            // 解密客户私钥
+            String customerPrivateKey = null;
+            if (StringUtils.isNotEmpty(customerPrivateKeyRSA)) {
+                customerPrivateKey = YcEncryptUtil.decryptByRsaPublicKeySection(customerPrivateKeyRSA, dealerPubKey);
+            }
+            // 解密授权信息
+            String warrantInfo3DES;
+            warrantInfo3DES = YcEncryptUtil.decryptByRsaPublicKeySection(warrantInfoRsa, customerPublicKey);
+
+            String warrantInfo = YcEncryptUtil.decryptByDESede(warrantInfo3DES, YcEncryptUtil.hex(customerId));
+            SysRegisterInfoVo tempVo = JSONUtil.toBean(warrantInfo, SysRegisterInfoVo.class);
+            tempVo.setCustomerId(customerId);
+            tempVo.setDealerNo(dealerNo);
+            vo.set(tempVo);
+
+            RedisUtils.setCacheObject(CacheNames.CUSTOM_PUB_KEY,customerPublicKey);
+            RedisUtils.setCacheObject(CacheNames.CUSTOM_PRI_KEY,customerPrivateKey);
 
-            warrantInfo3DES = EncryptUtils.decryptByRsaPublicKey(warrantInfoRsa,customerPublicKey);
+            //String seckey = YcEncryptUtil.getBalanceSecretKey(customerPublicKey,"20082016134101023897");
+            //byte[] key = YcEncryptUtil.hexToByte(StrUtil.subSuf(seckey,3));
+            //String cardValue = YcEncryptUtil.parseByte2HexStr("");
+            //String encryptValue = SecureUtil.desede(key).encryptHex("17.9", StandardCharsets.UTF_8);
+            //String encryptValue1 = SecureUtil.des(key).encryptHex("17.9".getBytes(StandardCharsets.UTF_8));
+            //String encryptValue2 = SecureUtil.des(key).decryptStr("ea0ea7d3e6f50986");
+            //byte[] data = YcEncryptUtil.hexToByte("01000000827801BF2D965037ED88D46FB8A8C4C9636D8BF149BB729D");
+            //String encryptValue2 = SecureUtil.desede(key).decryptStr(data);
 
-            String warrantInfo = EncryptUtils.decryptByDESede(customerId, warrantInfo3DES);
-            log.info("warrantInfo={}", warrantInfo);
-            vo.setDealerNo(dealerNo);
+            //log.info("encryptValue-{}", encryptValue.getBytes());
 
         });
-        return vo;
+        return vo.get();
     }
 }