From 1004f3d16011f69894196bfd180ea539b76ba4e7 Mon Sep 17 00:00:00 2001
From: zj <1772600164@qq.com>
Date: Wed, 03 Jun 2026 15:27:26 +0800
Subject: [PATCH] 1

---
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/AddressController.java                      |   95 +-
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewsController.java                        |   12 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java                       |    6 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/item/TItemLeverageController.java           |    3 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiHighLevelAuthController.java               |   22 
 trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderService.java                         |   35 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRealNameAuthContoller.java                 |   12 
 trading-order-service/src/main/java/com/yami/trading/service/item/ItemLeverageService.java                      |    4 
 trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderServiceImpl.java                     |  280 ++++++
 trading-order-service/src/main/java/com/yami/trading/service/loan/job/LoanDueRepayJob.java                      |   50 +
 sql/t_loan.sql                                                                                                  |   61 +
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiCapitaltWalletWalletController.java        |    4 
 sql/t_loan_menu.sql                                                                                             |   32 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemUserOptionalController.java            |   12 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiOtcOnlineChatController.java               |    4 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/MinerOrderController.java             |   24 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiChannelBlockchainController.java  |    2 
 trading-order-service/src/main/java/com/yami/trading/service/ChannelBlockchainService.java                      |    5 
 trading-order-admin/src/main/java/com/yami/trading/api/filter/KickoutFilter.java                                |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java                          |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/dto/RealNameAuthRecordDto.java                           |    2 
 trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java                 |   90 +
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java                     |    4 
 trading-order-service/src/main/java/com/yami/trading/service/impl/ChannelBlockchainServiceImpl.java             |   31 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiKycController.java                         |   12 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/user/UserController.java                    |    1 
 trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanOrderMapper.java                              |   19 
 trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateAddressModel.java                          |    4 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIndexController.java                       |    2 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/AdminMinerController.java             |   20 
 trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanOrder.java                                      |   42 
 trading-order-admin/src/main/resources/config/system.properties                                                 |    2 
 trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java   |    4 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanOrderController.java          |  190 ++++
 trading-order-security-common/src/main/java/com/yami/trading/security/common/adapter/ResourceServerAdapter.java |    1 
 trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderLock.java                            |   16 
 trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateWalltModel.java                            |    1 
 trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanConfigMapper.java                             |    7 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanConfigController.java         |   78 +
 trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerServiceImpl.java           |    9 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAdvertController.java                   |   40 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWalletController.java                      |   14 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/PromoteController.java                        |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewOnlineChatController.java               |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/dto/HighLevelAuthRecordDto.java                          |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java                    |   50 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiExchangeApplyOrderController.java |   44 
 trading-order-common/src/main/java/com/yami/trading/common/constants/TipConstants.java                          |    7 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java               |   16 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiTItemLeverageController.java               |    4 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWithdrawController.java                    |   16 
 trading-order-admin/src/main/java/com/yami/trading/api/model/SetSafewordModel.java                              |    2 
 trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanConfig.java                                     |   26 
 trading-order-service/src/main/java/com/yami/trading/service/cms/impl/CmsServiceImpl.java                       |   15 
 trading-order-service/src/main/resources/mapper/miner/MinerOrderMapper.xml                                      |    2 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java                    |   44 
 trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java                                      |  167 ---
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethod2Controller.java              |   32 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanController.java                    |  215 ++++
 trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigServiceImpl.java                    |   41 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiFuturesOrderController.java                |   16 
 trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java            |    5 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethodController.java               |   32 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUserController.java                        |  158 +-
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/future/AdminFuturesOrderController.java     |   20 
 trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigService.java                        |   18 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cPaymentMethodConfigController.java      |    2 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/cms/CmsController.java                      |   19 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAppealController.java                   |   14 
 trading-order-service/src/main/java/com/yami/trading/service/impl/UserServiceImpl.java                          |    5 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApGoogleAuthController.java                   |    4 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java                         |    8 
 trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java                    |   78 +
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUploadFileController.java                  |    4 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java                        |    2 
 trading-order-common/src/main/java/com/yami/trading/common/util/MarketOpenChecker.java                          |   14 
 scripts/translate_api_exceptions.js                                                                             |  169 +++
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java          |   26 
 trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRechargeBlockchainController.java          |   12 
 trading-order-service/src/main/resources/mapper/loan/LoanOrderMapper.xml                                        |   55 +
 80 files changed, 1,977 insertions(+), 627 deletions(-)

diff --git a/scripts/translate_api_exceptions.js b/scripts/translate_api_exceptions.js
new file mode 100644
index 0000000..447cebe
--- /dev/null
+++ b/scripts/translate_api_exceptions.js
@@ -0,0 +1,169 @@
+const fs = require('fs');
+const path = require('path');
+
+const API_ROOT = path.join(__dirname, '../trading-order-admin/src/main/java/com/yami/trading/api');
+
+const replacements = [
+  ['accessToken 已过期', 'Access token has expired'],
+  ['请输入正确的货币数量', 'Please enter a valid amount'],
+  ['请输入正确的兑换数量', 'Please enter a valid exchange amount'],
+  ['请选择正确的币种', 'Please select a valid currency'],
+  ['系统错误,请稍后重试', 'System error, please try again later'],
+  ['用户已禁用!', 'User account is disabled'],
+  ['用户已禁用', 'User account is disabled'],
+  ['请求第三方失败', 'Third-party request failed'],
+  ['生成实时数据失败', 'Failed to generate market data'],
+  ['代理层级错误', 'Invalid agent level'],
+  ['k线图获取失败', 'Failed to load chart data'],
+  ['系统参数错误', 'System parameter error'],
+  ['资金密码必须6-12位', 'Fund password must be 6-12 characters'],
+  ['资金密码错误', 'Incorrect fund password'],
+  ['不支持的提现币种', 'Unsupported withdrawal currency'],
+  ['订单不存在!', 'Order does not exist'],
+  ['订单不存在', 'Order does not exist'],
+  ['页码不能小于等于0', 'Page number must be greater than 0'],
+  ['页码不是整数', 'Page number must be an integer'],
+  ['用户名不能为空', 'Username is required'],
+  ['登录密码不能为空', 'Login password is required'],
+  ['登录密码必须6-12位', 'Login password must be 6-12 characters'],
+  ['校验IP不合法', 'Invalid IP address'],
+  ['当前用户在黑名单中', 'The current user is on the blacklist.'],
+  ['资金密码不能为空', 'Fund password is required'],
+  ['资金密码不符合设定', 'Fund password does not meet requirements'],
+  ['请先登录', 'Please log in first'],
+  ['密码不能为空', 'Password is required'],
+  ['密码必须6-12位', 'Password must be 6-12 characters'],
+  ['验证类型不能为空', 'Verification type is required'],
+  ['验证码不能为空', 'Verification code is required'],
+  ['用户名不存在', 'Username does not exist'],
+  ['验证码不正确', 'Incorrect verification code'],
+  ['用户名参数为空', 'Username is required'],
+  ['请填写正确的电话号码', 'Please enter a valid phone number'],
+  ['电话号码已绑定其他用户', 'Phone number is bound to another user'],
+  ['电话号码已绑定', 'Phone number is already bound'],
+  ['请填写正确的验证码', 'Please enter a valid verification code'],
+  ['请输入推荐码', 'Please enter referral code'],
+  ['推荐人无权限推荐', 'Referrer is not authorized to refer'],
+  ['请填写正确的邮箱地址', 'Please enter a valid email address'],
+  ['邮箱已绑定其他用户', 'Email is bound to another user'],
+  ['邮箱已绑定', 'Email is already bound'],
+  ['操作失败,请稍后再试', 'Operation failed, please try again later'],
+  ['旧密码不能为空', 'Old password is required'],
+  ['新密码不能为空', 'New password is required'],
+  ['旧资金密码不能为空', 'Old fund password is required'],
+  ['新资金密码不能为空', 'New fund password is required'],
+  ['新密码确认不能为空', 'Password confirmation is required'],
+  ['旧密码不正确!', 'Incorrect old password'],
+  ['新密码不一致', 'New passwords do not match'],
+  ['旧资金密码不能为空', 'Old fund password is required'],
+  ['新资金密码不能为空', 'New fund password is required'],
+  ['新资金密码确认不能为空', 'Fund password confirmation is required'],
+  ['操作类型为空', 'Operation type is required'],
+  ['操作类型不是整数', 'Operation type must be an integer'],
+  ['操作类型不能小于0', 'Operation type cannot be negative'],
+  ['备注长度超过250', 'Remark exceeds 250 characters'],
+  ['未绑定谷歌验证器', 'Google Authenticator is not bound'],
+  ['未绑定手机号', 'Phone number is not bound'],
+  ['未绑定邮箱', 'Email is not bound'],
+  ['状态不能小于0', 'Status cannot be negative'],
+  ['状态不是整数', 'Status must be an integer'],
+  ['参数错误', 'Invalid parameters'],
+  ['支付方式模板不正确', 'Invalid payment method template'],
+  ['真实姓名必填', 'Real name is required'],
+  ['参数值1必填', 'Parameter value 1 is required'],
+  ['真实姓名长度大于20', 'Real name exceeds 20 characters'],
+  ['备注长度大于100', 'Remark exceeds 100 characters'],
+  ['支付方式模板不存在', 'Payment method template does not exist'],
+  ['长度大于25', ' exceeds 25 characters'],
+  ['请重新登录', 'Please log in again'],
+  ['支付方式数量已达上限', 'Payment method limit reached'],
+  ['支付方式不匹配该用户', 'Payment method does not match this user'],
+  ['支付方式不存在', 'Payment method does not exist'],
+  ['证件号码长度超过50', 'ID number exceeds 50 characters'],
+  ['实名姓名长度超过50', 'Real name exceeds 50 characters'],
+  ['已经提交申请,请等待审核', 'Application submitted, please wait for review'],
+  ['审核状态异常请联系客服', 'Abnormal review status, please contact support'],
+  ['审核已通过', 'Already approved'],
+  ['审核中', 'Under review'],
+  ['请上传图片', 'Please upload an image'],
+  ['请稍后再试', 'Please try again later'],
+  ['无权限', 'Permission denied'],
+  ['提交失败,当前有未处理银行卡订单', 'Submission failed, pending bank order exists'],
+  ['图片大小不能超过4M', 'Image size cannot exceed 4MB'],
+  ['文件上传失败', 'File upload failed'],
+  ['订单号不能未空', 'Order number is required'],
+  ['当前支付方式有未处理完成的订单!', 'Pending orders exist for this payment method'],
+  ['广告id不正确', 'Invalid advert ID'],
+  ['广告不存在', 'Advert does not exist'],
+  ['承兑商支付方式未配置', 'Merchant payment method not configured'],
+  ['承兑商广告支付方式未配置', 'Merchant advert payment method not configured'],
+  ['承兑商不存在', 'Merchant does not exist'],
+  ['承兑商的用户信息不存在', 'Merchant user info does not exist'],
+  ['当前已经加入过自选', 'Already added to favorites'],
+  ['保存自选失败:', 'Failed to save favorites:'],
+  ['删除失败', 'Delete failed'],
+  ['账号或密码不正确', 'Incorrect username or password'],
+  ['操作失败,请稍后再试', 'Operation failed, please try again later'],
+  ['追加保证金异常', 'Failed to add margin'],
+  ['当前币对不存在', 'Trading pair does not exist'],
+  ['未开放合约交易', 'Futures trading is not available'],
+  ['停牌禁止交易', 'Trading suspended'],
+  ['当前已经休市', 'Market is closed'],
+  ['实名认证未通过,无法进行高级认证', 'Real-name verification required before advanced verification'],
+  ['工作地址长度超过245', 'Work address exceeds 245 characters'],
+  ['家庭地址长度超过245', 'Home address exceeds 245 characters'],
+  ['亲属电话长度超过32', 'Relative phone exceeds 32 characters'],
+  ['亲属名称长度超过32', 'Relative name exceeds 32 characters'],
+  ['亲属地址长度超过245', 'Relative address exceeds 245 characters'],
+  ['请登录!', 'Please log in'],
+  ['最低下单金额:', 'Minimum order amount: '],
+  ['委托单不存在', 'Order does not exist'],
+  ['执行撤单异常', 'Failed to cancel order'],
+  ['无网络', 'Network unavailable'],
+  ['谷歌验证码已绑定', 'Google Authenticator is already bound'],
+  ['谷歌验证码错误', 'Incorrect Google Authenticator code'],
+  ['支付币种不正确', 'Invalid payment currency'],
+  ['提交失败,当前有未处理订单', 'Submission failed, pending order exists'],
+  ['用户未结束订单数量已达上限', 'Too many open orders'],
+  ['今日取消订单次数太多了,请明日再试', 'Too many cancellations today, try again tomorrow'],
+  ['订单类型不正确', 'Invalid order type'],
+  ['支付金额不正确', 'Invalid payment amount'],
+  ['币种数量不正确', 'Invalid currency amount'],
+  ['用户不存在', 'User does not exist'],
+  ['C2C广告id不正确', 'Invalid C2C advert ID'],
+  ['申诉订单号不正确', 'Invalid appeal order number'],
+  ['请输入申诉原因', 'Appeal reason is required'],
+  ['请上传申诉凭证', 'Please upload appeal evidence'],
+  ['该订单已提交申诉', 'Appeal already submitted for this order'],
+  ['申诉不存在', 'Appeal does not exist'],
+  ['请先通过高级认证', 'Advanced verification required'],
+  ['流水小于限额', 'Turnover below minimum limit'],
+  ['用户不能取消提现', 'User cannot cancel this withdrawal'],
+  ['充值或提现不正确', 'Invalid recharge or withdrawal type'],
+  ['订单状态不正确', 'Invalid order status'],
+  [' 不存在', ' does not exist'],
+];
+
+function walk(dir, files = []) {
+  for (const name of fs.readdirSync(dir)) {
+    const p = path.join(dir, name);
+    if (fs.statSync(p).isDirectory()) walk(p, files);
+    else if (name.endsWith('.java')) files.push(p);
+  }
+  return files;
+}
+
+let changed = 0;
+for (const file of walk(API_ROOT)) {
+  let content = fs.readFileSync(file, 'utf8');
+  const original = content;
+  for (const [from, to] of replacements) {
+    if (content.includes(from)) content = content.split(from).join(to);
+  }
+  if (content !== original) {
+    fs.writeFileSync(file, content, 'utf8');
+    changed++;
+    console.log('updated:', path.relative(API_ROOT, file));
+  }
+}
+console.log('done, files changed:', changed);
diff --git a/sql/t_loan.sql b/sql/t_loan.sql
new file mode 100644
index 0000000..329f66e
--- /dev/null
+++ b/sql/t_loan.sql
@@ -0,0 +1,61 @@
+-- 助力贷:产品配置与订单表
+
+CREATE TABLE IF NOT EXISTS `t_loan_config` (
+  `uuid` varchar(64) NOT NULL,
+  `term` int NOT NULL COMMENT '借款天数',
+  `daily_rate` decimal(20,8) NOT NULL DEFAULT '0.00100000' COMMENT '日利率',
+  `max_quota` decimal(20,8) NOT NULL DEFAULT '10000.00000000' COMMENT '最高额度',
+  `lending_institution` varchar(64) DEFAULT '1',
+  `lending_name` varchar(128) DEFAULT 'Platform Finance',
+  `repayment` int DEFAULT '1' COMMENT '1到期一次还款',
+  `repay_cycle` int DEFAULT NULL COMMENT '还款周期(天)',
+  `state` int DEFAULT '1' COMMENT '0停用 1启用',
+  `sort_num` int DEFAULT '0',
+  `create_time` datetime DEFAULT NULL,
+  `update_time` datetime DEFAULT NULL,
+  PRIMARY KEY (`uuid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='贷款产品配置';
+
+CREATE TABLE IF NOT EXISTS `t_loan_order` (
+  `uuid` varchar(64) NOT NULL,
+  `order_no` varchar(64) NOT NULL,
+  `user_id` varchar(64) NOT NULL,
+  `loan_config_id` varchar(64) DEFAULT NULL,
+  `symbol` varchar(32) DEFAULT 'USDT',
+  `quota` decimal(20,8) NOT NULL,
+  `term` int NOT NULL,
+  `daily_rate` decimal(20,8) NOT NULL,
+  `total_interest` decimal(20,8) DEFAULT '0.00000000',
+  `repay_cycle` int DEFAULT NULL,
+  `repayment` int DEFAULT '1',
+  `lending_institution` varchar(64) DEFAULT NULL,
+  `lending_name` varchar(128) DEFAULT NULL,
+  `state` int DEFAULT '1' COMMENT '1待审 2还款中 3驳回 4逾期 5已还款',
+  `reason` varchar(512) DEFAULT NULL,
+  `id_front_img` varchar(512) DEFAULT NULL,
+  `id_back_img` varchar(512) DEFAULT NULL,
+  `handheld_img` varchar(512) DEFAULT NULL,
+  `create_time` datetime DEFAULT NULL,
+  `approve_time` datetime DEFAULT NULL,
+  `due_time` datetime DEFAULT NULL,
+  `repaid_time` datetime DEFAULT NULL,
+  PRIMARY KEY (`uuid`),
+  KEY `idx_loan_order_user` (`user_id`),
+  KEY `idx_loan_order_state_due` (`state`,`due_time`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='贷款订单';
+
+INSERT INTO `t_loan_config` (`uuid`,`term`,`daily_rate`,`max_quota`,`lending_institution`,`lending_name`,`repayment`,`repay_cycle`,`state`,`sort_num`,`create_time`)
+SELECT 'loan_cfg_7', 7, 0.001, 5000, '1', 'Platform Finance', 1, 7, 1, 1, NOW()
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_loan_config WHERE uuid = 'loan_cfg_7');
+
+INSERT INTO `t_loan_config` (`uuid`,`term`,`daily_rate`,`max_quota`,`lending_institution`,`lending_name`,`repayment`,`repay_cycle`,`state`,`sort_num`,`create_time`)
+SELECT 'loan_cfg_14', 14, 0.001, 10000, '1', 'Platform Finance', 1, 14, 1, 2, NOW()
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_loan_config WHERE uuid = 'loan_cfg_14');
+
+INSERT INTO `t_loan_config` (`uuid`,`term`,`daily_rate`,`max_quota`,`lending_institution`,`lending_name`,`repayment`,`repay_cycle`,`state`,`sort_num`,`create_time`)
+SELECT 'loan_cfg_30', 30, 0.001, 30000, '1', 'Platform Finance', 1, 30, 1, 3, NOW()
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_loan_config WHERE uuid = 'loan_cfg_30');
+
+INSERT INTO `t_loan_config` (`uuid`,`term`,`daily_rate`,`max_quota`,`lending_institution`,`lending_name`,`repayment`,`repay_cycle`,`state`,`sort_num`,`create_time`)
+SELECT 'loan_cfg_60', 60, 0.001, 50000, '1', 'Platform Finance', 1, 60, 1, 4, NOW()
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM t_loan_config WHERE uuid = 'loan_cfg_60');
diff --git a/sql/t_loan_menu.sql b/sql/t_loan_menu.sql
new file mode 100644
index 0000000..fdc9e60
--- /dev/null
+++ b/sql/t_loan_menu.sql
@@ -0,0 +1,32 @@
+-- 助力贷管理后台菜单(挂到「财务」下)
+-- 执行后请重新登录管理后台;非超级管理员需在「角色管理」勾选新菜单或执行下方角色授权 SQL
+
+-- 财务目录 menu_id 一般为 211,若不一致请先查询:
+-- SELECT menu_id, name FROM tz_sys_menu WHERE name = '财务' AND type = 0;
+
+INSERT INTO `tz_sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `is_show`)
+SELECT 3410, 211, '助力贷套餐', 'finance/loan-config', NULL, 1, '', 10, 0
+FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM `tz_sys_menu` WHERE `menu_id` = 3410);
+
+INSERT INTO `tz_sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `is_show`)
+SELECT 3411, 211, '助力贷订单', 'finance/loan-order', NULL, 1, '', 11, 0
+FROM DUAL
+WHERE NOT EXISTS (SELECT 1 FROM `tz_sys_menu` WHERE `menu_id` = 3411);
+
+-- 将新菜单授权给已拥有「财务」子菜单的角色(与充值订单等同权限)
+INSERT INTO `tz_sys_role_menu` (`role_id`, `menu_id`)
+SELECT DISTINCT rm.`role_id`, 3410
+FROM `tz_sys_role_menu` rm
+INNER JOIN `tz_sys_menu` m ON m.`menu_id` = rm.`menu_id` AND m.`parent_id` = 211
+WHERE NOT EXISTS (
+  SELECT 1 FROM `tz_sys_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = 3410
+);
+
+INSERT INTO `tz_sys_role_menu` (`role_id`, `menu_id`)
+SELECT DISTINCT rm.`role_id`, 3411
+FROM `tz_sys_role_menu` rm
+INNER JOIN `tz_sys_menu` m ON m.`menu_id` = rm.`menu_id` AND m.`parent_id` = 211
+WHERE NOT EXISTS (
+  SELECT 1 FROM `tz_sys_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = 3411
+);
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
index a1f645e..0b78bf3 100644
--- 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
@@ -1,35 +1,26 @@
 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.constants.RedisKeys;
 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 com.yami.trading.service.ChannelBlockchainService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 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
- **/
+ * 管理后台 - 财务 - 充值地址(ChannelBlockchain 表)
+ */
 @Slf4j
 @RestController
 @RequestMapping("address")
@@ -39,61 +30,62 @@
     @Autowired
     RedisTemplate redisTemplate;
 
-    /**
-     * 地址列表
-     * @return
-     */
+    @Autowired
+    private ChannelBlockchainService channelBlockchainService;
+
+    @ApiOperation("充值地址列表")
     @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);
+    public Result<List<ChannelBlockchain>> list() {
+        List<ChannelBlockchain> list = channelBlockchainService.list();
+        list.forEach(this::fillBlockchainNameAlias);
+        return Result.succeed(list);
     }
 
+    @ApiOperation("修改充值地址")
     @PostMapping("/update")
-    public Result<?> list(@RequestBody UpdateAddressModel model) {
-        String name = model.getCoin().toLowerCase()+"_"+model.getChain().toLowerCase();
-        try {
-            if(model.getCoin().equals("eth") || model.getCoin().equals("btc")){
-                name = model.getCoin();
+    public Result<ChannelBlockchain> update(@RequestBody UpdateAddressModel model) {
+        if (StringUtils.isNotBlank(model.getUuid())) {
+            ChannelBlockchain existing = channelBlockchainService.getById(model.getUuid());
+            if (existing == null) {
+                throw new YamiShopBindException("充值地址记录不存在");
             }
-            return LocalKeyStorageAESUtil.encryptAndStore(model.getPassword(),model.getAddress(),name);
-        }catch (Exception e){
-            e.getMessage();
+            if (StringUtils.isBlank(model.getAddress())) {
+                throw new YamiShopBindException("充值地址不能为空");
+            }
+            existing.setAddress(model.getAddress().trim());
+            if (StringUtils.isNotBlank(model.getCoin())) {
+                existing.setCoin(model.getCoin().trim().toLowerCase());
+            }
+            if (StringUtils.isNotBlank(model.getChain())) {
+                existing.setBlockchainName(model.getChain().trim());
+            }
+            channelBlockchainService.updateById(existing);
+            fillBlockchainNameAlias(existing);
+            return Result.succeed(existing);
         }
-        return Result.succeed();
+        ChannelBlockchain saved = channelBlockchainService.saveOrUpdateByCoinAndChain(
+                model.getCoin(), model.getChain(), model.getAddress());
+        fillBlockchainNameAlias(saved);
+        return Result.succeed(saved);
     }
 
     /**
-     * u盾地址列表
-     * @return
+     * u盾地址列表(按用户维度,仍走 Redis)
      */
     @GetMapping("/getUDList")
-    public Result<?> getUDList(String partyId) {
+    public Result<List<ChannelBlockchain>> getUDList(String partyId) {
         if (partyId == null || partyId.isEmpty()) {
             return Result.failed("请选择用户");
         }
         List<CryptoCurrencyEnum> currencyEnums = CryptoCurrencyEnum.getAll();
         List<ChannelBlockchain> data = new ArrayList<>();
-        currencyEnums.forEach(currencyEnum->{
+        currencyEnums.forEach(currencyEnum -> {
             try {
-                String address = (String)redisTemplate.opsForValue().get(RedisKeys.BLOCKCHAIN_ADDRESS + partyId + currencyEnum.getName());
+                String address = (String) redisTemplate.opsForValue()
+                        .get(RedisKeys.BLOCKCHAIN_ADDRESS + partyId + currencyEnum.getName());
                 ChannelBlockchain blockchain = new ChannelBlockchain();
                 blockchain.setBlockchain_name(currencyEnum.getChain());
+                blockchain.setBlockchainName(currencyEnum.getChain());
                 blockchain.setAddress(address);
                 blockchain.setCoin(currencyEnum.getCoin());
                 blockchain.setAuto(false);
@@ -106,4 +98,9 @@
         return Result.succeed(data);
     }
 
+    private void fillBlockchainNameAlias(ChannelBlockchain item) {
+        if (item != null && StringUtils.isNotBlank(item.getBlockchainName())) {
+            item.setBlockchain_name(item.getBlockchainName());
+        }
+    }
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/cms/CmsController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/cms/CmsController.java
index c4f9800..4fa3e73 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/cms/CmsController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/cms/CmsController.java
@@ -41,15 +41,17 @@
     @PostMapping("list")
     public Result<Page> list(@RequestBody @Valid CmsListModel request) {
         Page<Cms> page = new Page(request.getCurrent(), request.getSize());
-        LambdaQueryWrapper<Cms> lambdaQueryWrapper = Wrappers.<Cms>query().lambda();
+        LambdaQueryWrapper<Cms> lambdaQueryWrapper = Wrappers.<Cms>query().lambda()
+                .select(Cms::getUuid, Cms::getTitle, Cms::getModel, Cms::getCreateTime,
+                        Cms::getLanguage, Cms::getContentCode);
         if (!StrUtil.isEmpty(request.getTitle())) {
             lambdaQueryWrapper.like(Cms::getTitle, request.getTitle());
         }
         if (!StrUtil.isEmpty(request.getContentCode())) {
-            lambdaQueryWrapper.like(Cms::getContentCode, request.getContentCode());
+            lambdaQueryWrapper.eq(Cms::getContentCode, request.getContentCode());
         }
         if (!StrUtil.isEmpty(request.getLanguage())) {
-            lambdaQueryWrapper.like(Cms::getLanguage, request.getLanguage());
+            lambdaQueryWrapper.eq(Cms::getLanguage, request.getLanguage());
         }
         lambdaQueryWrapper.orderByDesc(Cms::getCreateTime);
         cmsService.page(page, lambdaQueryWrapper);
@@ -59,6 +61,17 @@
         return Result.ok(page);
     }
 
+    @ApiOperation(value = "详情")
+    @PostMapping("info")
+    public Result<Cms> info(@RequestBody @Valid IdModel model) {
+        Cms cms = cmsService.getById(model.getId());
+        if (cms == null) {
+            throw new YamiShopBindException("参数错误!");
+        }
+        cms.setLanguageText(Constants.LANGUAGE.get(cms.getLanguage()));
+        return Result.ok(cms);
+    }
+
     @ApiOperation(value = "新增")
     @PostMapping("add")
     public Result<?> add(@RequestBody @Valid CmsModel model) {
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/future/AdminFuturesOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/future/AdminFuturesOrderController.java
index 15019ce..88a1f32 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/future/AdminFuturesOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/future/AdminFuturesOrderController.java
@@ -1,5 +1,6 @@
 package com.yami.trading.admin.controller.future;
 
+import cn.hutool.core.util.StrUtil;
 import com.yami.trading.admin.facade.PermissionFacade;
 import com.yami.trading.common.domain.Result;
 
@@ -57,8 +58,23 @@
 	@ApiOperation(value = "盈利还是亏损")
 	@GetMapping("orderProfitLoss.action")
 	public Result<String> orderProfitLoss(@RequestParam String orderNo, @RequestParam String profitLoss) {
-		futuresOrderService.saveOrderPorfitOrLoss(orderNo, profitLoss, SecurityUtils.getSysUser().getUsername());
-		return Result.ok("操作成过");
+		String msg = futuresOrderService.saveOrderPorfitOrLoss(orderNo, profitLoss, SecurityUtils.getSysUser().getUsername());
+		if (StrUtil.isNotBlank(msg)) {
+			return Result.failed(msg);
+		}
+		return Result.ok("操作成功");
+	}
 
+	/**
+	 * 修改订单方向 buy=买涨 sell=买跌
+	 */
+	@ApiOperation(value = "修改交割订单方向")
+	@GetMapping("orderDirection.action")
+	public Result<String> orderDirection(@RequestParam String orderNo, @RequestParam String direction) {
+		String msg = futuresOrderService.saveOrderDirection(orderNo, direction, SecurityUtils.getSysUser().getUsername());
+		if (StrUtil.isNotBlank(msg)) {
+			return Result.failed(msg);
+		}
+		return Result.ok("操作成功");
 	}
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/item/TItemLeverageController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/item/TItemLeverageController.java
index 283bd91..bc42b3e 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/item/TItemLeverageController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/item/TItemLeverageController.java
@@ -41,8 +41,7 @@
     @Autowired
     private ItemLeverageService itemLeverageService;
 
-    @Autowired
-    private TItemLeverageWrapper tItemLeverageWrapper;
+    private final TItemLeverageWrapper tItemLeverageWrapper = TItemLeverageWrapper.INSTANCE;
 
     /**
      * 产品杠杠倍数列表数据
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanConfigController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanConfigController.java
new file mode 100644
index 0000000..e644af5
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanConfigController.java
@@ -0,0 +1,78 @@
+package com.yami.trading.admin.controller.loan;
+
+import com.yami.trading.bean.loan.LoanConfig;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.common.util.StringUtils;
+import com.yami.trading.service.loan.LoanConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@CrossOrigin
+@Slf4j
+public class AdminLoanConfigController {
+
+    private final String action = "normal/loanConfigAdmin!";
+
+    @Autowired
+    private LoanConfigService loanConfigService;
+
+    @RequestMapping(action + "list.action")
+    public Result<List<LoanConfig>> list() {
+        return Result.ok(loanConfigService.listAll());
+    }
+
+    @RequestMapping(action + "save.action")
+    public Result<String> save(HttpServletRequest request) {
+        LoanConfig config = new LoanConfig();
+        String uuid = request.getParameter("uuid");
+        if (!StringUtils.isNullOrEmpty(uuid)) {
+            config.setUuid(uuid);
+        }
+        config.setTerm(parseInt(request.getParameter("term"), 30));
+        config.setDailyRate(parseDouble(request.getParameter("dailyRate"), 0.001));
+        config.setMaxQuota(parseDouble(request.getParameter("maxQuota"), 10000));
+        config.setLendingInstitution(request.getParameter("lendingInstitution"));
+        config.setLendingName(request.getParameter("lendingName"));
+        config.setRepayment(parseInt(request.getParameter("repayment"), 1));
+        config.setRepayCycle(parseInt(request.getParameter("repayCycle"), config.getTerm()));
+        config.setState(parseInt(request.getParameter("state"), 1));
+        config.setSortNum(parseInt(request.getParameter("sortNum"), 0));
+        config.setUpdateTime(new Date());
+        if (StringUtils.isNullOrEmpty(uuid)) {
+            config.setCreateTime(new Date());
+        }
+        loanConfigService.saveOrUpdateConfig(config);
+        return Result.ok("Success");
+    }
+
+    @RequestMapping(action + "delete.action")
+    public Result<String> delete(HttpServletRequest request) {
+        String uuid = request.getParameter("uuid");
+        loanConfigService.deleteConfig(uuid);
+        return Result.ok("Success");
+    }
+
+    private int parseInt(String val, int defaultVal) {
+        try {
+            return StringUtils.isNullOrEmpty(val) ? defaultVal : Integer.parseInt(val);
+        } catch (NumberFormatException e) {
+            return defaultVal;
+        }
+    }
+
+    private double parseDouble(String val, double defaultVal) {
+        try {
+            return StringUtils.isNullOrEmpty(val) ? defaultVal : Double.parseDouble(val);
+        } catch (NumberFormatException e) {
+            return defaultVal;
+        }
+    }
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanOrderController.java
new file mode 100644
index 0000000..69dc447
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/AdminLoanOrderController.java
@@ -0,0 +1,190 @@
+package com.yami.trading.admin.controller.loan;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.admin.facade.PermissionFacade;
+import com.yami.trading.bean.loan.LoanOrder;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.common.util.StringUtils;
+import com.yami.trading.security.common.util.SecurityUtils;
+import com.yami.trading.service.loan.LoanOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@RestController
+@CrossOrigin
+@Slf4j
+public class AdminLoanOrderController {
+
+    private final String action = "normal/loanadmin!";
+
+    @Autowired
+    private LoanOrderService loanOrderService;
+    @Autowired
+    private PermissionFacade permissionFacade;
+
+    private static final Map<Integer, String> STATE_LABEL = new HashMap<>();
+    private static final Map<Integer, String> REPAYMENT_LABEL = new HashMap<>();
+
+    static {
+        STATE_LABEL.put(1, "未审");
+        STATE_LABEL.put(2, "通过");
+        STATE_LABEL.put(3, "驳回");
+        STATE_LABEL.put(4, "逾期");
+        STATE_LABEL.put(5, "已还款");
+        REPAYMENT_LABEL.put(1, "到期一次还款");
+    }
+
+    @RequestMapping(action + "list.action")
+    public Result<Page<Map<String, Object>>> list(HttpServletRequest request) {
+        int current = parseInt(request.getParameter("current"), 1);
+        int size = parseInt(request.getParameter("size"), 10);
+        String status = normalizeStatusFilter(request.getParameter("status"));
+        String userName = firstNonBlank(request.getParameter("userName"), request.getParameter("user_name"));
+        String orderNo = request.getParameter("orderNo");
+        String rolename = request.getParameter("rolename");
+        List<String> children = permissionFacade.getOwnerUserIds();
+        Page<Map<String, Object>> page = loanOrderService.adminPagedQuery(current, size, status, userName, orderNo, rolename, children);
+        List<Map<String, Object>> records = new ArrayList<>();
+        for (Map<String, Object> row : page.getRecords()) {
+            records.add(formatAdminRow(row));
+        }
+        page.setRecords(records);
+        return Result.ok(page);
+    }
+
+    @RequestMapping(action + "change.action")
+    public Result<String> change(HttpServletRequest request) {
+        String orderId = firstNonBlank(request.getParameter("orderId"), request.getParameter("uuid"));
+        String statusStr = request.getParameter("statusStr");
+        String reason = request.getParameter("reason");
+        String operator = SecurityUtils.getSysUser().getUsername();
+        String err;
+        if ("2".equals(statusStr)) {
+            err = loanOrderService.approve(orderId, operator);
+        } else if ("3".equals(statusStr)) {
+            err = loanOrderService.reject(orderId, reason, operator);
+        } else if ("5".equals(statusStr)) {
+            err = loanOrderService.manualRepay(orderId, operator);
+        } else {
+            return Result.failed("Invalid status");
+        }
+        if (err != null) {
+            return Result.failed(err);
+        }
+        return Result.ok("Success");
+    }
+
+    @RequestMapping(action + "modify.action")
+    public Result<String> modify(HttpServletRequest request) {
+        LoanOrder order = new LoanOrder();
+        order.setUuid(firstNonBlank(request.getParameter("orderNo"), request.getParameter("uuid")));
+        order.setSymbol(request.getParameter("symbol"));
+        order.setQuota(parseDouble(request.getParameter("quota"), 0));
+        order.setIdFrontImg(firstNonBlank(request.getParameter("img_idimg_1"), request.getParameter("idFrontImg")));
+        order.setIdBackImg(firstNonBlank(request.getParameter("img_idimg_2"), request.getParameter("idBackImg")));
+        order.setHandheldImg(firstNonBlank(request.getParameter("img_idimg_3"), request.getParameter("handheldImg")));
+        loanOrderService.modifyOrder(order);
+        return Result.ok("Success");
+    }
+
+    private Map<String, Object> formatAdminRow(Map<String, Object> row) {
+        Map<String, Object> map = new HashMap<>(row);
+        int state = toInt(row.get("state"));
+        int repayment = toInt(row.get("repayment"));
+        String lendingInstitution = row.get("lendingInstitution") != null ? row.get("lendingInstitution").toString() : "1";
+        String lendingName = row.get("lendingName") != null ? row.get("lendingName").toString() : "";
+        map.put("state", new Object[]{state, STATE_LABEL.getOrDefault(state, String.valueOf(state))});
+        map.put("repayment", new Object[]{repayment, REPAYMENT_LABEL.getOrDefault(repayment, "到期一次还款")});
+        map.put("lendingInstitution", new Object[]{lendingInstitution, lendingName});
+        map.put("createTime", formatDate(row.get("createTime")));
+        map.put("houseImgs", buildHouseImgs(row));
+        map.put("userId", row.get("userId"));
+        map.put("userCode", row.get("userCode"));
+        return map;
+    }
+
+    private List<String> buildHouseImgs(Map<String, Object> row) {
+        List<String> imgs = new ArrayList<>();
+        imgs.add(fullImage(getStr(row, "idFrontImg")));
+        imgs.add(fullImage(getStr(row, "idBackImg")));
+        imgs.add(fullImage(getStr(row, "handheldImg")));
+        return imgs;
+    }
+
+    private String fullImage(String path) {
+        if (StringUtils.isNullOrEmpty(path)) {
+            return "";
+        }
+        if (path.startsWith("http")) {
+            return path;
+        }
+        return Constants.IMAGES_HTTP + path;
+    }
+
+    private String formatDate(Object val) {
+        if (val == null) {
+            return "";
+        }
+        if (val instanceof Date) {
+            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) val);
+        }
+        return val.toString();
+    }
+
+    private int toInt(Object val) {
+        if (val == null) {
+            return 0;
+        }
+        return Integer.parseInt(val.toString());
+    }
+
+    private String getStr(Map<String, Object> row, String key) {
+        Object val = row.get(key);
+        return val == null ? "" : val.toString();
+    }
+
+    private int parseInt(String val, int defaultVal) {
+        try {
+            return StringUtils.isNullOrEmpty(val) ? defaultVal : Integer.parseInt(val);
+        } catch (NumberFormatException e) {
+            return defaultVal;
+        }
+    }
+
+    private double parseDouble(String val, double defaultVal) {
+        try {
+            return StringUtils.isNullOrEmpty(val) ? defaultVal : Double.parseDouble(val);
+        } catch (NumberFormatException e) {
+            return defaultVal;
+        }
+    }
+
+    private String firstNonBlank(String... values) {
+        for (String v : values) {
+            if (!StringUtils.isNullOrEmpty(v)) {
+                return v;
+            }
+        }
+        return null;
+    }
+
+    /** 全部:不传 status 或传 0/空,均不按状态过滤 */
+    private String normalizeStatusFilter(String status) {
+        if (StringUtils.isNullOrEmpty(status)) {
+            return null;
+        }
+        String s = status.trim();
+        if ("0".equals(s) || "all".equalsIgnoreCase(s)) {
+            return null;
+        }
+        return s;
+    }
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanController.java
new file mode 100644
index 0000000..984bc53
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/loan/LoanController.java
@@ -0,0 +1,215 @@
+package com.yami.trading.admin.controller.loan;
+
+import com.yami.trading.bean.loan.LoanConfig;
+import com.yami.trading.bean.loan.LoanOrder;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.exception.BusinessException;
+import com.yami.trading.common.util.StringUtils;
+import com.yami.trading.common.web.ResultObject;
+import com.yami.trading.security.common.util.SecurityUtils;
+import com.yami.trading.service.loan.LoanConfigService;
+import com.yami.trading.service.loan.LoanOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+@CrossOrigin
+@Slf4j
+public class LoanController {
+
+    private final String action = "/api/loan!";
+
+    @Autowired
+    private LoanConfigService loanConfigService;
+    @Autowired
+    private LoanOrderService loanOrderService;
+
+    @RequestMapping(action + "getLoanParamList.action")
+    public Object getLoanParamList() {
+        ResultObject result = new ResultObject();
+        try {
+            List<Map<String, Object>> list = new ArrayList<>();
+            for (LoanConfig config : loanConfigService.listEnabled()) {
+                list.add(buildConfigMap(config));
+            }
+            result.setData(list);
+            result.setCode("0");
+        } catch (BusinessException e) {
+            result.setCode("1");
+            result.setMsg(e.getMessage());
+        } catch (Exception e) {
+            result.setCode("1");
+            result.setMsg("Program error");
+            log.error("getLoanParamList error", e);
+        }
+        return result;
+    }
+
+    @RequestMapping(action + "apply.action")
+    public Object apply(HttpServletRequest request) {
+        ResultObject result = new ResultObject();
+        try {
+            String userId = SecurityUtils.getCurrentUserId();
+            if (StringUtils.isNullOrEmpty(userId)) {
+                result.setCode("403");
+                result.setMsg("Please login first");
+                return result;
+            }
+            String configId = firstNonBlank(request.getParameter("uuid"), request.getParameter("id"));
+            double quota = parseDouble(request.getParameter("quota"), 0);
+            String symbol = request.getParameter("symbol");
+            String front = firstNonBlank(request.getParameter("frontFile"), request.getParameter("idFrontImg"));
+            String back = firstNonBlank(request.getParameter("reverseFile"), request.getParameter("idBackImg"));
+            String handheld = firstNonBlank(request.getParameter("fileList"), request.getParameter("handheldImg"));
+            LoanOrder order = loanOrderService.apply(userId, configId, quota, symbol, front, back, handheld);
+            result.setData(buildOrderMap(order));
+            result.setCode("0");
+        } catch (BusinessException e) {
+            result.setCode("1");
+            result.setMsg(e.getMessage());
+        } catch (Exception e) {
+            result.setCode("1");
+            result.setMsg(e.getMessage());
+            log.error("loan apply error", e);
+        }
+        return result;
+    }
+
+    @RequestMapping(action + "getOrders.action")
+    public Object getOrders() {
+        ResultObject result = new ResultObject();
+        try {
+            String userId = SecurityUtils.getCurrentUserId();
+            if (StringUtils.isNullOrEmpty(userId)) {
+                result.setData(Collections.emptyList());
+                result.setCode("0");
+                return result;
+            }
+            List<Map<String, Object>> list = new ArrayList<>();
+            for (LoanOrder order : loanOrderService.listByUser(userId)) {
+                list.add(buildOrderMap(order));
+            }
+            result.setData(list);
+            result.setCode("0");
+        } catch (Exception e) {
+            result.setCode("1");
+            result.setMsg("Program error");
+            log.error("getOrders error", e);
+        }
+        return result;
+    }
+
+    @RequestMapping(action + "getOrderDetail.action")
+    public Object getOrderDetail(HttpServletRequest request) {
+        ResultObject result = new ResultObject();
+        try {
+            String userId = SecurityUtils.getCurrentUserId();
+            String orderNo = request.getParameter("orderNo");
+            String id = request.getParameter("id");
+            LoanOrder order = null;
+            if (!StringUtils.isNullOrEmpty(orderNo)) {
+                order = loanOrderService.findByOrderNo(orderNo);
+            }
+            if (order == null && !StringUtils.isNullOrEmpty(id)) {
+                order = loanOrderService.findById(id);
+            }
+            if (order == null || !Objects.equals(order.getUserId(), userId)) {
+                result.setCode("1");
+                result.setMsg("Order not found");
+                return result;
+            }
+            result.setData(buildOrderMap(order));
+            result.setCode("0");
+        } catch (Exception e) {
+            result.setCode("1");
+            result.setMsg("Program error");
+            log.error("getOrderDetail error", e);
+        }
+        return result;
+    }
+
+    private Map<String, Object> buildConfigMap(LoanConfig config) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", config.getUuid());
+        map.put("uuid", config.getUuid());
+        map.put("term", config.getTerm());
+        map.put("dailyRate", config.getDailyRate());
+        map.put("maxQuota", config.getMaxQuota());
+        map.put("lendingInstitution", config.getLendingInstitution());
+        map.put("lendingName", config.getLendingName());
+        map.put("repayment", config.getRepayment());
+        map.put("repayCycle", config.getRepayCycle() != null ? config.getRepayCycle() : config.getTerm());
+        return map;
+    }
+
+    private Map<String, Object> buildOrderMap(LoanOrder order) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("id", order.getUuid());
+        map.put("uuid", order.getUuid());
+        map.put("orderNo", order.getOrderNo());
+        map.put("quota", order.getQuota());
+        map.put("symbol", order.getSymbol());
+        map.put("term", order.getTerm());
+        map.put("dailyRate", order.getDailyRate());
+        map.put("totalInterest", order.getTotalInterest());
+        map.put("repayCycle", order.getRepayCycle());
+        map.put("repayment", order.getRepayment());
+        map.put("lendingInstitution", order.getLendingInstitution());
+        map.put("lendingName", order.getLendingName());
+        map.put("state", order.getState());
+        map.put("status", order.getState());
+        map.put("reason", order.getReason());
+        map.put("createTime", order.getCreateTime() != null ? order.getCreateTime().getTime() : null);
+        map.put("dueTime", order.getDueTime());
+        map.put("remainQuota", calcRemainDays(order));
+        map.put("idFrontImg", fullImage(order.getIdFrontImg()));
+        map.put("idBackImg", fullImage(order.getIdBackImg()));
+        map.put("handheldImg", fullImage(order.getHandheldImg()));
+        return map;
+    }
+
+    private int calcRemainDays(LoanOrder order) {
+        if (order.getDueTime() == null) {
+            return order.getTerm();
+        }
+        long diff = order.getDueTime().getTime() - System.currentTimeMillis();
+        return (int) Math.max(0, TimeUnit.MILLISECONDS.toDays(diff));
+    }
+
+    private String fullImage(String path) {
+        if (StringUtils.isNullOrEmpty(path)) {
+            return path;
+        }
+        if (path.startsWith("http")) {
+            return path;
+        }
+        return Constants.IMAGES_HTTP + path;
+    }
+
+    private String firstNonBlank(String... values) {
+        if (values == null) {
+            return null;
+        }
+        for (String v : values) {
+            if (!StringUtils.isNullOrEmpty(v)) {
+                return v;
+            }
+        }
+        return null;
+    }
+
+    private double parseDouble(String val, double defaultVal) {
+        try {
+            return StringUtils.isNullOrEmpty(val) ? defaultVal : Double.parseDouble(val);
+        } catch (NumberFormatException e) {
+            return defaultVal;
+        }
+    }
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/AdminMinerController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/AdminMinerController.java
index 06b60f7..3c12aac 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/AdminMinerController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/AdminMinerController.java
@@ -189,15 +189,13 @@
 //		}
 		
 		if (StringUtils.isNullOrEmpty(show_daily_rate) 
-				|| !StringUtils.isDouble(show_daily_rate) 
-				|| Double.valueOf(show_daily_rate) < 0) {
-			return "日利率不能小于0";
+				|| !StringUtils.isDouble(show_daily_rate)) {
+			return "请输入有效的日利率";
 		}
 		
 		if (StringUtils.isNullOrEmpty(daily_rate) 
-				|| !StringUtils.isDouble(daily_rate) 
-				|| Double.valueOf(daily_rate) < 0) {
-			return "今日利率不能小于0";
+				|| !StringUtils.isDouble(daily_rate)) {
+			return "请输入有效的今日利率";
 		}
 
 		if (StringUtils.isNullOrEmpty(cycle_close) 
@@ -294,15 +292,13 @@
 //			return "周期不能小于等于0天";
 //		}
 		if (StringUtils.isNullOrEmpty(show_daily_rate) 
-				|| !StringUtils.isDouble(show_daily_rate) 
-				|| Double.valueOf(show_daily_rate) < 0) {
-			return "日利率不能小于0";
+				|| !StringUtils.isDouble(show_daily_rate)) {
+			return "请输入有效的日利率";
 		}
 		
 		if (StringUtils.isNullOrEmpty(daily_rate) 
-				|| !StringUtils.isDouble(daily_rate) 
-				|| Double.valueOf(daily_rate) < 0) {
-			return "今日利率不能小于0";
+				|| !StringUtils.isDouble(daily_rate)) {
+			return "请输入有效的今日利率";
 		}
 
 		if (StringUtils.isNullOrEmpty(cycle_close) 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/MinerOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/MinerOrderController.java
index cebd32a..89009f7 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/MinerOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/miner/MinerOrderController.java
@@ -115,15 +115,18 @@
                     data.put("cycle", data.get("cycle"));
                     data.put("all_rate", Arith.mul(minerTestProfit, Integer.valueOf(data.get("cycle").toString())));
                 } else {
-                    double dailyProfitRate = Arith.mul(Double.valueOf(data.get("daily_rate").toString()), 0.01d);
+                    double displayDailyRate = data.get("show_daily_rate") != null
+                            ? Double.valueOf(data.get("show_daily_rate").toString())
+                            : Double.valueOf(data.get("daily_rate").toString());
+                    double dailyProfitRate = Arith.mul(displayDailyRate, 0.01d);
                     double dailyProfitAmount = Arith.mul(dailyProfitRate, Double.valueOf(data.get("amount").toString()));
                     String dailyProfit = df.format(dailyProfitAmount);
                     // 当日收益
                     data.put("daily_profit", dailyProfit);
-                    data.put("daily_rate", data.get("daily_rate"));
+                    data.put("daily_rate", displayDailyRate);
                     // 这里的周期,体验矿机是周期,其他矿机是解锁周期(到期后需手动解锁)
                     data.put("cycle", data.get("cycle_close"));
-                    double all_rate = Arith.mul(30, Double.valueOf(data.get("daily_rate").toString()));
+                    double all_rate = Arith.mul(30, displayDailyRate);
                     data.put("all_rate", df.format(all_rate));
                 }
             }
@@ -373,13 +376,15 @@
                 map.put("all_rate", Arith.mul(minerTestProfit, miner.getCycle()));
             } else {
                 double amount = Double.valueOf(amount_temp);
+                double displayDailyRate = miner.getShow_daily_rate();
                 map.put("amount", amount);
                 map.put("stop_time", null);
-                map.put("daily_rate", miner.getDaily_rate());
-                double rate = Arith.mul(miner.getDaily_rate(), 0.01d);
+                map.put("daily_rate", displayDailyRate);
+                map.put("show_daily_rate", displayDailyRate);
+                double rate = Arith.mul(displayDailyRate, 0.01d);
                 map.put("profit_may", String.valueOf(df.format(Arith.mul(amount, Arith.mul(rate, 30d)))));
                 map.put("cycle", miner.getCycle_close());
-                double all_rate = Arith.mul(30d, miner.getDaily_rate());
+                double all_rate = Arith.mul(30d, displayDailyRate);
                 map.put("all_rate", df.format(all_rate));
             }
             map.put("investment_min", miner.getInvestment_min());
@@ -480,7 +485,7 @@
         map.put("miner_name_cn", miner.getName_cn());
         Double miner_test_profit = sysparaService.find("miner_test_profit").getDouble();
 
-        map.put("daily_rate", miner.getTest().equals("Y") ? miner_test_profit : miner.getDaily_rate());
+        map.put("daily_rate", miner.getTest().equals("Y") ? miner_test_profit : miner.getShow_daily_rate());
         Date create_time = order.getCreate_time();
         map.put("create_timeStr", create_time);
         map.put("close_timeStr", order.getClose_time());
@@ -505,7 +510,8 @@
         map.put("days", daysBetween);
         int last_days = daysBetween(create_time, date_now);
         map.put("can_close", last_days >= miner.getCycle_close());
-        double rate = Arith.mul(miner.getDaily_rate(), 0.01d);
+        double displayDailyRate = miner.getShow_daily_rate();
+        double rate = Arith.mul(displayDailyRate, 0.01d);
         map.put("profit_may", miner.getTest().equals("Y") ? String.valueOf(Arith.mul(miner_test_profit, miner.getCycle()))
                 : String.valueOf(Arith.mul(order.getAmount(), Arith.mul(rate, 30d))));
         map.put("order_no", order.getOrder_no());
@@ -518,7 +524,7 @@
 
         int cycle = miner.getTest().equals("Y") ? miner.getCycle() : miner.getCycle_close();
         map.put("cycle", cycle);
-        double all_rate = Arith.mul(30, miner.getDaily_rate());
+        double all_rate = Arith.mul(30, displayDailyRate);
         map.put("all_rate", miner.getTest().equals("Y") ? Arith.mul(miner_test_profit, miner.getCycle()) : df.format(all_rate));
 
         map.put("test", miner.getTest());
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 d62924e..e62fe85 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
@@ -102,7 +102,6 @@
     @PostMapping("updateWallt")
     @SysLog("修改账户余额")
     public Result updateWallt(@Valid @RequestBody UpdateWalltModel model) {
-        sysUserService.checkSafeWord(model.getSafePassword());
         userService.updateWallt(model.getUserId(), model.getMoneyRevise(),
                 model.getAccountType(), model.getCoinType());
         return Result.ok(null);
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
index 521370d..972f75e 100644
--- 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
@@ -1,7 +1,6 @@
 package com.yami.trading.admin.model;
 
 import lombok.Data;
-import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * @program: trading-order-master
@@ -10,8 +9,9 @@
  **/
 @Data
 public class UpdateAddressModel {
+    /** 记录主键,有值时按 uuid 更新 */
+    private String uuid;
     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/UpdateWalltModel.java b/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateWalltModel.java
index 607688f..886e97d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateWalltModel.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/model/UpdateWalltModel.java
@@ -36,6 +36,5 @@
 
 
     @ApiModelProperty("登录人资金密码")
-    @NotBlank
     private  String safePassword;
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java b/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
index ac8360f..77d6bd0 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/task/IcoTask.java
@@ -1,175 +1,48 @@
 package com.yami.trading.admin.task;
 
-
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.lang.Console;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpStatus;
-import cn.hutool.json.JSONUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.yami.trading.api.UD.*;
-import com.yami.trading.bean.data.domain.Depth;
-import com.yami.trading.bean.data.domain.Kline;
-import com.yami.trading.bean.data.domain.Realtime;
 import com.yami.trading.bean.ico.domain.Ico;
 import com.yami.trading.bean.item.domain.Item;
-import com.yami.trading.bean.model.ChannelBlockchain;
-import com.yami.trading.bean.model.User;
-import com.yami.trading.bean.model.Withdraw;
-import com.yami.trading.common.config.RequestDataHelper;
-import com.yami.trading.common.domain.Result;
-import com.yami.trading.common.util.*;
-import com.yami.trading.huobi.data.DataCache;
-import com.yami.trading.huobi.data.internal.CryptosKlineService;
-import com.yami.trading.huobi.data.internal.DepthTimeObject;
+import com.yami.trading.common.util.ApplicationContextUtils;
 import com.yami.trading.huobi.data.internal.KlineInitService;
-import com.yami.trading.huobi.data.internal.KlineTimeObject;
-import com.yami.trading.huobi.hobi.HobiDataService;
-import com.yami.trading.security.common.enums.CryptoCurrencyEnum;
-import com.yami.trading.security.common.enums.SysTypeEnum;
-import com.yami.trading.security.common.manager.PasswordCheckManager;
-import com.yami.trading.security.common.util.SecurityUtils;
-import com.yami.trading.service.IdentifyingCodeService;
-import com.yami.trading.service.WithdrawService;
-import com.yami.trading.service.data.KlineDBService;
 import com.yami.trading.service.ico.IcoService;
 import com.yami.trading.service.item.ItemService;
-import com.yami.trading.service.user.UserService;
 import lombok.extern.slf4j.Slf4j;
-
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestMapping;
 
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.text.DecimalFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.stream.Collectors;
 
-
+/**
+ * ICO 定时任务:到期 ICO 转入交易品种,并触发行情初始化。
+ */
 @Component
 @Slf4j
 public class IcoTask {
 
     @Autowired
-    IcoService icoService;
+    private IcoService icoService;
 
     @Autowired
-    ItemService itemService;
+    private ItemService itemService;
 
     @Autowired
-    InitHandle initHandle;
+    private InitHandle initHandle;
 
     @Autowired
     private KlineInitService klineInitService;
 
-    @Autowired
-    UdunClient udunClient;
-
-    @Autowired
-    RedisTemplate redisTemplate;
-
-    @Autowired
-    WithdrawService withdrawService;
-
-    @Autowired
-    IdentifyingCodeService identifyingCodeService;
-    @Autowired
-    UserService userService;
-    @Autowired
-    PasswordCheckManager passwordCheckManager;
-    @Autowired
-    HobiDataService hobiDataService;
-    @Autowired
-    KlineDBService klineDBService;
-
-    @Autowired
-    DepthPushJob depthPushJob;
-
-    //@Scheduled(cron = "*/5 * * * * ?")
-    public void test() throws Exception {
-        /*String symbol ="snekusdt";
-        RequestDataHelper.set("symbol", symbol);
-        LambdaQueryWrapper<Kline> queryWrapper = new LambdaQueryWrapper<Kline>()
-                .eq(Kline::getSymbol, symbol)
-                .eq(Kline::getPeriod, "5min")
-                .ge(Kline::getTs, ts1)
-                .lt(Kline::getTs, ts2)
-                .orderByAsc(Kline::getTs);
-        List<Kline> list = klineDBService.list(queryWrapper);
-        BigDecimal tz = num.divide(BigDecimal.valueOf(list.size()), 6, RoundingMode.HALF_UP);
-        System.out.println(list.size());
-        System.out.println(tz);
-        for(int i=0;i<list.size();i++){
-            BigDecimal nums = BigDecimal.valueOf(i+1);
-            *//*BigDecimal integerPart = nums.divide(BigDecimal.valueOf(100), 0, RoundingMode.FLOOR).add(BigDecimal.valueOf(1));
-
-            System.out.printf("nums=%d, 除以100的整数部分=%d%n", nums.intValue(), integerPart.intValue());*//*
-            BigDecimal addNum = nums.multiply(tz);
-            list.get(i).setClose(list.get(i).getClose().add(addNum));
-            list.get(i).setOpen(list.get(i).getOpen().add(addNum));
-            list.get(i).setHigh(list.get(i).getHigh().add(addNum));
-            list.get(i).setLow(list.get(i).getLow().add(addNum));
-        }
-        klineDBService.saveOrUpdateBatch(list);*/
-
-        /*RequestDataHelper.clear();
-        // 定义时间范围:2025-09-16 00:00:00 到 2025-09-19 16:15:00
-        LocalDateTime startTime = LocalDateTime.of(2025, 9, 16, 0, 0, 0);
-        LocalDateTime endTime = LocalDateTime.of(2025, 9, 19, 16, 15, 0);
-
-        // 转换为东八区(UTC+8)的毫秒级时间戳
-        ZoneOffset zoneOffset = ZoneOffset.of("+8");
-        long startTs = startTime.toInstant(zoneOffset).toEpochMilli();
-        long endTs = endTime.toInstant(zoneOffset).toEpochMilli();
-
-        // 存储所有时间戳
-        List<Long> timestamps = new ArrayList<>();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-
-        List<Kline> list = new ArrayList<>();
-        // 每5分钟 = 300000毫秒,遍历生成时间戳
-        for (long currentTs = startTs; currentTs <= endTs; currentTs += 300000) {
-            timestamps.add(currentTs);
-
-            // 打印时间和对应的时间戳(可选)
-            LocalDateTime currentTime = LocalDateTime.ofInstant(
-                    java.time.Instant.ofEpochMilli(currentTs),
-                    zoneOffset
-            );
-            System.out.printf("时间: %s  |  时间戳: %d%n",
-                    currentTime.format(formatter), currentTs);
-            Kline kline = new Kline();
-            kline.setTs(currentTs);
-            kline.setSymbol(symbol);
-            kline.setPeriod("5min");
-            list.add(kline);
-        }
-        System.out.println(list.size());
-        RequestDataHelper.set("symbol", symbol);
-        klineDBService.saveOrUpdateBatch(list);
-        RequestDataHelper.clear();*/
-        /*String symbol = "snekusdt";
-        DepthTimeObject depth = DataCache.getDepth().get(symbol);
-        Depth depthData = depth.getDepth();
-        Realtime realtime = DataCache.getRealtime(symbol);
-        depthPushJob.depthRevise(depthData, symbol, realtime.getClose().doubleValue(), true);*/
-    }
     /**
-     * ico转入产品
+     * ICO 上市时间到期后,写入品种表并刷新行情缓存。
      */
     @Scheduled(cron = "0 */1 * * * ?")
     public void icoToItem() {
-        QueryWrapper<Ico> query  = new QueryWrapper<>();
+        QueryWrapper<Ico> query = new QueryWrapper<>();
         query.lt("market_date", DateTime.now());
         List<Ico> icoList = icoService.list(query);
         if (icoList == null || icoList.isEmpty()) {
@@ -177,32 +50,32 @@
         }
         List<Item> addItemList = new ArrayList<>();
         for (Ico ico : icoList) {
-            //是否已存在币
-            QueryWrapper<Item> iQuery  = new QueryWrapper<>();
+            QueryWrapper<Item> iQuery = new QueryWrapper<>();
             iQuery.eq("SYMBOL", ico.getSymbol());
             iQuery.eq("SYMBOL_DATA", ico.getSymbolData());
             Item item = itemService.getOne(iQuery);
             if (item == null) {
                 item = new Item();
-                item =icoService.icoToItem(item, ico);
+                item = icoService.icoToItem(item, ico);
                 addItemList.add(item);
             }
         }
         if (!addItemList.isEmpty()) {
-            log.info("ico转入产品 数据 Start>>");
+            log.info("ico转入产品 数据 Start>> count={}", addItemList.size());
             itemService.saveOrUpdateBatch(addItemList);
             initHandle.init();
-            log.info("成功ico转入产品 数据 End {}", icoList.size());
+            log.info("成功ico转入产品 数据 End count={}", addItemList.size());
         }
     }
 
-
     /**
-     * K线数据修正
+     * K线数据修正(默认关闭定时,需要时取消注释 cron)
      */
-    //@Scheduled(cron = "0 */5 * * * ?")
+    // @Scheduled(cron = "0 */5 * * * ?")
     public void klineInit() {
-        List<Item> items = ApplicationContextUtils.getApplicationContext().getBean(ItemService.class).list();
+        List<Item> items = ApplicationContextUtils.getApplicationContext()
+                .getBean(ItemService.class)
+                .list();
         if (CollectionUtil.isNotEmpty(items)) {
             String symbols = items.stream().map(Item::getSymbol).collect(Collectors.joining(","));
             klineInitService.klineInit(symbols);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApGoogleAuthController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApGoogleAuthController.java
index 2843a2b..d928f20 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApGoogleAuthController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApGoogleAuthController.java
@@ -63,7 +63,7 @@
         if (flag) {
             User user = userService.getById(userId);
             if (user.isGoogleAuthBind()) {
-                throw new YamiShopBindException("谷歌验证码已绑定");
+                throw new YamiShopBindException("Google Authenticator is already bound");
             }
             user.setGoogleAuthBind(true);
             user.setGoogleAuthSecret(model.getSecret());
@@ -75,7 +75,7 @@
             map.put("google_auth_bind",true);
             return Result.succeed(map);
         } else {
-            throw new YamiShopBindException("谷歌验证码错误");
+            throw new YamiShopBindException("Incorrect Google Authenticator code");
         }
     }
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java
index 585e685..1c48ad2 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiBankCardController.java
@@ -87,7 +87,7 @@
 
         if (null == cpmMap || 0 == cpmMap.size()) {
             // TODO: 2023/4/16
-            throw new YamiShopBindException("支付方式不存在");
+            throw new YamiShopBindException("Payment method does not exist");
         }
         List<String> cpmList = new ArrayList<String>();
         for (String key : cpmMap.keySet()) {
@@ -101,11 +101,11 @@
 
     private String verif(String direction, String nationality, String currency, String payment_method_id, String coin_amount, String img) {
         if (StringUtils.isEmptyString(direction) || !Arrays.asList("recharge", "withdraw").contains(direction)) {
-            return "充值或提现不正确";
+            return "Invalid recharge or withdrawal type";
         }
         Map<String, String> currencyMap = this.c2cPaymentMethodService.getCurrencyMap();
         if (StringUtils.isEmptyString(currency) || null == currencyMap || (null != currencyMap && !currencyMap.containsKey(currency))) {
-            return "支付币种不正确";
+            return "Invalid payment currency";
         }
         if (StringUtils.isEmptyString(payment_method_id)) {
             return "支付方式不正确";
@@ -121,7 +121,7 @@
             boolean bank_card_recharge_must_need_img = this.sysparaService.find("bank_card_recharge_must_need_img").getBoolean();
             if (bank_card_recharge_must_need_img) {
                 if (StringUtils.isEmptyString(img)) {
-                    return "请上传图片";
+                    return "Please upload an image";
                 }
             }
         }
@@ -232,15 +232,15 @@
         Object object = this.sessionTokenService.cacheGet(session_token);
         this.sessionTokenService.del(session_token);
         if (null == object || !userId.equals((String) object)) {
-            throw new YamiShopBindException("请稍后再试");
+            throw new YamiShopBindException("Please try again later");
         }
         String partyId = SecurityUtils.getUser().getUserId();
         if (null == partyId) {
-            throw new YamiShopBindException("请重新登录");
+            throw new YamiShopBindException("Please log in again");
         }
         User party = userService.getById(partyId);
         if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
-            throw new YamiShopBindException("无权限");
+            throw new YamiShopBindException("Permission denied");
         }
         if (!party.isEnabled()) {
             throw new YamiShopBindException("User is locked");
@@ -272,7 +272,7 @@
                 party_kyc=new RealNameAuthRecord();
             }
             if (!(party_kyc.getStatus() == 2) && "true".equals(this.sysparaService.find("withdraw_by_kyc").getSvalue())) {
-                throw new YamiShopBindException("无权限");
+                throw new YamiShopBindException("Permission denied");
             }
             HighLevelAuthRecord party_kycHighLevel = highLevelAuthRecordService.findByUserId(partyId);
             if (party_kycHighLevel==null){
@@ -280,10 +280,10 @@
             }
             double withdraw_by_high_kyc = Double.valueOf(this.sysparaService.find("withdraw_by_high_kyc").getSvalue());
             if (withdraw_by_high_kyc > 0 && coin_amount_double > withdraw_by_high_kyc && !(party_kycHighLevel.getStatus() == 2)) {
-                throw new YamiShopBindException("请先通过高级认证");
+                throw new YamiShopBindException("Advanced verification required");
             }
 //                if (!party.getWithdraw_authority()) {
-//                    throw new BusinessException(1, "无权限");
+//                    throw new BusinessException(1, "Permission denied");
 //                }
             // 手续费(USDT) 提现手续费类型,fixed是单笔固定金额,rate是百分比,part是分段
             String withdraw_fee_type = this.sysparaService.find("withdraw_fee_type").getSvalue();
@@ -387,10 +387,10 @@
                     }
                     double withdraw_limit_turnover_percent = Double.valueOf(this.sysparaService.find("withdraw_limit_turnover_percent").getSvalue());
                     party_withdraw = Arith.mul(party_withdraw, withdraw_limit_turnover_percent);
-                    // 流水小于限额
+                    // Turnover below minimum limit
                     if (userdata_turnover < party_withdraw) {
                         fact_withdraw_amount = Arith.sub(party_withdraw, userdata_turnover);
-                        throw new YamiShopBindException("流水小于限额");
+                        throw new YamiShopBindException("Turnover below minimum limit");
                     }
                 }
                 if ("2".equals(withdraw_limit_open_use_type)) {
@@ -402,7 +402,7 @@
                     double userdata_turnover = party.getWithdrawLimitNowAmount().doubleValue();
                     double withdraw_limit_turnover_percent = Double.valueOf(this.sysparaService.find("withdraw_limit_turnover_percent").getSvalue());
                     party_withdraw = Arith.mul(party_withdraw, withdraw_limit_turnover_percent);
-                    // 流水小于限额
+                    // Turnover below minimum limit
                     if (userdata_turnover < party_withdraw) {
                         fact_withdraw_amount = Arith.sub(party_withdraw, userdata_turnover);
                         throw new YamiShopBindException(fact_withdraw_amount + "");
@@ -421,13 +421,13 @@
         Object obj1 = this.sysparaService.find("bank_card_order_cancel_day_times");
         if (null != obj1) {
             if (orderCancelDayTimes >= Integer.valueOf(this.sysparaService.find("bank_card_order_cancel_day_times").getSvalue()).intValue()) {
-                throw new YamiShopBindException("今日取消订单次数太多了,请明日再试");
+                throw new YamiShopBindException("Too many cancellations today, try again tomorrow");
             }
         }
         DecimalFormat df = new DecimalFormat("#.########");
         ExchangeRate ex = this.exchangeRateService.findBy(Constants.OUT_OR_IN_DEFAULT, currency.toUpperCase());
         if (null == ex) {
-            throw new YamiShopBindException("支付币种不正确");
+            throw new YamiShopBindException("Invalid payment currency");
         }
         C2cOrder c2cOrder = new C2cOrder();
         c2cOrder.setPartyId(party.getUserId());
@@ -458,20 +458,20 @@
     public Result orderCancel(String order_no, String remark) {
         User party = userService.getById(SecurityUtils.getUser().getUserId());
         if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
-            throw new YamiShopBindException("无权限");
+            throw new YamiShopBindException("Permission denied");
         }
         if (!party.isEnabled()) {
             throw new YamiShopBindException("User is locked");
         }
         C2cOrder order = this.c2cOrderService.get(order_no);
         if (null == order || !order.getPartyId().equals(SecurityUtils.getUser().getUserId())) {
-            throw new YamiShopBindException("订单不存在");
+            throw new YamiShopBindException("Order does not exist");
         }
         order.setRemark(remark);
-        // 用户不能取消提现
+        // User cannot cancel this withdrawal
         if (SecurityUtils.getUser().getUserId().equals(order.getPartyId())) {
             if ("withdraw".equals(order.getDirection())) {
-                throw new YamiShopBindException("用户不能取消提现");
+                throw new YamiShopBindException("User cannot cancel this withdrawal");
             }
             this.c2cOrderService.saveOrderCancel(order, "user");
         }
@@ -486,7 +486,7 @@
     public Result get(@RequestParam String order_no, @RequestParam String language) {
         C2cOrder c2cOrder = this.c2cOrderService.get(order_no);
         if (null == c2cOrder) {
-            throw new YamiShopBindException("订单不存在");
+            throw new YamiShopBindException("Order does not exist");
         }
         List<String> nos = new ArrayList<String>();
         nos.add(c2cOrder.getOrderNo());
@@ -548,23 +548,23 @@
     public Result list(String page_no, String direction, String state) {
         String partyId = SecurityUtils.getUser().getUserId();
         if (null == partyId) {
-            throw new YamiShopBindException("请重新登录");
+            throw new YamiShopBindException("Please log in again");
         }
         if (StringUtils.isNullOrEmpty(page_no)) {
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         if (StringUtils.isNotEmpty(direction) && !Arrays.asList("recharge", "withdraw").contains(direction)) {
-            throw new YamiShopBindException("充值或提现不正确");
+            throw new YamiShopBindException("Invalid recharge or withdrawal type");
         }
         if (StringUtils.isNotEmpty(state) && !Arrays.asList("0", "3", "4").contains(state)) {
-            throw new YamiShopBindException("订单状态不正确");
+            throw new YamiShopBindException("Invalid order status");
         }
         Page page = this.c2cOrderService.pagedQuery(page_no_int, 20, direction, state, partyId);
         if (null == page) {
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAdvertController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAdvertController.java
index 4dacfb4..7e08a98 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAdvertController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAdvertController.java
@@ -159,17 +159,17 @@
                 page_no = "1";
             }
             if (!StringUtils.isInteger(page_no)) {
-                throw new YamiShopBindException("页码不是整数");
+                throw new YamiShopBindException("Page number must be an integer");
             }
             if (Integer.valueOf(page_no).intValue() <= 0) {
-                throw new YamiShopBindException("页码不能小于等于0");
+                throw new YamiShopBindException("Page number must be greater than 0");
             }
             int page_no_int = Integer.valueOf(page_no).intValue();
             String partyId = SecurityUtils.getUser().getUserId();
              String c2cUserId = "";
             User party = userService.getById(partyId);
             if (null == party) {
-                throw new YamiShopBindException("用户不存在");
+                throw new YamiShopBindException("User does not exist");
             }
             if (Arrays.asList(1, 2).contains(party.getC2cUserType())) {
                 C2cUser c2cUser = c2cUserService.getByPartyId(partyId);
@@ -284,22 +284,22 @@
 ////				page_no = "1";
 ////			}
 ////			if (!StringUtils.isInteger(page_no)) {
-////				throw new BusinessException("页码不是整数");
+////				throw new BusinessException("Page number must be an integer");
 ////			}
 ////			if (Integer.valueOf(page_no).intValue() <= 0) {
-////				throw new BusinessException("页码不能小于等于0");
+////				throw new BusinessException("Page number must be greater than 0");
 ////			}
 ////
 ////			int page_no_int = Integer.valueOf(page_no).intValue();
 ////
 ////			String partyId = this.getLoginPartyId();
 ////			if (null == partyId) {
-////				throw new BusinessException("请重新登录");
+////				throw new BusinessException("Please log in again");
 ////			}
 ////
 ////			C2cUser c2cUser = this.c2cUserService.getByPartyId(partyId);
 ////			if (null == c2cUser) {
-////				throw new BusinessException("承兑商不存在");
+////				throw new BusinessException("Merchant does not exist");
 ////			}
 ////
 ////			Integer on_sale_int = null;
@@ -377,22 +377,22 @@
 ////				page_no = "1";
 ////			}
 ////			if (!StringUtils.isInteger(page_no)) {
-////				throw new BusinessException("页码不是整数");
+////				throw new BusinessException("Page number must be an integer");
 ////			}
 ////			if (Integer.valueOf(page_no).intValue() <= 0) {
-////				throw new BusinessException("页码不能小于等于0");
+////				throw new BusinessException("Page number must be greater than 0");
 ////			}
 ////
 ////			int page_no_int = Integer.valueOf(page_no).intValue();
 ////
 ////			String partyId = this.getLoginPartyId();
 ////			if (null == partyId) {
-////				throw new BusinessException("请重新登录");
+////				throw new BusinessException("Please log in again");
 ////			}
 ////
 ////			C2cUser c2cUser = this.c2cUserService.getByPartyId(partyId);
 ////			if (null == c2cUser) {
-////				throw new BusinessException("承兑商不存在");
+////				throw new BusinessException("Merchant does not exist");
 ////			}
 ////
 ////			Page page = this.c2cAdvertService.pagedQuery(page_no_int, 20, c2cUser.getId().toString(), direction, "", "", "", null, 1, true);
@@ -451,19 +451,19 @@
         String id = request.getParameter("id");
         String language = request.getParameter("language");
         if (StringUtils.isEmptyString(id)) {
-            throw new YamiShopBindException("C2C广告id不正确");
+            throw new YamiShopBindException("C2CInvalid advert ID");
         }
         C2cAdvert c2cAdvert = c2cAdvertService.getById(id);
         if (null == c2cAdvert) {
-            throw new YamiShopBindException("广告不存在");
+            throw new YamiShopBindException("Advert does not exist");
         }
         C2cUser c2cUser = this.c2cUserService.getById(c2cAdvert.getC2cUserId());
         if (null == c2cUser) {
-            throw new YamiShopBindException("承兑商不存在");
+            throw new YamiShopBindException("Merchant does not exist");
         }
         User c2cParty = userService.getById(c2cUser.getC2cUserPartyId());
         if (null == c2cParty) {
-            throw new YamiShopBindException("承兑商的用户信息不存在");
+            throw new YamiShopBindException("Merchant user info does not exist");
         }
         Map<String, String> data = new HashMap<String, String>();
         data.put("id", c2cAdvert.getUuid().toString());
@@ -534,7 +534,7 @@
 //        Map<String, String> currencyMap = this.c2cAdvertService.getCurrencyMap();
 //        Map<String, String> symbolMap = this.c2cAdvertService.getSymbolMap();
 //        if (StringUtils.isEmptyString(currency) || null == currencyMap || (null != currencyMap && !currencyMap.containsKey(currency))) {
-//            return "支付币种不正确";
+//            return "Invalid payment currency";
 //        }
 //        if (StringUtils.isEmptyString(symbol) || null == symbolMap || (null != symbolMap && !symbolMap.containsKey(symbol))) {
 //            return "上架币种不正确";
@@ -556,7 +556,7 @@
 //            return "支付时效未填或格式不正确";
 //        }
 //        if (StringUtils.isEmptyString(safeword)) {
-//            return "资金密码错误";
+//            return "Incorrect fund password";
 //        }
 //        return null;
 //    }
@@ -568,7 +568,7 @@
         Map<String, String> currencyMap = this.c2cAdvertService.getCurrencyMap();
         Map<String, String> symbolMap = this.c2cAdvertService.getSymbolMap();
         if (!StringUtils.isEmptyString(currency) && null != currencyMap && !currencyMap.containsKey(currency)) {
-            return "支付币种不正确";
+            return "Invalid payment currency";
         }
         if (!StringUtils.isEmptyString(symbol) && null != symbolMap && !symbolMap.containsKey(symbol)) {
             return "上架币种不正确";
@@ -578,7 +578,7 @@
             return "支付方式类型不正确";
         }
         if (!StringUtils.isEmptyString(amount) && (!StringUtils.isDouble(amount) || Double.valueOf(amount).doubleValue() < 0)) {
-            return "支付金额不正确";
+            return "Invalid payment amount";
         }
         return null;
     }
@@ -590,7 +590,7 @@
 //        Map<String, String> currencyMap = this.c2cAdvertService.getCurrencyMap();
 //        Map<String, String> symbolMap = this.c2cAdvertService.getSymbolMap();
 //        if (!StringUtils.isEmptyString(currency) && null != currencyMap && !currencyMap.containsKey(currency)) {
-//            return "支付币种不正确";
+//            return "Invalid payment currency";
 //        }
 //        if (!StringUtils.isEmptyString(symbol) && null != symbolMap && !symbolMap.containsKey(symbol)) {
 //            return "上架币种不正确";
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAppealController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAppealController.java
index bcea1e4..7a4cd4d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAppealController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cAppealController.java
@@ -53,22 +53,22 @@
         String name = request.getParameter("name");
         String phone = request.getParameter("phone");
         if (StringUtils.isEmptyString(order_no)) {
-            throw new YamiShopBindException("申诉订单号不正确");
+            throw new YamiShopBindException("Invalid appeal order number");
         }
         if (StringUtils.isEmptyString(reason)) {
-            throw new YamiShopBindException("请输入申诉原因");
+            throw new YamiShopBindException("Appeal reason is required");
         }
         if (StringUtils.isEmptyString(img)) {
-            throw new YamiShopBindException("请上传申诉凭证");
+            throw new YamiShopBindException("Please upload appeal evidence");
         }
         String partyId = SecurityUtils.getUser().getUserId();
         C2cOrder order = this.c2cOrderService.get(order_no);
         if (null == order || !partyId.equals(order.getPartyId())) {
-            throw new YamiShopBindException("订单不存在");
+            throw new YamiShopBindException("Order does not exist");
         }
         C2cAppeal appeal = this.c2cAppealService.findByOrderNo(order_no);
         if (null != appeal) {
-            throw new YamiShopBindException("该订单已提交申诉");
+            throw new YamiShopBindException("Appeal already submitted for this order");
         }
         C2cAppeal entity = new C2cAppeal();
         entity.setOrderNo(order_no);
@@ -97,11 +97,11 @@
     public Result get(HttpServletRequest request) throws IOException {
         String order_no = request.getParameter("order_no");
         if (StringUtils.isEmptyString(order_no)) {
-            throw new YamiShopBindException("申诉订单号不正确");
+            throw new YamiShopBindException("Invalid appeal order number");
         }
         C2cAppeal c2cAppeal = this.c2cAppealService.findByOrderNo(order_no);
         if (null == c2cAppeal) {
-            throw new YamiShopBindException("申诉不存在");
+            throw new YamiShopBindException("Appeal does not exist");
         }
         if (StringUtils.isNotEmpty(c2cAppeal.getImg())) {
             String path = Constants.IMAGES_HTTP+c2cAppeal.getImg();
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java
index b87c16c..8c459f8 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cOrderController.java
@@ -63,7 +63,7 @@
     public Object order_open(HttpServletRequest request) throws IOException {
         String currency = request.getParameter("currency");
         if (StringUtils.isEmptyString(currency)) {
-            throw new YamiShopBindException("支付币种不正确");
+            throw new YamiShopBindException("Invalid payment currency");
         }
         String partyId = SecurityUtils.getCurrentUserId();
         String session_token = sessionTokenService.savePut(partyId);
@@ -111,7 +111,7 @@
                party = userService.getById(partyId);
             log.error("用户"+direction+"开始当前用户uid:"+party.getUserCode()+"当前用户名:"+party.getUserName()+"生成的订单号:"+orderNo);
             if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
-                throw new YamiShopBindException("无权限");
+                throw new YamiShopBindException("Permission denied");
             }
 
             if (!C2cLock.add(partyId)) {
@@ -122,7 +122,7 @@
             Object object = this.sessionTokenService.cacheGet(session_token);
             this.sessionTokenService.del(session_token);
             if (null == object || !partyId.equals((String) object)) {
-                throw new YamiShopBindException("请稍后再试");
+                throw new YamiShopBindException("Please try again later");
             }
 
             if (!party.isEnabled()) {
@@ -135,14 +135,14 @@
             String c2c_sell_only_one = sysparaService.find("c2c_sell_only_one").getSvalue();
             if(StringUtils.isNotEmpty(c2c_sell_only_one)&&"1".equals(c2c_sell_only_one)) {
                 if(nofinishOrderCount >= 1) {
-                    throw new YamiShopBindException("提交失败,当前有未处理订单");
+                    throw new YamiShopBindException("Submission failed, pending order exists");
                 }
                 Long.valueOf(c2c_sell_only_one).longValue();
             }
             Object obj2 = this.sysparaService.find("c2c_nofinish_order_count_max");
             if (null != obj2) {
                 if (nofinishOrderCount >= Long.valueOf(this.sysparaService.find("c2c_nofinish_order_count_max").getSvalue()).longValue()) {
-                    throw new YamiShopBindException("用户未结束订单数量已达上限");
+                    throw new YamiShopBindException("Too many open orders");
                 }
             }
 
@@ -163,34 +163,34 @@
             Object obj1 = this.sysparaService.find("c2c_order_cancel_day_times");
             if (null != obj1) {
                 if (orderCancelDayTimes >= Integer.valueOf(this.sysparaService.find("c2c_order_cancel_day_times").getSvalue()).intValue()) {
-                    throw new YamiShopBindException("今日取消订单次数太多了,请明日再试");
+                    throw new YamiShopBindException("Too many cancellations today, try again tomorrow");
                 }
             }
 
             C2cAdvert c2cAdvert = this.c2cAdvertService.getById(c2c_advert_id);
             if (null == c2cAdvert) {
-                throw new YamiShopBindException("广告不存在");
+                throw new YamiShopBindException("Advert does not exist");
             }
 
             C2cPaymentMethod method =c2cPaymentMethodService.get(payment_method_id);
             if (null == method) {
-                throw new YamiShopBindException("支付方式不存在");
+                throw new YamiShopBindException("Payment method does not exist");
             }
 
             if (StringUtils.isEmptyString(order_type) || !Arrays.asList("by_amount", "by_num").contains(order_type)) {
-                throw new YamiShopBindException("订单类型不正确");
+                throw new YamiShopBindException("Invalid order type");
             }
 
             if (C2cOrder.ORDER_TYPE_BY_AMOUNT.equals(order_type)) {
                 // 按支付金额支付
                 if (StringUtils.isEmptyString(amount) || !StringUtils.isDouble(amount) || Double.valueOf(amount).doubleValue() <= 0) {
-                    throw new YamiShopBindException("支付金额不正确");
+                    throw new YamiShopBindException("Invalid payment amount");
                 }
                 coin_amount = "0";
             } else {
                 // 按币种数量支付
                 if (StringUtils.isEmptyString(coin_amount) || !StringUtils.isDouble(coin_amount) || Double.valueOf(coin_amount).doubleValue() <= 0) {
-                    throw new YamiShopBindException("币种数量不正确");
+                    throw new YamiShopBindException("Invalid currency amount");
                 }
                 amount = "0";
             }
@@ -247,16 +247,16 @@
 
             String partyId = SecurityUtils.getCurrentUserId();
             if (null == partyId) {
-                throw new BusinessException("请重新登录");
+                throw new BusinessException("Please log in again");
             }
 
             User party = userService.getById(partyId);
             if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
-                throw new BusinessException("无权限");
+                throw new BusinessException("Permission denied");
             }
 
             if (!userService.checkLoginSafeword(partyId, safe_password)) {
-                throw new BusinessException("资金密码错误");
+                throw new BusinessException("Incorrect fund password");
             }
 
             if (!party.isEnabled()) {
@@ -265,7 +265,7 @@
 
             C2cOrder order = this.c2cOrderService.get(order_no);
             if (null == order) {
-                throw new BusinessException("订单不存在");
+                throw new BusinessException("Order does not exist");
             }
 
             if (partyId.equals(order.getPartyId())) {
@@ -279,7 +279,7 @@
                     throw new BusinessException("承兑商不能支付买单");
                 }
             } else {
-                throw new BusinessException("无权限");
+                throw new BusinessException("Permission denied");
             }
 
             if (!"0".equals(order.getState())) {
@@ -287,7 +287,7 @@
             }
 
             if (!C2cOrderLock.add(order_no)) {
-                throw new BusinessException(1, "请稍后再试");
+                throw new BusinessException(1, "Please try again later");
             }
 
             lock = true;
@@ -356,22 +356,22 @@
 
             String partyId = SecurityUtils.getCurrentUserId();
             if (null == partyId) {
-                throw new BusinessException("请重新登录");
+                throw new BusinessException("Please log in again");
             }
 
             User party = userService.getById(partyId);
             if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
-                throw new BusinessException("无权限");
+                throw new BusinessException("Permission denied");
             }
 
             if (!C2cOrderLock.add(order_no)) {
-                throw new BusinessException(1, "请稍后再试");
+                throw new BusinessException(1, "Please try again later");
             }
 
             lock = true;
 
             if (!userService.checkLoginSafeword(partyId, safe_password)) {
-                throw new BusinessException("资金密码错误");
+                throw new BusinessException("Incorrect fund password");
             }
             if (!party.isEnabled()) {
                 return Result.succeed("User is locked");
@@ -379,7 +379,7 @@
 
             C2cOrder order = this.c2cOrderService.get(order_no);
             if (null == order || !order.getPartyId().equals(partyId)) {
-                throw new BusinessException("订单不存在");
+                throw new BusinessException("Order does not exist");
             }
             if ("0".equals(order.getState())) {
                 throw new BusinessException("待付款的订单无法放行");
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cPaymentMethodConfigController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cPaymentMethodConfigController.java
index 0db676c..d3851c2 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cPaymentMethodConfigController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cPaymentMethodConfigController.java
@@ -58,7 +58,7 @@
         String language = request.getParameter("language");
         C2cPaymentMethodConfig config = this.c2cPaymentMethodConfigService.getById(id);
         if (null == config) {
-            throw new BusinessException("支付方式模板不存在");
+            throw new BusinessException("Payment method template does not exist");
         }
         if (StringUtils.isNotEmpty(config.getMethodImg())) {
             String path = Constants.IMAGES_HTTP+config.getMethodImg();
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java
index 9e43987..f4c7c56 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiC2cUserController.java
@@ -71,7 +71,7 @@
 
             C2cUser c2cUser = this.c2cUserService.getById(c2c_user_id);
             if (null == c2cUser) {
-                throw new BusinessException("承兑商不存在");
+                throw new BusinessException("Merchant does not exist");
             }
 
             C2cUserParamBaseSet paramBaseSet = this.c2cUserParamBaseSetService.getByPartyId(c2cUser.getC2cUserPartyId());
@@ -86,7 +86,7 @@
 
             User party = userService.getById(c2cUser.getC2cUserPartyId());
             if (null == party) {
-                throw new YamiShopBindException("承兑商的用户信息不存在");
+                throw new YamiShopBindException("Merchant user info does not exist");
             }
 
             DecimalFormat df = new DecimalFormat("#.########");
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiCapitaltWalletWalletController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiCapitaltWalletWalletController.java
index c6ab84a..74a6922 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiCapitaltWalletWalletController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiCapitaltWalletWalletController.java
@@ -77,7 +77,7 @@
     public Result updateWallt(@Valid TransferModel model) {
         String partyId = SecurityUtils.getCurrentUserId();
         if(!StringUtils.isNotEmpty(partyId)){
-            throw new YamiShopBindException("请登录!");
+            throw new YamiShopBindException("Please log in");
         }
         return capitaltWalletService.updateWallt(partyId,model.getDeductAccount(),model.getReceiveAccount(),model.getMoneyRevise());
     }
@@ -87,7 +87,7 @@
     public Result updateWallt() {
         String partyId = SecurityUtils.getCurrentUserId();
         if(!StringUtils.isNotEmpty(partyId)){
-            throw new YamiShopBindException("请登录!");
+            throw new YamiShopBindException("Please log in");
         }
         // 获取合约账户(contract)
         Wallet wallet = walletService.saveWalletByPartyId(partyId);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java
index d05f720..01ecc50 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractApplyOrderController.java
@@ -204,7 +204,7 @@
             lockAcquired = rLock.tryLock(5, TimeUnit.SECONDS);
             if (!lockAcquired) {
                 log.warn("无法获取锁: contract_open_{}", partyId);
-                throw new YamiShopBindException("请稍后再试");
+                throw new YamiShopBindException("Please try again later");
             }
             //判断下单金额是否符合最低金额  最低下单张数:0.01
             //合约张数  张数=保证金*杠杆倍数/(面值*最新成交价)
@@ -213,7 +213,7 @@
             if (amount.compareTo(new BigDecimal(faceValue)) < 0) {
                 double minimumAmount = minAmount * faceValue * openAction.getPrice().doubleValue() / openAction.getLever_rate().doubleValue();
                 double roundedAmount = Math.ceil(minimumAmount * 10000) / 10000;
-                throw new YamiShopBindException("最低下单金额:"+roundedAmount);
+                throw new YamiShopBindException("Minimum order amount: "+roundedAmount);
             }
 
             // 校验当前用户订单状态
@@ -233,7 +233,7 @@
             throw e; // 重新抛出自定义异常
         } catch (Exception e) {
             log.error("系统异常: {}", e.getMessage(), e);
-            throw new YamiShopBindException("操作失败,请稍后再试");
+            throw new YamiShopBindException("Operation failed, please try again later");
         } finally {
             // 确保释放锁
             if (lockAcquired && rLock.isHeldByCurrentThread()) {
@@ -277,7 +277,7 @@
             String[] stopUsers = stopUserInternet.split(",");
             User user = userService.getById(partyId);
             if (Arrays.asList(stopUsers).contains(user.getUserName())) {
-                throw new YamiShopBindException("无网络");
+                throw new YamiShopBindException("Network unavailable");
             }
         }
     }
@@ -313,7 +313,7 @@
         RLock rLock = redissonClient.getLock("contract_close_" + partyId);
         boolean lockResult = rLock.tryLock(5, TimeUnit.SECONDS);
         if (!lockResult) {
-            throw new YamiShopBindException("请稍后再试");
+            throw new YamiShopBindException("Please try again later");
         }
         try {
             User user = userService.getById(partyId);
@@ -330,7 +330,7 @@
                 System.out.println("stopUserInternet = " + stopUserInternet);
 
                 if(Arrays.asList(stopUsers).contains(user.getUserName())){
-                    throw new YamiShopBindException("无网络");
+                    throw new YamiShopBindException("Network unavailable");
                 }
             }
 
@@ -401,7 +401,7 @@
 
         ContractApplyOrder order = this.contractApplyOrderService.findByOrderNo(order_no);
         if (order == null) {
-            throw new YamiShopBindException("委托单不存在");
+            throw new YamiShopBindException("Order does not exist");
         }
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("order_no", order.getOrderNo());
@@ -449,8 +449,8 @@
             t.start();
 
         } catch (Exception e) {
-            log.error("执行撤单异常", e);
-            throw new YamiShopBindException("执行撤单异常");
+            log.error("Failed to cancel order", e);
+            throw new YamiShopBindException("Failed to cancel order");
         }
 
         return Result.succeed(null,"success");
@@ -467,8 +467,8 @@
             t.start();
 
         } catch (Exception e) {
-            log.error("执行撤单异常", e);
-            throw new YamiShopBindException("执行撤单异常");
+            log.error("Failed to cancel order", e);
+            throw new YamiShopBindException("Failed to cancel order");
         }
 
         return Result.succeed(null,"success");
@@ -559,10 +559,10 @@
         Page<ContractApplyOrder> result = contractApplyOrderService.findList(page, SecurityUtils.getUser().getUserId(), type,  symbolType);
         List<ContractApplyOrder> datas = result.getRecords();
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         Long count = 0L;
 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java
index 65c5b1f..b32e987 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiContractOrderController.java
@@ -78,8 +78,8 @@
                 contractOrderService.addDepositOpen(order, addDepositOpen);
             }
         } catch (Exception e) {
-            log.error("追加保证金异常", e);
-            throw new YamiShopBindException("追加保证金异常");
+            log.error("Failed to add margin", e);
+            throw new YamiShopBindException("Failed to add margin");
         }
         return Result.succeed("success");
     }
@@ -96,8 +96,8 @@
                 contractOrderService.update(order);
             }
         } catch (Exception e) {
-            log.error("追加保证金异常", e);
-            throw new YamiShopBindException("追加保证金异常");
+            log.error("Failed to add margin", e);
+            throw new YamiShopBindException("Failed to add margin");
         }
         return Result.succeed("success");
     }
@@ -169,7 +169,7 @@
         List<Realtime> realtime_all = this.dataService.realtime(symbolsStr);
         if (realtime_all.size() <= 0) {
             realtime_all = new ArrayList<Realtime>();
-//				throw new BusinessException("系统错误,请稍后重试");
+//				throw new BusinessException("System error, please try again later");
         }
 
         Map<String, Realtime> realtimeMap = new HashMap<String, Realtime>();
@@ -215,7 +215,7 @@
 
         if (null == order) {
             log.info("contractOrder!get order_no:" + order_no + ", order null");
-            throw new YamiShopBindException("订单不存在");
+            throw new YamiShopBindException("Order does not exist");
         }
 
         return Result.ok(this.contractOrderService.bulidOne(order));
@@ -256,10 +256,10 @@
         }
 
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         String partyId = SecurityUtils.getCurrentUserId();
 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiFuturesOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiFuturesOrderController.java
index 04fb253..2abe1e6 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiFuturesOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiFuturesOrderController.java
@@ -75,7 +75,7 @@
         Map<String, Object> data = new HashMap<>();
         Item bySymbol = itemService.findBySymbol(symbol);
         if(bySymbol == null){
-            throw new YamiShopBindException("当前币对不存在");
+            throw new YamiShopBindException("Trading pair does not exist");
         }
         List<Map<String,Object>> futuresParas = new ArrayList<>();
         for (FuturesPara para : this.futuresParaService.getBySymbolSort(symbol)) {
@@ -142,19 +142,19 @@
     public Result<Map<String, String>> open(FutureOpenAction futureOpenAction) {
         Item bySymbol = itemService.findBySymbol(futureOpenAction.getSymbol());
         if(bySymbol == null){
-            throw  new YamiShopBindException("当前币对不存在");
+            throw  new YamiShopBindException("Trading pair does not exist");
         }
         if (!itemService.isContractTrading(bySymbol)) {
-            throw new YamiShopBindException("未开放合约交易");
+            throw new YamiShopBindException("Futures trading is not available");
         }
         /*if (itemService.isSuspended(bySymbol.getSymbol())) {
-            throw new YamiShopBindException("停牌禁止交易");
+            throw new YamiShopBindException("Trading suspended");
         }*/
 
 
         boolean isOpen = MarketOpenChecker.isMarketOpenByItemCloseType(bySymbol.getOpenCloseType());
         if(!isOpen){
-            throw  new YamiShopBindException("当前已经休市");
+            throw  new YamiShopBindException("Market is closed");
         }
         String partyId = SecurityUtils.getUser().getUserId();
         boolean lock = false;
@@ -163,7 +163,7 @@
             Map<String, String> data = new HashMap<String, String>();
 
             if (!FuturesLock.add(partyId)) {
-                throw new YamiShopBindException("请稍后再试");
+                throw new YamiShopBindException("Please try again later");
             }
 
             lock = true;
@@ -175,7 +175,7 @@
                 throw new YamiShopBindException("User is locked");
             }
             if (null == object || !party.getUserId().equals((String) object)) {
-                throw new BusinessException("请稍后再试");
+                throw new BusinessException("Please try again later");
             }
 
             FuturesOrder order = new FuturesOrder();
@@ -240,7 +240,7 @@
         FuturesOrder order = this.futuresOrderService.cacheByOrderNo(order_no);
         if (null == order) {
             log.info("futuresOrder!get order_no:" + order_no + ", order null");
-            throw new YamiShopBindException("订单不存在");
+            throw new YamiShopBindException("Order does not exist");
         }
         return Result.succeed(this.futuresOrderService.bulidOne(order));
     }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiHighLevelAuthController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiHighLevelAuthController.java
index 372890c..7e43a18 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiHighLevelAuthController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiHighLevelAuthController.java
@@ -48,20 +48,20 @@
     public Result applyHighLevelAuth(@Valid  ApplyHighLevelAuthModel model) {
         User user = userCacheService.currentUser();
         if (!realNameAuthRecordService.isPass(user.getUserId())) {
-            throw new YamiShopBindException("实名认证未通过,无法进行高级认证");
+            throw new YamiShopBindException("Real-name verification required before advanced verification");
         }
         HighLevelAuthRecord highLevelAuthRecord = highLevelAuthRecordService.findByUserId(user.getUserId());
         if (highLevelAuthRecord != null) {
             String msg = "";
             switch (highLevelAuthRecord.getStatus()) {
                 case 0:
-                    msg = "已经提交申请,请等待审核";
+                    msg = "Application submitted, please wait for review";
                     break;
                 case 1:
-                    msg = "审核中";
+                    msg = "Under review";
                     break;
                 case 2:
-                    msg = "审核已通过";
+                    msg = "Already approved";
                     break;
                 case 3:
                     highLevelAuthRecord.setStatus(1);
@@ -71,7 +71,7 @@
                    // msg = MessageFormat.format("审核未通过,原因:{0}", record.getMsg());
                     break;
                 default:
-                    msg = "审核状态异常请联系客服";
+                    msg = "Abnormal review status, please contact support";
                     break;
             }
             if (StrUtil.isNotBlank(msg)) {
@@ -85,34 +85,34 @@
 
         if (StrUtil.isNotBlank(model.getWork_place())){
             if ( model.getWork_place().length()>245){
-                throw new YamiShopBindException("工作地址长度超过245");
+                throw new YamiShopBindException("Work address exceeds 245 characters");
             }
         }
 
         if (StrUtil.isNotBlank(model.getHome_place())){
             if ( model.getHome_place().length()>245){
-                throw new YamiShopBindException("家庭地址长度超过245");
+                throw new YamiShopBindException("Home address exceeds 245 characters");
             }
         }
         if (StrUtil.isNotBlank(model.getRelatives_relation())){
             if ( model.getRelatives_relation().length()>32){
-                throw new YamiShopBindException("亲属电话长度超过32");
+                throw new YamiShopBindException("Relative phone exceeds 32 characters");
             }
         }
         if (StrUtil.isNotBlank(model.getRelatives_name())){
             if ( model.getRelatives_name().length()>32){
-                throw new YamiShopBindException("亲属名称长度超过32");
+                throw new YamiShopBindException("Relative name exceeds 32 characters");
             }
         }
         if (StrUtil.isNotBlank(model.getRelatives_place())){
             if ( model.getRelatives_place().length()>245){
-                throw new YamiShopBindException("亲属地址长度超过245");
+                throw new YamiShopBindException("Relative address exceeds 245 characters");
             }
         }
 
         if (StrUtil.isNotBlank(model.getRelatives_phone())){
             if ( model.getRelatives_phone().length()>32){
-                throw new YamiShopBindException("亲属电话长度超过32");
+                throw new YamiShopBindException("Relative phone exceeds 32 characters");
             }
         }
 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java
index bc94e2b..aff11d0 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiIcoController.java
@@ -64,7 +64,7 @@
     public Result<String> subscribe(@Valid UserSubscription model) {
         String partyId = SecurityUtils.getUser().getUserId();
         if (StringUtils.isEmpty(partyId)) {
-            throw new YamiShopBindException("请重新登录");
+            throw new YamiShopBindException("Please log in again");
         }
         RLock rLock = redissonClient.getLock("subscribe" + partyId);
         boolean lockAcquired = false;
@@ -73,7 +73,7 @@
             lockAcquired = rLock.tryLock(5, TimeUnit.SECONDS);
             if (!lockAcquired) {
                 log.warn("无法获取锁: subscribe{}", partyId);
-                throw new YamiShopBindException("请稍后再试");
+                throw new YamiShopBindException("Please try again later");
             }
             model.setUserId(partyId);
             return icoService.subscribe(model);
@@ -82,7 +82,7 @@
             throw e; // 重新抛出自定义异常
         } catch (Exception e) {
             log.error("系统异常: {}", e.getMessage(), e);
-            throw new YamiShopBindException("操作失败,请稍后再试");
+            throw new YamiShopBindException("Operation failed, please try again later");
         } finally {
             // 确保释放锁
             if (lockAcquired && rLock.isHeldByCurrentThread()) {
@@ -97,7 +97,7 @@
         QueryWrapper queryWrapper = QueryWrapperGenerator.buildQueryCondition (icoQuery, IcoQuery.class);
         String partyId = SecurityUtils.getUser().getUserId();
         if (StringUtils.isEmpty(partyId)) {
-            throw new YamiShopBindException("请重新登录");
+            throw new YamiShopBindException("Please log in again");
         }
         queryWrapper.eq("u.user_id", partyId);
         queryWrapper.orderByDesc("created_at");
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 a1ff910..066984c 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
@@ -89,7 +89,7 @@
             user= userService.findByUserName(mobileOrUserName);
         }
         if (user==null){
-            throw new YamiShopBindException("账号或密码不正确");
+            throw new YamiShopBindException("Incorrect username or password");
         }
 
         // 半小时内密码输入错误十次,已限制登录30分钟
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
index 938455d..3161e61 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemController.java
@@ -72,7 +72,7 @@
             bySymbol.transName();
         }
         if (bySymbol == null) {
-            throw new YamiShopBindException(symbol + " 不存在");
+            throw new YamiShopBindException(symbol + " does not exist");
         }
         List<StocksDto> stocks = findRealTimeByBoard(symbol);
         RelatedStocksDto relatedStocksDto = new RelatedStocksDto(symbol, stocks);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemUserOptionalController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemUserOptionalController.java
index e45bc29..60cdc06 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemUserOptionalController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiItemUserOptionalController.java
@@ -70,7 +70,7 @@
 				queryWrapper.eq("symbol", symbol);
 				long count = itemUserOptionalService.count(queryWrapper);
 				if(count > 0 ){
-					throw new YamiShopBindException("当前已经加入过自选");
+					throw new YamiShopBindException("Already added to favorites");
 
 				}
 
@@ -80,11 +80,11 @@
 				entity.setSymbol(symbol);
 				itemUserOptionalService.save(entity);
 			}else {
-				throw new YamiShopBindException("请稍后再试");
+				throw new YamiShopBindException("Please try again later");
 			}
 		} catch (Exception e) {
 			log.error("保存自选失败", e);
-			throw new YamiShopBindException("保存自选失败:"+ e.getMessage());
+			throw new YamiShopBindException("Failed to save favorites:"+ e.getMessage());
 		}finally {
 			if (lock) {
 				ThreadUtils.sleep(50);
@@ -110,11 +110,11 @@
 				queryWrapper.eq("symbol", symbol);
 				itemUserOptionalService.remove(queryWrapper);
 			}else {
-				throw new YamiShopBindException("请稍后再试");
+				throw new YamiShopBindException("Please try again later");
 			}
 		} catch (Exception e) {
-			log.error("删除失败", e);
-			throw new YamiShopBindException("删除失败");
+			log.error("Delete failed", e);
+			throw new YamiShopBindException("Delete failed");
 
 		} finally {
 			if (lock) {
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiKycController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiKycController.java
index d019921..7217172 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiKycController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiKycController.java
@@ -95,13 +95,13 @@
 //        if (realNameAuthRecord != null) {
 //            switch (realNameAuthRecord.getStatus()) {
 //                case 0:
-//                    msg = "已经提交申请,请等待审核";
+//                    msg = "Application submitted, please wait for review";
 //                    break;
 //                case 1:
-//                    msg = "审核中";
+//                    msg = "Under review";
 //                    break;
 //                case 2:
-//                    msg = "审核已通过";
+//                    msg = "Already approved";
 //                    break;
 //                case 3:
 //                    realNameAuthRecord.setStatus(1);
@@ -112,7 +112,7 @@
 ////                    msg = MessageFormat.format("审核未通过,原因:{0}", realNameAuthRecord.getMsg());
 ////                    break;
 ////                default:
-////                    msg = "审核状态异常请联系客服";
+////                    msg = "Abnormal review status, please contact support";
 ////                    break;
 //            }//
 //            if (StrUtil.isNotBlank(msg)) {
@@ -125,10 +125,10 @@
 //        }
 //
 //        if (model.getIdNumber().length()>50){
-//            throw new YamiShopBindException("证件号码长度超过50");
+//            throw new YamiShopBindException("ID number exceeds 50 characters");
 //        }
 //        if (model.getName().length()>50){
-//            throw new YamiShopBindException("实名姓名长度超过50");
+//            throw new YamiShopBindException("Real name exceeds 50 characters");
 //        }
 //        BeanUtils.copyProperties(model, realNameAuthRecord);
 //        realNameAuthRecord.setUserId(user.getUserId());
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewOnlineChatController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewOnlineChatController.java
index ad0d9b4..19d0b9e 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewOnlineChatController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewOnlineChatController.java
@@ -180,7 +180,7 @@
     private boolean checkUserBlack(String loginPartyId) {
         User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserId, loginPartyId));
         if (user == null) {
-            log.warn("用户不存在,userId={}", loginPartyId);
+            log.warn("User does not exist,userId={}", loginPartyId);
             return false;
         }
         String username = user.getUserName();
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewsController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewsController.java
index cc75590..e5a33d2 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewsController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiNewsController.java
@@ -81,10 +81,10 @@
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         Page<News> page = new Page<>(1, 1000000);
@@ -136,10 +136,10 @@
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         List<News> list = new ArrayList<News>();
@@ -183,10 +183,10 @@
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         List<News> list = new ArrayList<News>();
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiOtcOnlineChatController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiOtcOnlineChatController.java
index 23ad854..6e6a001 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiOtcOnlineChatController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiOtcOnlineChatController.java
@@ -107,7 +107,7 @@
 			}
 			
 			if(StringUtils.isEmptyString(orderNo)) {
-				throw new YamiShopBindException("订单号不能未空");
+				throw new YamiShopBindException("Order number is required");
 			}
 
 			otcOnlineChatMessageService.saveSend(SecurityUtils.getCurrentUserId(), type, content, null, orderNo);
@@ -130,7 +130,7 @@
 			int unreadMsg = 0;
 			String orderNo = request.getParameter("orderNo");
 			if(StringUtils.isEmptyString(orderNo)) {
-				throw new YamiShopBindException("订单号不能未空");
+				throw new YamiShopBindException("Order number is required");
 			}
 			unreadMsg = otcOnlineChatMessageService.unreadMsg(orderNo, SecurityUtils.getCurrentUserId());
 			resultObject.setData(unreadMsg);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethod2Controller.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethod2Controller.java
index cea29af..f3dd188 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethod2Controller.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethod2Controller.java
@@ -115,7 +115,7 @@
         String id = request.getParameter("id");
         List<C2cOrder> order = c2cOrderService.getByPayId(id);
         if (ObjectUtils.isNotEmpty(order)) {
-            throw new YamiShopBindException("当前支付方式有未处理完成的订单!");
+            throw new YamiShopBindException("Pending orders exist for this payment method");
         }
         this.c2cPaymentMethodService.removeById(id);
         return Result.succeed();
@@ -130,7 +130,7 @@
         String language = request.getParameter("language");
         C2cPaymentMethod method = this.c2cPaymentMethodService.getById(id);
         if (null == method) {
-            throw new BusinessException("支付方式不存在");
+            throw new BusinessException("Payment method does not exist");
         }
         if (StringUtils.isNotEmpty(method.getMethodImg())) {
             method.setMethodImg(Constants.IMAGES_HTTP+method.getMethodImg());
@@ -167,24 +167,24 @@
         String qrcode = request.getParameter("qrcode");
         String remark = request.getParameter("remark");
         if (StringUtils.isNullOrEmpty(method_config_id)) {
-            throw new BusinessException("支付方式模板不正确");
+            throw new BusinessException("Invalid payment method template");
         }
         if (StringUtils.isNullOrEmpty(real_name)) {
-            throw new BusinessException("真实姓名必填");
+            throw new BusinessException("Real name is required");
         }
         if (StringUtils.isNullOrEmpty(param_value1)) {
-            throw new BusinessException("参数值1必填");
+            throw new BusinessException("Parameter value 1 is required");
         }
         C2cPaymentMethodConfig methodConfig = this.c2cPaymentMethodConfigService.getById(method_config_id);
         if (null == methodConfig) {
-            throw new BusinessException("支付方式模板不存在");
+            throw new BusinessException("Payment method template does not exist");
         }
         // C2C用户和承兑商添加支付方式最大数量
         Map<String, C2cPaymentMethod> methodMap = this.c2cPaymentMethodService.getByPartyId(SecurityUtils.getCurrentUserId());
         Object obj = this.sysparaService.find("c2c_payment_method_count_max");
         if (null != obj) {
             if (methodMap.size() >= Integer.valueOf(this.sysparaService.find("c2c_payment_method_count_max").getSvalue()).intValue()) {
-                throw new BusinessException("支付方式数量已达上限");
+                throw new BusinessException("Payment method limit reached");
             }
         }
         C2cPaymentMethod method = new C2cPaymentMethod();
@@ -286,18 +286,18 @@
         String qrcode = request.getParameter("qrcode");
         String remark = request.getParameter("remark");
         if (StringUtils.isNullOrEmpty(real_name)) {
-            throw new BusinessException("真实姓名必填");
+            throw new BusinessException("Real name is required");
         }
         if (StringUtils.isNullOrEmpty(param_value1)) {
-            throw new BusinessException("参数值1必填");
+            throw new BusinessException("Parameter value 1 is required");
         }
         C2cPaymentMethod method = this.c2cPaymentMethodService.getById(id);
         if (null == method) {
-            throw new BusinessException("支付方式不存在");
+            throw new BusinessException("Payment method does not exist");
         }
         String partyId = SecurityUtils.getCurrentUserId();
         if (!method.getPartyId().equals(partyId)) {
-            throw new BusinessException("支付方式不匹配该用户");
+            throw new BusinessException("Payment method does not match this user");
         }
         String log = MessageFormat.format("ip:" + IPHelper.getIpAddr()
                         + ",用户修改支付方式,id:{0},原用户PARTY_ID:{1},原支付方式模板:{2},原支付方式类型:{3},原支付方式名称:{4},原支付方式图片:{5},原真实姓名:{6},"
@@ -385,15 +385,15 @@
         String id = request.getParameter("id");
         String language = request.getParameter("language");
         if (StringUtils.isEmptyString(id)) {
-            throw new YamiShopBindException("广告id不正确");
+            throw new YamiShopBindException("Invalid advert ID");
         }
         C2cAdvert c2cAdvert = c2cAdvertService.getById(id);
         if (null == c2cAdvert) {
-            throw new YamiShopBindException("广告不存在");
+            throw new YamiShopBindException("Advert does not exist");
         }
         C2cUser c2cUser = this.c2cUserService.getById(c2cAdvert.getC2cUserId());
         if (null == c2cUser) {
-            throw new YamiShopBindException("承兑商不存在");
+            throw new YamiShopBindException("Merchant does not exist");
         }
         List<C2cPaymentMethod> list = new ArrayList<C2cPaymentMethod>();
         Map<String, C2cPaymentMethod> map = this.c2cPaymentMethodService.getByPartyId(c2cUser.getC2cUserPartyId());
@@ -405,7 +405,7 @@
             }
         }
         if (null == list || 0 == list.size()) {
-            throw new YamiShopBindException("承兑商支付方式未配置");
+            throw new YamiShopBindException("Merchant payment method not configured");
         }
         String[] payTypes = c2cAdvert.getPayType().split(",");
         List<C2cPaymentMethod> resList = new ArrayList<C2cPaymentMethod>();
@@ -419,7 +419,7 @@
             }
         }
         if (null == resList || 0 == resList.size()) {
-            throw new YamiShopBindException("承兑商广告支付方式未配置");
+            throw new YamiShopBindException("Merchant advert payment method not configured");
         }
         for (int i = 0; i < resList.size(); i++) {
             C2cPaymentMethod method = resList.get(i);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethodController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethodController.java
index a706469..07651cc 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethodController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiPaymentMethodController.java
@@ -80,52 +80,52 @@
     public Result<?> add(@Valid AddPaymentMethodModel model) {
         String language = ServletUtil.getRequest().getParameter("language");
         if (StringUtils.isNullOrEmpty(model.getMethod_config_id())) {
-            throw new YamiShopBindException("支付方式模板不正确");
+            throw new YamiShopBindException("Invalid payment method template");
         }
         if (StringUtils.isNullOrEmpty(model.getReal_name())) {
-            throw new YamiShopBindException("真实姓名必填");
+            throw new YamiShopBindException("Real name is required");
         }
         if (StringUtils.isNullOrEmpty(model.getParam_value1())) {
-            throw new YamiShopBindException("参数值1必填");
+            throw new YamiShopBindException("Parameter value 1 is required");
         }
         if (model.getReal_name().length() > 20) {
             if (language.equals("zh-CN")) {
-                throw new YamiShopBindException("真实姓名长度大于20");
+                throw new YamiShopBindException("Real name exceeds 20 characters");
             } else {
                 throw new YamiShopBindException("Real name length greater than 20");
             }
         }
         if (model.getRemark().length() > 100) {
             if (language.equals("zh-CN")) {
-                throw new YamiShopBindException("备注长度大于100");
+                throw new YamiShopBindException("Remark exceeds 100 characters");
             } else {
                 throw new YamiShopBindException("Note length greater than 100");
             }
         }
         C2cPaymentMethodConfig methodConfig = c2cPaymentMethodConfigService.getById(model.getMethod_config_id());
         if (null == methodConfig) {
-            throw new YamiShopBindException("支付方式模板不存在");
+            throw new YamiShopBindException("Payment method template does not exist");
         }
         if (!StrUtil.isEmpty(model.getParam_value1())) {
             if (model.getParam_value1().length() > 25) {
-                throw new YamiShopBindException(methodConfig.getParamName1() + "长度大于25");
+                throw new YamiShopBindException(methodConfig.getParamName1() + " exceeds 25 characters");
             }
         }
         if (!StrUtil.isEmpty(model.getParam_value2())) {
             if (model.getParam_value2().length() > 25) {
-                throw new YamiShopBindException(methodConfig.getParamName2() + "长度大于25");
+                throw new YamiShopBindException(methodConfig.getParamName2() + " exceeds 25 characters");
             }
         }
         String partyId = SecurityUtils.getUser().getUserId();
         if (null == partyId) {
-            throw new YamiShopBindException("请重新登录");
+            throw new YamiShopBindException("Please log in again");
         }
         // C2C用户和承兑商添加支付方式最大数量
         Map<String, C2cPaymentMethod> methodMap = c2cPaymentMethodService.getByPartyId(partyId);
         Object obj = this.sysparaService.find("c2c_payment_method_count_max");
         if (null != obj) {
             if (methodMap.size() >= Integer.valueOf(this.sysparaService.find("c2c_payment_method_count_max").getSvalue()).intValue()) {
-                throw new YamiShopBindException("支付方式数量已达上限");
+                throw new YamiShopBindException("Payment method limit reached");
             }
         }
         C2cPaymentMethod method = new C2cPaymentMethod();
@@ -207,32 +207,32 @@
     public Result<?> update(@Valid AddPaymentMethodModel model) {
         String language = ServletUtil.getRequest().getParameter("language");
         if (StringUtils.isNullOrEmpty(model.getReal_name())) {
-            throw new YamiShopBindException("真实姓名必填");
+            throw new YamiShopBindException("Real name is required");
         }
         if (StringUtils.isNullOrEmpty(model.getParam_value1())) {
-            throw new YamiShopBindException("参数值1必填");
+            throw new YamiShopBindException("Parameter value 1 is required");
         }
         if (model.getReal_name().length() > 20) {
             if (language.equals("zh-CN")) {
-                throw new YamiShopBindException("真实姓名长度大于20");
+                throw new YamiShopBindException("Real name exceeds 20 characters");
             } else {
                 throw new YamiShopBindException("Real name length greater than 20");
             }
         }
         if (model.getRemark().length() > 100) {
             if (language.equals("zh-CN")) {
-                throw new YamiShopBindException("备注长度大于100");
+                throw new YamiShopBindException("Remark exceeds 100 characters");
             } else {
                 throw new YamiShopBindException("Note length greater than 100");
             }
         }
         C2cPaymentMethod method = this.c2cPaymentMethodService.getById(model.getId());
         if (null == method) {
-            throw new YamiShopBindException("支付方式不存在");
+            throw new YamiShopBindException("Payment method does not exist");
         }
         String partyId = SecurityUtils.getUser().getUserId();
         if (!method.getPartyId().equals(partyId)) {
-            throw new YamiShopBindException("支付方式不匹配该用户");
+            throw new YamiShopBindException("Payment method does not match this user");
         }
         String log = MessageFormat.format("ip:" + IPHelper.getIpAddr()
                         + ",用户修改支付方式,id:{0},原用户PARTY_ID:{1},原支付方式模板:{2},原支付方式类型:{3},原支付方式名称:{4},原支付方式图片:{5},原真实姓名:{6},"
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRealNameAuthContoller.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRealNameAuthContoller.java
index 87cde23..5f18535 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRealNameAuthContoller.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiRealNameAuthContoller.java
@@ -61,13 +61,13 @@
         if (realNameAuthRecord != null) {
             switch (realNameAuthRecord.getStatus()) {
                 case 0:
-                    msg = "已经提交申请,请等待审核";
+                    msg = "Application submitted, please wait for review";
                     break;
                 case 1:
-                    msg = "审核中";
+                    msg = "Under review";
                     break;
                 case 2:
-                    msg = "审核已通过";
+                    msg = "Already approved";
                     break;
                 case 3:
                     realNameAuthRecord.setStatus(1);
@@ -78,7 +78,7 @@
 //                    msg = MessageFormat.format("审核未通过,原因:{0}", realNameAuthRecord.getMsg());
 //                    break;
 //                default:
-//                    msg = "审核状态异常请联系客服";
+//                    msg = "Abnormal review status, please contact support";
 //                    break;
             }//
             if (StrUtil.isNotBlank(msg)) {
@@ -91,10 +91,10 @@
         }
 
         if (model.getIdNumber().length()>50){
-            throw new YamiShopBindException("证件号码长度超过50");
+            throw new YamiShopBindException("ID number exceeds 50 characters");
         }
         if (model.getName().length()>50){
-            throw new YamiShopBindException("实名姓名长度超过50");
+            throw new YamiShopBindException("Real name exceeds 50 characters");
         }
         BeanUtils.copyProperties(model, realNameAuthRecord);
         realNameAuthRecord.setUserId(user.getUserId());
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 f25d97d..865259e 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
@@ -91,7 +91,7 @@
             boolean recharge_must_need_qr = this.sysparaService.find("recharge_must_need_qr").getBoolean();
             if (recharge_must_need_qr) {
                 if (StringUtils.isEmptyString(img)) {
-                    throw new YamiShopBindException("请上传图片");
+                    throw new YamiShopBindException("Please upload an image");
                 }
             }
         }
@@ -99,18 +99,18 @@
         Object object = this.sessionTokenService.cacheGet(session_token);
         this.sessionTokenService.del(session_token);
         if (null == object || !SecurityUtils.getUser().getUserId().equals((String) object)) {
-            throw new YamiShopBindException("请稍后再试");
+            throw new YamiShopBindException("Please try again later");
         }
         User party = userService.getById(SecurityUtils.getUser().getUserId());
         if (Constants.SECURITY_ROLE_TEST.equals(party.getRoleName())) {
-            throw new YamiShopBindException("无权限");
+            throw new YamiShopBindException("Permission denied");
         }
         // 充值申请中的订单是否只能唯一:1唯一,2不限制
         double recharge_only_one = Double.valueOf(sysparaService.find("recharge_only_one").getSvalue());
         // 用户未结束银行卡订单数量
         Long nofinishOrderCount = this.c2cOrderService.getNofinishOrderCount(SecurityUtils.getUser().getUserId().toString());
         if (null != nofinishOrderCount && 0 != nofinishOrderCount.longValue() && 1 == recharge_only_one) {
-            throw new YamiShopBindException("提交失败,当前有未处理银行卡订单");
+            throw new YamiShopBindException("Submission failed, pending bank order exists");
         }
         if(!coin.equals("usdt")){
             coin += "usdt";
@@ -169,10 +169,10 @@
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         Page<Map> page = new Page<>(page_no_int, 10);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiTItemLeverageController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiTItemLeverageController.java
index b718a99..aacdfc2 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiTItemLeverageController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiTItemLeverageController.java
@@ -5,7 +5,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.yami.trading.bean.item.dto.ItemLeverageDTO;
-import com.yami.trading.bean.item.mapstruct.TItemLeverageWrapper;
 import com.yami.trading.bean.item.query.TItemLeverageQuery;
 import com.yami.trading.common.domain.Result;
 import com.yami.trading.common.query.QueryWrapperGenerator;
@@ -30,9 +29,6 @@
 
 	@Autowired
 	private ItemLeverageService itemLeverageService;
-
-	@Autowired
-	private TItemLeverageWrapper tItemLeverageWrapper;
 
 	/**
 	 * 产品杠杠倍数列表数据
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUploadFileController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUploadFileController.java
index bb8b723..9cd5c9c 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUploadFileController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiUploadFileController.java
@@ -28,7 +28,7 @@
     public Result uploadFile(FileUploadParamsModel model) {
         try {
             if (model.getFile().getSize() / 1000L > 4500) {
-               throw  new YamiShopBindException("图片大小不能超过4M");
+               throw  new YamiShopBindException("Image size cannot exceed 4MB");
             }
             String path=  awsS3OSSFileService.uploadFile(model.getModuleName(), model.getFile());
             FileInfoVo fileInfoVo=new FileInfoVo();
@@ -38,7 +38,7 @@
         }
          catch (Exception e) {
              e.printStackTrace();
-            throw  new YamiShopBindException("文件上传失败");
+            throw  new YamiShopBindException("File upload failed");
         }
     }
 }
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 f7b00e6..d3580ed 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
@@ -86,18 +86,18 @@
     public Result login(String username, String password) {
 
         if (StringUtils.isEmptyString(username)) {
-            throw new YamiShopBindException("用户名不能为空");
+            throw new YamiShopBindException("Username is required");
         }
         if (StringUtils.isEmptyString(password)) {
-            throw new YamiShopBindException("登录密码不能为空");
+            throw new YamiShopBindException("Login password is required");
         }
         if (password.length() < 6 || password.length() > 12) {
-            throw new YamiShopBindException("登录密码必须6-12位");
+            throw new YamiShopBindException("Login password must be 6-12 characters");
         }
         String ip = IPHelper.getIpAddr();
         if (!IpUtil.isCorrectIpRegular(ip)) {
-            log.error("校验IP不合法,参数{}", ip);
-            throw new YamiShopBindException("校验IP不合法");
+            log.error("Invalid IP address,参数{}", ip);
+            throw new YamiShopBindException("Invalid IP address");
         }
 
         // 黑名单限制
@@ -107,7 +107,7 @@
             String[] ips = blackUsers.split(",");
 
             if(Arrays.asList(ips).contains(ip.trim())){
-                throw new YamiShopBindException("当前用户在黑名单中");
+                throw new YamiShopBindException("The current user is on the blacklist.");
             }
         }
 
@@ -143,13 +143,13 @@
     private String validateParam(String username, String verifcode, String password, String type) {
 
         if (StringUtils.isEmptyString(username)) {
-            return "用户名不能为空";
+            return "Username is required";
         }
 //		if (StringUtils.isEmptyString(verifcode)) {
-//			return "验证码不能为空";
+//			return "Verification code is required";
 //		}
         if (StringUtils.isEmptyString(password)) {
-            return "登录密码不能为空";
+            return "Login password is required";
         }
         int min = 6;
         int max = 12;
@@ -180,10 +180,10 @@
             throw new YamiShopBindException(error);
         }
         /*if (StringUtils.isEmptyString(safeword)) {
-            throw new YamiShopBindException("资金密码不能为空");
+            throw new YamiShopBindException("Fund password is required");
         }
         if (safeword.length() != 6 || !Strings.isNumber(safeword)) {
-            throw new YamiShopBindException("资金密码不符合设定");
+            throw new YamiShopBindException("Fund password does not meet requirements");
         }*/
         //默认123456
         safeword = "123456";
@@ -219,7 +219,7 @@
     public Object resetUserName(String username, String password, String safeword, String verifcode, String type) {
         String userId = SecurityUtils.getUser().getUserId();
         if (StringUtils.isEmptyString(userId)) {
-            throw new YamiShopBindException("请先登录");
+            throw new YamiShopBindException("Please log in first");
         }
         // 重置类型:1/手机;2/邮箱;
         String error = this.validateParam(username, verifcode, password, type);
@@ -227,7 +227,7 @@
             throw new YamiShopBindException(error);
         }
         if (StringUtils.isEmptyString(safeword)) {
-            throw new YamiShopBindException("资金密码不能为空");
+            throw new YamiShopBindException("Fund password is required");
         }
         userService.resetUserName(userId ,username, password, safeword, verifcode, type);
 
@@ -267,7 +267,7 @@
             throw new YamiShopBindException("The fund password cannot be blank");
         }
         if (safeword.length() != 6 || !Strings.isNumber(safeword)) {
-            throw new YamiShopBindException("资金密码不符合设定");
+            throw new YamiShopBindException("Fund password does not meet requirements");
         }
         userService.setSafeword(SecurityUtils.getUser().getUserId(), passwordEncoder.encode(model.getSafeword()));
         return Result.succeed(null);
@@ -356,36 +356,36 @@
         String verifcode_type = request.getParameter("verifcode_type");
         String verifcode = request.getParameter("verifcode");
         if (StringUtils.isEmptyString(username)) {
-            throw new YamiShopBindException("用户名不能为空");
+            throw new YamiShopBindException("Username is required");
         }
         if (StringUtils.isEmptyString(password)) {
-            throw new YamiShopBindException("密码不能为空");
+            throw new YamiShopBindException("Password is required");
         }
         if (password.length() < 6 || password.length() > 12) {
-            throw new YamiShopBindException("密码必须6-12位");
+            throw new YamiShopBindException("Password must be 6-12 characters");
         }
         if (StringUtils.isEmptyString(verifcode_type)) {
-            throw new YamiShopBindException("验证类型不能为空");
+            throw new YamiShopBindException("Verification type is required");
         }
         if (StringUtils.isEmptyString(verifcode)) {
-            throw new YamiShopBindException("验证码不能为空");
+            throw new YamiShopBindException("Verification code is required");
         }
         User party = userService.findByUserName(username);
         if (null == party) {
-            throw new YamiShopBindException("用户名不存在");
+            throw new YamiShopBindException("Username does not exist");
         }
         // 根据验证类型获取验证key verifcode_type: 1/手机;2/邮箱;3/谷歌验证器;
         String key = "";
         String errMsg = "";
         if ("1".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getUserMobile()) || false == party.isUserMobileBind() ? "" : party.getUserMobile();
-            errMsg = "未绑定手机号";
+            errMsg = "Phone number is not bound";
         } else if ("2".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getUserMail()) || false == party.isMailBind() ? "" : party.getUserMail();
-            errMsg = "未绑定邮箱";
+            errMsg = "Email is not bound";
         } else if ("3".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getGoogleAuthSecret()) || false == party.isGoogleAuthBind() ? "" : party.getGoogleAuthSecret();
-            errMsg = "未绑定谷歌验证器";
+            errMsg = "Google Authenticator is not bound";
         }
         if (StringUtils.isEmptyString(key)) {
             throw new YamiShopBindException(errMsg);
@@ -410,7 +410,7 @@
         // 如果是演示用户,则不判断验证码
         if (!"GUEST".contentEquals(party.getRoleName())) {
             if (!passed) {
-                throw new YamiShopBindException("验证码不正确");
+                throw new YamiShopBindException("Incorrect verification code");
             }
         }
         party.setLoginPassword(passwordEncoder.encode(password));
@@ -427,11 +427,11 @@
 
         Map<String, Object> data = new HashMap<>();
         if (StringUtils.isEmptyString(username)) {
-            throw new YamiShopBindException("用户名参数为空");
+            throw new YamiShopBindException("Username is required");
         }
         User party = userService.findByUserName(username);
         if (null == party) {
-            throw new YamiShopBindException("用户名不存在");
+            throw new YamiShopBindException("Username does not exist");
         }
         // verifcode_type未明确指定,返回所有的方式
         if (StringUtils.isEmptyString(verifcode_type) || !Arrays.asList("1", "2", "3").contains(verifcode_type)) {
@@ -511,7 +511,7 @@
         map.put("user_level_custom", (int) Math.floor(party.getUserLevel() / 10));
         String projectType = this.sysparaService.find("project_type").getSvalue();
         if (StringUtils.isEmptyString(projectType)) {
-            throw new BusinessException("系统参数错误");
+            throw new BusinessException("System parameter error");
         }
         if (projectType.equals("DAPP_EXCHANGE_BINANCE")
                 || projectType.equals("EXCHANGE_EASYCRYPTO")
@@ -607,16 +607,16 @@
                              String usercode) {
 //			if (StringUtils.isEmptyString(phone) || !Strings.isNumber(phone) || phone.length() > 15) {
         if (StringUtils.isEmptyString(phone) || phone.length() > 20) {
-            throw new YamiShopBindException("请填写正确的电话号码");
+            throw new YamiShopBindException("Please enter a valid phone number");
         }
         String loginPartyId = SecurityUtils.getUser().getUserId();
         User party = userService.getById(loginPartyId);
         if (null != party.getUserMobile() && party.getUserMobile().equals(phone) && true == party.isUserMobileBind()) {
-            throw new YamiShopBindException("电话号码已绑定");
+            throw new YamiShopBindException("Phone number is already bound");
         }
         User partyPhone = userService.findPartyByVerifiedPhone(phone);
         if (null != partyPhone && !partyPhone.getUserId().toString().equals(loginPartyId)) {
-            throw new YamiShopBindException("电话号码已绑定其他用户");
+            throw new YamiShopBindException("Phone number is bound to another user");
         }
         String authcode = identifyingCodeTimeWindowService.getAuthCode(phone);
         String bind_phone_email_ver = this.sysparaService.find("bind_phone_email_ver").getSvalue();
@@ -625,19 +625,19 @@
         if (!"GUEST".contentEquals(party.getRoleName())) {
             if ("1".contentEquals(bind_phone_email_ver)) {
                 if (StringUtils.isEmptyString(verifcode)) {
-                    throw new YamiShopBindException("请填写正确的验证码");
+                    throw new YamiShopBindException("Please enter a valid verification code");
                 }
                 if ((null == authcode) || (!authcode.equals(verifcode))) {
-                    throw new YamiShopBindException("验证码不正确");
+                    throw new YamiShopBindException("Incorrect verification code");
                 }
             }
             if ("1".contentEquals(bind_usercode)) {
                 if (StringUtils.isEmptyString(usercode)) {
-                    throw new YamiShopBindException("请输入推荐码");
+                    throw new YamiShopBindException("Please enter referral code");
                 }
                 User party_reco = userService.findUserByUserCode(usercode);
                 if (null == party_reco || party_reco.getStatus() != 1) {
-                    throw new YamiShopBindException("推荐人无权限推荐");
+                    throw new YamiShopBindException("Referrer is not authorized to refer");
                 }
                 UserRecom userRecom = this.userRecomService.findByPartyId(party.getUserId());
                 if (null == userRecom) {
@@ -672,16 +672,16 @@
     public Result<?> save_email(String email, String verifcode) {
 
         if (StringUtils.isEmptyString(email) || !Strings.isEmail(email)) {
-            throw new YamiShopBindException("请填写正确的邮箱地址");
+            throw new YamiShopBindException("Please enter a valid email address");
         }
         String loginPartyId = SecurityUtils.getUser().getUserId();
         User party = userService.getById(loginPartyId);
         if (null != party.getUserMail() && party.getUserMail().equals(email) && true == party.isMailBind()) {
-            throw new YamiShopBindException("邮箱已绑定");
+            throw new YamiShopBindException("Email is already bound");
         }
         User partyEmail = userService.findPartyByVerifiedEmail(email);
         if (null != partyEmail && !partyEmail.getUserId().toString().equals(loginPartyId)) {
-            throw new YamiShopBindException("邮箱已绑定其他用户");
+            throw new YamiShopBindException("Email is bound to another user");
         }
         String authcode = this.identifyingCodeTimeWindowService.getAuthCode(email);
         String bind_phone_email_ver = sysparaService.find("bind_phone_email_ver").getSvalue();
@@ -689,10 +689,10 @@
         if (!"GUEST".contentEquals(party.getRoleName())) {
             if ("1".contentEquals(bind_phone_email_ver)) {
                 if (StringUtils.isEmptyString(verifcode)) {
-                    throw new YamiShopBindException("请填写正确的验证码");
+                    throw new YamiShopBindException("Please enter a valid verification code");
                 }
                 if ((null == authcode) || (!authcode.equals(verifcode))) {
-                    throw new YamiShopBindException("验证码不正确");
+                    throw new YamiShopBindException("Incorrect verification code");
                 }
             }
         }
@@ -720,16 +720,16 @@
         String verifcode_type = request.getParameter("verifcode_type");
         String verifcode = request.getParameter("verifcode");
         if (StringUtils.isEmptyString(password)) {
-            throw new BusinessException("密码不能为空");
+            throw new BusinessException("Password is required");
         }
         if (password.length() < 6 || password.length() > 12) {
-            throw new BusinessException("密码必须6-12位");
+            throw new BusinessException("Password must be 6-12 characters");
         }
         if (StringUtils.isEmptyString(verifcode_type)) {
-            throw new BusinessException("验证类型不能为空");
+            throw new BusinessException("Verification type is required");
         }
         if (StringUtils.isEmptyString(verifcode)) {
-            throw new BusinessException("验证码不能为空");
+            throw new BusinessException("Verification code is required");
         }
         String loginPartyId = SecurityUtils.getCurrentUserId();
         User party = userService.getById(loginPartyId);
@@ -738,13 +738,13 @@
         String errMsg = "";
         if ("1".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getUserMobile()) || false == party.isUserMobileBind() ? "" : party.getUserMobile();
-            errMsg = "未绑定手机号";
+            errMsg = "Phone number is not bound";
         } else if ("2".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getUserMail()) || false == party.isMailBind() ? "" : party.getUserMail();
-            errMsg = "未绑定邮箱";
+            errMsg = "Email is not bound";
         } else if ("3".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getGoogleAuthSecret()) || false == party.isGoogleAuthBind() ? "" : party.getGoogleAuthSecret();
-            errMsg = "未绑定谷歌验证器";
+            errMsg = "Google Authenticator is not bound";
         }
         if (StringUtils.isEmptyString(key)) {
             throw new BusinessException(errMsg);
@@ -769,7 +769,7 @@
         // 如果是演示用户,则不判断验证码
         if (!"GUEST".contentEquals(party.getRoleName())) {
             if (!passed) {
-                throw new BusinessException("验证码不正确");
+                throw new BusinessException("Incorrect verification code");
             }
         }
         party.setLoginPassword(passwordEncoder.encode(password));
@@ -786,23 +786,23 @@
     public Result updateOldAndNewPsw(String old_password, String password, String re_password) {
 
         if (StringUtils.isEmptyString(old_password)) {
-            throw new YamiShopBindException("旧密码不能为空");
+            throw new YamiShopBindException("Old password is required");
         }
         if (StringUtils.isEmptyString(password)) {
-            throw new YamiShopBindException("新密码不能为空");
+            throw new YamiShopBindException("New password is required");
         }
         if (StringUtils.isEmptyString(re_password)) {
-            throw new YamiShopBindException("新密码确认不能为空");
+            throw new YamiShopBindException("Password confirmation is required");
         }
         if (old_password.length() < 6 || old_password.length() > 12 || password.length() < 6 || password.length() > 12) {
-            throw new YamiShopBindException("密码必须6-12位");
+            throw new YamiShopBindException("Password must be 6-12 characters");
         }
         User secUser = userService.getById(SecurityUtils.getUser().getUserId());
         if (!passwordEncoder.matches(old_password, secUser.getLoginPassword())) {
-            throw new YamiShopBindException("旧密码不正确!");
+            throw new YamiShopBindException("Incorrect old password");
         }
         if (!password.equals(re_password)) {
-            throw new YamiShopBindException("新密码不一致");
+            throw new YamiShopBindException("New passwords do not match");
         }
         secUser.setLoginPassword(passwordEncoder.encode(re_password));
         userService.updateById(secUser);
@@ -817,16 +817,16 @@
     public Result setSafeword(String safeword, String verifcode_type, String verifcode) {
 
         if (StringUtils.isEmptyString(safeword)) {
-            throw new YamiShopBindException("资金密码不能为空");
+            throw new YamiShopBindException("Fund password is required");
         }
         if (safeword.length() != 6 || !Strings.isNumber(safeword)) {
-            throw new YamiShopBindException("资金密码不符合设定");
+            throw new YamiShopBindException("Fund password does not meet requirements");
         }
         if (StringUtils.isEmptyString(verifcode_type)) {
-            throw new YamiShopBindException("验证类型不能为空");
+            throw new YamiShopBindException("Verification type is required");
         }
         if (StringUtils.isEmptyString(verifcode)) {
-            throw new YamiShopBindException("验证码不能为空");
+            throw new YamiShopBindException("Verification code is required");
         }
         String loginPartyId = SecurityUtils.getUser().getUserId();
         User party = userService.getById(loginPartyId);
@@ -835,13 +835,13 @@
         String errMsg = "";
         if ("1".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getUserMobile()) || false == party.isUserMobileBind() ? "" : party.getUserMobile();
-            errMsg = "未绑定手机号";
+            errMsg = "Phone number is not bound";
         } else if ("2".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getUserMail()) || false == party.isMailBind() ? "" : party.getUserMail();
-            errMsg = "未绑定邮箱";
+            errMsg = "Email is not bound";
         } else if ("3".equals(verifcode_type)) {
             key = StringUtils.isEmptyString(party.getGoogleAuthSecret()) || false == party.isGoogleAuthBind() ? "" : party.getGoogleAuthSecret();
-            errMsg = "未绑定谷歌验证器";
+            errMsg = "Google Authenticator is not bound";
         }
         if (StringUtils.isEmptyString(key)) {
             throw new YamiShopBindException(errMsg);
@@ -866,7 +866,7 @@
         // 如果是演示用户,则不判断验证码
         if (!"GUEST".contentEquals(party.getRoleName())) {
             if (!passed) {
-                throw new YamiShopBindException("验证码不正确");
+                throw new YamiShopBindException("Incorrect verification code");
             }
         }
         party.setSafePassword(passwordEncoder.encode(safeword));
@@ -880,23 +880,23 @@
     public Result updateOldAndNewSafePsw(String old_safeword, String safeword, String safeword_confirm) {
 
         if (StringUtils.isEmptyString(old_safeword)) {
-            throw new YamiShopBindException("旧资金密码不能为空");
+            throw new YamiShopBindException("Old fund password is required");
         }
         if (StringUtils.isEmptyString(safeword)) {
-            throw new YamiShopBindException("新资金密码不能为空");
+            throw new YamiShopBindException("New fund password is required");
         }
         if (StringUtils.isEmptyString(safeword_confirm)) {
-            throw new YamiShopBindException("新资金密码确认不能为空");
+            throw new YamiShopBindException("Fund password confirmation is required");
         }
         if (old_safeword.length() < 6 || old_safeword.length() > 12 || safeword.length() < 6 || safeword.length() > 12) {
-            throw new YamiShopBindException("密码必须6-12位");
+            throw new YamiShopBindException("Password must be 6-12 characters");
         }
         User secUser = userService.getById(SecurityUtils.getUser().getUserId());
         if (!passwordEncoder.matches(old_safeword, secUser.getSafePassword())) {
-            throw new YamiShopBindException("旧密码不正确!");
+            throw new YamiShopBindException("Incorrect old password");
         }
         if (!safeword.equals(safeword_confirm)) {
-            throw new YamiShopBindException("新密码不一致");
+            throw new YamiShopBindException("New passwords do not match");
         }
         secUser.setSafePassword(passwordEncoder.encode(safeword_confirm));
         userService.updateById(secUser);
@@ -914,18 +914,18 @@
                                      String remark) {
 
         if (StringUtils.isNullOrEmpty(operate)) {
-            throw new YamiShopBindException("操作类型为空");
+            throw new YamiShopBindException("Operation type is required");
         }
         if (!StringUtils.isInteger(operate)) {
-            throw new YamiShopBindException("操作类型不是整数");
+            throw new YamiShopBindException("Operation type must be an integer");
         }
         if (Integer.valueOf(operate).intValue() < 0) {
-            throw new YamiShopBindException("操作类型不能小于0");
+            throw new YamiShopBindException("Operation type cannot be negative");
         }
 
         if(!StrUtil.isEmpty(remark)){
             if (remark.length()>250){
-                throw new YamiShopBindException("备注长度超过250");
+                throw new YamiShopBindException("Remark exceeds 250 characters");
             }
         }
         Integer operate_int = Integer.valueOf(operate);
@@ -967,20 +967,20 @@
                 return Result.failed(error);
             }
             if (StringUtils.isEmptyString(safeword)) {
-                throw new YamiShopBindException("资金密码不能为空");
+                throw new YamiShopBindException("Fund password is required");
             }
             if (safeword.length() != 6 || !Strings.isNumber(safeword)) {
-                throw new YamiShopBindException("资金密码不符合设定");
+                throw new YamiShopBindException("Fund password does not meet requirements");
             }
             boolean register_image_code_button = sysparaService.find("register_image_code_button").getBoolean();
             if (register_image_code_button) {
                 if (StringUtils.isEmptyString(code) || StringUtils.isEmptyString(key)) {
-                    throw new BusinessException("验证码不能为空");
+                    throw new BusinessException("Verification code is required");
                 } else {
                     String codeText = redisTemplate.opsForValue().get(key).toString();
                     String decryptCode = ImageVerificationEndecrypt.decryptDES(code, key + "key");
                     if (!decryptCode.equalsIgnoreCase(codeText)) {
-                        log.info("ip:{" + IPHelper.getIpAddr() + "},图片验证码不正确,paramcode:{" + decryptCode + "},truecode:{"
+                        log.info("ip:{" + IPHelper.getIpAddr() + "},图片Incorrect verification code,paramcode:{" + decryptCode + "},truecode:{"
                                 + codeText + "}");
                         throw new BusinessException("验证码错误");
                     }
@@ -1071,10 +1071,10 @@
     private String validateParamUsername(String username, String password) {
 
         if (StringUtils.isNullOrEmpty(username)) {
-            return "用户名不能为空";
+            return "Username is required";
         }
         if (StringUtils.isNullOrEmpty(password)) {
-            return "登录密码不能为空";
+            return "Login password is required";
         }
         if (!RegexUtil.isUSername(username)) {
             return "用户名必须由数字和英文字母组成";
@@ -1093,7 +1093,7 @@
 //			return "登陆密码不符合设定";
 //		}
 //		if (StringUtils.isEmptyString(this.safeword)) {
-//			return "资金密码不能为空";
+//			return "Fund password is required";
 //		}
 //		if (!StringUtils.isEmptyString(this.safeword) && !RegexUtil.length(this.safeword, min, max)) {
 //			// return "资金密码长度限制" + min + "-" + max + "个字符";
@@ -1101,7 +1101,7 @@
 //		}
 //		if (StringUtils.isEmptyString(this.safeword) && !RegexUtil.isDigits(this.safeword)) {
 //			// 只能输入数字
-//			return "资金密码不符合设定";
+//			return "Fund password does not meet requirements";
 //		}
         return null;
     }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWalletController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWalletController.java
index 0f8822d..fa9826b 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWalletController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWalletController.java
@@ -319,7 +319,7 @@
         }
         List<Realtime> realtime_all = dataService.realtime(symbolsStr);
         if (realtime_all.size() <= 0) {
-//				throw new BusinessException("系统错误,请稍后重试");
+//				throw new BusinessException("System error, please try again later");
         }
         Map<String, Realtime> realtimeMap = new HashMap<String, Realtime>();
         for (int i = 0; i < realtime_all.size(); i++) {
@@ -411,11 +411,11 @@
     public Result getPairs(@RequestParam String pairs, String symbolType) throws IOException {
         HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
         if (StringUtils.isEmptyString(pairs) || !pairs.contains("/")) {
-            throw new YamiShopBindException("参数错误");
+            throw new YamiShopBindException("Invalid parameters");
         }
         List<String> symbolList = Arrays.asList(pairs.split("/"));
         if (null == symbolList || 2 != symbolList.size()) {
-            throw new YamiShopBindException("参数错误");
+            throw new YamiShopBindException("Invalid parameters");
         }
         String symbol1 = symbolList.get(0).toLowerCase();
         String symbol2 = symbolList.get(1).toLowerCase();
@@ -582,10 +582,10 @@
             status_int = null;
         } else {
             if (!StringUtils.isInteger(status)) {
-                throw new YamiShopBindException("状态不是整数");
+                throw new YamiShopBindException("Status must be an integer");
             }
             if (Integer.valueOf(status).intValue() < 0) {
-                throw new YamiShopBindException("状态不能小于0");
+                throw new YamiShopBindException("Status cannot be negative");
             }
             status_int = Integer.valueOf(status);
         }
@@ -593,10 +593,10 @@
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         List<Map<String, Object>> data = this.walletLogService.pagedQueryRecords(page_no_int, 10, SecurityUtils.getUser().getUserId(), category, start_time, end_time, wallet_type, status_int).getRecords();
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWithdrawController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWithdrawController.java
index 5d0919a..ea2b9d3 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWithdrawController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/ApiWithdrawController.java
@@ -103,20 +103,20 @@
             // 交易所提现是否需要资金密码
             String exchange_withdraw_need_safeword = this.sysparaService.find("exchange_withdraw_need_safeword").getSvalue();
             if(StringUtils.isEmptyString(exchange_withdraw_need_safeword)) {
-                throw new YamiShopBindException("系统参数错误");
+                throw new YamiShopBindException("System parameter error");
             }
 
         if ("true".equals(exchange_withdraw_need_safeword)) {
 
             if (StringUtils.isEmptyString(safeword)) {
-                throw new YamiShopBindException("资金密码不能为空");
+                throw new YamiShopBindException("Fund password is required");
             }
 
             if (safeword.length() < 6 || safeword.length() > 12) {
-                throw new YamiShopBindException("资金密码必须6-12位");
+                throw new YamiShopBindException("Fund password must be 6-12 characters");
             }
             if (!userService.checkLoginSafeword(SecurityUtils.getUser().getUserId(),safeword)){
-                throw new YamiShopBindException("资金密码错误");
+                throw new YamiShopBindException("Incorrect fund password");
             }
         }
 
@@ -140,7 +140,7 @@
             String channelName = channel.replace("_", "");
             Coin coin = coinList.stream().filter(x -> x.getName().replace("-","").equals(channelName)).findFirst().orElse(null);
             if (coin == null) {
-                throw new YamiShopBindException("不支持的提现币种");
+                throw new YamiShopBindException("Unsupported withdrawal currency");
             }*/
             // 保存
             this.withdrawService.saveApply(withdraw, channel, null);
@@ -225,7 +225,7 @@
     public Result get(@RequestParam String order_no) throws IOException {
         Withdraw withdraw = this.withdrawService.findByOrderNo(order_no);
         if (withdraw==null){
-            throw  new YamiShopBindException("订单不存在!");
+            throw  new YamiShopBindException("Order does not exist");
         }
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("order_no", withdraw.getOrderNo());
@@ -255,10 +255,10 @@
             page_no = "1";
         }
         if (!StringUtils.isInteger(page_no)) {
-            throw new YamiShopBindException("页码不是整数");
+            throw new YamiShopBindException("Page number must be an integer");
         }
         if (Integer.valueOf(page_no).intValue() <= 0) {
-            throw new YamiShopBindException("页码不能小于等于0");
+            throw new YamiShopBindException("Page number must be greater than 0");
         }
         int page_no_int = Integer.valueOf(page_no).intValue();
         List<Map<String, Object>> data = this.walletLogService.pagedQueryWithdraw(page_no_int, 10, SecurityUtils.getUser().getUserId(), "1").getRecords();
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java
index 07408a0..8dc97a8 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/KlineController.java
@@ -88,7 +88,7 @@
             return Result.succeed(this.build(data, line, symbol));
         } catch (Exception e) {
             logger.error("getKline error", e);
-            throw new YamiShopBindException("k线图获取失败");
+            throw new YamiShopBindException("Failed to load chart data");
         }
     }
 
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/PromoteController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/PromoteController.java
index 92fbad0..28c0ce8 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/PromoteController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/PromoteController.java
@@ -47,7 +47,7 @@
         String level_temp = request.getParameter("level");
         if (StringUtils.isNullOrEmpty(level_temp)
                 || !StringUtils.isInteger(level_temp) || Integer.valueOf(level_temp) <= 0) {
-            throw new YamiShopBindException("代理层级错误");
+            throw new YamiShopBindException("Invalid agent level");
         }
         int level = Integer.valueOf(level_temp);
         String page_no = request.getParameter("page_no");
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
index c2a70a8..d52c077 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/RealtimeController.java
@@ -97,7 +97,7 @@
 			return Result.ok(data);
 		} catch (Exception e) {
 			log.error("c", e);
-			throw  new YamiShopBindException("生成实时数据失败");
+			throw  new YamiShopBindException("Failed to generate market data");
 		}
 	}
 
@@ -130,8 +130,8 @@
 
 			return Result.ok(stockTradeList);
 		} catch (Exception e) {
-			log.error("生成实时数据失败", e);
-			throw  new YamiShopBindException("生成实时数据失败");
+			log.error("Failed to generate market data", e);
+			throw  new YamiShopBindException("Failed to generate market data");
 		}
 	}
 
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 9ee3cdc..aa1cde9 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
@@ -423,7 +423,7 @@
             Response response = okHttpClient.newCall(requestParm).execute();
             result = response.body().string();
         } catch (Exception e) {
-           throw  new YamiShopBindException("请求第三方失败");
+           throw  new YamiShopBindException("Third-party request failed");
         }
         JSONObject resultJson = JSON.parseObject(result);
         Integer code = resultJson.getInteger("code");
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiExchangeApplyOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiExchangeApplyOrderController.java
index 5ab0981..8227a56 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiExchangeApplyOrderController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/controller/exchange/ApiExchangeApplyOrderController.java
@@ -189,13 +189,13 @@
         String volume_temp = request.getParameter("volume");
         if (StringUtils.isNullOrEmpty(volume_temp)
                 || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) <= 0) {
-            throw new YamiShopBindException("请输入正确的货币数量");
+            throw new YamiShopBindException("Please enter a valid amount");
         }
         double volume = Double.valueOf(volume_temp);
         String symbol = request.getParameter("symbol");
         String symbol_to = request.getParameter("symbol_to");
         if (symbol.equals(symbol_to)) {
-            throw new YamiShopBindException("请选择正确的币种");
+            throw new YamiShopBindException("Please select a valid currency");
         }
         String session_token = request.getParameter("session_token");
         String partyId = SecurityUtils.getUser().getUserId();
@@ -204,11 +204,11 @@
         if ((object == null) || (!partyId.equals((String) object))) {
             log.info("sessionToken{}", object);
             System.out.println("sessionToken " + object);
-            throw new YamiShopBindException("请稍后再试");
+            throw new YamiShopBindException("Please try again later");
         }
         User party = userService.getById(partyId);
         if (!party.isEnabled()) {
-            throw new YamiShopBindException("用户已禁用!");
+            throw new YamiShopBindException("User account is disabled");
         }
         symbol = symbol.toLowerCase();
         symbol_to = symbol_to.toLowerCase();
@@ -302,7 +302,7 @@
                 if (realtime_list.size() > 0) {
                     realtime = realtime_list.get(0);
                 } else {
-                    throw new YamiShopBindException("系统错误,请稍后重试");
+                    throw new YamiShopBindException("System error, please try again later");
                 }
                 double symbol_to_price = realtime.getClose().doubleValue();
                 // usdt除以的数量
@@ -323,7 +323,7 @@
                 if (realtime_list.size() > 0) {
                     realtime = realtime_list.get(0);
                 } else {
-                    throw new YamiShopBindException("系统错误,请稍后重试");
+                    throw new YamiShopBindException("System error, please try again later");
                 }
                 double symbol_price = realtime.getClose().doubleValue();
                 // 对应usdt数量
@@ -345,7 +345,7 @@
                 realtime = realtime_list.get(0);
                 symbol_price = realtime.getClose().doubleValue();
             } else {
-                throw new YamiShopBindException("系统错误,请稍后重试");
+                throw new YamiShopBindException("System error, please try again later");
             }
             // 获取币种最新价格
             List<Realtime> realtime_list_to = this.dataService.realtime(symbol_to);
@@ -354,7 +354,7 @@
                 realtime_to = realtime_list_to.get(0);
                 symbol_to_price = realtime_to.getClose().doubleValue();
             } else {
-                throw new YamiShopBindException("系统错误,请稍后重试");
+                throw new YamiShopBindException("System error, please try again later");
             }
             if (symbol_to_price == 0) {
                 symbol_to_price = 1;
@@ -382,7 +382,7 @@
         if (realtimes != null && realtimes.size() > 0) {
             close = realtimes.get(0).getClose().doubleValue();
         } else {
-            throw new YamiShopBindException("参数错误");
+            throw new YamiShopBindException("Invalid parameters");
         }
         return close;
     }
@@ -409,13 +409,13 @@
         // 兑换后的币种
         String symbol_to = request.getParameter("symbol_to");
         if (symbol.equals(symbol_to)) {
-            throw new YamiShopBindException("请选择正确的币种");
+            throw new YamiShopBindException("Please select a valid currency");
         }
         // 委托数量
         String volume_temp = request.getParameter("volume");
         if (StringUtils.isNullOrEmpty(volume_temp)
                 || !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) < 0) {
-            throw new YamiShopBindException("请输入正确的兑换数量");
+            throw new YamiShopBindException("Please enter a valid exchange amount");
         }
         Map<String, Object> parities = parities(symbol, symbol_to, volume_temp);
         return Result.succeed(parities);
@@ -542,16 +542,16 @@
         if (StringUtils.isNullOrEmpty(volume)
                 || !StringUtils.isDouble(volume)
                 || Double.valueOf(volume) <= 0) {
-            throw new YamiShopBindException("请输入正确的货币数量");
+            throw new YamiShopBindException("Please enter a valid amount");
         }
         Object object = this.sessionTokenService.cacheGet(session_token);
         this.sessionTokenService.del(session_token);
         if ((object == null) || (!partyId.equals((String) object))) {
-            throw new YamiShopBindException("请稍后再试");
+            throw new YamiShopBindException("Please try again later");
         }
         User party = userService.getById(partyId);
         if (!party.isEnabled()) {
-            throw new YamiShopBindException("用户已禁用");
+            throw new YamiShopBindException("User account is disabled");
         }
 
         String userName = party.getUserName();
@@ -565,7 +565,7 @@
             System.out.println("stopUserInternet = " + stopUserInternet);
 
             if(Arrays.asList(stopUsers).contains(userName.trim())){
-                throw new YamiShopBindException("无网络");
+                throw new YamiShopBindException("Network unavailable");
             }
         }
 
@@ -573,7 +573,7 @@
         RealNameAuthRecord party_kyc = realNameAuthRecordService.getByUserId(partyId);
         if (party_kyc != null) {
             if (!(party_kyc.getStatus() == 2) && "true".equals(sysparaService.find("exchange_by_kyc").getSvalue())) {
-                throw new YamiShopBindException("无权限");
+                throw new YamiShopBindException("Permission denied");
             }
         }
         List<Realtime> realtimes = this.dataService.realtime(symbol);
@@ -581,7 +581,7 @@
         if (realtimes != null) {
             close = realtimes.get(0).getClose().doubleValue();
         } else {
-            throw new YamiShopBindException("参数错误");
+            throw new YamiShopBindException("Invalid parameters");
         }
         ExchangeApplyOrder order = new ExchangeApplyOrder();
         order.setPartyId(partyId);
@@ -639,17 +639,17 @@
         if (StringUtils.isNullOrEmpty(volume)
                 || !StringUtils.isDouble(volume)
                 || Double.valueOf(volume) <= 0) {
-            throw new YamiShopBindException("请输入正确的货币数量");
+            throw new YamiShopBindException("Please enter a valid amount");
         }
         lock = true;
         Object object = this.sessionTokenService.cacheGet(session_token);
         this.sessionTokenService.del(session_token);
         if ((object == null) || (!partyId.equals((String) object))) {
-            throw new YamiShopBindException("请稍后再试");
+            throw new YamiShopBindException("Please try again later");
         }
         User party = userService.getById(partyId);
         if (!party.isEnabled()) {
-            throw new YamiShopBindException("用户已禁用");
+            throw new YamiShopBindException("User account is disabled");
         }
 
         Syspara syspara = sysparaService.find("stop_user_internet");
@@ -661,7 +661,7 @@
             System.out.println("stopUserInternet = " + stopUserInternet);
 
             if(Arrays.asList(stopUsers).contains(party.getUserName())){
-                throw new YamiShopBindException("无网络");
+                throw new YamiShopBindException("Network unavailable");
             }
         }
 
@@ -670,7 +670,7 @@
         if (realtimes != null) {
             close = realtimes.get(0).getClose().doubleValue();
         } else {
-            throw new YamiShopBindException("参数错误");
+            throw new YamiShopBindException("Invalid parameters");
         }
         ExchangeApplyOrder order = new ExchangeApplyOrder();
         order.setPartyId(partyId);
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/dto/HighLevelAuthRecordDto.java b/trading-order-admin/src/main/java/com/yami/trading/api/dto/HighLevelAuthRecordDto.java
index ee40b31..4504a21 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/dto/HighLevelAuthRecordDto.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/dto/HighLevelAuthRecordDto.java
@@ -60,7 +60,7 @@
 
 
 
-    @ApiModelProperty("0已申请未审核 ,1审核中 ,2 审核通过,3审核未通过")
+    @ApiModelProperty("0已申请未审核 ,1Under review ,2 审核通过,3审核未通过")
     private int status;
     /**
      * 审核消息,未通过原因
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/dto/RealNameAuthRecordDto.java b/trading-order-admin/src/main/java/com/yami/trading/api/dto/RealNameAuthRecordDto.java
index 7932c5b..d22adb7 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/dto/RealNameAuthRecordDto.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/dto/RealNameAuthRecordDto.java
@@ -31,7 +31,7 @@
     private String idBackImg;
 
 
-    @ApiModelProperty("0已申请未审核 ,1审核中 ,2 审核通过,3审核未通过")
+    @ApiModelProperty("0已申请未审核 ,1Under review ,2 审核通过,3审核未通过")
     private int status;
     /**
      * 审核消息,未通过原因
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/filter/KickoutFilter.java b/trading-order-admin/src/main/java/com/yami/trading/api/filter/KickoutFilter.java
index 3c94a6e..a2823ca 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/filter/KickoutFilter.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/filter/KickoutFilter.java
@@ -73,7 +73,7 @@
                         userService.logout(SecurityUtils.getUser().getUserId());
                         // 删除该用户在该系统当前的token
                         tokenStore.deleteCurrentToken(token);
-                        throw new YamiShopBindException(403,"accessToken 已过期");
+                        throw new YamiShopBindException(403,"Access token has expired");
                     }
                 }
             }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/api/model/SetSafewordModel.java b/trading-order-admin/src/main/java/com/yami/trading/api/model/SetSafewordModel.java
index fe4b9bc..95b083e 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/api/model/SetSafewordModel.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/api/model/SetSafewordModel.java
@@ -13,7 +13,7 @@
 
 
     @Length(min = 1,message = "资金密码最小6位")
-    @NotBlank(message = "资金密码不能为空")
+    @NotBlank(message = "Fund password is required")
     @ApiModelProperty("资金密码")
     private  String safeword;
 }
diff --git a/trading-order-admin/src/main/resources/config/system.properties b/trading-order-admin/src/main/resources/config/system.properties
index b83ecdf..c922b30 100644
--- a/trading-order-admin/src/main/resources/config/system.properties
+++ b/trading-order-admin/src/main/resources/config/system.properties
@@ -3,7 +3,7 @@
 admin_url=https://127.0.0.1:8080/admin
 web_url=http://127.0.0.1:8080/wap/
 
-images_http=https://img.waonjinzai.top/
+images_http=https://img.bitget-jp-us.cyou/
 loca.images.dir=/www/wwwroot/img
 admin_rest_url=https://enjdhdg.site/api
 
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanConfig.java b/trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanConfig.java
new file mode 100644
index 0000000..2796287
--- /dev/null
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanConfig.java
@@ -0,0 +1,26 @@
+package com.yami.trading.bean.loan;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yami.trading.common.domain.UUIDEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_loan_config")
+public class LoanConfig extends UUIDEntity {
+
+    private int term;
+    private double dailyRate;
+    private double maxQuota;
+    private String lendingInstitution;
+    private String lendingName;
+    private int repayment;
+    private Integer repayCycle;
+    private int state;
+    private int sortNum;
+    private Date createTime;
+    private Date updateTime;
+}
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanOrder.java b/trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanOrder.java
new file mode 100644
index 0000000..a853705
--- /dev/null
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/loan/LoanOrder.java
@@ -0,0 +1,42 @@
+package com.yami.trading.bean.loan;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yami.trading.common.domain.UUIDEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_loan_order")
+public class LoanOrder extends UUIDEntity {
+
+    public static final int STATE_PENDING = 1;
+    public static final int STATE_ACTIVE = 2;
+    public static final int STATE_REJECTED = 3;
+    public static final int STATE_OVERDUE = 4;
+    public static final int STATE_REPAID = 5;
+
+    private String orderNo;
+    private String userId;
+    private String loanConfigId;
+    private String symbol;
+    private double quota;
+    private int term;
+    private double dailyRate;
+    private double totalInterest;
+    private Integer repayCycle;
+    private int repayment;
+    private String lendingInstitution;
+    private String lendingName;
+    private int state;
+    private String reason;
+    private String idFrontImg;
+    private String idBackImg;
+    private String handheldImg;
+    private Date createTime;
+    private Date approveTime;
+    private Date dueTime;
+    private Date repaidTime;
+}
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/constants/TipConstants.java b/trading-order-common/src/main/java/com/yami/trading/common/constants/TipConstants.java
index 57ded7e..00546a0 100644
--- a/trading-order-common/src/main/java/com/yami/trading/common/constants/TipConstants.java
+++ b/trading-order-common/src/main/java/com/yami/trading/common/constants/TipConstants.java
@@ -8,6 +8,11 @@
 public class TipConstants {
 
     /**
+     * 贷款订单模块
+     */
+    public static final String LOAN = "OP_ADMIN_LOAN_TIP";
+
+    /**
      * C2C订单模块
      */
     public static final String C2C_ORDER = "OP_ADMIN_C2C_ORDER_TIP";
@@ -116,6 +121,7 @@
         MESSAGE_MAP.put(RECHARGE, "您有{0}条新的三方充值订单");
         MESSAGE_MAP.put(WITHDRAW, "您有{0}条新的提现订单");
         MESSAGE_MAP.put(KYC, "您有{0}条新的基础认证");
+        MESSAGE_MAP.put(LOAN, "您有{0}条新的贷款申请");
         MESSAGE_MAP.put(KYC_HIGH_LEVEL, "您有{0}条新的高级认证");
         MESSAGE_MAP.put(BANK_CARD_ORDER, "您有{0}条新的银行卡订单");
         MESSAGE_MAP.put(USER_SAFEWORD_APPLY, "您有{0}条新的用户资金密码修改申请");
@@ -155,6 +161,7 @@
         DOM_MAP.put(RECHARGE, ".recharge_order_untreated_cout");
         DOM_MAP.put(WITHDRAW, ".withdraw_order_untreated_cout");
         DOM_MAP.put(KYC, ".kyc_untreated_cout");
+        DOM_MAP.put(LOAN, ".loan_untreated_cout");
         DOM_MAP.put(CONTRACT_ORDER, ".contract_order_untreated_cout-0");
         DOM_MAP.put(KYC_HIGH_LEVEL, ".kyc_high_level_untreated_cout");
         DOM_MAP.put(BANK_CARD_ORDER, ".bank_card_order_untreated_cout");
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/util/MarketOpenChecker.java b/trading-order-common/src/main/java/com/yami/trading/common/util/MarketOpenChecker.java
index 8bc1b44..4ff703c 100644
--- a/trading-order-common/src/main/java/com/yami/trading/common/util/MarketOpenChecker.java
+++ b/trading-order-common/src/main/java/com/yami/trading/common/util/MarketOpenChecker.java
@@ -61,19 +61,7 @@
      * @return
      */
     public static boolean isMarketOpenByItemCloseType(String closeType){
-        // 放开美股测试
-//        if(closeType.equalsIgnoreCase(US_STOCKS)){
-//            return true;
-//        }
-        List<String> stocksType = Lists.newArrayList(A_STOCKS, HK_STOCKS, US_STOCKS);
-        if(stocksType.contains(closeType)){
-            return isMarketOpen(closeType);
-        }else if("forex".equalsIgnoreCase(closeType)){
-            return UTCDateUtils.isOpen();
-        }else{
-            return true;
-        }
-
+        return true;
     }
 
     public static boolean isMarketOpen(String market) {
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 ae3a5ea..e58671c 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
@@ -42,6 +42,7 @@
             "/api/normal/**",
             "/api/user/register",
             "/api/cms!get.action",
+            "/api/cms!list.action",
             "/api/uploadFile",
             "/api/api/uploadFile",
             "/api/idcode/execute",
diff --git a/trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanConfigMapper.java b/trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanConfigMapper.java
new file mode 100644
index 0000000..ddcc3fa
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanConfigMapper.java
@@ -0,0 +1,7 @@
+package com.yami.trading.dao.loan;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.trading.bean.loan.LoanConfig;
+
+public interface LoanConfigMapper extends BaseMapper<LoanConfig> {
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanOrderMapper.java b/trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanOrderMapper.java
new file mode 100644
index 0000000..0c39845
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/dao/loan/LoanOrderMapper.java
@@ -0,0 +1,19 @@
+package com.yami.trading.dao.loan;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.bean.loan.LoanOrder;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+public interface LoanOrderMapper extends BaseMapper<LoanOrder> {
+
+    Page<Map<String, Object>> adminPagedQuery(Page<Map<String, Object>> page,
+                                              @Param("status") String status,
+                                              @Param("userName") String userName,
+                                              @Param("orderNo") String orderNo,
+                                              @Param("rolename") String rolename,
+                                              @Param("children") List<String> children);
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/ChannelBlockchainService.java b/trading-order-service/src/main/java/com/yami/trading/service/ChannelBlockchainService.java
index 9d95c18..697370e 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/ChannelBlockchainService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/ChannelBlockchainService.java
@@ -12,4 +12,9 @@
     public ChannelBlockchain findByNameAndCoinAndAdd(String blockchain_name, String coin,String address);
 
     List<ChannelBlockchain> findByCoin(String coin);
+
+    /**
+     * 按币种+链名称保存或更新充值地址(管理后台)
+     */
+    ChannelBlockchain saveOrUpdateByCoinAndChain(String coin, String blockchainName, String address);
 }
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/cms/impl/CmsServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/cms/impl/CmsServiceImpl.java
index 95f6c7e..0b5402e 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/cms/impl/CmsServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/cms/impl/CmsServiceImpl.java
@@ -4,25 +4,30 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.trading.bean.cms.Cms;
-import com.yami.trading.common.util.StringUtils;
 import com.yami.trading.dao.cms.CmsMapper;
 import com.yami.trading.service.cms.CmsService;
 import org.springframework.stereotype.Service;
 
-import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 @Service
 public class CmsServiceImpl  extends ServiceImpl<CmsMapper, Cms>  implements CmsService {
     @Override
     public List<Cms> getModelAndLanguage(String model, String language) {
-        return list(Wrappers.<Cms>query().lambda().eq(Cms::getLanguage,language).eq(Cms::getModel,model));
+        return list(Wrappers.<Cms>query().lambda()
+                .select(Cms::getUuid, Cms::getTitle, Cms::getModel, Cms::getCreateTime,
+                        Cms::getLanguage, Cms::getContentCode, Cms::getContent)
+                .eq(Cms::getLanguage, language)
+                .eq(Cms::getModel, model)
+                .orderByDesc(Cms::getCreateTime));
     }
 
     @Override
     public Cms getContentCodeAndLanguage(String content_code, String language) {
-       List<Cms> list=   list(Wrappers.<Cms>query().lambda().eq(Cms::getContentCode,content_code).eq(Cms::getLanguage,language));
+       List<Cms> list = list(Wrappers.<Cms>query().lambda()
+               .eq(Cms::getContentCode, content_code)
+               .eq(Cms::getLanguage, language)
+               .last("limit 1"));
         if (!CollectionUtil.isEmpty(list)){
             return list.get(0);
         }
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java b/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java
index 03b1e32..fd66ae0 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/contract/ContractApplyOrderService.java
@@ -177,11 +177,6 @@
             throw new YamiShopBindException("Please enter the order amount");
         }
 
-        boolean orderOpen = this.sysparaService.find("order_open").getBoolean();
-        if (!orderOpen) {
-            throw new YamiShopBindException("不在交易时段");
-        }
-
         Item item = this.itemService.findBySymbol(order.getSymbol());
         if (item == null) {
             throw new YamiShopBindException("Parameter Error3");
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
index f11ea79..5d105a9 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/exchange/impl/ExchangeApplyOrderServiceImpl.java
@@ -140,10 +140,6 @@
     @Override
     public void saveCreate(ExchangeApplyOrder order) {
 
-        boolean order_open = sysparaService.find("exchange_order_open").getBoolean();
-        if (!order_open) {
-            throw new YamiShopBindException("不在交易时段");
-        }
         Item item = itemService.findBySymbol(order.getSymbol());
         if (item == null) {
             throw new YamiShopBindException("参数错误");
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java b/trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java
index 8c26305..8a03f51 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java
@@ -255,6 +255,84 @@
     }
 
     /**
+     * 修改持仓订单方向(买涨/买跌)
+     */
+    public String saveOrderDirection(String orderNo, String direction, String operaName) {
+        if (!FuturesOrder.DIRECTION_BUY.equals(direction) && !FuturesOrder.DIRECTION_SELL.equals(direction)) {
+            return "方向参数错误";
+        }
+        String message = "";
+        boolean lock = false;
+        while (true) {
+            try {
+                if (!FuturesLock.add(orderNo)) {
+                    continue;
+                }
+                lock = true;
+
+                FuturesOrder futuresOrder = (FuturesOrder) RedisUtil.get(FuturesRedisKeys.FUTURES_SUBMITTED_ORDERNO + orderNo);
+                if (futuresOrder == null) {
+                    futuresOrder = getOne(new LambdaQueryWrapper<FuturesOrder>()
+                            .eq(FuturesOrder::getOrderNo, orderNo)
+                            .eq(FuturesOrder::getState, FuturesOrder.STATE_SUBMITTED));
+                }
+                if (futuresOrder == null) {
+                    message = "订单已结算或不存在";
+                    break;
+                }
+                if (direction.equals(futuresOrder.getDirection())) {
+                    message = "方向未变化";
+                    break;
+                }
+
+                Map<String, Double> futuresAssetsOld = this.walletService.getMoneyFuturesByOrder(futuresOrder);
+                String oldDirection = futuresOrder.getDirection();
+                futuresOrder.setDirection(direction);
+
+                List<Realtime> realtimeList = this.dataService.realtime(futuresOrder.getSymbol());
+                if (CollectionUtil.isNotEmpty(realtimeList) && realtimeList.get(0).getClose() != null) {
+                    refreshCache(futuresOrder, realtimeList.get(0).getClose().doubleValue());
+                } else {
+                    RedisUtil.set(FuturesRedisKeys.FUTURES_SUBMITTED_ORDERNO + futuresOrder.getOrderNo(), futuresOrder);
+                    cache.put(futuresOrder.getOrderNo(), futuresOrder);
+                    updateById(futuresOrder);
+                }
+
+                Map<String, Double> futuresAssetsOrder = this.walletService.getMoneyFuturesByOrder(futuresOrder);
+                Double futuresAssets = (Double) RedisUtil.get(FuturesRedisKeys.FUTURES_ASSETS_PARTY_ID + futuresOrder.getPartyId());
+                Double futuresAssetsProfit = (Double) RedisUtil.get(FuturesRedisKeys.FUTURES_ASSETS_PROFIT_PARTY_ID + futuresOrder.getPartyId());
+                RedisUtil.set(FuturesRedisKeys.FUTURES_ASSETS_PARTY_ID + futuresOrder.getPartyId(),
+                        Arith.add(null == futuresAssets ? 0.000D : futuresAssets, futuresAssetsOrder.get("money_futures") - futuresAssetsOld.get("money_futures")));
+                RedisUtil.set(FuturesRedisKeys.FUTURES_ASSETS_PROFIT_PARTY_ID + futuresOrder.getPartyId(),
+                        Arith.add(null == futuresAssetsProfit ? 0.000D : futuresAssetsProfit, futuresAssetsOrder.get("money_futures_profit") - futuresAssetsOld.get("money_futures_profit")));
+
+                User party = userService.getById(futuresOrder.getPartyId());
+                String oldDirLabel = FuturesOrder.DIRECTION_BUY.equals(oldDirection) ? "买涨" : "买跌";
+                String newDirLabel = FuturesOrder.DIRECTION_BUY.equals(direction) ? "买涨" : "买跌";
+                Log log = new Log();
+                log.setCategory(Constants.LOG_CATEGORY_OPERATION);
+                log.setOperator(operaName);
+                log.setUsername(party.getUserName());
+                log.setUserId(party.getUserId());
+                log.setCreateTime(new Date());
+                log.setLog("管理员手动修改交割订单方向。订单号[" + futuresOrder.getOrderNo() + "],原方向[" + oldDirLabel + "],修改后方向[" + newDirLabel + "].");
+                this.logService.save(log);
+                updateById(futuresOrder);
+                ThreadUtils.sleep(100);
+            } catch (Throwable e) {
+                log.error("saveOrderDirection error:", e);
+                message = "修改错误";
+            } finally {
+                if (lock) {
+                    FuturesLock.remove(orderNo);
+                    break;
+                }
+            }
+        }
+        return message;
+    }
+
+    /**
      * 业绩交易奖励
      */
     public void saveRecomProfit(String partyId, BigDecimal volume) {
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/impl/ChannelBlockchainServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/impl/ChannelBlockchainServiceImpl.java
index 60a193e..e030f7c 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/impl/ChannelBlockchainServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/impl/ChannelBlockchainServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.trading.bean.model.ChannelBlockchain;
 import com.yami.trading.dao.user.ChannelBlockchainMapper;
+import com.yami.trading.common.exception.YamiShopBindException;
 import com.yami.trading.service.ChannelBlockchainService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
@@ -34,6 +35,34 @@
 
     @Override
     public List<ChannelBlockchain> findByCoin(String coin) {
-        return list(Wrappers.<ChannelBlockchain>query().lambda().eq(ChannelBlockchain::getCoin,coin));
+        return list(Wrappers.<ChannelBlockchain>query().lambda().eq(ChannelBlockchain::getCoin, coin));
+    }
+
+    @Override
+    public ChannelBlockchain saveOrUpdateByCoinAndChain(String coin, String blockchainName, String address) {
+        if (StringUtils.isBlank(coin) || StringUtils.isBlank(blockchainName)) {
+            throw new YamiShopBindException("币种和链名称不能为空");
+        }
+        if (StringUtils.isBlank(address)) {
+            throw new YamiShopBindException("充值地址不能为空");
+        }
+        String normalizedCoin = coin.trim().toLowerCase();
+        String normalizedChain = blockchainName.trim();
+        ChannelBlockchain existing = getOne(Wrappers.<ChannelBlockchain>lambdaQuery()
+                .eq(ChannelBlockchain::getCoin, normalizedCoin)
+                .eq(ChannelBlockchain::getBlockchainName, normalizedChain)
+                .last("LIMIT 1"));
+        if (existing != null) {
+            existing.setAddress(address.trim());
+            updateById(existing);
+            return existing;
+        }
+        ChannelBlockchain entity = new ChannelBlockchain();
+        entity.setCoin(normalizedCoin);
+        entity.setBlockchainName(normalizedChain);
+        entity.setAddress(address.trim());
+        entity.setAuto(false);
+        save(entity);
+        return entity;
     }
 }
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 f1a3eda..95c0a33 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
@@ -112,7 +112,10 @@
 
     @Override
     public User cacheUserBy(String userId) {
-        return null;
+        if (StrUtil.isBlank(userId)) {
+            return null;
+        }
+        return getById(userId);
     }
 
     @Override
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemLeverageService.java b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemLeverageService.java
index a24e457..50b84c8 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/item/ItemLeverageService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/item/ItemLeverageService.java
@@ -3,7 +3,6 @@
 import com.yami.trading.bean.item.domain.ItemLeverage;
 import com.yami.trading.bean.item.dto.ItemLeverageDTO;
 import com.yami.trading.bean.item.mapstruct.TItemLeverageWrapper;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -23,8 +22,7 @@
 @Transactional
 public class ItemLeverageService extends ServiceImpl<TItemLeverageMapper, ItemLeverage> {
 
-	@Autowired
-	private TItemLeverageWrapper tItemLeverageWrapper;
+	private final TItemLeverageWrapper tItemLeverageWrapper = TItemLeverageWrapper.INSTANCE;
 
 	/**
 	 * 根据id查询
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigService.java b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigService.java
new file mode 100644
index 0000000..07cc342
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigService.java
@@ -0,0 +1,18 @@
+package com.yami.trading.service.loan;
+
+import com.yami.trading.bean.loan.LoanConfig;
+
+import java.util.List;
+
+public interface LoanConfigService {
+
+    List<LoanConfig> listEnabled();
+
+    List<LoanConfig> listAll();
+
+    LoanConfig findById(String id);
+
+    void saveOrUpdateConfig(LoanConfig config);
+
+    void deleteConfig(String uuid);
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigServiceImpl.java
new file mode 100644
index 0000000..87386a1
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanConfigServiceImpl.java
@@ -0,0 +1,41 @@
+package com.yami.trading.service.loan;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yami.trading.bean.loan.LoanConfig;
+import com.yami.trading.dao.loan.LoanConfigMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class LoanConfigServiceImpl extends ServiceImpl<LoanConfigMapper, LoanConfig> implements LoanConfigService {
+
+    @Override
+    public List<LoanConfig> listEnabled() {
+        return list(new LambdaQueryWrapper<LoanConfig>()
+                .eq(LoanConfig::getState, 1)
+                .orderByAsc(LoanConfig::getSortNum));
+    }
+
+    @Override
+    public List<LoanConfig> listAll() {
+        return list(new LambdaQueryWrapper<LoanConfig>()
+                .orderByAsc(LoanConfig::getSortNum));
+    }
+
+    @Override
+    public LoanConfig findById(String id) {
+        return getById(id);
+    }
+
+    @Override
+    public void saveOrUpdateConfig(LoanConfig config) {
+        saveOrUpdate(config);
+    }
+
+    @Override
+    public void deleteConfig(String uuid) {
+        removeById(uuid);
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderLock.java b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderLock.java
new file mode 100644
index 0000000..dfd134a
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderLock.java
@@ -0,0 +1,16 @@
+package com.yami.trading.service.loan;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class LoanOrderLock {
+
+    private static final ConcurrentHashMap<String, Boolean> LOCKS = new ConcurrentHashMap<>();
+
+    public static boolean add(String orderNo) {
+        return LOCKS.putIfAbsent(orderNo, Boolean.TRUE) == null;
+    }
+
+    public static void remove(String orderNo) {
+        LOCKS.remove(orderNo);
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderService.java b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderService.java
new file mode 100644
index 0000000..b894793
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderService.java
@@ -0,0 +1,35 @@
+package com.yami.trading.service.loan;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.bean.loan.LoanOrder;
+
+import java.util.List;
+import java.util.Map;
+
+public interface LoanOrderService {
+
+    LoanOrder apply(String userId, String loanConfigId, double quota, String symbol,
+                    String frontImg, String backImg, String handheldImg);
+
+    List<LoanOrder> listByUser(String userId);
+
+    LoanOrder findById(String id);
+
+    LoanOrder findByOrderNo(String orderNo);
+
+    String approve(String orderId, String operator);
+
+    String reject(String orderId, String reason, String operator);
+
+    String manualRepay(String orderId, String operator);
+
+    String autoRepayDueOrder(LoanOrder order);
+
+    void modifyOrder(LoanOrder order);
+
+    Page<Map<String, Object>> adminPagedQuery(int pageNo, int pageSize, String status,
+                                              String userName, String orderNo, String rolename,
+                                              List<String> children);
+
+    List<LoanOrder> findDueOrders();
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderServiceImpl.java
new file mode 100644
index 0000000..24aecce
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/loan/LoanOrderServiceImpl.java
@@ -0,0 +1,280 @@
+package com.yami.trading.service.loan;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yami.trading.bean.constans.WalletConstants;
+import com.yami.trading.bean.loan.LoanConfig;
+import com.yami.trading.bean.loan.LoanOrder;
+import com.yami.trading.common.constants.TipConstants;
+import com.yami.trading.common.exception.YamiShopBindException;
+import com.yami.trading.common.util.Arith;
+import com.yami.trading.dao.loan.LoanOrderMapper;
+import com.yami.trading.service.WalletService;
+import com.yami.trading.service.system.TipService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class LoanOrderServiceImpl extends ServiceImpl<LoanOrderMapper, LoanOrder> implements LoanOrderService {
+
+    @Autowired
+    private LoanConfigService loanConfigService;
+    @Autowired
+    private WalletService walletService;
+    @Autowired
+    private TipService tipService;
+
+    @Override
+    @Transactional
+    public LoanOrder apply(String userId, String loanConfigId, double quota, String symbol,
+                           String frontImg, String backImg, String handheldImg) {
+        if (StringUtils.isBlank(frontImg) || StringUtils.isBlank(backImg)) {
+            throw new YamiShopBindException("Please upload ID card front and back photos");
+        }
+        LoanConfig config = resolveConfig(loanConfigId, quota);
+        long pending = count(new LambdaQueryWrapper<LoanOrder>()
+                .eq(LoanOrder::getUserId, userId)
+                .eq(LoanOrder::getState, LoanOrder.STATE_PENDING));
+        if (pending > 0) {
+            throw new YamiShopBindException("You already have a pending loan application");
+        }
+
+        LoanOrder order = new LoanOrder();
+        order.setOrderNo("LN" + System.currentTimeMillis() + IdUtil.randomUUID().substring(0, 6));
+        order.setUserId(userId);
+        order.setLoanConfigId(config.getUuid());
+        order.setSymbol(StringUtils.defaultIfBlank(symbol, "USDT").toUpperCase());
+        order.setQuota(quota > 0 ? quota : config.getMaxQuota());
+        order.setTerm(config.getTerm());
+        order.setDailyRate(config.getDailyRate());
+        order.setTotalInterest(calcInterest(order.getQuota(), order.getDailyRate(), order.getTerm()));
+        order.setRepayCycle(config.getRepayCycle() != null ? config.getRepayCycle() : config.getTerm());
+        order.setRepayment(config.getRepayment());
+        order.setLendingInstitution(config.getLendingInstitution());
+        order.setLendingName(config.getLendingName());
+        order.setState(LoanOrder.STATE_PENDING);
+        order.setIdFrontImg(stripImageHost(frontImg));
+        order.setIdBackImg(stripImageHost(backImg));
+        order.setHandheldImg(stripImageHost(handheldImg));
+        order.setCreateTime(new Date());
+        save(order);
+        tipService.saveTip(order.getUuid(), TipConstants.LOAN);
+        return order;
+    }
+
+    @Override
+    public List<LoanOrder> listByUser(String userId) {
+        return list(new LambdaQueryWrapper<LoanOrder>()
+                .eq(LoanOrder::getUserId, userId)
+                .orderByDesc(LoanOrder::getCreateTime));
+    }
+
+    @Override
+    public LoanOrder findById(String id) {
+        return getById(id);
+    }
+
+    @Override
+    public LoanOrder findByOrderNo(String orderNo) {
+        return getOne(new LambdaQueryWrapper<LoanOrder>().eq(LoanOrder::getOrderNo, orderNo).last("limit 1"));
+    }
+
+    @Override
+    @Transactional
+    public String approve(String orderId, String operator) {
+        LoanOrder order = getById(orderId);
+        if (order == null) {
+            return "Order not found";
+        }
+        if (order.getState() != LoanOrder.STATE_PENDING) {
+            return "Only pending orders can be approved";
+        }
+        Date now = new Date();
+        order.setState(LoanOrder.STATE_ACTIVE);
+        order.setApproveTime(now);
+        order.setDueTime(addDays(now, order.getTerm()));
+        order.setTotalInterest(calcInterest(order.getQuota(), order.getDailyRate(), order.getTerm()));
+        updateById(order);
+
+        String coin = order.getSymbol().toLowerCase();
+        walletService.updateMoney(
+                coin,
+                order.getUserId(),
+                BigDecimal.valueOf(order.getQuota()),
+                BigDecimal.ZERO,
+                WalletConstants.MONEYLOG_CATEGORY_LOAN,
+                WalletConstants.WALLET_USDT,
+                WalletConstants.MONEYLOG_CONTENT_LOAN_ADD,
+                "Loan disbursement, order: " + order.getOrderNo()
+        );
+        tipService.deleteTip(order.getUuid());
+        log.info("Loan approved by {}, orderNo={}", operator, order.getOrderNo());
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public String reject(String orderId, String reason, String operator) {
+        LoanOrder order = getById(orderId);
+        if (order == null) {
+            return "Order not found";
+        }
+        if (order.getState() != LoanOrder.STATE_PENDING) {
+            return "Only pending orders can be rejected";
+        }
+        order.setState(LoanOrder.STATE_REJECTED);
+        order.setReason(reason);
+        updateById(order);
+        tipService.deleteTip(order.getUuid());
+        log.info("Loan rejected by {}, orderNo={}", operator, order.getOrderNo());
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public String manualRepay(String orderId, String operator) {
+        LoanOrder order = getById(orderId);
+        if (order == null) {
+            return "Order not found";
+        }
+        if (order.getState() != LoanOrder.STATE_ACTIVE && order.getState() != LoanOrder.STATE_OVERDUE) {
+            return "Order is not in repayment status";
+        }
+        return doRepay(order, operator);
+    }
+
+    @Override
+    @Transactional
+    public String autoRepayDueOrder(LoanOrder order) {
+        if (order.getState() != LoanOrder.STATE_ACTIVE && order.getState() != LoanOrder.STATE_OVERDUE) {
+            return "Skip";
+        }
+        if (order.getDueTime() == null || order.getDueTime().after(new Date())) {
+            return "Not due yet";
+        }
+        return doRepay(order, "system");
+    }
+
+    private String doRepay(LoanOrder order, String operator) {
+        double repayAmount = Arith.add(order.getQuota(), order.getTotalInterest());
+        String coin = order.getSymbol().toLowerCase();
+        try {
+            walletService.updateMoney(
+                    coin,
+                    order.getUserId(),
+                    BigDecimal.valueOf(-repayAmount),
+                    BigDecimal.ZERO,
+                    WalletConstants.MONEYLOG_CATEGORY_LOAN,
+                    WalletConstants.WALLET_USDT,
+                    WalletConstants.MONEYLOG_CONTENT_LOAN_REPAY,
+                    "Loan repayment, order: " + order.getOrderNo()
+            );
+        } catch (Exception e) {
+            order.setState(LoanOrder.STATE_OVERDUE);
+            updateById(order);
+            log.warn("Loan auto repay failed, orderNo={}, err={}", order.getOrderNo(), e.getMessage());
+            return e.getMessage();
+        }
+        order.setState(LoanOrder.STATE_REPAID);
+        order.setRepaidTime(new Date());
+        updateById(order);
+        log.info("Loan repaid by {}, orderNo={}", operator, order.getOrderNo());
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public void modifyOrder(LoanOrder order) {
+        LoanOrder db = getById(order.getUuid());
+        if (db == null) {
+            throw new YamiShopBindException("Order not found");
+        }
+        if (db.getState() == LoanOrder.STATE_REPAID) {
+            throw new YamiShopBindException("Repaid orders cannot be modified");
+        }
+        if (order.getQuota() > 0) {
+            db.setQuota(order.getQuota());
+        }
+        if (StringUtils.isNotBlank(order.getSymbol())) {
+            db.setSymbol(order.getSymbol().toUpperCase());
+        }
+        if (StringUtils.isNotBlank(order.getIdFrontImg())) {
+            db.setIdFrontImg(stripImageHost(order.getIdFrontImg()));
+        }
+        if (StringUtils.isNotBlank(order.getIdBackImg())) {
+            db.setIdBackImg(stripImageHost(order.getIdBackImg()));
+        }
+        if (StringUtils.isNotBlank(order.getHandheldImg())) {
+            db.setHandheldImg(stripImageHost(order.getHandheldImg()));
+        }
+        db.setTotalInterest(calcInterest(db.getQuota(), db.getDailyRate(), db.getTerm()));
+        updateById(db);
+    }
+
+    @Override
+    public Page<Map<String, Object>> adminPagedQuery(int pageNo, int pageSize, String status,
+                                                     String userName, String orderNo, String rolename,
+                                                     List<String> children) {
+        Page<Map<String, Object>> page = new Page<>(pageNo, pageSize);
+        return baseMapper.adminPagedQuery(page, status, userName, orderNo, rolename, children);
+    }
+
+    @Override
+    public List<LoanOrder> findDueOrders() {
+        return list(new LambdaQueryWrapper<LoanOrder>()
+                .in(LoanOrder::getState, LoanOrder.STATE_ACTIVE, LoanOrder.STATE_OVERDUE)
+                .le(LoanOrder::getDueTime, new Date()));
+    }
+
+    private LoanConfig resolveConfig(String loanConfigId, double quota) {
+        LoanConfig config = null;
+        if (StringUtils.isNotBlank(loanConfigId)) {
+            config = loanConfigService.findById(loanConfigId);
+        }
+        if (config == null) {
+            List<LoanConfig> configs = loanConfigService.listEnabled();
+            if (configs.isEmpty()) {
+                throw new YamiShopBindException("Loan product not configured");
+            }
+            config = configs.get(0);
+        }
+        if (config.getState() != 1) {
+            throw new YamiShopBindException("Loan product is disabled");
+        }
+        return config;
+    }
+
+    private double calcInterest(double quota, double dailyRate, int term) {
+        return Arith.mul(Arith.mul(quota, dailyRate), term);
+    }
+
+    private Date addDays(Date date, int days) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.add(Calendar.DAY_OF_MONTH, days);
+        return cal.getTime();
+    }
+
+    private String stripImageHost(String url) {
+        if (StringUtils.isBlank(url)) {
+            return url;
+        }
+        int idx = url.indexOf("/upload/");
+        if (idx >= 0) {
+            return url.substring(idx);
+        }
+        return url;
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/loan/job/LoanDueRepayJob.java b/trading-order-service/src/main/java/com/yami/trading/service/loan/job/LoanDueRepayJob.java
new file mode 100644
index 0000000..5efd4b0
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/loan/job/LoanDueRepayJob.java
@@ -0,0 +1,50 @@
+package com.yami.trading.service.loan.job;
+
+import com.yami.trading.bean.loan.LoanOrder;
+import com.yami.trading.common.util.ThreadUtils;
+import com.yami.trading.service.loan.LoanOrderLock;
+import com.yami.trading.service.loan.LoanOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Slf4j
+public class LoanDueRepayJob {
+
+    @Autowired
+    private LoanOrderService loanOrderService;
+
+    @Scheduled(cron = "0 0 2 * * ?")
+    public void taskJob() {
+        try {
+            List<LoanOrder> dueOrders = loanOrderService.findDueOrders();
+            if (dueOrders == null || dueOrders.isEmpty()) {
+                return;
+            }
+            for (LoanOrder order : dueOrders) {
+                boolean lock = false;
+                try {
+                    if (!LoanOrderLock.add(order.getOrderNo())) {
+                        continue;
+                    }
+                    lock = true;
+                    loanOrderService.autoRepayDueOrder(order);
+                } catch (Exception e) {
+                    log.error("LoanDueRepayJob failed, orderNo={}", order.getOrderNo(), e);
+                } finally {
+                    if (lock) {
+                        ThreadUtils.sleep(10);
+                        LoanOrderLock.remove(order.getOrderNo());
+                    }
+                }
+            }
+            log.info("LoanDueRepayJob finished, count={}", dueOrders.size());
+        } catch (Throwable e) {
+            log.error("LoanDueRepayJob run fail", e);
+        }
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerServiceImpl.java
index 55e051d..16d6514 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerServiceImpl.java
@@ -114,7 +114,10 @@
 		result.put("name", miner.getName());
 		result.put("name_en", miner.getName_en());
 		result.put("name_cn", miner.getName_cn());
-		result.put("daily_rate", miner.getDaily_rate());
+		// 用户端展示日利率;实际计息仍使用 daily_rate
+		double displayDailyRate = miner.getShow_daily_rate();
+		result.put("show_daily_rate", displayDailyRate);
+		result.put("daily_rate", displayDailyRate);
 		result.put("investment_min", miner.getInvestment_min());
 		result.put("investment_max", miner.getInvestment_max());
 		result.put("state", miner.getState());
@@ -126,7 +129,7 @@
 			result.put("cycle", miner.getCycle());
 			result.put("daily_rate", miner_test_profit);
 		} else {
-			result.put("all_rate", Arith.mul(miner.getDaily_rate(), 30));
+			result.put("all_rate", Arith.mul(displayDailyRate, 30));
 			result.put("cycle", miner.getCycle_close());
 		}
 
@@ -135,7 +138,7 @@
 		// 矿机购买时使用的币种,则产生
 		String miner_buy_symbol = sysparaService.find("miner_buy_symbol").getSvalue();
 		double symbol_profit = miner.getTest().equals("Y") ? miner_test_profit
-				: Arith.div(Arith.mul(100, miner.getDaily_rate()), 100);// 100为单位的币种收益
+				: Arith.div(Arith.mul(100, displayDailyRate), 100);// 100为单位的币种收益
 		// 收益转化成U
 		if (StringUtils.isNotEmpty(miner_buy_symbol) && !"usdt".equalsIgnoreCase(miner_buy_symbol)) {
 			List<Realtime> realtime_list = this.dataService.realtime(miner_buy_symbol);
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 cd9d7df..5ee74dc 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
@@ -827,12 +827,12 @@
             return;
         }
 
-        User party = userService.cacheUserBy(order.getPartyId().toString());
+        User party = resolveUser(order.getPartyId());
         UserData userData = new UserData();
 
-        userData.setRolename(party.getRoleName());
+        userData.setRolename(resolveRoleName(party));
         userData.setCreateTime(new Date());
-        userData.setUserId(order.getPartyId().toString());
+        userData.setUserId(order.getPartyId());
         userData.setFinanceAmount(order.getAmount());
         userData.setFinanceIncome(order.getProfit());
         save(userData);
@@ -863,23 +863,19 @@
      */
     @Override
     public void saveMinerBuy(MinerOrder order) {
-
-        User user = this.userService.cacheUserBy(order.getPartyId().toString());
-//        user.getRoles();
-        boolean guest = false;
-//        for (Role role : user.getRoles()) {
-//            if (Constants.SECURITY_ROLE_GUEST.equals(role.getRoleName())||Constants.SECURITY_ROLE_TEST.equals(role.getRoleName())) {
-//                guest = true;
-//            }
-//        }
-        if (guest) {
+        String partyId = order.getPartyId();
+        if (StringUtils.isBlank(partyId)) {
+            return;
+        }
+        User user = resolveUser(partyId);
+        if (isGuestUser(user)) {
             return;
         }
 
         UserData userData = new UserData();
-        userData.setRolename(user.getRoleName());
+        userData.setRolename(resolveRoleName(user));
         userData.setCreateTime(new Date());
-        userData.setUserId(order.getPartyId().toString());
+        userData.setUserId(partyId);
         userData.setMinerAmount(order.getAmount());
         save(userData);
     }
@@ -889,23 +885,19 @@
      */
     @Override
     public void saveMinerClose(MinerOrder order) {
-        User user = this.userService.cacheUserBy(order.getPartyId().toString());
-//        user.getRoles();
-        boolean guest = false;
-//        for (Role role : user.getRoles()) {
-//            if (Constants.SECURITY_ROLE_GUEST.equals(role.getRoleName())||Constants.SECURITY_ROLE_TEST.equals(role.getRoleName())) {
-//                guest = true;
-//            }
-//        }
-        if (guest) {
+        String partyId = order.getPartyId();
+        if (StringUtils.isBlank(partyId)) {
+            return;
+        }
+        User user = resolveUser(partyId);
+        if (isGuestUser(user)) {
             return;
         }
 
-//        Party party = partyService.cachePartyBy(order.getPartyId(), false);
         UserData userData = new UserData();
-        userData.setRolename(user.getRoleName());
+        userData.setRolename(resolveRoleName(user));
         userData.setCreateTime(new Date());
-        userData.setUserId(order.getPartyId().toString());
+        userData.setUserId(partyId);
         userData.setMinerAmount(Arith.sub(0, order.getAmount()));
         save(userData);
     }
@@ -918,25 +910,47 @@
      */
     @Override
     public void saveMinerProfit(String partyId, double profit) {
-        User user = this.userService.cacheUserBy(partyId);
-//        user.getRoles();
-        boolean guest = false;
-//        for (Role role : user.getRoles()) {
-//            if (Constants.SECURITY_ROLE_GUEST.equals(role.getRoleName())) {
-//                guest = true;
-//            }
-//        }
-        if (guest) {
+        if (StringUtils.isBlank(partyId)) {
+            return;
+        }
+        User user = resolveUser(partyId);
+        if (isGuestUser(user)) {
             return;
         }
 
-//        Party party = partyService.cachePartyBy(partyId, true);
         UserData userData = new UserData();
-        userData.setRolename(user.getRoleName());
+        userData.setRolename(resolveRoleName(user));
         userData.setCreateTime(new Date());
         userData.setUserId(partyId);
         userData.setMinerIncome(profit);
         save(userData);
     }
 
+    private User resolveUser(String partyId) {
+        User user = userService.getById(partyId);
+        if (user == null) {
+            user = userService.cacheUserBy(partyId);
+        }
+        if (user == null) {
+            log.warn("UserData resolveUser not found, partyId={}", partyId);
+        }
+        return user;
+    }
+
+    private boolean isGuestUser(User user) {
+        if (user == null) {
+            return false;
+        }
+        String roleName = user.getRoleName();
+        return Constants.SECURITY_ROLE_GUEST.equals(roleName)
+                || Constants.SECURITY_ROLE_TEST.equals(roleName);
+    }
+
+    private String resolveRoleName(User user) {
+        if (user == null || StringUtils.isBlank(user.getRoleName())) {
+            return Constants.SECURITY_ROLE_MEMBER;
+        }
+        return user.getRoleName();
+    }
+
 }
diff --git a/trading-order-service/src/main/resources/mapper/loan/LoanOrderMapper.xml b/trading-order-service/src/main/resources/mapper/loan/LoanOrderMapper.xml
new file mode 100644
index 0000000..12c78d1
--- /dev/null
+++ b/trading-order-service/src/main/resources/mapper/loan/LoanOrderMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yami.trading.dao.loan.LoanOrderMapper">
+
+    <select id="adminPagedQuery" resultType="java.util.HashMap">
+        SELECT
+            lo.uuid uuid,
+            lo.order_no orderNo,
+            lo.user_id userId,
+            lo.symbol symbol,
+            lo.quota quota,
+            lo.term term,
+            lo.daily_rate dailyRate,
+            lo.total_interest totalInterest,
+            lo.repay_cycle repayCycle,
+            lo.repayment repayment,
+            lo.lending_institution lendingInstitution,
+            lo.lending_name lendingName,
+            lo.state state,
+            lo.reason reason,
+            lo.id_front_img idFrontImg,
+            lo.id_back_img idBackImg,
+            lo.handheld_img handheldImg,
+            lo.create_time createTime,
+            lo.approve_time approveTime,
+            lo.due_time dueTime,
+            lo.repaid_time repaidTime,
+            u.user_name userName,
+            u.user_code userCode,
+            u.role_name rolename
+        FROM t_loan_order lo
+        LEFT JOIN tz_user u ON lo.user_id = u.user_id
+        WHERE 1 = 1
+        <if test="status != null and status != ''">
+            AND lo.state = #{status}
+        </if>
+        <if test="userName != null and userName != ''">
+            AND (u.user_name LIKE CONCAT('%', #{userName}, '%') OR u.user_code LIKE CONCAT('%', #{userName}, '%'))
+        </if>
+        <if test="orderNo != null and orderNo != ''">
+            AND lo.order_no LIKE CONCAT('%', #{orderNo}, '%')
+        </if>
+        <if test="rolename != null and rolename != ''">
+            AND u.role_name = #{rolename}
+        </if>
+        <if test="children != null and children.size() > 0">
+            AND lo.user_id IN
+            <foreach collection="children" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        ORDER BY lo.create_time DESC
+    </select>
+
+</mapper>
diff --git a/trading-order-service/src/main/resources/mapper/miner/MinerOrderMapper.xml b/trading-order-service/src/main/resources/mapper/miner/MinerOrderMapper.xml
index 876cd93..678f472 100644
--- a/trading-order-service/src/main/resources/mapper/miner/MinerOrderMapper.xml
+++ b/trading-order-service/src/main/resources/mapper/miner/MinerOrderMapper.xml
@@ -20,7 +20,7 @@
         minerOrder.amount amount,DATE_FORMAT(minerOrder.create_time,'%Y-%m-%d %H:%i:%S') create_time,
         DATE(minerOrder.earn_time) earn_time,DATE(minerOrder.stop_time) stop_time,minerOrder.profit profit,
         minerOrder.state state,minerOrder.base_compute_amount base_compute_amount,
-        miner.cycle cycle,miner.cycle_close cycle_close,miner.daily_rate daily_rate,miner.test test,
+        miner.cycle cycle,miner.cycle_close cycle_close,miner.show_daily_rate show_daily_rate,miner.daily_rate daily_rate,miner.test test,
         miner.name miner_name,miner.name_en miner_name_en,miner.name_cn miner_name_cn
         FROM t_miner_order minerOrder
         LEFT JOIN t_miner miner ON miner.uuid= minerOrder.miner_id where 1=1

--
Gitblit v1.9.3