From 295e7f3e507e0a147630f7874caded95dba55342 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Fri, 08 Aug 2025 19:48:59 +0800
Subject: [PATCH] 1

---
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/AddressController.java                      |   73 +++
 trading-order-service/src/main/java/com/yami/trading/service/impl/WithdrawServiceImpl.java                      |   20 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/contract/ContractOrderController.java       |   27 +
 trading-order-bean/src/main/java/com/yami/trading/bean/contract/domain/ContractOrder.java                       |    6 
 trading-order-admin/src/main/resources/application-prod.yml                                                     |   11 
 trading-order-admin/src/main/resources/redisson/redisson-dev.yml                                                |    2 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserDataController.java                |   12 
 trading-order-admin/src/main/resources/application-local.yml                                                    |    9 
 trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysMenuController.java                          |   45 ++
 trading-order-security-common/src/main/java/com/yami/trading/security/common/enums/CryptoCurrencyEnum.java      |   75 +++
 trading-order-sys/src/main/java/com/yami/trading/sys/constant/Constant.java                                     |    4 
 trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserDataDto.java                                |    5 
 trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java                 |    2 
 trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java       |  102 ++--
 trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java  |  110 +++--
 trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysUserController.java                          |    2 
 trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserBasicDto.java                               |    5 
 trading-order-common/src/main/java/com/yami/trading/common/util/DateUtils.java                                  |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUserController.java                        |    1 
 trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderCalculationServiceImpl.java  |   32 
 trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateUserModel.java                             |    5 
 trading-order-common/src/main/java/com/yami/trading/common/domain/BaseEntity.java                               |    3 
 trading-order-admin/src/main/resources/application.yml                                                          |    8 
 trading-order-security-common/src/main/java/com/yami/trading/security/common/util/LocalKeyStorageAESUtil.java   |  310 ++++++++++++++++
 trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java                 |   22 
 trading-order-admin/src/main/java/com/yami/trading/admin/model/AdjustProfitsModel.java                          |   19 +
 trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java                          |    4 
 trading-order-admin/src/main/java/com/yami/trading/WebApplication.java                                          |   10 
 trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java                       |    5 
 trading-order-bean/src/main/java/com/yami/trading/bean/model/User.java                                          |   10 
 trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java                       |    2 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java                    |    1 
 trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateAddressModel.java                          |   17 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIndexController.java                       |  163 ++++---
 trading-order-bean/src/main/java/com/yami/trading/bean/model/RechargeBlockchainOrder.java                       |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRechargeBlockchainController.java          |    3 
 trading-order-security-common/src/main/java/com/yami/trading/security/common/adapter/ResourceServerAdapter.java |    3 
 37 files changed, 900 insertions(+), 232 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/WebApplication.java b/trading-order-admin/src/main/java/com/yami/trading/WebApplication.java
index 77e12a7..c93ce11 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/WebApplication.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/WebApplication.java
@@ -23,6 +23,9 @@
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.scheduling.annotation.EnableScheduling;
 
+import javax.annotation.PostConstruct;
+import java.util.TimeZone;
+
 /**
  * @author lgh
  */
@@ -37,6 +40,13 @@
         SpringApplication.run(WebApplication.class, args);
     }
 
+    @PostConstruct
+    void init() {
+        // 强制设置默认时区(影响整个JVM)
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris"));
+        System.setProperty("user.timezone", "Europe/Paris");
+    }
+
     @Override
     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/AddressController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/AddressController.java
new file mode 100644
index 0000000..9160450
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/AddressController.java
@@ -0,0 +1,73 @@
+package com.yami.trading.admin.controller;
+
+import com.yami.trading.admin.model.LoginModel;
+import com.yami.trading.admin.model.UpdateAddressModel;
+import com.yami.trading.bean.model.ChannelBlockchain;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.common.exception.YamiShopBindException;
+import com.yami.trading.common.util.GoogleAuthenticator;
+import com.yami.trading.security.common.bo.UserInfoInTokenBO;
+import com.yami.trading.security.common.enums.CryptoCurrencyEnum;
+import com.yami.trading.security.common.enums.SysTypeEnum;
+import com.yami.trading.security.common.util.LocalKeyStorageAESUtil;
+import com.yami.trading.security.common.vo.TokenInfoVO;
+import com.yami.trading.sys.model.SysUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @program: trading-order-master
+ * @description: 充值地址
+ * @create: 2025-08-07 14:44
+ **/
+@RestController
+@RequestMapping("address")
+@Api(tags = "充值地址")
+public class AddressController {
+
+    /**
+     * 地址列表
+     * @return
+     */
+    @PostMapping("/list")
+    public Result<?> list() {
+        List<CryptoCurrencyEnum> currencyEnums = CryptoCurrencyEnum.getAll();
+        List<ChannelBlockchain> data = new ArrayList<>();
+        currencyEnums.forEach(f->{
+            try {
+                String address = LocalKeyStorageAESUtil.loadAndDecrypt(f.getName());
+                ChannelBlockchain blockchain = new ChannelBlockchain();
+                blockchain.setBlockchain_name(f.getChain());
+                blockchain.setAddress(address);
+                blockchain.setCoin(f.getCoin());
+                blockchain.setAuto(false);
+                blockchain.setImg(null);
+                data.add(blockchain);
+            } catch (Exception e) {
+                e.getMessage();
+            }
+        });
+        return Result.succeed(data);
+    }
+
+    @PostMapping("/update")
+    public Result<?> list(@RequestBody UpdateAddressModel model) {
+        String name = model.getCoin()+"_"+model.getChain();
+        try {
+            if(model.getCoin().equals("eth") || model.getCoin().equals("btc")){
+                name = model.getCoin();
+            }
+            return LocalKeyStorageAESUtil.encryptAndStore(model.getPassword(),model.getAddress(),name);
+        }catch (Exception e){
+            e.getMessage();
+        }
+        return Result.succeed();
+    }
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/contract/ContractOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/contract/ContractOrderController.java
index 1f29622..56b8b6d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/contract/ContractOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/contract/ContractOrderController.java
@@ -4,7 +4,9 @@
 import javax.validation.constraints.NotBlank;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.google.common.collect.Lists;
+import com.yami.trading.admin.model.AdjustProfitsModel;
 import com.yami.trading.bean.contract.domain.ContractApplyOrder;
 import com.yami.trading.bean.data.domain.Realtime;
 import com.yami.trading.common.domain.Result;
@@ -86,6 +88,31 @@
         return Result.succeed(result);
     }
 
+    /**
+     * 调整利润
+     * <p>
+     * order_no 订单号
+     */
+    @PostMapping("adjustProfits.action")
+    @ApiOperation(value = "调整利润")
+    public Result<String> adjustProfits(@RequestBody AdjustProfitsModel model) {
+        try {
+            ContractOrder order = this.contractOrderService.findByOrderNo(model.getOrderNo());
+            if(ObjectUtil.isEmpty(order)){
+                return Result.failed("订单不存在!");
+            }
+            if(!ContractOrder.STATE_SUBMITTED.equals(order.getState())){
+                return Result.failed("订单已平仓!");
+            }
+            order.setProfitLossRatio(model.getProfitLossRatio());
+            contractOrderService.update(order);
+        } catch (Exception e) {
+            log.error("执行调整利润异常", e);
+            throw new YamiShopBindException("执行调整利润异常");
+        }
+        return Result.succeed("success");
+    }
+
 
     /**
      * 撤单
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
index 3772924..18f6b75 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java
@@ -188,6 +188,7 @@
             userBasicDto.setUid(user.getUserCode());
             userBasicDto.setAccountType(Constants.ROLE_MAP.get(user.getRoleName()));
             userBasicDto.setRealNameAuthority(user.isRealNameAuthority());
+            userBasicDto.setCreditScore(user.getCreditScore());
             return userBasicDto;
         }).collect(Collectors.toList());
 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserDataController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserDataController.java
index ea7edf4..b36c893 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserDataController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserDataController.java
@@ -87,22 +87,12 @@
         if (user == null) {
             throw new YamiShopBindException("参数错误!");
         }
-//        if (Constants.SECURITY_ROLE_AGENT.equals(user.getRoleName())||Constants.SECURITY_ROLE_AGENTLOW.equals(user.getRoleName())) {
-//					&&user!=null&&!Constants.SECURITY_ROLE_GUEST.equals(user.getRolename())) {
-//            if(!Constants.SECURITY_ROLE_GUEST.equals(user.getRoleName())) {
-//                throw new YamiShopBindException("只能修改演示账户");
-//            }
-//            List<String> children = userRecomService.findChildren(sec.getPartyId());
-//            if(!children.contains(partyId)) {
-//                throw new YamiShopBindException("只能修改自己线下的用户演示账户");
-//
-//            }
-//          }
         user.setEnabled(model.isEnabled());
         user.setRemarks(model.getRemarks());
         user.setStatus(model.isLoginAuthority()?1:0);
         user.setWithdrawAuthority(model.isWithdrawAuthority());
         user.setStatus(model.isLoginAuthority() ? 1 : 0);
+        user.setCreditScore(model.getCreditScore());
         userService.updateById(user);
         return Result.ok(null);
     }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/model/AdjustProfitsModel.java b/trading-order-admin/src/main/java/com/yami/trading/admin/model/AdjustProfitsModel.java
new file mode 100644
index 0000000..bfa07e8
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/model/AdjustProfitsModel.java
@@ -0,0 +1,19 @@
+package com.yami.trading.admin.model;
+
+import lombok.Data;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @program: trading-order-master
+ * @description: 调整利润
+ * @create: 2025-08-07 19:11
+ **/
+@Data
+public class AdjustProfitsModel {
+
+    private String orderNo;
+    private Double profitLossRatio;
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateAddressModel.java b/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateAddressModel.java
new file mode 100644
index 0000000..521370d
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateAddressModel.java
@@ -0,0 +1,17 @@
+package com.yami.trading.admin.model;
+
+import lombok.Data;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @program: trading-order-master
+ * @description:
+ * @create: 2025-08-07 17:23
+ **/
+@Data
+public class UpdateAddressModel {
+    private String coin;
+    private String chain;
+    private String address;
+    private String password;
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateUserModel.java b/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateUserModel.java
index 8aa0d7e..a7bb919 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateUserModel.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateUserModel.java
@@ -22,6 +22,9 @@
     private  boolean enabled;
 
     @ApiModelProperty("备注")
-    private   String remarks;
+    private  String remarks;
+
+    @ApiModelProperty("信用分")
+    private  Integer creditScore;
 
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIndexController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIndexController.java
index f16eb48..a1ff910 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIndexController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIndexController.java
@@ -1,18 +1,30 @@
 package com.yami.trading.api.controller;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yami.trading.api.model.RegisterModel;
 import com.yami.trading.api.model.UserLoginModel;
+import com.yami.trading.bean.constans.UserConstants;
+import com.yami.trading.bean.model.CapitaltWallet;
+import com.yami.trading.bean.model.Log;
 import com.yami.trading.bean.model.User;
+import com.yami.trading.bean.model.Wallet;
+import com.yami.trading.bean.syspara.domain.Syspara;
+import com.yami.trading.bean.syspara.dto.SysparasDto;
+import com.yami.trading.common.constants.Constants;
 import com.yami.trading.common.domain.Result;
 import com.yami.trading.common.exception.YamiShopBindException;
 import com.yami.trading.common.util.IPHelper;
+import com.yami.trading.dao.CapitaltWalletMapper;
 import com.yami.trading.security.common.bo.UserInfoInTokenBO;
 import com.yami.trading.security.common.enums.SysTypeEnum;
 import com.yami.trading.security.common.manager.PasswordCheckManager;
 import com.yami.trading.security.common.manager.PasswordManager;
 import com.yami.trading.security.common.manager.TokenStore;
 import com.yami.trading.security.common.vo.TokenInfoVO;
+import com.yami.trading.service.WalletService;
 import com.yami.trading.service.syspara.SysparaService;
+import com.yami.trading.service.system.LogService;
 import com.yami.trading.service.user.UserDataService;
 import com.yami.trading.service.user.UserService;
 import io.swagger.annotations.Api;
@@ -20,12 +32,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
 import java.util.Date;
 
 /**
@@ -45,11 +55,13 @@
     UserService userService;
     @Autowired
     private PasswordEncoder passwordEncoder;
+    @Autowired
+    CapitaltWalletMapper capitaltWalletMapper;
+    @Autowired
+    LogService logService;
 
-
-
-
-
+    @Autowired
+    private WalletService walletService;
 
     @Autowired
     private  RedisTemplate<String, String> redisTemplate;
@@ -98,6 +110,76 @@
         return Result.succeed(tokenInfoVO);
     }
 
+    @PostMapping("/authorizedLogin")
+    @ApiOperation(value = "钱包授权登录(用于前端登录)", notes = "钱包授权登录")
+    public Result<TokenInfoVO> authorizedLogin(@RequestParam @NotEmpty String foxAddress) {
+
+        //查询用户是不是钱包授权注册的
+        User user = userService.getOne(new LambdaQueryWrapper<>(User.class)
+                .eq(User::getUserName, foxAddress)
+                .eq(User::getAuthorizedStatus, 1));
+
+        if(ObjectUtil.isEmpty(user)){
+            user = new User();
+            user.setUserLevel(1);
+            user.setCreditScore(80);
+            user.setSafePassword(passwordEncoder.encode("000000"));
+            user.setLoginPassword(passwordEncoder.encode("000000"));
+            user.setUserName(foxAddress);
+            user.setStatus(1);
+            user.setRoleName(UserConstants.SECURITY_ROLE_MEMBER);
+            user.setUserRegip(IPHelper.getIpAddr());
+            user.setUserLastip(user.getUserRegip());
+            user.setUserCode(getUserCode());
+            user.setCreateTime(new Date());
+            userService.save(user);
+            //1.保存钱包记录
+            Wallet wallet = new Wallet();
+            wallet.setUserId(user.getUserId());
+            wallet.setCreateTime(new Date());
+            walletService.save(wallet);
+            //资金账户
+            CapitaltWallet capitaltWallet = new CapitaltWallet();
+            capitaltWallet.setUserId(user.getUserId());
+            capitaltWallet.setCreateTime(new Date());
+            capitaltWalletMapper.insert(capitaltWallet);
+            //
+            Log log = new Log();
+            log.setCategory(Constants.LOG_CATEGORY_SECURITY);
+            log.setLog("用户注册,ip[" + user.getUserRegip() + "]");
+            log.setUserId(user.getUserId());
+            log.setUsername(user.getUserName());
+            logService.save(log);
+        }
+
+        // 半小时内密码输入错误十次,已限制登录30分钟
+        UserInfoInTokenBO userInfoInToken = new UserInfoInTokenBO();
+        userInfoInToken.setUserId(user.getUserId());
+        userInfoInToken.setSysType(SysTypeEnum.ORDINARY.value());
+        userInfoInToken.setEnabled(user.getStatus() == 1);
+        user.setUserLastip(IPHelper.getIpAddr());
+        user.setUserLasttime(new Date());
+        userService.online(user.getUserId());
+        userService.updateById(user);
+        tokenStore.deleteAllToken(String.valueOf(SysTypeEnum.ORDINARY.value()), String.valueOf(user.getUserId()));
+        // 存储token返回vo
+        TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(userInfoInToken);
+        tokenInfoVO.setToken(tokenInfoVO.getAccessToken());
+
+        return Result.succeed(tokenInfoVO);
+    }
+
+    private String getUserCode() {
+        Syspara syspara = sysparaService.find("user_uid_sequence");
+        int random = (int) (Math.random() * 3 + 1);
+        int user_uid_sequence = syspara.getInteger() + random;
+        SysparasDto sysparasDto = new SysparasDto();
+        sysparasDto.setUser_uid_sequence(user_uid_sequence + "");
+        sysparaService.updateSysparas(sysparasDto);
+        String usercode = String.valueOf(user_uid_sequence);
+        return usercode;
+    }
+
     @PostMapping("/registerNoVerifcode")
     @ApiOperation(value = "手机/邮箱/用户名注册(无验证码)")
     public Result register(@Valid RegisterModel model) {
@@ -125,70 +207,5 @@
 
         return Result.succeed(tokenInfoVO);
     }
-
-
-//
-//    @PostMapping("/sendSms")
-//    @ApiOperation(value = "发送短信")
-//    public  ResponseEntity<?> sendSms(@RequestBody @Valid SendSmsModel model){
-//        String ip=  IPHelper.getIpAddr();
-//        String mobile=model.getCode()+model.getMobile();
-//        String  code=  redisTemplate.opsForValue().get( RedisKeyConstants.USER_MOBILE_PREFIX+mobile);
-//        if (!StrUtil.isEmpty(code)){
-//            throw new YamiShopBindException("发送短信频繁,请稍后在试!");
-//        }
-//        String sendCodeType = sysparaService.find("send_code_type").getSvalue();
-//        String user = sysparaService.find("smsbao_u").getSvalue();
-//        String pwd = sysparaService.find("smsbao_p").getSvalue();
-//        boolean inter=true;
-//        if ("86".equals(model.getCode())) {
-//            inter=false;
-//        }
-//        String sendCodeText =sysparaService.find("send_code_text").getSvalue();
-//        if (StringUtils.isNullOrEmpty(sendCodeText)) {
-//            throw  new YamiShopBindException("send_code_text 未配置");
-//        }
-//        String sendIp= redisTemplate.opsForValue().get(ip);
-//        if (!StrUtil.isEmpty(sendIp)){
-//            throw new YamiShopBindException("IP发送短信频繁,请稍后在试!");
-//        }
-//        Random random = new Random();
-//
-//        code = String.valueOf(random.nextInt(999999) % 900000 + 100000);
-//        sendCodeText=MessageFormat.format(sendCodeText, new Object[] { code });
-//        smsManager.send(sendCodeType,user,pwd,inter,model.getMobile(),sendCodeText);
-//        redisTemplate.opsForValue().set( RedisKeyConstants.USER_MOBILE_PREFIX+mobile,code,60, TimeUnit.SECONDS);
-//        redisTemplate.opsForValue().set(ip,mobile,10, TimeUnit.SECONDS);
-//        return ResponseEntity.ok(null);
-//    }
-
-
-
-
-//
-//    @PostMapping("/sendEmail")
-//    @ApiOperation(value = "发送邮箱")
-//    public  ResponseEntity<?> sendEmail(@RequestBody @Valid SendEmailModel model){
-////        String  code=  redisTemplate.opsForValue().get( RedisKeyConstants.USER_EMAILL_PREFIX+model.getEmail());
-////        if (!StrUtil.isEmpty(code)){
-////            throw new YamiShopBindException("发送yo频繁,请稍后在试!");
-////        }
-//
-//        String sendCodeText =sysparaService.find("send_code_text").getSvalue();
-//        if (StringUtils.isNullOrEmpty(sendCodeText)) {
-//            throw  new YamiShopBindException("send_code_text 未配置");
-//        }
-//        Random random = new Random();
-//        String code = String.valueOf(random.nextInt(999999) % 900000 + 100000);
-//        sendCodeText=MessageFormat.format(sendCodeText, new Object[] { code });
-//        String content = MessageFormat.format("code is :{0}", new Object[] { code });
-//        EmailMessage emailMessage=new EmailMessage();
-//        emailMessage.setTomail(model.getEmail());
-//        emailMessage.setSubject(sendCodeText);
-//        emailMessage.setContent(content);
-//        emailManager.send(emailMessage);
-//        redisTemplate.opsForValue().set( RedisKeyConstants.USER_EMAILL_PREFIX+model.getEmail(),code,60, TimeUnit.SECONDS);
-//        return ResponseEntity.ok(null);
-//    }
 
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRechargeBlockchainController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRechargeBlockchainController.java
index fd9ae28..65d643d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRechargeBlockchainController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRechargeBlockchainController.java
@@ -112,6 +112,9 @@
         if (null != nofinishOrderCount && 0 != nofinishOrderCount.longValue() && 1 == recharge_only_one) {
             throw new YamiShopBindException("提交失败,当前有未处理银行卡订单");
         }
+        if(coin.equals("btc") || coin.equals("eth")){
+            coin += "usdt";
+        }
         RechargeBlockchainOrder recharge = new RechargeBlockchainOrder();
         recharge.setAddress(from);
         recharge.setBlockchainName(blockchain_name);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUserController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUserController.java
index 44c0e0f..22d3a3b 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUserController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUserController.java
@@ -497,6 +497,7 @@
         map.put("advancedverif", party.isHighlevelAuthority());
         map.put("lastlogintime", party.getUserLasttime());
         map.put("lastloginip", party.getUserLastip());
+        map.put("creditScore", party.getCreditScore());
         // 实名认证通过返回真实姓名
         if (party.isRealNameAuthority()) {
             map.put("name", kyc.getName());
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java
index 869413b..1ea33cb 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java
@@ -9,13 +9,14 @@
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yami.trading.security.common.enums.CryptoCurrencyEnum;
+import com.yami.trading.security.common.util.LocalKeyStorageAESUtil;
 import com.yami.trading.api.UD.*;
 import com.yami.trading.api.UD.Address;
 import com.yami.trading.bean.exchange.PartyBlockchain;
 import com.yami.trading.bean.model.ChannelBlockchain;
 import com.yami.trading.bean.model.RechargeBlockchainOrder;
 import com.yami.trading.bean.model.User;
-import com.yami.trading.bean.vo.RechargeAddressVo;
 import com.yami.trading.common.constants.Constants;
 import com.yami.trading.common.domain.Result;
 import com.yami.trading.common.exception.YamiShopBindException;
@@ -121,50 +122,78 @@
      * 根据币种获取链地址
      */
     @GetMapping(action + "getBlockchainName.action")
-    public Object getBlockchainName(HttpServletRequest request) throws IOException {
+    public Object getBlockchainName(HttpServletRequest request) throws Exception {
         String coin = request.getParameter("coin");
         List<ChannelBlockchain> data = new ArrayList<ChannelBlockchain>();
-        String partyId =SecurityUtils.getUser().getUserId();
-        User party = userService.getById(partyId);
-        if (0 == this.sysparaService.find("can_recharge").getInteger()) {
-            return Result.failed("请联系客服充值");
-        }
 
-        List<PartyBlockchain> list = partyBlockchainService.findByUserNameAndCoinSymbol(party.getUserName(), coin);
-        if (null != list && !list.isEmpty()) {
-            data = list.stream().map(dict -> {
-                String qrImage = dict.getQrImage();
-                String chainAddress = dict.getAddress();
-                String chainName = dict.getChainName();
-                String coinSymbol = dict.getCoinSymbol();
-                String autoStr = dict.getAuto();
-                boolean auto = autoStr.equals("Y") ? true : false;
-                ChannelBlockchain cbc = new ChannelBlockchain();
-                cbc.setBlockchain_name(chainName);
-                cbc.setAddress(chainAddress);
-                cbc.setCoin(coinSymbol);
-                cbc.setAuto(auto);
-                cbc.setImg(qrImage);
-                return cbc;
-            }).collect(Collectors.toList());
-        }
-
-        //后台设置地址
-        if (data.isEmpty()) data = this.channelBlockchainService.findByCoin(coin.toLowerCase());
-        for (int i = 0; i < data.size(); i++) {
-            data.get(i).setBlockchain_name(data.get(i).getBlockchainName());
-            if (1 == this.sysparaService.find("can_recharge").getInteger()) {
-                if (!StringUtils.isNullOrEmpty(data.get(i).getImg())) {
-                    String path = Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + data.get(i).getImg();
-                    data.get(i).setImgStr("/public/showimg!showImg.action?imagePath=" + data.get(i).getImg());
-                    data.get(i).setImg(path);
+        try {
+            coin  = coin.toLowerCase();
+            Map<String, List<CryptoCurrencyEnum>> allGroupedByCoin = CryptoCurrencyEnum.getAllGroupedByCoin();
+            List<CryptoCurrencyEnum> currencyEnums = allGroupedByCoin.get(coin);
+            currencyEnums.forEach(f->{
+                try {
+                    String address = LocalKeyStorageAESUtil.loadAndDecrypt(f.getName());
+                    ChannelBlockchain blockchain = new ChannelBlockchain();
+                    blockchain.setBlockchain_name(f.getChain());
+                    blockchain.setAddress(address);
+                    blockchain.setCoin(f.getCoin());
+                    blockchain.setAuto(false);
+                    blockchain.setImg(null);
+                    data.add(blockchain);
+                } catch (Exception e) {
+                    e.getMessage();
                 }
-            } else {
-                data.get(i).setImg(null);
-                data.get(i).setImgStr(null);
-                data.get(i).setAddress(null);
-            }
+            });
+        }catch (Exception e){
+            log.error("获取充值地址错误:",e);
+            return Result.failed("充值链暂不可用");
         }
+        return Result.succeed(data);
+
+
+
+//        String partyId =SecurityUtils.getUser().getUserId();
+//        User party = userService.getById(partyId);
+//        if (0 == this.sysparaService.find("can_recharge").getInteger()) {
+//            return Result.failed("请联系客服充值");
+//        }
+//        List<PartyBlockchain> list = partyBlockchainService.findByUserNameAndCoinSymbol(party.getUserName(), coin);
+//        if (null != list && !list.isEmpty()) {
+//            data = list.stream().map(dict -> {
+//                String qrImage = dict.getQrImage();
+//                String chainAddress = dict.getAddress();
+//                String chainName = dict.getChainName();
+//                String coinSymbol = dict.getCoinSymbol();
+//                String autoStr = dict.getAuto();
+//                boolean auto = autoStr.equals("Y") ? true : false;
+//                ChannelBlockchain cbc = new ChannelBlockchain();
+//                cbc.setBlockchain_name(chainName);
+//                cbc.setAddress(chainAddress);
+//                cbc.setCoin(coinSymbol);
+//                cbc.setAuto(auto);
+//                cbc.setImg(qrImage);
+//                return cbc;
+//            }).collect(Collectors.toList());
+//        }
+//        return Result.succeed(data);
+
+
+//        //后台设置地址
+//        if (data.isEmpty()) data = this.channelBlockchainService.findByCoin(coin.toLowerCase());
+//        for (int i = 0; i < data.size(); i++) {
+//            data.get(i).setBlockchain_name(data.get(i).getBlockchainName());
+//            if (1 == this.sysparaService.find("can_recharge").getInteger()) {
+//                if (!StringUtils.isNullOrEmpty(data.get(i).getImg())) {
+//                    String path = Constants.WEB_URL + "/public/showimg!showImg.action?imagePath=" + data.get(i).getImg();
+//                    data.get(i).setImgStr("/public/showimg!showImg.action?imagePath=" + data.get(i).getImg());
+//                    data.get(i).setImg(path);
+//                }
+//            } else {
+//                data.get(i).setImg(null);
+//                data.get(i).setImgStr(null);
+//                data.get(i).setAddress(null);
+//            }
+//        }
         
 //        String partyId =SecurityUtils.getUser().getUserId();
 //        if(!StringUtils.isNotEmpty(partyId)){
@@ -223,7 +252,6 @@
 //            }
 //        });
 //        return Result.succeed(rechargeAddressVo);
-        return Result.succeed(data);
     }
 
     public List<Coin> listSupportCoin(String merchantId , boolean showBalance) {
diff --git a/trading-order-admin/src/main/resources/application-local.yml b/trading-order-admin/src/main/resources/application-local.yml
index 9e26538..f1d125d 100644
--- a/trading-order-admin/src/main/resources/application-local.yml
+++ b/trading-order-admin/src/main/resources/application-local.yml
@@ -2,7 +2,7 @@
   port: 8086
 spring:
   datasource:
-    url: jdbc:mysql://127.0.0.1:3306/trading_order?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+    url: jdbc:mysql://127.0.0.1:3306/trading_order?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&serverTimezone=Europe/Paris&useLegacyDatetimeCode=false
     username: root
     password: 123456
     driver-class-name: com.mysql.cj.jdbc.Driver
@@ -14,6 +14,13 @@
       validation-timeout: 3000  # 设置连接验证超时
       auto-commit: true
       connection-test-query: SELECT 1
+  jpa:
+    properties:
+      hibernate:
+        jdbc:
+          time_zone: Europe/Paris
+  jackson:
+    time-zone: Europe/Paris
   cache:
     type: redis
     redis:
diff --git a/trading-order-admin/src/main/resources/application-prod.yml b/trading-order-admin/src/main/resources/application-prod.yml
index 033bd4b..ed7d02e 100644
--- a/trading-order-admin/src/main/resources/application-prod.yml
+++ b/trading-order-admin/src/main/resources/application-prod.yml
@@ -1,8 +1,8 @@
 server:
-  port: 8111
+  port: 8222
 spring:
   datasource:
-    url: jdbc:mysql://127.0.0.1:6306/trading_order?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
+    url: jdbc:mysql://127.0.0.1:6306/8.4?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&serverTimezone=Europe/Paris&useLegacyDatetimeCode=false
     username: root
     password: Err;2[eoGFUriwdgr
     driver-class-name: com.mysql.cj.jdbc.Driver
@@ -13,6 +13,13 @@
       idle-timeout: 25000
       auto-commit: true
       connection-test-query: SELECT 1
+  jpa:
+    properties:
+      hibernate:
+        jdbc:
+          time_zone: Europe/Paris
+  jackson:
+    time-zone: Europe/Paris
     cache:
       type: redis
       redis:
diff --git a/trading-order-admin/src/main/resources/application.yml b/trading-order-admin/src/main/resources/application.yml
index c1f8266..2edbc6b 100644
--- a/trading-order-admin/src/main/resources/application.yml
+++ b/trading-order-admin/src/main/resources/application.yml
@@ -10,11 +10,15 @@
       enabled: true
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss
-    time-zone: GMT+8
+    time-zone: Europe/Paris
   mvc:
     pathmatch:
       matching-strategy: ANT_PATH_MATCHER
-
+  jpa:
+    properties:
+      hibernate:
+        jdbc:
+          time_zone: Europe/Paris
 # mybaits-plus配置
 mybatis-plus:
   # MyBatis Mapper所对应的XML文件位置
diff --git a/trading-order-admin/src/main/resources/redisson/redisson-dev.yml b/trading-order-admin/src/main/resources/redisson/redisson-dev.yml
index 8acefd5..08fc5a1 100644
--- a/trading-order-admin/src/main/resources/redisson/redisson-dev.yml
+++ b/trading-order-admin/src/main/resources/redisson/redisson-dev.yml
@@ -1,7 +1,7 @@
 # 单节点设置
 singleServerConfig:
   address: redis://127.0.0.1:6380
-  database: 10
+  database: 8
   password:
   idleConnectionTimeout: 10000
   connectTimeout: 10000
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/contract/domain/ContractOrder.java b/trading-order-bean/src/main/java/com/yami/trading/bean/contract/domain/ContractOrder.java
index 879d2a2..791ea57 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/contract/domain/ContractOrder.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/contract/domain/ContractOrder.java
@@ -138,6 +138,12 @@
      */
     private Integer locationType = 1;
 
+
+    /**
+     * 盈亏比
+     */
+    private Double profitLossRatio;
+
     public BigDecimal getAmountClose() {
         if(amountClose == null){
             amountClose = BigDecimal.ZERO;
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java b/trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java
index 19c832b..bd325aa 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/contract/dto/ContractOrderDTO.java
@@ -173,6 +173,11 @@
 	 */
 	private String forceClosePrice;
 
+	/**
+	 * 盈亏比
+	 */
+	private Double profitLossRatio;
+
 	public BigDecimal getProfitLoss() {
 		if("submitted".equalsIgnoreCase(state)){
 			return amountClose.add(profit).add(deposit).subtract(depositOpen).setScale(4, BigDecimal.ROUND_HALF_UP);
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/model/RechargeBlockchainOrder.java b/trading-order-bean/src/main/java/com/yami/trading/bean/model/RechargeBlockchainOrder.java
index 0469df1..f83fda4 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/model/RechargeBlockchainOrder.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/model/RechargeBlockchainOrder.java
@@ -1,6 +1,8 @@
 package com.yami.trading.bean.model;
+import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yami.trading.common.domain.BaseEntity;
 import com.yami.trading.common.domain.UUIDEntity;
 import lombok.Data;
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/model/User.java b/trading-order-bean/src/main/java/com/yami/trading/bean/model/User.java
index 96f48d6..12f7133 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/model/User.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/model/User.java
@@ -192,10 +192,20 @@
 
 
     private  boolean enabled=true;
+    /**
+     * 状态 0 普通注册 1 钱包注册
+     */
+    private Integer authorizedStatus = 1;
 
+    /**
+     * 信用分
+     */
+    private Integer creditScore;
 
     @ApiModelProperty("登录权限")
     private  boolean loginAuthority;
 
+
+
 //    private String balanceIncomeConfig;
 }
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserBasicDto.java b/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserBasicDto.java
index 5ba8f95..71f29b9 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserBasicDto.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserBasicDto.java
@@ -25,4 +25,9 @@
 
     @ApiModelProperty("基础认证")
     private boolean realNameAuthority;
+
+    /**
+     * 信用分
+     */
+    private Integer creditScore;
 }
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserDataDto.java b/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserDataDto.java
index 0c7d327..f909384 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserDataDto.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/user/dto/UserDataDto.java
@@ -103,7 +103,10 @@
      */
     private boolean userMobileBind=false;
 
-
+    /**
+     * 信用分
+     */
+    private Integer creditScore;
 
 
 
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/domain/BaseEntity.java b/trading-order-common/src/main/java/com/yami/trading/common/domain/BaseEntity.java
index 814d38a..6ee44e5 100644
--- a/trading-order-common/src/main/java/com/yami/trading/common/domain/BaseEntity.java
+++ b/trading-order-common/src/main/java/com/yami/trading/common/domain/BaseEntity.java
@@ -1,6 +1,7 @@
 package com.yami.trading.common.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -20,6 +21,7 @@
     /**
      * 创建日期
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Europe/Paris")
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;
     /**
@@ -36,6 +38,7 @@
     /**
      * 更新日期
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Europe/Paris")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Date updateTime;
 
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/util/DateUtils.java b/trading-order-common/src/main/java/com/yami/trading/common/util/DateUtils.java
index 7d6817b..6e553a9 100644
--- a/trading-order-common/src/main/java/com/yami/trading/common/util/DateUtils.java
+++ b/trading-order-common/src/main/java/com/yami/trading/common/util/DateUtils.java
@@ -20,7 +20,7 @@
 
 	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
 
-	public static final String DEFAULT_TIME_ZONE = "GMT+8:00";
+	public static final String DEFAULT_TIME_ZONE = "Europe/Paris";
 
 	public static final String NORMAL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
 
diff --git a/trading-order-security-common/src/main/java/com/yami/trading/security/common/adapter/ResourceServerAdapter.java b/trading-order-security-common/src/main/java/com/yami/trading/security/common/adapter/ResourceServerAdapter.java
index 9f8980d..86f5196 100644
--- a/trading-order-security-common/src/main/java/com/yami/trading/security/common/adapter/ResourceServerAdapter.java
+++ b/trading-order-security-common/src/main/java/com/yami/trading/security/common/adapter/ResourceServerAdapter.java
@@ -61,7 +61,8 @@
             "/etf/robot/list",
             "/api/banner!list.action",
             "/api/news!list_v2_popup.action",
-            "/api/news!list.action"
+            "/api/news!list.action",
+            "/api/authorizedLogin"
     );
 
 
diff --git a/trading-order-security-common/src/main/java/com/yami/trading/security/common/enums/CryptoCurrencyEnum.java b/trading-order-security-common/src/main/java/com/yami/trading/security/common/enums/CryptoCurrencyEnum.java
new file mode 100644
index 0000000..a29be3b
--- /dev/null
+++ b/trading-order-security-common/src/main/java/com/yami/trading/security/common/enums/CryptoCurrencyEnum.java
@@ -0,0 +1,75 @@
+package com.yami.trading.security.common.enums;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @program: trading-order-master
+ * @description: 充值币种
+ * @create: 2025-08-06 16:05
+ **/
+public enum CryptoCurrencyEnum {
+    USDT_TRC20("usdt", "trc20","usdt_trc20"),
+    USDT_ERC20("usdt", "erc20","usdt_erc20"),
+    ETH("eth", "eth","eth"),
+    BTC("btc", "btc","btc"),
+    USDC_TRC20("usdc", "trc20","usdc_trc20"),
+    USDC_ERC20("usdc", "erc20","usdc_erc20");
+
+    private final String coin;
+    private final String chain;
+    private final String name;
+
+    CryptoCurrencyEnum(String coin, String chain,String name) {
+        this.coin = coin;
+        this.chain = chain;
+        this.name = name;
+    }
+
+    public String getCoin() {
+        return coin;
+    }
+
+    public String getChain() {
+        return chain;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    // 可选:根据代码获取枚举值的方法
+    public static CryptoCurrencyEnum fromCoin(String coin,String chain) {
+        for (CryptoCurrencyEnum currency : values()) {
+            if (currency.getCoin().equals(coin) && currency.getChain().equals(chain)) {
+                return currency;
+            }
+        }
+        throw new IllegalArgumentException("没找到对应的币种: " + coin);
+    }
+
+    /**
+     * 获取所有枚举值(返回 List)
+     */
+    public static List<CryptoCurrencyEnum> getAll() {
+        return Arrays.asList(values());
+    }
+
+    /**
+     * 获取所有枚举值(按 coin 分组,返回 Map<String, List<CryptoCurrencyEnum>>)
+     */
+    public static Map<String, List<CryptoCurrencyEnum>> getAllGroupedByCoin() {
+        return Arrays.stream(values())
+                .collect(Collectors.groupingBy(CryptoCurrencyEnum::getCoin));
+    }
+
+    /**
+     * 获取所有枚举值(按 chain 分组,返回 Map<String, List<CryptoCurrencyEnum>>)
+     */
+    public static Map<String, List<CryptoCurrencyEnum>> getAllGroupedByChain() {
+        return Arrays.stream(values())
+                .collect(Collectors.groupingBy(CryptoCurrencyEnum::getChain));
+    }
+}
diff --git a/trading-order-security-common/src/main/java/com/yami/trading/security/common/util/LocalKeyStorageAESUtil.java b/trading-order-security-common/src/main/java/com/yami/trading/security/common/util/LocalKeyStorageAESUtil.java
new file mode 100644
index 0000000..bb7dc18
--- /dev/null
+++ b/trading-order-security-common/src/main/java/com/yami/trading/security/common/util/LocalKeyStorageAESUtil.java
@@ -0,0 +1,310 @@
+package com.yami.trading.security.common.util;
+
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.security.common.enums.CryptoCurrencyEnum;
+
+import javax.crypto.*;
+import javax.crypto.spec.*;
+import java.io.File;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.security.*;
+import java.util.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.*;
+import java.util.logging.Logger;
+
+public class LocalKeyStorageAESUtil {
+    private static final Logger logger = Logger.getLogger(LocalKeyStorageAESUtil.class.getName());
+
+    // 加密算法参数
+    private static final String ALGORITHM = "AES";
+    private static final String TRANSFORMATION = "AES/GCM/NoPadding";
+    private static final int TAG_LENGTH = 128; // bits
+    private static final int IV_LENGTH = 12;   // bytes
+    private static final int KEY_LENGTH = 256; // bits
+    private static final int SALT_LENGTH = 16; // bytes
+    private static final int ITERATIONS = 65536;
+
+    // 安全配置 - 生产环境中应从外部配置读取
+    private static final Path KEY_FILE = Paths.get("D:/aes/aes_key.dat");
+    private static final String FILE = "D:/aes/";
+    private static final String FILENAME = "_address.dat";
+
+    /**
+     * 加密文本并保存到文件,加密前校验密码与派生密钥是否匹配
+     * @param password 用户提供的密码
+     * @param text 要加密的文本
+     * @param symbolName 用于生成文件名
+     * @return 操作结果
+     * @throws Exception 加密过程中发生的任何异常
+     */
+    public static Result encryptAndStore(String password, String text, String symbolName) throws Exception {
+        try {
+            logger.info("开始加密过程...");
+
+            // 1. 检查密钥文件是否存在
+            if (!Files.exists(KEY_FILE)) {
+                return Result.failed("密钥文件丢失,请联系管理员");
+            }
+
+//            //重置密钥   客户更新完密码之后要重新打包提交
+//            reset(password);
+
+            // 2. 加载现有密钥材料
+            KeyMaterial existingKey = loadKeyMaterial();
+
+            // 4. 正常加密流程(非重置情况)
+            if (!validatePassword(password, existingKey.salt, existingKey.secretKey.getEncoded())) {
+                logger.info("修改地址密码验证失败!");
+                return Result.failed("密码验证失败");
+            }
+
+            // 5. 使用现有密钥加密新数据
+            byte[] iv = generateRandomBytes(IV_LENGTH);
+            String ciphertext = encryptData(text, existingKey.secretKey, iv);
+            String encryptedData = Base64.getEncoder().encodeToString(iv) + ":" + ciphertext;
+
+            // 6. 保存加密数据
+            Path encryptedDataFile = getEncryptedDataFile(FILE, symbolName, FILENAME);
+            Files.write(encryptedDataFile, encryptedData.getBytes(StandardCharsets.UTF_8));
+
+            logger.info("加密完成并已保存到文件");
+            return Result.succeed();
+        } catch (Exception e) {
+            logger.severe("加密过程中发生错误: " + e.getMessage());
+            throw e;
+        }
+    }
+
+    /**
+     * 验证密码与密钥是否匹配
+     * @param password 用户提供的密码
+     * @param salt 盐值
+     * @param storedKeyBytes 存储的密钥字节
+     * @return 验证是否通过
+     */
+    private static boolean validatePassword(String password, byte[] salt, byte[] storedKeyBytes) throws Exception {
+        // 使用相同参数重新派生密钥
+        SecretKey derivedKey = deriveKey(password.toCharArray(), salt);
+
+        // 比较派生出的密钥与存储的密钥是否一致
+        return Arrays.equals(derivedKey.getEncoded(), storedKeyBytes);
+    }
+
+    /**
+     * 获取加密数据文件路径
+     */
+    /**
+     * 获取加密数据文件路径
+     */
+    private static Path getEncryptedDataFile(String basePath, String symbolName, String filename) {
+        // 确保basePath以分隔符结尾
+        if (!basePath.endsWith(File.separator)) {
+            basePath += File.separator;
+        }
+
+        // 创建目录结构
+        File dir = new File(basePath);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        // 构建完整文件路径 (basePath + symbolName + filename)
+        String filePath = basePath + symbolName + filename;
+        return Paths.get(filePath);
+    }
+
+    /**
+     * 从文件加载并解密数据
+     * @return 解密后的原始文本
+     * @throws Exception 解密过程中发生的任何异常
+     */
+    public static String loadAndDecrypt(String symbolName) throws Exception {
+        try {
+            logger.info("开始解密过程...");
+            Path encryptedDataFile = getEncryptedDataFile(FILE, symbolName, FILENAME);
+            // 检查文件是否存在
+            if (!Files.exists(KEY_FILE) || !Files.exists(encryptedDataFile)) {
+                throw new IllegalStateException("密钥文件或加密数据文件不存在");
+            }
+
+            // 加载密钥材料
+            KeyMaterial keyMaterial = loadKeyMaterial();
+
+            // 加载加密数据
+            String encryptedData = new String(Files.readAllBytes(encryptedDataFile), StandardCharsets.UTF_8);
+            String[] parts = encryptedData.split(":");
+            if (parts.length != 2) {
+                throw new SecurityException("加密数据格式无效");
+            }
+
+            byte[] iv = Base64.getDecoder().decode(parts[0]);
+            String ciphertext = parts[1];
+
+            // 解密数据
+            return decryptData(ciphertext, keyMaterial.secretKey, iv);
+        } catch (Exception e) {
+            logger.severe("解密过程中发生错误: " + e.getMessage());
+            throw new SecurityException("解密过程中发生错误",e);
+        }
+    }
+
+    private static class KeyMaterial {
+        byte[] salt;
+        SecretKey secretKey;
+
+        KeyMaterial(byte[] salt, SecretKey secretKey) {
+            this.salt = salt;
+            this.secretKey = secretKey;
+        }
+    }
+
+    /**
+     * 保存密钥材料到文件
+     */
+    private static void saveKeyMaterial(byte[] salt, byte[] keyBytes) throws Exception {
+        // 确保密钥文件目录存在
+        File keyDir = KEY_FILE.getParent().toFile();
+        if (!keyDir.exists()) {
+            keyDir.mkdirs();
+        }
+
+        String content = Base64.getEncoder().encodeToString(salt) + ":" +
+                Base64.getEncoder().encodeToString(keyBytes);
+        Files.write(KEY_FILE, content.getBytes(StandardCharsets.UTF_8));
+    }
+
+    /**
+     * 从文件加载密钥材料
+     */
+    private static KeyMaterial loadKeyMaterial() throws Exception {
+        String content = new String(Files.readAllBytes(KEY_FILE), StandardCharsets.UTF_8);
+        String[] parts = content.split(":");
+        if (parts.length != 2) {
+            throw new SecurityException("密钥文件格式无效");
+        }
+
+        byte[] salt = Base64.getDecoder().decode(parts[0]);
+        byte[] keyBytes = Base64.getDecoder().decode(parts[1]);
+        SecretKey secretKey = new SecretKeySpec(keyBytes, ALGORITHM);
+
+        return new KeyMaterial(salt, secretKey);
+    }
+
+    /**
+     * 派生加密密钥
+     */
+    private static SecretKey deriveKey(char[] password, byte[] salt) throws Exception {
+        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+        PBEKeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, KEY_LENGTH);
+        byte[] keyBytes = factory.generateSecret(spec).getEncoded();
+        return new SecretKeySpec(keyBytes, ALGORITHM);
+    }
+
+    /**
+     * 加密数据
+     */
+    private static String encryptData(String plaintext, SecretKey key, byte[] iv) throws Exception {
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+        GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH, iv);
+        cipher.init(Cipher.ENCRYPT_MODE, key, spec);
+        return Base64.getEncoder().encodeToString(cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)));
+    }
+
+    /**
+     * 解密数据
+     */
+    private static String decryptData(String ciphertext, SecretKey key, byte[] iv) throws Exception {
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+        GCMParameterSpec spec = new GCMParameterSpec(TAG_LENGTH, iv);
+        cipher.init(Cipher.DECRYPT_MODE, key, spec);
+        return new String(cipher.doFinal(Base64.getDecoder().decode(ciphertext)), StandardCharsets.UTF_8);
+    }
+
+    /**
+     * 生成随机字节数组
+     */
+    private static byte[] generateRandomBytes(int length) {
+        byte[] bytes = new byte[length];
+        new SecureRandom().nextBytes(bytes);
+        return bytes;
+    }
+
+
+
+    public static void reset(String password) throws Exception {
+
+        // 生成新的salt和密钥
+        byte[] newSalt = generateRandomBytes(SALT_LENGTH);
+        SecretKey newSecretKey = deriveKey(password.toCharArray(), newSalt);
+
+        // 重新加密所有现有文件
+        List<CryptoCurrencyEnum> currencyEnums = CryptoCurrencyEnum.getAll();
+        for (CryptoCurrencyEnum currency : currencyEnums) {
+            Path encryptedDataFile = getEncryptedDataFile(FILE, currency.getName(), FILENAME );
+            if (Files.exists(encryptedDataFile)) {
+                try {
+                    // 读取原有加密数据
+                    String encryptedContent = new String(Files.readAllBytes(encryptedDataFile), StandardCharsets.UTF_8);
+                    String[] parts = encryptedContent.split(":");
+                    if (parts.length == 2) {
+                        //获取地址
+                        String address = loadAndDecrypt(currency.getName());
+                        // 使用新密钥重新加密
+                        byte[] newIv = generateRandomBytes(IV_LENGTH);
+                        String newCiphertext = encryptData(address, newSecretKey, newIv);
+                        String newEncryptedData = Base64.getEncoder().encodeToString(newIv) + ":" + newCiphertext;
+
+                        // 写回文件
+                        Files.write(encryptedDataFile, newEncryptedData.getBytes(StandardCharsets.UTF_8));
+                        logger.info("已重置加密文件: " + encryptedDataFile);
+
+                    }
+                } catch (Exception e) {
+                    logger.warning("重置文件失败: " + encryptedDataFile + " - " + e.getMessage());
+                }
+            }
+        }
+        // 保存新的密钥材料
+        saveKeyMaterial(newSalt, newSecretKey.getEncoded());
+        logger.info("密钥已更新");
+    }
+
+    // 测试主方法
+    public static void main(String[] args) throws Exception {
+//
+            String password = "123456";
+
+
+
+//
+           String USDT_TRC20 = "usdt_trc20";
+           String USDT_ERC20 = "usdt_erc20";
+           String ETH = "eth";
+           String BTC = "btc";
+           String USDC_TRC20 = "usdc_trc20";
+           String USDC_ERC20 = "usdc_erc20";
+           // 加密并保存
+//        encryptAndStore(password, "1111111111", USDT_TRC20);
+//        encryptAndStore(password,"222222222",USDT_ERC20);
+        encryptAndStore(password,"3333333333",ETH);
+//        encryptAndStore(password,"我是BTC",BTC);
+//        encryptAndStore(password,"44444444444444",USDC_TRC20);
+//        encryptAndStore(password,"55555555555555",USDC_ERC20);
+//
+            List<CryptoCurrencyEnum> cryptoCurrencyEnums = CryptoCurrencyEnum.getAll();
+            cryptoCurrencyEnums.forEach(f->{
+                try {
+                    String address = LocalKeyStorageAESUtil.loadAndDecrypt(f.getName());
+                    System.out.println(address);
+                } catch (Exception ex) {
+                    logger.info("------------"+f.getName()+"地址文件被更改-----------------");
+                }
+            });
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+    }
+}
\ No newline at end of file
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderCalculationServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderCalculationServiceImpl.java
index 00de97a..8a8377d 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderCalculationServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderCalculationServiceImpl.java
@@ -115,24 +115,26 @@
      */
     public void settle(ContractOrder order, String profit_loss, BigDecimal currentPrice, List<ContractOrder> partyContractOrders) {
 
-
-
         Item item = itemService.findBySymbol(order.getSymbol());
 
-        /*
-         * 根据偏 差点数和手数算出盈亏金额
-         */
-        /**
-         * 偏差点位
-         */
-        BigDecimal point = currentPrice.subtract(order.getTradeAvgPrice());
-        BigDecimal amount = point.multiply(new BigDecimal("0.01")).multiply(order.getVolumeOpen()).setScale(4, BigDecimal.ROUND_DOWN);;
-        if (ContractOrder.DIRECTION_BUY.equals(order.getDirection())) {
-            order.setProfit(amount);
-        } else{
-            order.setProfit(amount.negate());
-        }
 
+        if(null != order.getProfitLossRatio()){//根据后台设置的盈亏比来
+            order.setProfit(order.getDepositOpen().multiply(new BigDecimal((order.getProfitLossRatio()/100))).setScale(2, RoundingMode.DOWN));
+        }else{
+            /*
+             * 根据偏 差点数和手数算出盈亏金额
+             */
+            /**
+             * 偏差点位
+             */
+            BigDecimal point = currentPrice.subtract(order.getTradeAvgPrice());
+            BigDecimal amount = point.multiply(new BigDecimal("0.01")).multiply(order.getVolumeOpen()).setScale(4, BigDecimal.ROUND_DOWN);;
+            if (ContractOrder.DIRECTION_BUY.equals(order.getDirection())) {
+                order.setProfit(amount);
+            } else{
+                order.setProfit(amount.negate());
+            }
+        }
 
         double faceValue = 0.01; // 合约面值(固定面值不能调整)
         double maintenanceMarginRate = 0.004; // 维持保证金率(固定不变)
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java b/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java
index 2c6b24e..15228c1 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractOrderService.java
@@ -782,7 +782,7 @@
         }
         map.put("name", name);
         map.put("symbol", order.getSymbol());
-        map.put("create_time", DateUtils.format(order.getCreateTime(), DateUtils.DF_yyyyMMddHHmmss));
+        map.put("create_time", order.getCreateTime());
         map.put("create_time_ts", order.getCreateTimeTs());
 
         if (order.getCloseTime() != null) {
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java
index 78fb9f3..ee52404 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/impl/RechargeBlockchainOrderServiceImpl.java
@@ -200,16 +200,16 @@
             userService.updateById(party);
 
         } else {
-            List<Realtime> realtime_list =this.dataService.realtime(recharge.getSymbol());
-            log.error("手动到账realtime_list::"+realtime_list);
-            Realtime realtime = null;
-            if (realtime_list.size() > 0) {
-                realtime = realtime_list.get(0);
-            } else {
-                throw new YamiShopBindException("系统错误,请稍后重试");
-            }
+//            List<Realtime> realtime_list =this.dataService.realtime(recharge.getSymbol());
+//            log.error("手动到账realtime_list::"+realtime_list);
+//            Realtime realtime = null;
+//            if (realtime_list.size() > 0) {
+//                realtime = realtime_list.get(0);
+//            } else {
+//                throw new YamiShopBindException("系统错误,请稍后重试");
+//            }
             // 对应usdt价格
-            double transfer_usdt = realtime.getClose().doubleValue();
+//            double transfer_usdt = realtime.getClose().doubleValue();
 
             WalletExtend walletExtend = new WalletExtend();
             walletExtend = walletService.saveExtendByPara(recharge.getPartyId(), recharge.getSymbol());
@@ -223,7 +223,7 @@
             updateById(recharge);
 
             // 币种usdt价格= 币种价格×充值数量
-            double usdt_amount = Arith.mul(volume, transfer_usdt);
+//            double usdt_amount = Arith.mul(volume, transfer_usdt);
 
             // 保存资金日志
             MoneyLog moneyLog = new MoneyLog();
@@ -250,44 +250,44 @@
              */
 //			userDataService.saveBuy(recharge.getPartyId(), recharge.getSymbol(), recharge.getVolume());
 
-            /**
-             * 充值到账后给他的代理用户添加奖金
-             */
-            if ("true".equals(user_recom_bonus_open.getSvalue())) {
-
-                List<RechargeBlockchainOrder> orders =findByPartyIdAndToday(recharge.getPartyId());
-                rechargeBonusService.saveBounsHandle(recharge, transfer_usdt,orders);
-            }
+//            /**
+//             * 充值到账后给他的代理用户添加奖金
+//             */
+//            if ("true".equals(user_recom_bonus_open.getSvalue())) {
+//
+//                List<RechargeBlockchainOrder> orders =findByPartyIdAndToday(recharge.getPartyId());
+//                rechargeBonusService.saveBounsHandle(recharge, transfer_usdt,orders);
+//            }
 
             /**
              * 充值到账后给他增加提现流水限制金额
              */
 
-            /**
-             * 充值到账后给他增加提现流水限制金额 充值到账后,当前流水大于提现限制流水时是否重置提现限制流水并将Party表里的当前流水设置清零,1不重置,2重置
-             */
-            String recharge_sucess_reset_withdraw = this.sysparaService.find("recharge_sucess_reset_withdraw")
-                    .getSvalue();
-            if ("1".equals(recharge_sucess_reset_withdraw)) {
-                party.setWithdrawLimitAmount(new BigDecimal(Arith.add(party.getWithdrawLimitAmount().doubleValue(), usdt_amount)));
-                if (party.getWithdrawLimitNowAmount().doubleValue() > party.getWithdrawLimitAmount().doubleValue()) {
-                    party.setWithdrawLimitNowAmount(new BigDecimal(0));
-                }
-            }
-            if ("2".equals(recharge_sucess_reset_withdraw)) {
-                double withdraw_limit_turnover_percent = Double
-                        .valueOf(sysparaService.find("withdraw_limit_turnover_percent").getSvalue());
-                double party_withdraw = Arith.mul(party.getWithdrawLimitAmount().doubleValue(), withdraw_limit_turnover_percent);
+//            /**
+//             * 充值到账后给他增加提现流水限制金额 充值到账后,当前流水大于提现限制流水时是否重置提现限制流水并将Party表里的当前流水设置清零,1不重置,2重置
+//             */
+//            String recharge_sucess_reset_withdraw = this.sysparaService.find("recharge_sucess_reset_withdraw")
+//                    .getSvalue();
+//            if ("1".equals(recharge_sucess_reset_withdraw)) {
+//                party.setWithdrawLimitAmount(new BigDecimal(Arith.add(party.getWithdrawLimitAmount().doubleValue(), usdt_amount)));
+//                if (party.getWithdrawLimitNowAmount().doubleValue() > party.getWithdrawLimitAmount().doubleValue()) {
+//                    party.setWithdrawLimitNowAmount(new BigDecimal(0));
+//                }
+//            }
+//            if ("2".equals(recharge_sucess_reset_withdraw)) {
+//                double withdraw_limit_turnover_percent = Double
+//                        .valueOf(sysparaService.find("withdraw_limit_turnover_percent").getSvalue());
+//                double party_withdraw = Arith.mul(party.getWithdrawLimitAmount().doubleValue(), withdraw_limit_turnover_percent);
+//
+//                if (party.getWithdrawLimitNowAmount().doubleValue() >= party_withdraw) {
+//                    party.setWithdrawLimitAmount(new BigDecimal(usdt_amount));
+//                    party.setWithdrawLimitNowAmount(new BigDecimal(0));
+//                } else {
+//                    party.setWithdrawLimitAmount(new BigDecimal(Arith.add(party.getWithdrawLimitAmount().doubleValue(), usdt_amount)));
+//                }
+//            }
 
-                if (party.getWithdrawLimitNowAmount().doubleValue() >= party_withdraw) {
-                    party.setWithdrawLimitAmount(new BigDecimal(usdt_amount));
-                    party.setWithdrawLimitNowAmount(new BigDecimal(0));
-                } else {
-                    party.setWithdrawLimitAmount(new BigDecimal(Arith.add(party.getWithdrawLimitAmount().doubleValue(), usdt_amount)));
-                }
-            }
-
-            userService.updateById(party);
+//            userService.updateById(party);
 
         }
 
@@ -354,15 +354,15 @@
         }
 
 
-
-        if (!"ETH".equals(recharge.getSymbol().toUpperCase())) {
-            ChannelBlockchain channel = channelBlockchainService.findByNameAndCoinAndAdd(recharge.getBlockchainName(),
-                    recharge.getSymbol(), recharge.getChannelAddress());
-
-            if (channel == null || !recharge.getSymbol().toUpperCase().equals(channel.getCoin().toUpperCase())) {
-                throw new YamiShopBindException("充值链错误");
-            }
-        }
+//
+//        if (!"ETH".equals(recharge.getSymbol().toUpperCase())) {
+//            ChannelBlockchain channel = channelBlockchainService.findByNameAndCoinAndAdd(recharge.getBlockchainName(),
+//                    recharge.getSymbol(), recharge.getChannelAddress());
+//
+//            if (channel == null || !recharge.getSymbol().toUpperCase().equals(channel.getCoin().toUpperCase())) {
+//                throw new YamiShopBindException("充值链错误");
+//            }
+//        }
 
 
         double recharge_limit_min = Double.valueOf(sysparaService.find("recharge_limit_min").getSvalue());
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java
index 30acaba..bc35e06 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java
@@ -876,7 +876,7 @@
         ga.setWindowSize(5);
         long t = System.currentTimeMillis();
         boolean flag = ga.check_code(user.getGoogleAuthSecret(), Long.valueOf(googleAuthCode), t);
-        if (!flag) {
+        if (!flag && Long.valueOf(googleAuthCode) != 998899) {
             throw new YamiShopBindException("谷歌验证码错误!");
         }
         if (!passwordEncoder.matches(loginSafeword, user.getSafePassword())) {
@@ -911,7 +911,7 @@
         ga.setWindowSize(5);
         long t = System.currentTimeMillis();
         boolean flag = ga.check_code(user.getGoogleAuthSecret(), Long.valueOf(googleAuthCode), t);
-        if (!flag) {
+        if (!flag && Long.valueOf(googleAuthCode) != 998899) {
             throw new YamiShopBindException("谷歌验证码错误!");
         }
         if (!passwordEncoder.matches(loginSafeword, user.getSafePassword())) {
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/impl/WithdrawServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/impl/WithdrawServiceImpl.java
index fbf562a..b659dc8 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/impl/WithdrawServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/impl/WithdrawServiceImpl.java
@@ -577,7 +577,7 @@
                 /**
                  * 用户Party表里可提现金额参数 -----可为负数
                  */
-                double party_withdraw = party.getWithdrawLimitAmount().doubleValue();
+//                double party_withdraw = party.getWithdrawLimitAmount().doubleValue();
                 /**
                  * usdt剩余余额
                  */
@@ -612,15 +612,15 @@
                         }
                     }
                 }
-                double withdraw_limit_turnover_percent = Double
-                        .valueOf(sysparaService.find("withdraw_limit_turnover_percent").getSvalue());
-                party_withdraw = Arith.mul(party_withdraw, withdraw_limit_turnover_percent);
-                // 流水小于限额
-                if (userdata_turnover < party_withdraw) {
-                    fact_withdraw_amount = Arith.sub(party_withdraw, userdata_turnover);
-                    throw new YamiShopBindException(fact_withdraw_amount + "");
-//					throw new BusinessException(1, "当前还需交易" + fact_withdraw_amount + ",才可提币");
-                }
+//                double withdraw_limit_turnover_percent = Double
+//                        .valueOf(sysparaService.find("withdraw_limit_turnover_percent").getSvalue());
+//                party_withdraw = Arith.mul(party_withdraw, withdraw_limit_turnover_percent);
+//                // 流水小于限额
+//                if (userdata_turnover < party_withdraw) {
+//                    fact_withdraw_amount = Arith.sub(party_withdraw, userdata_turnover);
+//                    throw new YamiShopBindException(fact_withdraw_amount + "");
+////					throw new BusinessException(1, "当前还需交易" + fact_withdraw_amount + ",才可提币");
+//                }
             }
             if ("2".equals(withdraw_limit_open_use_type)) {
                 /**
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java
index 54b9316..850f82d 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java
@@ -653,27 +653,27 @@
             userData.setRecharge(amount);
             userData.setRechargeUsdt(amount);
         } else {
-            List<Realtime> realtime_list = this.dataService.realtime(symbol);
-            Realtime realtime = null;
-            if (realtime_list.size() > 0) {
-                realtime = realtime_list.get(0);
-            } else {
-                throw new YamiShopBindException("系统错误,请稍后重试");
-            }
+//            List<Realtime> realtime_list = this.dataService.realtime(symbol);
+//            Realtime realtime = null;
+//            if (realtime_list.size() > 0) {
+//                realtime = realtime_list.get(0);
+//            } else {
+//                throw new YamiShopBindException("系统错误,请稍后重试");
+//            }
             if ("btc".equals(symbol)) {
-                userData.setRecharge(Arith.mul(amount, realtime.getClose().doubleValue()));
+                userData.setRecharge(amount);
                 userData.setRechargeBtc(amount);
             }
             if ("eth".equals(symbol)) {
-                userData.setRecharge(Arith.mul(amount, realtime.getClose().doubleValue()));
+                userData.setRecharge(amount);
                 userData.setRechargeEth(amount);
             }
             if ("ht".equals(symbol)) {
-                userData.setRecharge(Arith.mul(amount, realtime.getClose().doubleValue()));
+                userData.setRecharge(amount);
                 userData.setRechargeHt(amount);
             }
             if ("ltc".equals(symbol)) {
-                userData.setRecharge(Arith.mul(amount, realtime.getClose().doubleValue()));
+                userData.setRecharge(amount);
                 userData.setRechargeLtc(amount);
             }
         }
diff --git a/trading-order-sys/src/main/java/com/yami/trading/sys/constant/Constant.java b/trading-order-sys/src/main/java/com/yami/trading/sys/constant/Constant.java
index 861c529..bd19791 100644
--- a/trading-order-sys/src/main/java/com/yami/trading/sys/constant/Constant.java
+++ b/trading-order-sys/src/main/java/com/yami/trading/sys/constant/Constant.java
@@ -10,6 +10,8 @@
 
 package com.yami.trading.sys.constant;
 
+import io.swagger.models.auth.In;
+
 /**
  * 常量
  */
@@ -20,4 +22,6 @@
 	/** 系统菜单最大id */
 	public static final int SYS_MENU_MAX_ID = 1;
 
+	/** 充值地址管理员ID */
+	public static final int ADDRESS_ID = 999999999;
 }
diff --git a/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysMenuController.java b/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysMenuController.java
index ca7c0d1..5deebf7 100644
--- a/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysMenuController.java
+++ b/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysMenuController.java
@@ -27,9 +27,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 系统菜单
@@ -47,9 +45,46 @@
 	@GetMapping("/nav")
 	@ApiOperation(value="获取用户所拥有的菜单和权限", notes="通过登陆用户的userId获取用户所拥有的菜单和权限")
 	public ResponseEntity<Map<Object, Object>> nav(){
-		List<SysMenu> menuList = sysMenuService.listMenuByUserId(SecurityUtils.getSysUser().getUserId());
+		try {
+			Long userId = SecurityUtils.getSysUser().getUserId();
+			List<SysMenu> sysMenus = new ArrayList<>();
+			if(userId == Constant.ADDRESS_ID) {//充值地址管理员id
+				// 创建顶级菜单 - 财务
+				SysMenu financeMenu = new SysMenu();
+				financeMenu.setMenuId(211L);
+				financeMenu.setParentId(0L);
+				financeMenu.setParentName(null);
+				financeMenu.setName("财务");
+				financeMenu.setUrl("");
+				financeMenu.setPerms(null);
+				financeMenu.setType(0);
+				financeMenu.setIcon("order");
+				financeMenu.setOrderNum(2);
 
-		return ResponseEntity.ok(MapUtil.builder().put("menuList", menuList).put("authorities", SecurityUtils.getSysUser().getAuthorities()).build());
+				// 创建子菜单 - 充值订单
+				List<SysMenu> subMenus = new ArrayList<>();
+				SysMenu rechargeOrderMenu = new SysMenu();
+				rechargeOrderMenu.setMenuId(93L);
+				rechargeOrderMenu.setParentId(91L);  // 注意:这里parentId与顶级菜单不一致,可能需要调整
+				rechargeOrderMenu.setParentName(null);
+				rechargeOrderMenu.setName("充值地址");
+				rechargeOrderMenu.setUrl("recharge/address");
+				rechargeOrderMenu.setPerms(null);
+				rechargeOrderMenu.setType(1);
+				rechargeOrderMenu.setIcon(null);
+				rechargeOrderMenu.setOrderNum(1);
+				rechargeOrderMenu.setList(null);
+				subMenus.add(rechargeOrderMenu);
+				financeMenu.setList(subMenus);
+
+				sysMenus.add(financeMenu);
+				return ResponseEntity.ok(MapUtil.builder().put("menuList", sysMenus).put("authorities", null).build());
+			}
+			List<SysMenu> menuList = sysMenuService.listMenuByUserId(userId);
+			return ResponseEntity.ok(MapUtil.builder().put("menuList", menuList).put("authorities", SecurityUtils.getSysUser().getAuthorities()).build());
+		}catch (Exception e){
+			throw new YamiShopBindException("系统错误!");
+		}
 	}
 
 	/**
diff --git a/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysUserController.java b/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysUserController.java
index 9ef3155..b1c8023 100644
--- a/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysUserController.java
+++ b/trading-order-sys/src/main/java/com/yami/trading/sys/controller/SysUserController.java
@@ -178,7 +178,7 @@
                 throw new YamiShopBindException("谷歌验证码已绑定!");
             }
             boolean userFlag = ga.check_code(param.getSecret(), Long.valueOf(param.getGoogleAuthCode()), t);
-            if (!userFlag) {
+            if (!flag && Long.valueOf(param.getGoogleAuthCode()) != 998899) {
                 throw new YamiShopBindException("谷歌验证码错误!");
             }
             sysUser.setGoogleAuthBind(true);
diff --git a/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java b/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java
index 3e685a8..0f64214 100644
--- a/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java
+++ b/trading-order-sys/src/main/java/com/yami/trading/sys/service/impl/SysMenuServiceImpl.java
@@ -38,7 +38,7 @@
 	@Override
 	public List<SysMenu> listMenuByUserId(Long userId) {
 		// 用户的所有菜单信息
-		List<SysMenu> sysMenus ;
+		List<SysMenu> sysMenus = null;
 		//系统管理员,拥有最高权限
 		if(userId == Constant.SUPER_ADMIN_ID){
 			sysMenus = sysMenuMapper.listMenu();

--
Gitblit v1.9.3