From dc6abd25de0fc12e7a9de54f628f970c8fdc5910 Mon Sep 17 00:00:00 2001
From: zyy <zyy@email.com>
Date: Fri, 22 May 2026 16:57:16 +0800
Subject: [PATCH] 理财

---
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderController.java             |  584 ++++++++
 trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerServiceImpl.java               |    4 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceServiceImpl.java      |   23 
 trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomJob.java            |   48 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceController.java                  |  250 ++-
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/AdminMinerService.java                  |    8 
 trading-order-service/src/main/java/com/yami/trading/service/finance/loadcache/FinanceLoadCacheService.java         |   45 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceService.java               |   15 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceServiceImpl.java           |  123 +
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceOrderController.java        |  341 +++++
 trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderProfitServiceImpl.java    |   12 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderLock.java                  |   22 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderService.java               |   67 +
 trading-order-service/src/main/resources/mapper/finance/FinanceMapper.xml                                           |   20 
 trading-order-bean/src/main/java/com/yami/trading/bean/finance/Finance.java                                         |   39 
 trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrder1DayJob.java                   |  135 ++
 trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomServiceImpl.java    |  165 ++
 trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomService.java        |    8 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceOrderService.java          |   17 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceController.java             |  460 +++++++
 trading-order-service/src/main/java/com/yami/trading/service/user/impl/UserDataServiceImpl.java                     |  133 ++
 trading-order-admin/src/main/java/com/yami/trading/admin/dao/MinerMapper.java                                       |    8 
 trading-order-bean/src/main/java/com/yami/trading/bean/finance/FinanceOrder.java                                    |   82 
 trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java                                 |   28 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderLock.java                   |   22 
 /dev/null                                                                                                           |   19 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerService.java                       |    3 
 trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderServiceImpl.java          |    8 
 trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceOrderMapper.java                            |   26 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceOrderServiceImpl.java |   80 +
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceRedisKeys.java                  |   12 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/AdminMinerServiceImpl.java         |    3 
 trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/MinerServiceImpl.java              |    2 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceService.java                    |   28 
 trading-order-service/src/main/resources/mapper/finance/FinanceOrderMapper.xml                                      |  100 +
 trading-order-service/src/main/java/com/yami/trading/service/user/UserDataService.java                              |   27 
 trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceMapper.java                                 |   11 
 trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceOrderServiceImpl.java      |  873 +++++++++++++
 38 files changed, 3,645 insertions(+), 206 deletions(-)

diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceController.java
new file mode 100644
index 0000000..a09497a
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceController.java
@@ -0,0 +1,460 @@
+package com.yami.trading.admin.controller.finance;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.bean.model.Log;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.domain.Result;
+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.AwsS3OSSFileService;
+import com.yami.trading.service.finance.service.AdminFinanceService;
+import com.yami.trading.service.finance.service.FinanceService;
+import com.yami.trading.service.system.LogService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+/**
+ * 理财配置
+ */
+@RestController
+@CrossOrigin
+public class AdminFinanceController {
+	
+	private Logger logger = LogManager.getLogger(AdminFinanceController.class);
+//	@Autowired
+//	private UserService userService;
+	@Autowired
+	protected AdminFinanceService adminFinanceService;
+	@Autowired
+	protected FinanceService financeService;
+//	@Autowired
+//	protected PartyService partyService;
+	@Autowired
+	protected LogService logService;
+//	@Autowired
+//	protected SecUserService secUserService;
+	@Autowired
+	protected PasswordEncoder passwordEncoder;
+
+	@Autowired
+	AwsS3OSSFileService awsS3OSSFileService;
+	
+	private final String action = "/normal/adminFinanceAction!";
+
+	/**
+	 * 获取 理财配置 列表
+	 */
+	@RequestMapping(action + "list.action")
+	public Result list(HttpServletRequest request) {
+
+//		ResultObject resultObject = new ResultObject();
+//		resultObject = this.readSecurityContextFromSession(resultObject);
+//		if (!"0".equals(resultObject.getCode())) {
+//			return resultObject;
+//		}
+
+
+		System.out.println("current = " + request.getParameter("current"));
+//		request.get
+
+		int pageNo = Integer.parseInt(request.getParameter("current"));
+		int pageSize = Integer.parseInt(request.getParameter("size"));
+		String message = request.getParameter("message");
+		String error = request.getParameter("error");
+		String name_para = request.getParameter("name_para");
+
+
+		Page page = this.adminFinanceService.pagedQuery(pageNo, pageSize, name_para);
+
+
+
+//		modelAndView.addObject("pageNo", pageNo);
+//		modelAndView.addObject("pageSize", pageSize);
+//		modelAndView.addObject("page", page);
+//		modelAndView.addObject("message", message);
+//		modelAndView.addObject("error", error);
+//		modelAndView.addObject("name_para", name_para);
+		return Result.ok(page);
+	}
+
+	/**
+	 * 新增 理财配置 页面adminLogin
+	 */
+	@RequestMapping(action + "toAdd.action")
+	public ModelAndView toAdd() {
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("finance_add");
+		return modelAndView;
+	}
+
+	/**
+	 * 新增 理财配置
+	 */
+	@RequestMapping(action + "add.action")
+	public Result add(HttpServletRequest request) {
+		// 产品名称
+		String name = request.getParameter("name");
+		// 产品图片
+		String img = request.getParameter("img");
+		// 周期
+		String cycle = request.getParameter("cycle");
+		// 日利率
+		String daily_rate = request.getParameter("daily_rate");
+		String daily_rate_max = request.getParameter("daily_rate_max");
+		// 今日利率
+		String today_rate = request.getParameter("today_rate");
+		// 违约结算比例
+		String default_ratio = request.getParameter("default_ratio");
+		// 投资金额区间min
+		String investment_min = request.getParameter("investment_min");
+		// 投资金额区间max
+		String investment_max = request.getParameter("investment_max");
+		// 资金密码
+		String login_safeword = request.getParameter("login_safeword");
+		String name_en = request.getParameter("name_en");
+		String name_cn = request.getParameter("name_cn");
+		String name_kn = request.getParameter("name_kn");
+		String name_jn = request.getParameter("name_jn");
+		String state = request.getParameter("state");
+		
+//		ModelAndView model = new ModelAndView();
+//		model.addObject("name", name);
+//		model.addObject("img", img);
+//		model.addObject("cycle", cycle);
+//		model.addObject("daily_rate", daily_rate);
+//		model.addObject("daily_rate_max", daily_rate_max);
+//		model.addObject("today_rate", today_rate);
+//		model.addObject("default_ratio", default_ratio);
+//		model.addObject("investment_min", investment_min);
+//		model.addObject("investment_max", investment_max);
+//		model.addObject("name_en", name_en);
+//		model.addObject("name_cn", name_cn);
+//		model.addObject("name_kn", name_kn);
+//		model.addObject("name_jn", name_jn);
+//		model.addObject("state", state);
+
+		Finance finance = new Finance();
+		try {
+
+			String error = this.verification(name, img, cycle, daily_rate, daily_rate_max, today_rate, 
+					default_ratio, investment_min, investment_max, login_safeword);
+			if (!StringUtils.isNullOrEmpty(error)) {
+				throw new BusinessException(error);
+			}
+			
+
+			finance.setName(name);
+			finance.setNameEn(name_en);
+			finance.setNameCn(name_cn);
+			finance.setNameKn(name_kn);
+			finance.setNameJn(name_jn);
+			if(img.startsWith("http")){
+				finance.setImg(img);
+			}else{
+				finance.setImg(Constants.IMAGES_HTTP+img);
+			}
+			finance.setCycle(Integer.valueOf(cycle));
+			finance.setDailyRate(Double.valueOf(daily_rate));
+			finance.setDailyRateMax(Double.valueOf(daily_rate_max));
+			finance.setTodayRate(Double.valueOf(today_rate));
+			finance.setDefaultRatio(Double.valueOf(default_ratio));
+			finance.setInvestmentMin(Double.valueOf(investment_min));
+			finance.setInvestmentMax(Double.valueOf(investment_max));
+			finance.setState(state);
+
+			this.financeService.save(finance, login_safeword, SecurityUtils.getSysUser().getUsername());
+			
+			Log log = new Log();
+			log.setCategory(Constants.LOG_CATEGORY_OPERATION);
+			log.setUsername(SecurityUtils.getSysUser().getUsername());
+			log.setOperator(SecurityUtils.getSysUser().getUsername());
+			log.setLog("手动添加理财配置,ip:["+this.getIp()+"]");
+			logService.save(log);
+			
+		} catch (BusinessException e) {
+
+			return Result.failed(1, e.getMessage());
+		} catch (Throwable t) {
+			logger.error("UserAction.register error ", t);
+			return Result.failed(1, t.getMessage());
+		}
+		
+//		model.addObject("message", "操作成功");
+//		model.setViewName("redirect:/" + action + "list.action");
+
+		return Result.ok(finance);
+	}
+	
+	/**
+	 * 修改 理财配置 页面
+	 */
+	@RequestMapping(action + "toUpdate.action")
+	public ModelAndView toUpdate(HttpServletRequest request) {
+		String id = request.getParameter("id");
+
+		ModelAndView modelAndView = new ModelAndView();
+		
+		try {
+		
+			Finance finance = this.financeService.findById(id);
+
+			modelAndView.addObject("id", id);
+			modelAndView.addObject("name", finance.getName());
+			modelAndView.addObject("img", finance.getImg());
+			modelAndView.addObject("cycle", finance.getCycle());
+			modelAndView.addObject("daily_rate", finance.getDailyRate());
+			modelAndView.addObject("daily_rate_max", finance.getDailyRateMax());
+			modelAndView.addObject("today_rate", finance.getTodayRate());
+			modelAndView.addObject("default_ratio", finance.getDefaultRatio());
+			modelAndView.addObject("investment_min", finance.getInvestmentMin());
+			modelAndView.addObject("investment_max", finance.getInvestmentMax());
+			modelAndView.addObject("name_en", finance.getNameEn());
+			modelAndView.addObject("name_cn", finance.getNameCn());
+			modelAndView.addObject("name_kn", finance.getNameKn());
+			modelAndView.addObject("name_jn", finance.getNameJn());
+			modelAndView.addObject("state", finance.getState());
+		
+		} catch (BusinessException e) {
+			modelAndView.addObject("error", e.getMessage());
+			modelAndView.setViewName("redirect:/" + action + "list.action");
+			return modelAndView;
+		} catch (Throwable t) {
+			logger.error(" error ", t);
+			modelAndView.addObject("error", "[ERROR] " + t.getMessage());
+			modelAndView.setViewName("redirect:/" + action + "list.action");
+			return modelAndView;
+		}
+		
+		modelAndView.setViewName("finance_update");
+		return modelAndView;
+	}
+
+	/**
+	 * 修改 理财配置
+	 */
+	@RequestMapping(action + "update.action")
+	public Result update(HttpServletRequest request) {
+		String id = request.getParameter("id");
+		// 产品名称
+		String name = request.getParameter("name");
+		// 产品图片
+		String img = request.getParameter("img");
+		// 周期
+		String cycle = request.getParameter("cycle");
+		// 日利率
+		String daily_rate = request.getParameter("daily_rate");
+		String daily_rate_max = request.getParameter("daily_rate_max");
+		// 今日利率
+		String today_rate = request.getParameter("today_rate");
+		// 违约结算比例
+		String default_ratio = request.getParameter("default_ratio");
+		// 投资金额区间min
+		String investment_min = request.getParameter("investment_min");
+		// 投资金额区间max
+		String investment_max = request.getParameter("investment_max");
+		String name_en = request.getParameter("name_en");
+		String name_cn = request.getParameter("name_cn");
+		String name_kn = request.getParameter("name_kn");
+		String name_jn = request.getParameter("name_jn");
+		String state = request.getParameter("state");
+		// 资金密码
+		String login_safeword = request.getParameter("login_safeword");
+		
+//		ModelAndView model = new ModelAndView();
+//		model.addObject("id", id);
+//		model.addObject("name", name);
+//		model.addObject("img", img);
+//		model.addObject("cycle", cycle);
+//		model.addObject("daily_rate", daily_rate);
+//		model.addObject("daily_rate_max", daily_rate_max);
+//		model.addObject("today_rate", today_rate);
+//		model.addObject("default_ratio", default_ratio);
+//		model.addObject("investment_min", investment_min);
+//		model.addObject("investment_max", investment_max);
+//		model.addObject("name_en", name_en);
+//		model.addObject("name_cn", name_cn);
+//		model.addObject("name_kn", name_kn);
+//		model.addObject("name_jn", name_jn);
+//		model.addObject("state", state);
+		Finance finance = null;
+		try {
+			
+			String error = this.verification(name, img, cycle, daily_rate, daily_rate_max, today_rate, 
+					default_ratio, investment_min, investment_max, login_safeword);
+			if (!StringUtils.isNullOrEmpty(error)) {
+				throw new BusinessException(error);
+			}
+			
+			finance = this.financeService.findById(id);
+
+			finance.setName(name);
+			finance.setNameEn(name_en);
+			finance.setNameCn(name_cn);
+			finance.setNameKn(name_kn);
+			finance.setNameJn(name_jn);
+			if(img.startsWith("http")){
+				finance.setImg(img);
+			}else{
+				finance.setImg(Constants.IMAGES_HTTP+img);
+			}
+
+			finance.setCycle(Integer.valueOf(cycle));
+			finance.setDailyRate(Double.valueOf(daily_rate));
+			finance.setDailyRateMax(Double.valueOf(daily_rate_max));
+			finance.setTodayRate(Double.valueOf(today_rate));
+			finance.setDefaultRatio(Double.valueOf(default_ratio));
+			finance.setInvestmentMin(Double.valueOf(investment_min));
+			finance.setInvestmentMax(Double.valueOf(investment_max));
+			finance.setState(state);
+			
+			this.financeService.update(finance, login_safeword, SecurityUtils.getSysUser().getUsername());
+			
+			Log log = new Log();
+			log.setCategory(Constants.LOG_CATEGORY_OPERATION);
+			log.setUsername(SecurityUtils.getSysUser().getUsername());
+			log.setOperator(SecurityUtils.getSysUser().getUsername());
+			log.setLog("手动修改理财配置,ip:["+this.getIp()+"]");
+			logService.save(log);
+			
+		} catch (BusinessException e) {
+			return Result.failed(1, e.getMessage());
+		} catch (Throwable t) {
+			logger.error("update error ", t);
+			return Result.failed(1, t.getMessage());
+		}
+
+		return Result.ok(finance);
+	}
+	
+	/**
+	 * 删除 理财配置
+	 */
+	@RequestMapping(action + "toDelete.action")
+	public Result toDelete(HttpServletRequest request) {
+		String id = request.getParameter("id");
+		String login_safeword = request.getParameter("login_safeword");
+
+//		ModelAndView modelAndView = new ModelAndView();
+//		modelAndView.setViewName("redirect:/" + action + "list.action");
+
+		try {
+			
+			if (StringUtils.isNullOrEmpty(login_safeword)) {
+				throw new BusinessException("请输入登录人资金密码");
+			}
+			
+			this.financeService.delete(id, login_safeword, SecurityUtils.getSysUser().getUsername());
+			
+			Log log = new Log();
+			log.setCategory(Constants.LOG_CATEGORY_OPERATION);
+			log.setUsername(SecurityUtils.getSysUser().getUsername());
+			log.setOperator(SecurityUtils.getSysUser().getUsername());
+			log.setLog("手动删除理财配置,ip:["+this.getIp()+"]");
+			logService.save(log);
+
+		} catch (BusinessException e) {
+			return Result.failed(1, e.getMessage());
+		} catch (Throwable t) {
+			logger.error("update error ", t);
+			return Result.failed(1, t.getMessage());
+		}
+
+		return Result.ok(0);
+	}
+
+	protected String verification(String name, String img, String cycle, String daily_rate, String daily_rate_max, String today_rate, 
+			String default_ratio, String investment_min, String investment_max, String login_safeword) {
+		if (StringUtils.isEmptyString(name)) {
+			return "请输入产品名称";
+		}			
+		if (StringUtils.isEmptyString(img)) {
+			return "请上传产品图片";
+		}		
+		if (StringUtils.isEmptyString(login_safeword)) {
+			return "请输入登录人资金密码";
+		}			
+		if (StringUtils.isNullOrEmpty(cycle) 
+				|| !StringUtils.isInteger(cycle) 
+				|| Integer.valueOf(cycle) <= 0) {
+			return "周期不能小于等于0天";
+		}
+		if (StringUtils.isNullOrEmpty(daily_rate) 
+				|| !StringUtils.isDouble(daily_rate) 
+				|| Double.valueOf(daily_rate) < 0) {
+			return "日利率不能小于0";
+		}
+		if (StringUtils.isNullOrEmpty(daily_rate_max) 
+				|| !StringUtils.isDouble(daily_rate_max) 
+				|| Double.valueOf(daily_rate_max) < 0) {
+			return "日利率不能小于0";
+		}
+		if (StringUtils.isNullOrEmpty(today_rate) 
+				|| !StringUtils.isDouble(today_rate) 
+				|| Double.valueOf(today_rate) < 0) {
+			return "今日利率不能小于0";
+		}
+		if (StringUtils.isNullOrEmpty(default_ratio) 
+				|| !StringUtils.isDouble(default_ratio) 
+				|| Double.valueOf(default_ratio) < 0) {
+			return "违约结算比例不能小于0";
+		}
+		if (StringUtils.isNullOrEmpty(investment_min) 
+				|| !StringUtils.isDouble(investment_min) 
+				|| Double.valueOf(investment_min) < 0) {
+			return "投资金额区间不能小于0";
+		}
+		if (StringUtils.isNullOrEmpty(investment_max) 
+				|| !StringUtils.isDouble(investment_max) 
+				|| Double.valueOf(investment_max) < 0) {
+			return "投资金额区间不能小于0";
+		}
+		if (Double.valueOf(investment_max) <= Double.valueOf(investment_min)) {
+			return "投资金额区间错误";
+		}
+		return null;
+	}
+
+	public ResultObject readSecurityContextFromSession(ResultObject resultObject) {
+		String partyId = SecurityUtils.getCurrentSysUserId();
+		if (StringUtils.isNullOrEmpty(partyId)) {
+			resultObject.setCode("403");
+			resultObject.setMsg("请重新登录");
+			return resultObject;
+		}
+		return resultObject;
+	}
+
+	public String getIp() {
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
+		String ip = request.getHeader("X-Forwarded-For");
+		if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
+			// 多次反向代理后会有多个ip值,第一个ip才是真实ip
+			int index = ip.indexOf(",");
+			if (index != -1) {
+				return ip.substring(0, index);
+			} else {
+				return ip;
+			}
+		}
+		ip = request.getHeader("X-Real-IP");
+		if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
+			return ip;
+		}
+		return request.getRemoteAddr();
+	}
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceOrderController.java
new file mode 100644
index 0000000..9d57d7c
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/AdminFinanceOrderController.java
@@ -0,0 +1,341 @@
+package com.yami.trading.admin.controller.finance;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.admin.facade.PermissionFacade;
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.bean.finance.FinanceOrder;
+import com.yami.trading.bean.model.Log;
+import com.yami.trading.bean.model.User;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.domain.Result;
+import com.yami.trading.common.exception.BusinessException;
+import com.yami.trading.common.util.Arith;
+import com.yami.trading.common.util.DateTimeTools;
+import com.yami.trading.common.util.DateUtils;
+import com.yami.trading.common.util.ThreadUtils;
+import com.yami.trading.security.common.util.SecurityUtils;
+import com.yami.trading.service.finance.job.FinanceOrder1DayJob;
+import com.yami.trading.service.finance.service.AdminFinanceOrderService;
+import com.yami.trading.service.finance.service.FinanceOrderLock;
+import com.yami.trading.service.finance.service.FinanceOrderService;
+import com.yami.trading.service.finance.service.FinanceService;
+import com.yami.trading.service.system.LogService;
+import com.yami.trading.service.user.UserService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+/**
+ * 理财产品订单
+ */
+@RestController
+@CrossOrigin
+public class AdminFinanceOrderController {
+
+	private Logger logger = LogManager.getLogger(AdminFinanceOrderController.class);
+
+	@Autowired
+	protected AdminFinanceOrderService adminFinanceOrderService;
+	@Autowired
+	protected FinanceOrderService financeOrderService;
+	@Autowired
+	protected FinanceService financeService;
+	@Autowired
+	protected FinanceOrder1DayJob financeOrder1DayJob;
+	@Autowired
+	protected LogService logService;
+	@Autowired
+	protected UserService secUserService;
+	@Autowired
+	protected PasswordEncoder passwordEncoder;
+
+	@Autowired
+	private PermissionFacade permissionFacade;
+
+	private final String action = "normal/adminFinanceOrderAction!";
+
+	/**
+	 * 获取 理财产品订单 列表
+	 */
+	@RequestMapping(action + "list.action")
+	public Result list(HttpServletRequest request) {
+		String pageNo = request.getParameter("current");
+		String pageSize = request.getParameter("size");
+		String message = request.getParameter("message");
+		String error = request.getParameter("error");
+		String name_para = request.getParameter("name_para");
+		String finance_para = request.getParameter("finance_para");
+		String status_para = request.getParameter("status_para");
+		String order_no_para = request.getParameter("order_no_para");
+		String rolename_para = request.getParameter("rolename_para");
+		String closeTime = request.getParameter("closeTime");
+		String createTime = request.getParameter("createTime");
+
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("finance_order_list");
+
+		List<String> children = permissionFacade.getOwnerUserIds();
+
+		String partyId = "";
+		Page page = null;
+		try {
+
+			if("3".equals(status_para)){
+				status_para = null;
+			}
+
+//			this.checkAndSetPageNo(pageNo);
+
+
+
+//			String partyId = this.getLoginPartyId();
+
+			page = this.adminFinanceOrderService.pagedQuery(Integer.parseInt(pageNo), Integer.parseInt(pageSize), name_para, finance_para,
+					status_para, children, order_no_para, rolename_para,createTime ,closeTime);
+
+			List<Map> list = page.getRecords();
+			for (int i = 0; i < list.size(); i++) {
+				Map map = list.get(i);
+				if (null == map.get("rolename")) {
+					map.put("roleNameDesc", "");
+				} else {
+					String roleName = map.get("rolename").toString();
+					map.put("roleNameDesc", Constants.ROLE_MAP.containsKey(roleName) ? Constants.ROLE_MAP.get(roleName) : roleName);
+				}
+			}
+
+		} catch (BusinessException e) {
+//			modelAndView.addObject("error", e.getMessage());
+			return Result.failed(e.getMessage());
+		} catch (Throwable t) {
+			logger.error(" error ", t);
+//			modelAndView.addObject("error", "[ERROR] " + t.getMessage());
+			return Result.failed("程序错误");
+		}
+
+		Map<String,Object> map = new HashMap<>();
+
+		map.put("pageNo", pageNo);
+		map.put("pageSize", pageSize);
+		map.put("page", page);
+		map.put("message", message);
+		map.put("error", error);
+		map.put("name_para", name_para);
+		map.put("finance_para", finance_para);
+		map.put("status_para", status_para);
+		map.put("order_no_para", order_no_para);
+		map.put("rolename_para", rolename_para);
+		return Result.ok(map);
+	}
+	
+	/**
+	 * 后台赎回
+	 */
+	@RequestMapping(action + "close.action")
+	public Result close(HttpServletRequest request) {
+		String id = request.getParameter("id");
+
+//		ModelAndView modelAndView = new ModelAndView();
+//		modelAndView.setViewName("redirect:/" + action + "list.action");
+		
+		try {
+
+			FinanceOrder order = this.financeOrderService.findById(id);
+			
+			CloseDelayThread lockDelayThread = new CloseDelayThread(id, order.getOrderNo(), this.financeService, this.financeOrderService);
+			
+			Thread t = new Thread(lockDelayThread);
+			t.start();
+
+			User sec_user = this.secUserService.findUserByUserCode(order.getPartyId().toString());
+
+			Log log = new Log();
+			log.setCategory(Constants.LOG_CATEGORY_OPERATION);
+			log.setUsername(sec_user.getUserName());
+			log.setUserId(sec_user.getUserId());
+			log.setOperator(SecurityUtils.getSysUser().getUsername());
+			log.setLog("手动赎回理财订单,订单号:[" + order.getOrderNo() + "],ip:[" + this.getIp() + "]");
+			logService.save(log);
+
+		} catch (BusinessException e) {
+//			modelAndView.addObject("error", e.getMessage());
+			return Result.failed(e.getMessage());
+		} catch (Throwable t) {
+			logger.error(" error ", t);
+//			modelAndView.addObject("error", "[ERROR] " + t.getMessage());
+//			return modelAndView;
+			return Result.failed(t.getMessage());
+		}
+
+//		modelAndView.addObject("message", "操作成功");
+		return Result.ok("操作成功");
+	}
+	
+	/**
+	 * 利息重计
+	 */
+	@RequestMapping(action + "addProfit.action")
+	public Result addProfit(HttpServletRequest request) {
+		String system_time = request.getParameter("system_time");
+
+//		ModelAndView modelAndView = new ModelAndView();
+//		modelAndView.setViewName("redirect:/" + action + "list.action");
+		
+		try {
+			String username = SecurityUtils.getSysUser().getUsername();
+			if (!"root".equals(username) && !"admin".equals(username)) {
+				throw new BusinessException("权限不足");
+			}
+			
+			if (StringUtils.isEmpty(system_time)) {
+				throw new BusinessException("请填入系统时间");
+			}
+
+			Date localTime = DateTimeTools.readQueryTime(system_time, DateUtils.NORMAL_DATE_FORMAT, null);
+			//JobDelayThread thread = new JobDelayThread(DateUtils.toDate(system_time, DateUtils.NORMAL_DATE_FORMAT), this.financeOrder1DayJob);
+			JobDelayThread thread = new JobDelayThread(localTime, this.financeOrder1DayJob);
+
+			Thread t = new Thread(thread);
+			t.start();
+
+		} catch (BusinessException e) {
+//			modelAndView.addObject("error", e.getMessage());
+			return Result.failed(e.getMessage());
+		} catch (Throwable t) {
+			logger.error(" error ", t);
+//			modelAndView.addObject("error", "[ERROR] " + t.getMessage());
+//			return modelAndView;
+			return Result.failed(t.getMessage());
+		}
+
+//		modelAndView.addObject("message", "操作成功");
+//		return modelAndView;
+		return Result.ok("操作成功");
+	}
+
+	public static int daysBetween(Date smdate, Date bdate) throws ParseException {		
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		smdate = sdf.parse(sdf.format(smdate));
+		bdate = sdf.parse(sdf.format(bdate));		
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(smdate);
+		long time1 = cal.getTimeInMillis();
+		cal.setTime(bdate);
+		long time2 = cal.getTimeInMillis();
+		long between_days = (time2 - time1) / (1000 * 3600 * 24);
+		return Integer.parseInt(String.valueOf(between_days));
+	}
+
+	/**
+	 * 新线程处理,直接拿到订单锁处理完成后退出
+	 */
+	public class CloseDelayThread implements Runnable {
+		private String id;
+		private String order_no;
+		private FinanceService financeService;
+		private FinanceOrderService financeOrderService;
+
+		public void run() {
+			
+			try {
+				
+				while (true) {
+					
+					if (FinanceOrderLock.add(order_no)) {
+						
+						// 提前赎回理财产品需要支付违约金
+						FinanceOrder order = this.financeOrderService.findById(id);
+						Finance finance = this.financeService.findById(order.getFinanceId());
+						
+						if ("1".equals(order.getState())) {
+							
+							// 取时间
+							Date date_now = new Date();
+							
+							// 扣除违约金
+							double last_days = daysBetween(date_now, order.getStopTime());
+							if (last_days <= 0) {
+								last_days = 1;
+							}
+							
+							double default_ratio = Arith.mul(finance.getDefaultRatio(), 0.01);
+							default_ratio = Arith.mul(default_ratio, last_days);
+							double breach_amount = Arith.mul(order.getAmount(), default_ratio);
+							order.setProfit(Arith.sub(0, breach_amount));
+							order.setState("2");
+
+							this.financeOrderService.saveClose(order);
+						}
+						
+						// 处理完退出
+						break;
+					}
+					
+					ThreadUtils.sleep(500);
+				}
+
+			} catch (Exception e) {
+				logger.error("error:", e);
+			} finally {
+				FinanceOrderLock.remove(order_no);
+			}
+		}
+
+		public CloseDelayThread(String id, String order_no, FinanceService financeService, FinanceOrderService financeOrderService) {
+			this.id = id;
+			this.order_no = order_no;
+			this.financeService = financeService;
+			this.financeOrderService = financeOrderService;
+		}
+		
+	}
+
+	public class JobDelayThread implements Runnable {
+		private FinanceOrder1DayJob financeOrder1DayJob;
+		private Date systemTime;
+
+		public void run() {
+			this.financeOrder1DayJob.handleData(systemTime);
+		}
+
+		public JobDelayThread(Date systemTime, FinanceOrder1DayJob financeOrder1DayJob) {
+			this.systemTime = systemTime;
+			this.financeOrder1DayJob = financeOrder1DayJob;
+		}
+
+	}
+
+	public String getIp() {
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
+		String ip = request.getHeader("X-Forwarded-For");
+		if (com.yami.trading.common.util.StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
+			// 多次反向代理后会有多个ip值,第一个ip才是真实ip
+			int index = ip.indexOf(",");
+			if (index != -1) {
+				return ip.substring(0, index);
+			} else {
+				return ip;
+			}
+		}
+		ip = request.getHeader("X-Real-IP");
+		if (com.yami.trading.common.util.StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
+			return ip;
+		}
+		return request.getRemoteAddr();
+	}
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceController.java
index 015e97c..9b2e596 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceController.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceController.java
@@ -1,129 +1,161 @@
 package com.yami.trading.admin.controller.finance;
 
-import com.yami.trading.admin.model.LoginModel;
 import com.yami.trading.bean.finance.Finance;
-import com.yami.trading.bean.vo.FinanceVo;
-import com.yami.trading.common.domain.Result;
-import com.yami.trading.common.exception.YamiShopBindException;
-import com.yami.trading.common.util.ConvertUtil;
-import com.yami.trading.common.util.GoogleAuthenticator;
-import com.yami.trading.security.common.bo.UserInfoInTokenBO;
-import com.yami.trading.security.common.enums.SysTypeEnum;
-import com.yami.trading.security.common.vo.TokenInfoVO;
-import com.yami.trading.service.finance.FinanceService;
-import com.yami.trading.sys.model.SysUser;
-import com.yami.trading.util.ConverterUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
+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.service.finance.service.FinanceService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.ObjectUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.validation.Valid;
-import java.util.Collections;
+import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.Map;
+
 
 /**
- * @program: trading-order-master
- * @description: 理财
- * @create: 2025-01-22 17:13
- **/
+ * 理财产品
+ *
+ */
 @RestController
-@RequestMapping("finance")
-@Api(tags = "理财")
-@Slf4j
+@CrossOrigin
 public class FinanceController {
 
-    @Autowired
-    FinanceService service;
+	private Logger logger = LogManager.getLogger(FinanceController.class);
+	
+	@Autowired
+	protected FinanceService financeService;
+	
+	private final String action = "/api/finance!";
 
-    @PostMapping("/add")
-    @ApiOperation(value = "理财-添加")
-    public Result<?> login(@Valid @RequestBody FinanceVo vo) {
-        Finance finance = ConverterUtil.convert(vo, Finance.class);
-        service.save(finance);
-        return Result.ok("添加成功");
-    }
+	/**
+	 * 理财产品列表
+	 */
+	@RequestMapping(action + "list.action")
+	public Object list() {
+		
+		ResultObject resultObject = new ResultObject();
 
-    /**
-     * 修改理财
-     */
-    @PutMapping("/update/{id}")
-    @ApiOperation(value = "理财-修改")
-    public Result<?> updateFinance(@PathVariable Long id, @Valid @RequestBody FinanceVo vo) {
-        // 查询该理财产品是否被用户持有
-//        boolean isHeldByUsers = userFinanceService.isFinanceHeldByUsers(id);
-//        if (isHeldByUsers) {
-//            return Result.failed("该理财产品已被用户持有,无法修改");
-//        }
+		try {
+			
+			List<Finance> data = this.financeService.findAllState_1();
+			resultObject.setData(bulidData(data));
+			resultObject.setCode("0");
+			
+		} catch (BusinessException e) {
+			resultObject.setCode("1");
+			resultObject.setMsg(e.getMessage());
+		} catch (Throwable t) {
+			resultObject.setCode("1");
+			resultObject.setMsg("程序错误");
+			logger.error("error:", t);
+		}
 
-        // 如果没有用户持有,继续进行修改操作
-        return Optional.ofNullable(service.getById(id))
-                .map(finance -> {
-                    finance.setName(vo.getName());
-                    finance.setName_en(vo.getName_en());
-                    finance.setName_cn(vo.getName_cn());
-                    finance.setName_kn(vo.getName_kn());
-                    finance.setName_jn(vo.getName_jn());
-                    finance.setImg(vo.getImg());
-                    finance.setCycle(vo.getCycle());
-                    finance.setDaily_rate(vo.getDaily_rate());
-                    finance.setDaily_rate_max(vo.getDaily_rate_max());
-                    finance.setToday_rate(vo.getToday_rate());
-                    finance.setDefault_ratio(vo.getDefault_ratio());
-                    finance.setInvestment_min(vo.getInvestment_min());
-                    finance.setInvestment_max(vo.getInvestment_max());
-                    finance.setState(vo.getState());
-                    finance.setBuyCurrency(vo.getBuyCurrency());
-                    finance.setOutputCurrency(vo.getOutputCurrency());
+		return resultObject;
+	}
 
-                    service.save(finance);
-                    return Result.ok("修改成功");
-                })
-                .orElseGet(() -> Result.failed("理财信息不存在"));
-    }
+	/**
+	 * 理财产品详情
+	 */
+	@RequestMapping(action + "get.action")
+	public Object get(HttpServletRequest request) {
+		String id = request.getParameter("id");
+		
+		ResultObject resultObject = new ResultObject();
+		
+		try {
+			
+			Finance data = this.financeService.findById(id);
+			if (!StringUtils.isNullOrEmpty(data.getImg())) {
+				String path = data.getImg();
+				data.setImg(path);
+			}
+			
+			resultObject.setData(data);
+			resultObject.setCode("0");
+			
+		} catch (BusinessException e) {
+			resultObject.setCode("1");
+			resultObject.setMsg(e.getMessage());
+		} catch (Throwable t) {
+			resultObject.setCode("1");
+			resultObject.setMsg("程序错误");
+			logger.error("error:", t);
+		}
 
+		return resultObject;
+	}
 
-    /**
-     * 删除理财
-     */
-    @DeleteMapping("/delete/{id}")
-    @ApiOperation(value = "理财-删除")
-    public Result<?> deleteFinance(@PathVariable Long id) {
-        boolean removed = service.removeById(id);
-        if (removed) {
-            // 查询该理财产品是否被用户持有
-//        boolean isHeldByUsers = userFinanceService.isFinanceHeldByUsers(id);
-//        if (isHeldByUsers) {
-//            return Result.failed("该理财产品已被用户持有,无法删除");
-//        }
-            return Result.ok("删除成功");
-        } else {
-            return Result.failed("理财信息不存在");
-        }
-    }
+	protected List<Map<String, Object>> bulidData(List<Finance> finances) throws ParseException {
 
-    /**
-     * 查询单个理财
-     */
-    @GetMapping("/find/{id}")
-    @ApiOperation(value = "理财-查询")
-    public Result<?> getFinance(@PathVariable Long id) {
-        return Optional.ofNullable(service.getById(id))
-                .map(Result::ok)
-                .orElseGet(() -> Result.failed("理财信息不存在"));
-    }
+		List<Map<String, Object>> result_finances = new ArrayList<Map<String, Object>>();
 
-    /**
-     * 查询所有理财
-     */
-    @GetMapping("/list")
-    @ApiOperation(value = "理财-查询所有")
-    public Result<?> getAllFinances() {
-        List<Finance> finances = service.list();
-        return Result.ok(finances.isEmpty() ? Collections.emptyList() : finances);
-    }
+		for (int i = 0; i < finances.size(); i++) {
+			
+			Map<String, Object> map = new HashMap<String, Object>();
+			
+			Finance finance = finances.get(i);
+
+			System.out.println(finance);
+			
+			String path = finance.getImg();
+			map.put("img", path);
+			map.put("id", finance.getUuid());
+
+			map.put("name", finance.getName());
+			map.put("name_en", finance.getNameEn());
+			map.put("name_cn", finance.getNameCn());
+			map.put("name_kn", finance.getNameKn());
+			map.put("name_jn", finance.getNameJn());
+			map.put("cycle", finance.getCycle());
+			map.put("daily_rate", finance.getDailyRate() + " ~ " + finance.getDailyRateMax());
+			map.put("daily_rate_max", finance.getDailyRateMax());
+			map.put("today_rate", finance.getTodayRate());
+			map.put("default_ratio", finance.getDefaultRatio());
+			map.put("investment_min", finance.getInvestmentMin());
+			map.put("investment_max", finance.getInvestmentMax());
+			map.put("state", finance.getState());
+			map.put("buyCurrency", finance.getBuyCurrency());
+			map.put("outputCurrency", finance.getOutputCurrency());
+
+			result_finances.add(map);
+		}
+
+		return result_finances;
+	}
+
+	private Map<String, Object> bulidData(Finance finance) throws ParseException {
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		
+		String path = finance.getImg();
+		map.put("img", path);
+		map.put("id", finance.getUuid());
+
+		map.put("name", finance.getName());
+		map.put("name_en", finance.getNameEn());
+		map.put("name_cn", finance.getNameCn());
+		map.put("name_kn", finance.getNameKn());
+		map.put("name_jn", finance.getNameJn());
+		map.put("cycle", finance.getCycle());
+		map.put("daily_rate", finance.getDailyRate());
+		map.put("daily_rate_max", finance.getDailyRateMax());
+		map.put("today_rate", finance.getTodayRate());
+		map.put("default_ratio", finance.getDefaultRatio());
+		map.put("investment_min", finance.getInvestmentMin());
+		map.put("investment_max", finance.getInvestmentMax());
+		map.put("state", finance.getState());
+		map.put("buyCurrency", finance.getBuyCurrency());
+		map.put("outputCurrency", finance.getOutputCurrency());
+
+		return map;
+	}
+	
 }
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderController.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderController.java
new file mode 100644
index 0000000..0bd5998
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderController.java
@@ -0,0 +1,584 @@
+package com.yami.trading.admin.controller.finance;
+
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.bean.finance.FinanceOrder;
+import com.yami.trading.bean.model.User;
+import com.yami.trading.common.exception.BusinessException;
+import com.yami.trading.common.util.*;
+import com.yami.trading.common.web.ResultObject;
+import com.yami.trading.security.common.util.SecurityUtils;
+import com.yami.trading.service.SessionTokenService;
+import com.yami.trading.service.finance.service.FinanceOrderService;
+import com.yami.trading.service.finance.service.FinanceService;
+import com.yami.trading.service.user.UserService;
+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.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 理财订单
+ */
+@RestController
+@CrossOrigin
+@Slf4j
+public class FinanceOrderController {
+
+//	private Logger logger = LogManager.getLogger(FinanceOrderController.class);
+
+    @Autowired
+    protected FinanceOrderService financeOrderService;
+    @Autowired
+    protected FinanceService financeService;
+    @Autowired
+    protected UserService partyService;
+    @Autowired
+    protected SessionTokenService sessionTokenService;
+
+    private final String action = "/api/financeOrder!";
+
+    /**
+     * 托管订单
+     */
+    @RequestMapping(action + "list.action")
+    public Object list(HttpServletRequest request) {
+        ResultObject resultObject = new ResultObject();
+//		resultObject = readSecurityContextFromSession(resultObject);
+//		if (!"0".equals(resultObject.getCode())) {
+//			return resultObject;
+//		}
+        try {
+            List<FinanceOrder> data = new ArrayList<>();
+//			String partyId = getLoginPartyId();
+            String partyId = SecurityUtils.getCurrentUserId();
+            if (StringUtils.isNullOrEmpty(partyId)) {
+                resultObject.setData(data);
+                resultObject.setCode("0");
+                return resultObject;
+            }
+            String page_no = request.getParameter("page_no");
+            int pageNo = 1;
+            if (StringUtils.isNotEmpty(page_no)) {
+                pageNo = Integer.valueOf(page_no);
+            }
+            // 状态。0.正常赎回, 1 托管中 ,2提前赎回 (违约)3.取消
+            String state = request.getParameter("state");
+            data = financeOrderService.pagedQuery(pageNo, 10, partyId, state).getRecords();
+            // 如果不为空 则从理财产品中获取日利率 图片
+            if (data == null) {
+                resultObject.setData(data);
+                resultObject.setCode("0");
+                return resultObject;
+            }
+
+            List<Finance> finances = financeService.findAll();
+            Finance finance = new Finance();
+
+            for (int i = 0; i < data.size(); i++) {
+                FinanceOrder financeOrder = data.get(i);
+
+                for (int j = 0; j < finances.size(); j++) {
+                    finance = finances.get(j);
+                    if (finance.getUuid().equals(financeOrder.getFinanceId())) {
+                        break;
+                    }
+                }
+                // 取时间
+                Date date_now = new Date();
+                int days = daysBetween(date_now, financeOrder.getStopTime());
+                if (days < 0) {
+                    days = 0;
+                }
+                financeOrder.setName(finance.getName());
+                financeOrder.setNameCn(finance.getNameCn());
+                financeOrder.setNameEn(finance.getNameEn());
+                financeOrder.setDays(days);
+                financeOrder.setCloseTimeStr(DateUtils.format(financeOrder.getCloseTime(), DateUtils.DF_yyyyMMdd));
+                financeOrder.setCreateTimeStr(DateUtils.format(financeOrder.getCreateTime(), DateUtils.DF_yyyyMMdd));
+                financeOrder.setDailyRate(finance.getDailyRate() + " ~ " + finance.getDailyRateMax());
+                String path = finance.getImg();
+                financeOrder.setImg(path);
+            }
+
+            resultObject.setData(data);
+            resultObject.setCode("0");
+        } catch (BusinessException e) {
+            resultObject.setCode("1");
+            resultObject.setMsg(e.getMessage());
+        } catch (Exception t) {
+            resultObject.setCode("1");
+            resultObject.setMsg("程序错误");
+            log.error("error:", t);
+        }
+
+        return resultObject;
+
+    }
+
+    /**
+     * 收益统计
+     */
+    @RequestMapping(action + "listSum.action")
+    public Object listSum() {
+
+        ResultObject resultObject = new ResultObject();
+
+        try {
+            String partyId = SecurityUtils.getCurrentUserId();
+            List<FinanceOrder> data = financeOrderService.findByState(partyId, "1");
+            FinanceOrder order;
+            List<Finance> finances = financeService.findAll();
+            Finance finance = new Finance();
+            Map<String, Object> map = new HashMap<String, Object>();
+
+            // 金额总数
+            double amount_sum = 0;
+            // 预计今日盈利
+            double today_profit = 0;
+            // 已获收益
+            double aready_profit = 0;
+            // 订单数
+            double order_sum = 0;
+
+            if (data != null) {
+                for (int i = 0; i < data.size(); i++) {
+                    order = data.get(i);
+                    order_sum = Arith.add(order_sum, 1d);
+                    amount_sum = Arith.add(amount_sum, order.getAmount());
+                    aready_profit = Arith.add(aready_profit, order.getProfit());
+                    for (int j = 0; j < finances.size(); j++) {
+                        finance = finances.get(j);
+                        if (finance.getUuid().equals(order.getFinanceId())) {
+                            double finance_profit = Arith.mul(finance.getDailyRate(), 0.01d);
+                            double get_profit = Arith.mul(finance_profit, order.getAmount());
+                            today_profit = Arith.add(today_profit, get_profit);
+                            break;
+                        }
+                    }
+                }
+            }
+            // map.put("amount_sum", amount_sum);
+            // map.put("today_profit", today_profit);
+            // map.put("aready_profit", aready_profit);
+            // map.put("order_sum", order_sum);
+
+            map.put("amount_sum", new BigDecimal(amount_sum).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("amountSumValue", new BigDecimal(amount_sum).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("today_profit", new BigDecimal(today_profit).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("aready_profit", new BigDecimal(aready_profit).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("order_sum", new BigDecimal(order_sum).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("buyCurrency", "usdt");
+            map.put("outputCurrency", "usdt");
+            map.put("amountSumValue", new BigDecimal(amount_sum).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("areadyProfitValue", new BigDecimal(aready_profit).setScale(3, RoundingMode.FLOOR).toPlainString());
+            map.put("todayProfitValue", new BigDecimal(today_profit).setScale(3, RoundingMode.FLOOR).toPlainString());
+
+            resultObject.setData(map);
+            resultObject.setCode("0");
+        } catch (BusinessException e) {
+            resultObject.setCode("1");
+            resultObject.setMsg(e.getMessage());
+        } catch (Throwable t) {
+            resultObject.setCode("1");
+            resultObject.setMsg("程序错误");
+            log.error("error:", t);
+        }
+
+        return resultObject;
+    }
+
+    /**
+     * 理财托管订单-详情
+     */
+    @RequestMapping(action + "get.action")
+    public Object get(HttpServletRequest request) {
+
+        ResultObject resultObject = new ResultObject();
+        resultObject = readSecurityContextFromSession(resultObject);
+        if (!"0".equals(resultObject.getCode())) {
+            return resultObject;
+        }
+        try {
+            String order_no = request.getParameter("order_no");
+            FinanceOrder data = financeOrderService.findByOrder_no(order_no);
+            System.out.println("FinanceOrder data => " + data);
+            // 如果不为空 则从理财产品中获取日利率 图片
+            resultObject.setData(bulidData(data));
+            resultObject.setCode("0");
+        } catch (BusinessException e) {
+            resultObject.setCode("1");
+            resultObject.setMsg(e.getMessage());
+        } catch (Throwable t) {
+            resultObject.setCode("1");
+            resultObject.setMsg("程序错误");
+            log.error("error:", t);
+        }
+
+        return resultObject;
+    }
+
+    /**
+     * 创建买入理财产品订单
+     */
+    @RequestMapping(action + "open.action")
+    public Object open(HttpServletRequest request) {
+
+        ResultObject resultObject = new ResultObject();
+        resultObject = readSecurityContextFromSession(resultObject);
+        if (!"0".equals(resultObject.getCode())) {
+            return resultObject;
+        }
+//		String partyId = this.getLoginPartyId();
+        String partyId = SecurityUtils.getCurrentUserId();
+        try {
+            String session_token = request.getParameter("session_token");
+            String financeId = request.getParameter("financeId");
+            String amount = request.getParameter("amount");
+            String buyCurrency  = request.getParameter("buyCurrency");
+
+            Object object = this.sessionTokenService.cacheGet(session_token);
+            this.sessionTokenService.del(session_token);
+            if ((object == null) || (!partyId.equals((String) object))) {
+                resultObject.setCode("1");
+                resultObject.setMsg("请稍后再试");
+                return resultObject;
+            }
+            User party = this.partyService.cacheUserBy(partyId);
+//			if (!party.getEnabled()) {
+//				resultObject.setCode("506");
+//				resultObject.setMsg(error);
+//				return resultObject;
+//			}
+
+            FinanceOrder order = new FinanceOrder();
+            order.setPartyId(partyId);
+            order.setFinanceId(financeId);
+            order.setAmount(Double.valueOf(amount));
+            order.setBuyCurrency(buyCurrency);
+            order.setOrderNo(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
+            order.setState("1");
+
+            this.financeOrderService.saveCreate(order);
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put("order_no", order.getOrderNo());
+            resultObject.setData(map);
+            resultObject.setCode("0");
+        } catch (BusinessException e) {
+            resultObject.setCode("1");
+            resultObject.setMsg(e.getMessage());
+        } catch (Throwable t) {
+            resultObject.setCode("1");
+            resultObject.setMsg("程序错误");
+            log.error("error:", t);
+        }
+        return resultObject;
+    }
+
+    /**
+     * 获取订单
+     */
+    @RequestMapping(action + "getOpen.action")
+    public Object getOpen(HttpServletRequest request) {
+
+        ResultObject resultObject = new ResultObject();
+        resultObject = readSecurityContextFromSession(resultObject);
+        if (!"0".equals(resultObject.getCode())) {
+            return resultObject;
+        }
+        try {
+
+            String financeId = request.getParameter("financeId");
+            String amount_temp = request.getParameter("amount");
+            String buyCurrency  = request.getParameter("buyCurrency");
+
+            Finance finance = financeService.findById(financeId);
+
+            if (StringUtils.isNullOrEmpty(amount_temp)
+                    || !StringUtils.isDouble(amount_temp)
+                    || Double.valueOf(amount_temp) < 0) {
+                throw new BusinessException("金额错误");
+            }
+
+            if (finance == null) {
+                throw new BusinessException("id错误");
+            }
+
+            Double amount = Double.valueOf(amount_temp);
+
+            Map<String, Object> map = new HashMap<String, Object>();
+            if (finance != null) {
+                String path = finance.getImg();
+                map.put("img", path);
+            }
+
+            map.put("finance_name", finance.getName());
+            map.put("finance_name_en", finance.getNameEn());
+            map.put("finance_name_cn", finance.getNameCn());
+            map.put("finance_name_kn", finance.getNameKn());
+            map.put("finance_name_jn", finance.getNameJn());
+            map.put("cycle", finance.getCycle());
+            String partyId = SecurityUtils.getCurrentUserId();
+            if (!StringUtils.isNullOrEmpty(partyId)) {
+                String session_token = sessionTokenService.savePut(partyId);
+                map.put("session_token", session_token);
+            }
+
+            map.put("amount", amount);
+            // 取时间
+            Date date = new Date();
+
+            map.put("create_time", DateUtils.format(date, DateUtils.DF_yyyyMMddHHmmss));
+            Calendar calendar = new GregorianCalendar();
+            calendar.setTime(date);
+            calendar.add(calendar.DATE, 1);// 把日期往后增加一天.整数往后推
+            date = calendar.getTime(); //
+
+            // 起息时间
+            map.put("earn_time", DateUtils.format(date, DateUtils.DF_yyyyMMdd));
+            calendar.add(calendar.DATE, finance.getCycle() - 1);// 把日期往后增加周期.整数往后推
+            date = calendar.getTime();
+
+            // 截止时间
+            map.put("stop_time", DateUtils.format(date, DateUtils.DF_yyyyMMdd));
+
+            // 区间
+            map.put("investment_min", finance.getInvestmentMin());
+            map.put("investment_max", finance.getInvestmentMax());
+            DecimalFormat df = new DecimalFormat("#.##");
+            map.put("daily_rate", df.format(finance.getDailyRate()) + "~" + df.format(finance.getDailyRateMax()));
+            map.put("daily_rate_max", finance.getDailyRateMax());
+            map.put("financeId", financeId);
+            double rate = Arith.mul(finance.getDailyRate(), 0.01d);
+            double rateMax = Arith.mul(finance.getDailyRateMax(), 0.01d);
+            map.put("profit_may", Arith.mul(amount, Arith.mul(rate, finance.getCycle())) + "~"
+                    + Arith.mul(amount, Arith.mul(rateMax, finance.getCycle())));
+            map.put("order_no", DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
+            map.put("buyCurrency", buyCurrency != null && !buyCurrency.isEmpty() ? buyCurrency : finance.getBuyCurrency());
+            map.put("outputCurrency", finance.getOutputCurrency());
+
+            resultObject.setData(map);
+            resultObject.setCode("0");
+        } catch (BusinessException e) {
+            resultObject.setCode("1");
+            resultObject.setMsg(e.getMessage());
+        } catch (Throwable t) {
+            resultObject.setCode("1");
+            resultObject.setMsg("程序错误");
+            log.error("error:", t);
+        }
+        return resultObject;
+    }
+
+    /**
+     * 赎回理财产品订单
+     */
+    @RequestMapping(action + "closOrder.action")
+    public Object closOrder(HttpServletRequest request) {
+
+        ResultObject resultObject = new ResultObject();
+        resultObject = readSecurityContextFromSession(resultObject);
+        if (!"0".equals(resultObject.getCode())) {
+            return resultObject;
+        }
+        try {
+            String id = request.getParameter("id");
+            FinanceOrder order = financeOrderService.findById(id);
+            CloseDelayThread lockDelayThread = new CloseDelayThread(id, order.getOrderNo(), financeOrderService);
+            Thread t = new Thread(lockDelayThread);
+            t.start();
+        } catch (BusinessException e) {
+            resultObject.setCode("1");
+            resultObject.setMsg(e.getMessage());
+        } catch (Throwable t) {
+            resultObject.setCode("1");
+            resultObject.setMsg("程序错误");
+            log.error("error:", t);
+        }
+        return resultObject;
+    }
+
+    /**
+     * 新线程处理,直接拿到订单锁处理完成后退出
+     */
+    public class CloseDelayThread implements Runnable {
+        private String id;
+        private String order_no;
+        private FinanceOrderService financeOrderService;
+
+        public void run() {
+            try {
+                while (true) {
+                    if (FinanceOrderLock.add(order_no)) {
+                        /**
+                         * 提前赎回理财产品需要支付违约金
+                         */
+                        FinanceOrder order = financeOrderService.findById(id);
+                        Finance finance = financeService.findById(order.getFinanceId());
+                        // order.setDays(daysBetween(order.getEarn_time(), order.getStop_time()));
+                        if ("1".equals(order.getState())) {
+                            /**
+                             * 扣除违约金
+                             */
+                            Date date_now = new Date();// 取时间
+                            double last_days = daysBetween(date_now, order.getStopTime());
+                            if (last_days <= 0) {
+                                last_days = 1;
+                            }
+                            double default_ratio = Arith.mul(finance.getDefaultRatio(), 0.01d);
+                            default_ratio = Arith.mul(default_ratio, last_days);
+                            double breach_amount = Arith.mul(order.getAmount(), default_ratio);
+                            order.setProfit(Arith.sub(0, breach_amount));
+                            order.setState("2");
+
+                            this.financeOrderService.saveClose(order);
+
+                        }
+                        /**
+                         * 处理完退出
+                         */
+                        break;
+                    }
+                    ThreadUtils.sleep(500);
+
+                }
+
+            } catch (Throwable t) {
+                log.error("error:", t);
+            } finally {
+                FinanceOrderLock.remove(order_no);
+            }
+
+        }
+
+        public CloseDelayThread(String id, String order_no, FinanceOrderService financeOrderService) {
+            this.id = id;
+            this.order_no = order_no;
+            this.financeOrderService = financeOrderService;
+        }
+
+    }
+
+    public Map<String, Object> bulidData(FinanceOrder order) throws ParseException {
+
+        System.out.println("order => " + order);
+
+        Finance finance = new Finance();
+        finance = financeService.findById(order.getFinanceId());
+
+        DecimalFormat df = new DecimalFormat("#.##");
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("img", finance.getImg());
+        map.put("daily_rate", df.format(finance.getDailyRate()) + "~" + df.format(finance.getDailyRateMax()));
+        map.put("daily_rate_min", finance.getDailyRate());
+        map.put("daily_rate_max", finance.getDailyRateMax());
+        map.put("create_timeStr", DateUtils.format(order.getCreateTime(), DateUtils.DF_yyyyMMddHHmmss));
+        map.put("close_timeStr", DateUtils.format(order.getCloseTime(), DateUtils.DF_yyyyMMddHHmmss));
+        /**
+         * 此处将截止时间传回
+         */
+        map.put("stop_timeStr", DateUtils.format(order.getStopTime(), DateUtils.DF_yyyyMMdd));
+        map.put("earn_timeStr", DateUtils.format(order.getEarnTime(), DateUtils.DF_yyyyMMdd));
+        Date date_now = new Date();// 取时间
+        int days = daysBetween(date_now, order.getStopTime());
+        if (days < 0) {
+            days = 0;
+        }
+        map.put("days", days);
+        double rate = Arith.mul(finance.getDailyRate(), 0.01d);
+        double rateMax = Arith.mul(finance.getDailyRateMax(), 0.01d);
+        map.put("profit_may", Arith.mul(order.getAmount(), Arith.mul(rate, finance.getCycle())) + "~"
+                + Arith.mul(order.getAmount(), Arith.mul(rateMax, finance.getCycle())));
+
+//		{{((data.daily_rate.split(' ~ ')[0]) / 1 * form.amount / 100).toFixed(2)}} ~
+//				{{((data.daily_rate.split(' ~ ')[1]) / 1 * form.amount / 100).toFixed(2)}}
+
+        map.put("order_no", order.getOrderNo());
+        map.put("amount", order.getAmount());
+        map.put("cycle", order.getCycle());
+        map.put("id", order.getUuid());
+        map.put("name", finance.getName());
+        map.put("name_en", finance.getNameEn());
+        map.put("name_cn", finance.getNameCn());
+        map.put("name_kn", finance.getNameKn());
+        map.put("name_jn", finance.getNameJn());
+        map.put("buyCurrency", finance.getBuyCurrency());
+        map.put("outputCurrency", finance.getOutputCurrency());
+
+        map.put("state", order.getState());
+        if ("1".equals(order.getState())) {
+
+            map.put("profit", order.getProfit());
+
+            double last_days = daysBetween(date_now, order.getStopTime());
+            if (last_days <= 0) {
+                last_days = 1;
+            }
+            log.info("last_days = " + last_days);
+            log.info("finance.getDefault_ratio() = " + finance.getDefaultRatio());
+            double default_ratio = Arith.mul(finance.getDefaultRatio(), 0.01d);
+            log.info("default_ratio 1 = " + default_ratio);
+            default_ratio = Arith.mul(default_ratio, last_days);
+            log.info("default_ratio 2 = " + default_ratio);
+            double default_amount = Arith.mul(order.getAmount(), default_ratio);
+            log.info("default_amount = " + default_amount);
+            log.info("order.getAmount() = " + order.getAmount());
+            map.put("default_amount", default_amount);
+
+
+            double principal_amount = Arith.sub(order.getAmount(), default_amount);
+            if (principal_amount < 0) {
+                principal_amount = 0;
+            }
+            map.put("principal_amount", principal_amount);
+
+        }
+        if ("2".equals(order.getState())) {
+            map.put("profit", 0);
+            map.put("default_amount", df.format(Arith.sub(0, order.getProfit())));
+            map.put("principal_amount", df.format(Arith.add(order.getAmount(), order.getProfit())));
+        }
+        if ("0".equals(order.getState())) {
+            map.put("profit", order.getProfit());
+            map.put("default_amount", 0);
+            map.put("principal_amount", df.format(Arith.add(order.getAmount(), order.getProfit())));
+        }
+
+        return map;
+
+    }
+
+    public static int daysBetween(Date smdate, Date bdate) throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        smdate = sdf.parse(sdf.format(smdate));
+        bdate = sdf.parse(sdf.format(bdate));
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(smdate);
+        long time1 = cal.getTimeInMillis();
+        cal.setTime(bdate);
+        long time2 = cal.getTimeInMillis();
+        long between_days = (time2 - time1) / (1000 * 3600 * 24);
+
+        return Integer.parseInt(String.valueOf(between_days));
+    }
+
+    public ResultObject readSecurityContextFromSession(ResultObject resultObject) {
+//		String partyId = SecurityUtils.getCurrentSysUserId();
+        String partyId = SecurityUtils.getCurrentUserId();
+        if (StringUtils.isNullOrEmpty(partyId)) {
+            resultObject.setCode("403");
+            resultObject.setMsg("请重新登录");
+            return resultObject;
+        }
+        return resultObject;
+    }
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderLock.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderLock.java
new file mode 100644
index 0000000..706e84e
--- /dev/null
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/finance/FinanceOrderLock.java
@@ -0,0 +1,22 @@
+package com.yami.trading.admin.controller.finance;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class FinanceOrderLock {
+	private static final Set<String> filter = new HashSet<String>();
+
+	public static boolean add(String order_no) {
+		if (!filter.add(order_no)) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	public static void remove(String order_no) {
+		filter.remove(order_no);
+
+	}
+
+}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/AdminMinerService.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/AdminMinerService.java
index 9c33584..104d469 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/AdminMinerService.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/AdminMinerService.java
@@ -1,12 +1,16 @@
+/*
 package com.yami.trading.admin.controller.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 public interface AdminMinerService {
 
-	/**
+	*/
+/**
 	 * 代理分页查询
 	 * 
-	 */
+	 *//*
+
 	public Page pagedQuery(int pageNo, int pageSize, String name_para);
 }
+*/
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerRedisKeys.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerRedisKeys.java
deleted file mode 100644
index d4e1937..0000000
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerRedisKeys.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.yami.trading.admin.controller.service;
-
-public class MinerRedisKeys {
-	
-	/**
-	 * 矿机,id做key
-	 */
-	public final static String MINER_ID = "MINER_ID_";
-	
-
-	/**
-	 * 获取所有的矿机
-	 */
-	public final static String MINER_MAP = "MINER_MAP_";
-	
-	/**
-	 * 矿机订单,订单号做key
-	 */
-	public final static String MINER_ORDER_ORDERNO = "MINER_ORDER_ORDERNO_";
-	
-	/**
-	 * 矿机订单,查询partyid的map
-	 */
-	public final static String MINER_ORDER_PARTY_ID = "MINER_ORDER_PARTY_ID_";
-
-	/**
-	 * 矿机总资产,partyid做key
-	 */
-	public final static String MINER_ASSETS_PARTY_ID = "MINER_ASSETS_PARTY_ID_";
-	
-	/**
-	 * 矿机订单异步提交
-	 */
-	public final static String MINER_ORDER = "MINER_ORDER_";
-	
-}
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerService.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerService.java
index 6aafbc7..3f141b2 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerService.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/MinerService.java
@@ -1,3 +1,4 @@
+/*
 package com.yami.trading.admin.controller.service;
 
 import java.util.List;
@@ -20,4 +21,4 @@
     public Miner cacheById(String id);
 
     public Map<String,Object> getBindOne(Miner miner);
-}
\ No newline at end of file
+}*/
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/AdminMinerServiceImpl.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/AdminMinerServiceImpl.java
index f8c87fe..9cda08d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/AdminMinerServiceImpl.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/AdminMinerServiceImpl.java
@@ -1,9 +1,11 @@
+/*
 package com.yami.trading.admin.controller.service.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.trading.admin.controller.service.AdminMinerService;
 import com.yami.trading.admin.dao.MinerMapper;
+import com.yami.trading.bean.miner.Miner;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -38,3 +40,4 @@
 //		this.pagedQueryDao = pagedQueryDao;
 //	}
 }
+*/
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/MinerServiceImpl.java b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/MinerServiceImpl.java
index 5f7f7a4..8aa2fac 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/MinerServiceImpl.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/controller/service/impl/MinerServiceImpl.java
@@ -1,3 +1,4 @@
+/*
 package com.yami.trading.admin.controller.service.impl;
 
 import java.util.ArrayList;
@@ -210,3 +211,4 @@
 //		return new ArrayList<Finance>();
 //	}
 }
+*/
diff --git a/trading-order-admin/src/main/java/com/yami/trading/admin/dao/MinerMapper.java b/trading-order-admin/src/main/java/com/yami/trading/admin/dao/MinerMapper.java
index abc91f8..a86b26d 100644
--- a/trading-order-admin/src/main/java/com/yami/trading/admin/dao/MinerMapper.java
+++ b/trading-order-admin/src/main/java/com/yami/trading/admin/dao/MinerMapper.java
@@ -1,16 +1,20 @@
+/*
 package com.yami.trading.admin.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.bean.miner.Miner;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+*/
 /**
  * @program: trading-order-master
  * @description:
  * @create: 2025-03-10 14:27
- **/
+ **//*
+
 @Mapper
 public interface MinerMapper extends BaseMapper<Miner> {
     Page pagedQuery(Page page, @Param("name_para") String name_para);
-}
\ No newline at end of file
+}*/
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/finance/Finance.java b/trading-order-bean/src/main/java/com/yami/trading/bean/finance/Finance.java
index 5ecf3d7..e10ad11 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/finance/Finance.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/finance/Finance.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yami.trading.common.domain.UUIDEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -16,11 +17,12 @@
 @EqualsAndHashCode(callSuper = false)
 @TableName("t_finance")
 @Data
-public class Finance {
+public class Finance extends UUIDEntity {
 
-    @TableId(type = IdType.AUTO,value = "id")
-    private int id;
-
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1639941028310043811L;
     /**
      * 产品名称
      */
@@ -29,28 +31,25 @@
     /**
      * 产品名称英文
      */
-    private String name_en;
-
+//	@TableField("`name_en`")
+    private String nameEn;
     /**
      * 产品名称繁体
      */
-    private String name_cn;
-
+    private String nameCn;
     /**
      * 产品名称 韩语
      */
-    private String name_kn;
-
+    private String nameKn;
     /**
      * 产品名称 日语
      */
-    private String name_jn;
+    private String nameJn;
 
     /**
      * 产品图片
      */
     private String img;
-
     /**
      * 周期-天数
      */
@@ -59,33 +58,30 @@
     /**
      * 日利率最低(%)
      */
-    private double daily_rate;
-
+    private double dailyRate;
     /**
      * 日利率最高(%)
      */
-    private double daily_rate_max;
-
+    private double dailyRateMax;
     /**
      * 今日利率(%)
      *
      */
-    private double today_rate;
+    private double todayRate;
 
     /**
      * 违约结算比例(%)
      */
-    private double default_ratio;
+    private double defaultRatio;
 
     /**
      * 投资金额区间(USDT)
      */
-    private double investment_min;
-
+    private double investmentMin;
     /**
      * 投资金额区间(USDT)
      */
-    private double investment_max;
+    private double investmentMax;
 
     /**
      * 状态。0 停用, 1 启用
@@ -101,6 +97,5 @@
      * 理财购买币种
      */
     private String outputCurrency = "usdt";
-
 
 }
diff --git a/trading-order-bean/src/main/java/com/yami/trading/bean/finance/FinanceOrder.java b/trading-order-bean/src/main/java/com/yami/trading/bean/finance/FinanceOrder.java
index 0703eb2..1700360 100644
--- a/trading-order-bean/src/main/java/com/yami/trading/bean/finance/FinanceOrder.java
+++ b/trading-order-bean/src/main/java/com/yami/trading/bean/finance/FinanceOrder.java
@@ -1,12 +1,12 @@
 package com.yami.trading.bean.finance;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yami.trading.common.domain.UUIDEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
 
-import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -14,43 +14,44 @@
  * @description: 理财订单
  * @create: 2025-01-22 16:45
  **/
+@Data
 @EqualsAndHashCode(callSuper = false)
 @TableName("t_finance_order")
-@Data
-public class FinanceOrder {
+public class FinanceOrder extends UUIDEntity {
 
+    private static final long serialVersionUID = -726057340004619294L;
 
-    @TableId(type = IdType.AUTO,value = "id")
-    private int id;
+//	private String uuid;
 
     /**
      * 用户ID
      */
-    private int partyId;
+    private String partyId;
 
     /**
      * 订单 号
      */
-    private String order_no;
+    private String orderNo;
 
     /**
      * 理财产品名称
      */
-    private String financeName;
+    private String name;
 
     /**
      * 理财产品名称繁体
      */
-    private String financeName_cn;
+    private String nameCn;
 
     /**
      * 理财产品名称英文
      */
-    private String financeName_en;
+    private String nameEn;
 
     /**
      * 理财产品Id
      */
+    @TableField("`finance_id`")
     private String financeId;
 
     /**
@@ -61,89 +62,108 @@
     /**
      * 买入时间
      */
-    private Date create_time;
-
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
     /**
      * 起息时间 从买入时间第二天开始算
      */
-    private Date earn_time;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date earnTime;
 
     /**
      * 截止时间
      */
-    private Date stop_time;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date stopTime;
 
     /**
      * 赎回时间=截止时间+1天
      */
-    private Date close_time;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date closeTime;
 
     /**
      * 收益
      */
     private double profit;
-
     /**
      * 之前或累计收益
      */
-    private double profit_before;
+    private double profitBefore;
 
     /**
      * 状态。0.正常赎回, 1 托管中 ,2提前赎回 (违约)3.取消
      */
     private String state = "1";
-
     /**
      * 托管时间,周期
      */
     private int cycle;
 
     /**
-     * 理财产品图片
+     * 传回前端数据,数据库不保存
      */
-    private String img;
 
     /**
-     * 剩余天数
+     * 理财产品图片
      */
+    @TableField(exist = false)
+    private String img;
+    /**
+     * 剩余天数
+     *
+     * @return
+     */
+    @TableField(exist = false)
     private int days;
-
     /**
      * 赎回时间=截止时间+1天
      */
-    private String close_timeStr;
-
+    @TableField(exist = false)
+    private String closeTimeStr;
     /**
      * 买入时间
      */
-    private String create_timeStr;
+    @TableField(exist = false)
+    private String createTimeStr;
     /**
      * 起息时间 从买入时间第二天开始算
      */
-    private String earn_timeStr;
+    @TableField(exist = false)
+    private String earnTimeStr;
 
     /**
      * 截止时间
      */
-    private String stop_timeStr;
+    @TableField(exist = false)
+    private String stopTimeStr;
 
     /**
      * 日利率(%)
      */
-    private String daily_rate;
+    @TableField(exist = false)
+    private String dailyRate;
     /**
      * 预计收益
+     *
+     * @return
      */
-    private double profit_may;
+    @TableField(exist = false)
+    private double profitMay;
 
     /**
      * 理财购买币种
      */
+    //@TableField(exist = false)
     private String buyCurrency = "usdt";
 
+    //赎回币种数量
+    private double volume = 0;
+
     /**
      * 理财购买币种
      */
+    @TableField(exist = false)
     private String outputCurrency = "usdt";
 
 }
diff --git a/trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java b/trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java
index 23db7ea..c79ca23 100644
--- a/trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java
+++ b/trading-order-common/src/main/java/com/yami/trading/common/constants/Constants.java
@@ -246,6 +246,29 @@
 	 */
 	public static final String MONEYLOG_CONTENT_BANK_CARD_ORDER_CANCEL = "bank_card_order_cancel";
 
+	/**
+	 * 矿机交易
+	 */
+	public static final String MONEYLOG_CATEGORY_MINER = "miner";
+
+	/**
+	 * 矿机买入
+	 */
+	public static final String MONEYLOG_CONTENT_MINER_BUY = "miner_buy";
+	/**
+	 * 矿机退回本金
+	 */
+	public static final String MONEYLOG_CONTENT_MINER_BACK = "miner_back";
+
+	/**
+	 * 矿机收益
+	 */
+	public static final String MONEYLOG_CONTENT_MINER_PROFIT = "miner_profit";
+	/**
+	 * 矿机推荐收益
+	 */
+	public static final String MONEYLOG_CONTENT_MINER_RECOM_PROFIT = "miner_recom_profit";
+
 	public static Map<String, String> MONEYLOG_CONTENT = new HashMap<String, String>();
 
 	static {
@@ -383,6 +406,11 @@
 	 */
 	public static String OUT_OR_IN_DEFAULT = "in";
 
+	/**
+	 * 理财产品交易
+	 */
+	public static final String MONEYLOG_CATEGORY_FINANCE = "finance";
+
 	public final static String PROFIT_LOSS_TYPE_PROFIT = "profit";
 	public final static String PROFIT_LOSS_TYPE_LOSS = "loss";
 	public final static String PROFIT_LOSS_TYPE_BUY_PROFIT = "buy_profit";
diff --git a/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceMapper.java b/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceMapper.java
index 8bbbb42..95a09d3 100644
--- a/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceMapper.java
+++ b/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceMapper.java
@@ -1,15 +1,10 @@
 package com.yami.trading.dao.finance;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yami.trading.bean.finance.Finance;
-import com.yami.trading.bean.item.domain.Item;
-import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
-/**
- * @program: trading-order-master
- * @description: 理财
- * @create: 2025-01-22 17:18
- **/
-@Mapper
 public interface FinanceMapper extends BaseMapper<Finance> {
+    Page pagedQuery(Page page, @Param("name_para") String name_para);
 }
diff --git a/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceOrderMapper.java b/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceOrderMapper.java
new file mode 100644
index 0000000..a07c500
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/dao/finance/FinanceOrderMapper.java
@@ -0,0 +1,26 @@
+package com.yami.trading.dao.finance;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.bean.finance.FinanceOrder;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface FinanceOrderMapper extends BaseMapper<FinanceOrder> {
+
+    Page pagedQuery(Page page, @Param("partyId") String partyId, @Param("state") String state);
+
+    Page pagedQueryByDate(Page page, @Param("date") String date);
+
+    Page pagedQuery1(Page page, @Param("name_para") String name_para, @Param("finance_para") String finance_para, @Param("status_para") String status_para,
+                     @Param("children") List<String> children, @Param("orderNo") String orderNo, @Param("rolename_para") String rolename_para,
+                     @Param("createTime") String createTime, @Param("closeTime") String closeTime);
+
+    // public Page pagedQuery(int pageNo, int pageSize, String partyId, String state) {
+    // public Page pagedQueryByDate(int pageNo, int pageSize, String date) {
+//    public Page pagedQuery(int pageNo, int pageSize, String name_para, String finance_para, String status_para,
+//                           String partyId, String orderNo, String rolename_para) {
+
+    Double sumVolumeByBuyCurrency(@Param("partyId") String partyId, @Param("buyCurrency") String buyCurrency);
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/FinanceService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/FinanceService.java
deleted file mode 100644
index 4b995b5..0000000
--- a/trading-order-service/src/main/java/com/yami/trading/service/finance/FinanceService.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.yami.trading.service.finance;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.yami.trading.bean.finance.Finance;
-import com.yami.trading.bean.vo.FinanceVo;
-
-/**
- * 理财
- */
-public interface FinanceService extends IService<Finance> {
-
-
-}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/impl/FinanceServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/impl/FinanceServiceImpl.java
deleted file mode 100644
index ae803e4..0000000
--- a/trading-order-service/src/main/java/com/yami/trading/service/finance/impl/FinanceServiceImpl.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.yami.trading.service.finance.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yami.trading.bean.finance.Finance;
-import com.yami.trading.bean.model.ChannelBlockchain;
-import com.yami.trading.dao.finance.FinanceMapper;
-import com.yami.trading.dao.user.ChannelBlockchainMapper;
-import com.yami.trading.service.ChannelBlockchainService;
-import com.yami.trading.service.finance.FinanceService;
-import org.springframework.stereotype.Service;
-
-/**
- * @program: trading-order-master
- * @description: 理财
- * @create: 2025-01-22 17:18
- **/
-@Service
-public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> implements FinanceService {
-}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrder1DayJob.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrder1DayJob.java
new file mode 100644
index 0000000..e84024a
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrder1DayJob.java
@@ -0,0 +1,135 @@
+package com.yami.trading.service.finance.job;
+
+import com.yami.trading.bean.finance.FinanceOrder;
+import com.yami.trading.bean.model.Log;
+import com.yami.trading.common.util.DateUtils;
+import com.yami.trading.common.util.ThreadUtils;
+import com.yami.trading.service.finance.service.FinanceOrderLock;
+import com.yami.trading.service.finance.service.FinanceOrderService;
+import com.yami.trading.service.system.LogService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+@Component
+@Slf4j
+public class FinanceOrder1DayJob {
+	private static org.apache.commons.logging.Log logger = LogFactory.getLog(FinanceOrder1DayJob.class);
+	@Autowired
+	protected FinanceOrderService financeOrderService;
+	@Autowired
+	protected LogService sysLogService;
+
+	//
+	//	<!-- 每天凌晨4点启动 -->
+	//	<task:scheduled ref="dataTask" method="jobHandle" cron="0 0 4 * * ?"/>
+	@Scheduled(cron = "0 0 4 * * ?")
+	public void taskJob() {
+		try {
+			List<FinanceOrder> financeOrder = financeOrderService.getAllStateBy_1();
+			if(financeOrder != null) {
+				for (int i = 0; i < financeOrder.size(); i++) {
+					FinanceOrder order = financeOrder.get(i);
+					boolean lock = false;
+					try {
+
+						if (!FinanceOrderLock.add(order.getOrderNo())) {
+							continue;
+						}
+						lock = true;
+						this.financeOrderService.addListProfit(order);
+
+					} catch (Exception e) {
+						logger.error("FinanceOrder1DayJob order profit fail,orderno:{"+order.getOrderNo()+"},e:", e);
+					} finally {
+						if (lock) {
+							/**
+							 * 每秒处理100个订单
+							 */
+							ThreadUtils.sleep(10);
+							FinanceOrderLock.remove(order.getOrderNo());
+						}
+
+					}
+				}
+				logger.info(DateUtils.dateToStr(new Date(), DateUtils.DF_yyyyMMddHHmmss)+" finance profit finished ,count:" + financeOrder.size());
+			}
+			
+		
+		} catch (Throwable e) {
+			logger.error("FinanceOrder1DayJob run fail e:", e);
+			Log entity = new Log();
+//			entity.set(SysLog.level_error);
+			entity.setCreateTime(new Date());
+			entity.setOperator("FinanceOrder1DayJob 理财任务 执行失败 e:"+e);
+			sysLogService.save(entity);
+		} finally {
+			/**
+			 * 暂停0.1秒
+			 */
+			ThreadUtils.sleep(1000);
+		}
+
+	}
+	
+	public void handleData(Date systemTime) {
+		try {
+			List<FinanceOrder> financeOrder = financeOrderService.getAllStateBy_1();
+			if(financeOrder != null) {
+				for (int i = 0; i < financeOrder.size(); i++) {
+					FinanceOrder order = financeOrder.get(i);
+					boolean lock = false;
+					try {
+
+						if (!FinanceOrderLock.add(order.getOrderNo())) {
+							continue;
+						}
+						lock = true;
+						this.financeOrderService.addListProfit(order,systemTime);
+
+					} catch (Exception e) {
+						logger.error("FinanceOrder1DayJob order profit fail,orderno:{"+order.getOrderNo()+"},e:", e);
+					} finally {
+						if (lock) {
+							/**
+							 * 每秒处理100个订单
+							 */
+							ThreadUtils.sleep(10);
+							FinanceOrderLock.remove(order.getOrderNo());
+						}
+
+					}
+				}
+				logger.info(DateUtils.dateToStr(new Date(), DateUtils.DF_yyyyMMddHHmmss)+" finance profit finished ,count:" + financeOrder.size());
+			}
+			
+		} catch (Throwable e) {
+			logger.error("FinanceOrder1DayJob run fail e:", e);
+			Log entity = new Log();
+//			entity.setLevel(SysLog.level_error);
+			entity.setCreateTime(new Date());
+			entity.setOperator("FinanceOrder1DayJob 理财任务 执行失败  e:"+e);
+			sysLogService.save(entity);
+		} finally {
+			/**
+			 * 暂停0.1秒
+			 */
+			ThreadUtils.sleep(1000);
+		}
+	}
+
+	public void setFinanceOrderService(FinanceOrderService financeOrderService) {
+		this.financeOrderService = financeOrderService;
+	}
+
+//	public void setSysLogService(SysLogService sysLogService) {
+//		this.sysLogService = sysLogService;
+//	}
+
+	
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomJob.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomJob.java
new file mode 100644
index 0000000..cbdc54b
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomJob.java
@@ -0,0 +1,48 @@
+package com.yami.trading.service.finance.job;
+
+import com.yami.trading.bean.model.Log;
+import com.yami.trading.service.system.LogService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+@Slf4j
+public class FinanceOrderCreateRecomJob {
+	private static Logger logger = LoggerFactory.getLogger(FinanceOrderCreateRecomJob.class);
+	@Autowired
+	protected LogService sysLogService;
+	@Autowired
+	private FinanceOrderCreateRecomService financeOrderCreateRecomService;
+
+	//	<!-- 每天凌晨4点启动 -->
+	//	<task:scheduled ref="dataTask" method="jobHandle" cron="0 0 4 * * ?"/>
+	// 理财计算前一日购买奖励金额
+	@Scheduled(cron = "0 0 4 * * ?")
+	public void taskJob() {
+		try {
+			financeOrderCreateRecomService.computeRecom();
+		} catch (Exception e) {
+			logger.error("FinanceOrderCreateRecomJob run fail e:", e);
+			Log entity = new Log();
+//			entity.setLevel(SysLog.level_error);
+			entity.setCreateTime(new Date());
+			entity.setOperator("FinanceOrderCreateRecomJob 理财购买奖励任务 执行失败 e:"+e);
+			sysLogService.save(entity);
+		} 
+	}
+
+//	public void setSysLogService(SysLogService sysLogService) {
+//		this.sysLogService = sysLogService;
+//	}
+
+	public void setFinanceOrderCreateRecomService(FinanceOrderCreateRecomService financeOrderCreateRecomService) {
+		this.financeOrderCreateRecomService = financeOrderCreateRecomService;
+	}
+	
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomService.java
new file mode 100644
index 0000000..d6ed2a8
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomService.java
@@ -0,0 +1,8 @@
+package com.yami.trading.service.finance.job;
+
+public interface FinanceOrderCreateRecomService {
+	/**
+	 * 计算前一日购买产品的订单
+	 */
+	public void computeRecom();
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomServiceImpl.java
new file mode 100644
index 0000000..67c0085
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/job/FinanceOrderCreateRecomServiceImpl.java
@@ -0,0 +1,165 @@
+package com.yami.trading.service.finance.job;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.trading.bean.constans.WalletConstants;
+import com.yami.trading.bean.finance.FinanceOrder;
+import com.yami.trading.bean.model.MoneyLog;
+import com.yami.trading.bean.model.User;
+import com.yami.trading.bean.model.UserRecom;
+import com.yami.trading.bean.model.Wallet;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.util.Arith;
+import com.yami.trading.common.util.DateUtils;
+import com.yami.trading.common.util.StringUtils;
+import com.yami.trading.service.MoneyLogService;
+import com.yami.trading.service.WalletService;
+import com.yami.trading.service.finance.service.FinanceOrderService;
+import com.yami.trading.service.syspara.SysparaService;
+import com.yami.trading.service.user.UserRecomService;
+import com.yami.trading.service.user.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+@Slf4j
+public class FinanceOrderCreateRecomServiceImpl implements FinanceOrderCreateRecomService {
+	@Autowired
+	protected FinanceOrderService financeOrderService;
+	@Autowired
+	protected SysparaService sysparaService;
+	@Autowired
+	protected UserRecomService userRecomService;
+	@Autowired
+	protected UserService partyService;
+	@Autowired
+	protected WalletService walletService;
+	@Autowired
+	protected MoneyLogService moneyLogService;
+	/**
+	 * 计算推荐人收益
+	 */
+	protected Map<String, Double> cacheRecomProfit = new ConcurrentHashMap<String, Double>();
+
+	/**
+	 * 计算前一日购买产品的订单
+	 */
+	public void computeRecom() {
+		String finance_buy_bonus_parameters = sysparaService.find("finance_buy_bonus_parameters").getSvalue();
+		if (StringUtils.isEmptyString(finance_buy_bonus_parameters)) {
+			return;
+		}
+		cacheRecomProfit.clear();
+		int pageSize = 1000;
+		int pageNo = 1;
+		String date = DateUtils.getDateStr(DateUtils.addDate(new Date(), -1));
+		while (true) {
+			Page page = financeOrderService.pagedQueryByDate(pageNo, pageSize, date);
+			List<FinanceOrder> list = (List<FinanceOrder>) page.getRecords();
+			if (list.isEmpty()) {
+				break;
+			}
+			for (FinanceOrder order : list) {
+				handleCacheRecom(order, finance_buy_bonus_parameters);
+			}
+			pageNo++;
+		}
+		saveRecomProfit();
+	}
+
+	/**
+	 * 购买推荐奖励
+	 * 
+	 * @param entity
+	 */
+	public void handleCacheRecom(FinanceOrder entity, String finance_buy_bonus_parameters) {
+		List<UserRecom> list_parents = this.userRecomService.getParents((String)entity.getPartyId());
+
+		if (CollectionUtils.isNotEmpty(list_parents)) {
+			String[] finance_buy_bonus_array = finance_buy_bonus_parameters.split(",");
+			int loop = 0;
+			int loopMax = finance_buy_bonus_array.length;
+			for (int i = 0; i < list_parents.size(); i++) {
+				if (loop >= loopMax) {
+					break;
+				}
+				User party_parent = this.partyService.cacheUserBy(list_parents.get(i).getRecomUserId());
+				if (!Constants.SECURITY_ROLE_MEMBER.equals(party_parent.getRoleName())) {
+					continue;
+				}
+				loop++;
+				double pip_amount = Double.valueOf(finance_buy_bonus_array[loop - 1]);
+				double get_money = Arith.mul(entity.getAmount(), pip_amount);
+
+				if (cacheRecomProfit.containsKey(party_parent.getUserId())) {
+					cacheRecomProfit.put(party_parent.getUserId(),
+							Arith.add(cacheRecomProfit.get(party_parent.getUserId()), get_money));
+				} else {
+					cacheRecomProfit.put(party_parent.getUserId(), get_money);
+				}
+			}
+
+		}
+	}
+
+	public void saveRecomProfit() {
+		if (cacheRecomProfit.isEmpty()) {
+			return;
+		}
+		for (Entry<String, Double> entry : cacheRecomProfit.entrySet()) {
+			Wallet wallet_parent = walletService.saveWalletByPartyId(entry.getKey());
+			BigDecimal amount_before_parent = wallet_parent.getMoney();
+			walletService.update(wallet_parent.getUserId(), entry.getValue());
+			/**
+			 * 保存资金日志
+			 */
+			MoneyLog moneyLog = new MoneyLog();
+			moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+			moneyLog.setAmountBefore(amount_before_parent);
+			moneyLog.setAmount(BigDecimal.valueOf(entry.getValue()));
+			moneyLog.setAmountAfter(BigDecimal.valueOf(Arith.add(wallet_parent.getMoney(), BigDecimal.valueOf(entry.getValue()))));
+			moneyLog.setLog("下级购买理财佣金奖励");
+			moneyLog.setUserId(entry.getKey());
+			moneyLog.setWalletType(Constants.WALLET);
+			moneyLog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_RECOM_PROFIT);
+			moneyLogService.save(moneyLog);
+		}
+	}
+
+	public void setFinanceOrderService(FinanceOrderService financeOrderService) {
+		this.financeOrderService = financeOrderService;
+	}
+
+	public void setSysparaService(SysparaService sysparaService) {
+		this.sysparaService = sysparaService;
+	}
+
+	public void setUserRecomService(UserRecomService userRecomService) {
+		this.userRecomService = userRecomService;
+	}
+
+	public void setPartyService(UserService partyService) {
+		this.partyService = partyService;
+	}
+
+	public void setWalletService(WalletService walletService) {
+		this.walletService = walletService;
+	}
+
+	public void setMoneyLogService(MoneyLogService moneyLogService) {
+		this.moneyLogService = moneyLogService;
+	}
+
+	public void setCacheRecomProfit(Map<String, Double> cacheRecomProfit) {
+		this.cacheRecomProfit = cacheRecomProfit;
+	}
+
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/loadcache/FinanceLoadCacheService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/loadcache/FinanceLoadCacheService.java
new file mode 100644
index 0000000..ef49af1
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/loadcache/FinanceLoadCacheService.java
@@ -0,0 +1,45 @@
+package com.yami.trading.service.finance.loadcache;
+
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.service.finance.service.FinanceRedisKeys;
+import com.yami.trading.service.finance.service.FinanceService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+@Slf4j
+public class FinanceLoadCacheService {
+    private static final Log logger = LogFactory.getLog(FinanceLoadCacheService.class);
+    @Autowired
+    private FinanceService financeService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    public void loadcache() {
+        load();
+        logger.info("完成Finance数据加载redis");
+    }
+
+    public void load() {
+        List<Finance> all = financeService.selectAllNoCache();
+        Map<String, Finance> cacheMap = new ConcurrentHashMap<String, Finance>();
+        for (Finance finance : all) {
+            cacheMap.put(finance.getUuid(), finance);
+            redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_ID + finance.getUuid(), finance);
+        }
+        redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_MAP, cacheMap);
+    }
+
+//	public void setRedisHandler(RedisHandler redisHandler) {
+//		this.redisHandler = redisHandler;
+//	}
+
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceOrderService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceOrderService.java
new file mode 100644
index 0000000..0dcabe1
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceOrderService.java
@@ -0,0 +1,17 @@
+package com.yami.trading.service.finance.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.trading.bean.finance.FinanceOrder;
+
+import java.util.List;
+
+public interface AdminFinanceOrderService extends IService<FinanceOrder> {
+
+	/**
+	 * 代理分页查询
+	 * 
+	 */
+	public Page pagedQuery(int pageNo, int pageSize, String username_para, String finance_para, String status_para,
+						   List<String> children, String orderNo, String rolename_para , String createTime , String closeTime);
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceService.java
new file mode 100644
index 0000000..2e11525
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/AdminFinanceService.java
@@ -0,0 +1,15 @@
+package com.yami.trading.service.finance.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.trading.bean.finance.Finance;
+
+
+public interface AdminFinanceService extends IService<Finance> {
+
+	/**
+	 * 代理分页查询
+	 * 
+	 */
+	public Page pagedQuery(int pageNo, int pageSize, String name_para);
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderLock.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderLock.java
new file mode 100644
index 0000000..90040e6
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderLock.java
@@ -0,0 +1,22 @@
+package com.yami.trading.service.finance.service;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class FinanceOrderLock {
+	private static final Set<String> filter = new HashSet<String>();
+
+	public static boolean add(String order_no) {
+		if (!filter.add(order_no)) {
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	public static void remove(String order_no) {
+		filter.remove(order_no);
+
+	}
+
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderService.java
new file mode 100644
index 0000000..5e438fa
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceOrderService.java
@@ -0,0 +1,67 @@
+package com.yami.trading.service.finance.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.trading.bean.finance.FinanceOrder;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 理财产品订单
+ * 
+ *
+ */
+public interface FinanceOrderService extends IService<FinanceOrder> {
+
+	/**
+	 * 下单
+	 */
+	public void saveCreate(FinanceOrder financeOrder);
+
+	/**
+	 * 赎回
+	 */
+	public void saveClose(FinanceOrder financeOrder);
+	
+	public void saveClose(FinanceOrder financeOrder, Date systemTime);
+
+	/**
+	 * 计算当天收益
+	 */
+	public void addListProfit(FinanceOrder order);
+	
+	public void addListProfit(FinanceOrder order,Date systemTime);
+
+	public FinanceOrder findByOrder_no(String order_no);
+
+	/**
+	 * 按订单状态查询用户订单
+	 * 
+	 * @param partyId
+	 * @param state
+	 * @return
+	 */
+
+	public List<FinanceOrder> findByState(String partyId, String state);
+
+	public Page pagedQuery(int pageNo, int pageSize, String partyId, String state);
+
+	/**
+	 * 
+	 * @return
+	 */
+	public List<FinanceOrder> getAllStateBy_1();
+
+	public FinanceOrder findById(String id);
+	
+	public void update(FinanceOrder entity);
+	/**
+	 *  根据日期获取到当日的购买订单
+	 * @param pageNo
+	 * @param pageSize
+	 * @param date
+	 * @return
+	 */
+	public Page pagedQueryByDate(int pageNo, int pageSize,  String date);
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceRedisKeys.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceRedisKeys.java
new file mode 100644
index 0000000..7e04d62
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceRedisKeys.java
@@ -0,0 +1,12 @@
+package com.yami.trading.service.finance.service;
+
+public class FinanceRedisKeys {
+	/**
+	 * 获取所有的理财产品
+	 */
+	public final static String FINANCE_MAP = "FINANCE_MAP_";
+	/**
+	 * 理财产品,id做key
+	 */
+	public final static String FINANCE_ID = "FINANCE_ID_";
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceService.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceService.java
new file mode 100644
index 0000000..53205f0
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/FinanceService.java
@@ -0,0 +1,28 @@
+package com.yami.trading.service.finance.service;
+
+import com.yami.trading.bean.finance.Finance;
+
+import java.util.List;
+
+/**
+ * 理财产品
+ * 
+ * @author User
+ *
+ */
+public interface FinanceService {
+
+	public void save(Finance finance,String login_safeword,String operaterUsername);
+
+	public void update(Finance finance,String login_safeword,String operaterUsername);
+
+	public Finance findById(String id);
+
+	public void delete(String id,String login_safeword,String operaterUsername);
+
+	public List<Finance> findAll();
+
+	public List<Finance> findAllState_1();
+
+	List<Finance> selectAllNoCache();
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceOrderServiceImpl.java
new file mode 100644
index 0000000..80d691c
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceOrderServiceImpl.java
@@ -0,0 +1,80 @@
+package com.yami.trading.service.finance.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yami.trading.bean.finance.FinanceOrder;
+import com.yami.trading.dao.finance.FinanceOrderMapper;
+import com.yami.trading.service.finance.service.AdminFinanceOrderService;
+import com.yami.trading.service.user.UserRecomService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@Transactional
+public class AdminFinanceOrderServiceImpl extends ServiceImpl<FinanceOrderMapper, FinanceOrder> implements AdminFinanceOrderService {
+//	private PagedQueryDao pagedQueryDao;
+	@Autowired
+	private UserRecomService userRecomService;
+
+	public Page pagedQuery(int pageNo, int pageSize, String name_para, String finance_para, String status_para,
+						   List<String> children, String orderNo, String rolename_para , String createTime , String closeTime) {
+
+//		Map<String, Object> parameters = new HashMap<>();
+//		StringBuffer queryString = new StringBuffer(
+//				" SELECT financeOrder.UUID id,financeOrder.ORDER_NO order_no  ,financeOrder.FINANCE_ID financeId  , ");
+//		queryString.append(" financeOrder.AMOUNT amount,financeOrder.CREATE_TIME create_time, ");
+//		queryString.append("  financeOrder.CLOSE_TIME close_time,financeOrder.PROFIT profit, ");
+//		queryString.append(" financeOrder.STATE state, ");
+//		queryString.append(" party.user_name username,party.user_code usercode,party.role_name rolename, ");
+//		queryString.append(" finance.NAME finance_name,finance.NAME_EN finance_name_en, ");
+//		queryString.append(" finance.NAME_KN finance_name_kn,finance.NAME_JN finance_name_jn ");
+//		queryString.append(" FROM T_FINANCE_ORDER financeOrder   ");
+//		queryString.append(" LEFT JOIN  party ON financeOrder.PARTY_ID = party.UUID  ");
+//		queryString.append(" LEFT JOIN T_FINANCE finance ON finance.UUID = financeOrder.FINANCE_ID ");
+//
+//		queryString.append(" WHERE 1 = 1 ");
+//		if (!StringUtils.isNullOrEmpty(partyId)) {
+//			queryString.append(" and  financeOrder.PARTY_ID in (:partyId) ");
+//			parameters.put("partyId", children);
+//		}
+//
+//		if (!StringUtils.isNullOrEmpty(finance_para)) {
+//			queryString.append(
+//					" and  (finance.NAME=:finance_para or finance.NAME_EN =:finance_para or finance.NAME_CN =:finance_para) ");
+//			parameters.put("finance_para", finance_para);
+//		}
+//
+//		if (!StringUtils.isNullOrEmpty(name_para)) {
+//			queryString.append("AND (party.user_name like:username OR party.user_code like:username ) ");
+//			parameters.put("username", "%" + name_para + "%");
+//		}
+//		if (!StringUtils.isNullOrEmpty(status_para)) {
+//			queryString.append(" and  financeOrder.STATE  =:status_para ");
+//			parameters.put("status_para", status_para);
+//		}
+//		if (!StringUtils.isNullOrEmpty(orderNo)) {
+//			queryString.append(" and financeOrder.ORDER_NO = :orderNo  ");
+//			parameters.put("orderNo", orderNo);
+//
+//		}
+//		if (!StringUtils.isNullOrEmpty(rolename_para)) {
+//			queryString.append(" and   party.role_name =:rolename");
+//			parameters.put("rolename", rolename_para);
+//		}
+//
+//		queryString.append(" order by financeOrder.CREATE_TIME desc ");
+
+//		Page page = null;
+//		Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters);
+//		return page;
+
+		Page page=new Page(pageNo,pageSize);
+		return baseMapper.pagedQuery1(page,name_para,finance_para,status_para, children, orderNo, rolename_para , createTime , closeTime);
+
+	}
+
+
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceServiceImpl.java
new file mode 100644
index 0000000..71564af
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/AdminFinanceServiceImpl.java
@@ -0,0 +1,23 @@
+package com.yami.trading.service.finance.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.dao.finance.FinanceMapper;
+import com.yami.trading.service.finance.service.AdminFinanceService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class AdminFinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance>  implements AdminFinanceService {
+
+	public Page pagedQuery(int pageNo, int pageSize, String name_para) {
+		Page page=new Page(pageNo,pageSize);
+		return baseMapper.pagedQuery(page,name_para);
+	}
+
+//	public void setPagedQueryDao(PagedQueryDao pagedQueryDao) {
+//		this.pagedQueryDao = pagedQueryDao;
+//	}
+}
\ No newline at end of file
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceOrderServiceImpl.java
new file mode 100644
index 0000000..620c5ac
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceOrderServiceImpl.java
@@ -0,0 +1,873 @@
+package com.yami.trading.service.finance.service.impl;
+
+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.data.domain.Realtime;
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.bean.finance.FinanceOrder;
+import com.yami.trading.bean.model.*;
+import com.yami.trading.common.constants.Constants;
+import com.yami.trading.common.exception.BusinessException;
+import com.yami.trading.common.util.Arith;
+import com.yami.trading.common.util.DateUtils;
+import com.yami.trading.common.util.StringUtils;
+import com.yami.trading.common.util.UUIDGenerator;
+import com.yami.trading.dao.finance.FinanceOrderMapper;
+import com.yami.trading.service.MoneyLogService;
+import com.yami.trading.service.WalletService;
+import com.yami.trading.service.data.DataService;
+import com.yami.trading.service.finance.service.FinanceOrderService;
+import com.yami.trading.service.finance.service.FinanceService;
+import com.yami.trading.service.syspara.SysparaService;
+import com.yami.trading.service.user.UserDataService;
+import com.yami.trading.service.user.UserRecomService;
+import com.yami.trading.service.user.UserService;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+@Transactional
+public class FinanceOrderServiceImpl extends ServiceImpl<FinanceOrderMapper, FinanceOrder> implements FinanceOrderService {
+    @Autowired
+    protected WalletService walletService;
+    @Autowired
+    protected MoneyLogService moneyLogService;
+    @Autowired
+    protected FinanceService financeService;
+    @Autowired
+    protected UserService partyService;
+    @Autowired
+    protected SysparaService sysparaService;
+    @Autowired
+    protected UserDataService userDataService;
+    @Autowired
+    protected UserRecomService userRecomService;
+    @Autowired
+    protected DataService dataService;
+
+    public void saveCreate(FinanceOrder entity) {
+
+        entity.setCreateTime(new Date());
+
+        // 加入周期
+        Finance finance = financeService.findById(entity.getFinanceId());
+        entity.setCycle(finance.getCycle());
+
+        // 买入金额需要在区间内
+        if (entity.getAmount() > finance.getInvestmentMax() || entity.getAmount() < finance.getInvestmentMin()) {
+            throw new BusinessException("金额错误");
+
+        }
+
+        // 查看余额
+        Wallet wallet = this.walletService.saveWalletByPartyId((String) entity.getPartyId());
+        double amount_before = wallet.getMoney().doubleValue();
+        System.out.println("wallet = " + wallet);
+        System.out.println("amount_before = " + amount_before);
+        if (amount_before < entity.getAmount()) {
+            throw new BusinessException("余额不足");
+        }
+
+//		wallet.setMoney(Arith.sub(wallet.getMoney(), entity.getAmount()));
+//		this.walletService.update(wallet);
+        this.walletService.update(wallet.getUserId(), Arith.sub(0, entity.getAmount()));
+
+        // 起息时间=确认时间加1天
+        Date date = new Date();// 取时间
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        // 把日期往后增加一天.整数往后推,负数往前移动
+        calendar.add(calendar.DATE, 1);
+        // 这个时间就是日期往后推一天的结果
+        date = calendar.getTime();
+        entity.setEarnTime(date);
+
+        // 截止时间=起息时间+周期+1
+        int days = (int) Arith.sub(entity.getCycle(), 1);
+        calendar.add(calendar.DATE, days);
+        date = calendar.getTime();
+        entity.setStopTime(date);
+
+        // 默认的赎回时间=截止时间+1
+        calendar.add(calendar.DATE, 1);
+        date = calendar.getTime();
+        entity.setCloseTime(date);
+
+        //
+        double amount = Arith.sub(0, entity.getAmount());
+        double amount_after = Arith.add(amount_before, amount);
+        System.out.println("amount_before => " + amount_before);
+        System.out.println("amount_after => " + amount_after);
+        System.out.println("amount => " + amount);
+
+        // 保存资金日志
+        MoneyLog moneylog = new MoneyLog();
+        moneylog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+        moneylog.setAmountBefore(BigDecimal.valueOf(amount_before));
+        moneylog.setAmount(BigDecimal.valueOf(amount));
+        moneylog.setAmountAfter(BigDecimal.valueOf(amount_after));
+        moneylog.setLog("购买理财产品,订单号[" + entity.getOrderNo() + "]");
+        moneylog.setUserId((String) entity.getPartyId());
+        moneylog.setWalletType(Constants.WALLET);
+        moneylog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_BUY);
+
+        moneyLogService.save(moneylog);
+        String uuid = UUIDGenerator.getUUID();
+        entity.setUuid(uuid);
+
+        this.save(entity);
+
+        // 购买理财产品后是否需要增加用户提现流水,1不增加,2要增加(coinspace,cqpro,amex,emex)
+        String finance_buy_add_userdata = this.sysparaService.find("finance_buy_add_userdata").getSvalue();
+
+        // 理财购买后给他增加提现流水限制金额
+        if ("2".equals(finance_buy_add_userdata)) {
+            User party = this.partyService.cacheUserBy(entity.getPartyId().toString());
+//			User party = this.partyService.cachePartyBy(entity.getPartyId(), false);
+            party.setWithdrawLimitAmount(
+                    BigDecimal.valueOf(
+                            Arith.add(party.getWithdrawLimitAmount().doubleValue(), entity.getAmount())
+                    ));
+//			party.setWithdraw_limit_amount(Arith.add(party.getWithdraw_limit_amount(), entity.getAmount()));
+            partyService.updateById(party);
+        }
+    }
+
+    public void saveClose(FinanceOrder entity, Date systemTime) {
+
+        double get_amount = Arith.add(entity.getAmount(), entity.getProfit());
+        if (get_amount < 0) {
+            entity.setProfit(Arith.sub(0, entity.getAmount()));
+            get_amount = Arith.add(entity.getAmount(), entity.getProfit());
+        }
+
+        if (get_amount > 0) {
+            String symbol = entity.getBuyCurrency().toLowerCase();
+            double amount_before;
+            double amount_after;
+            double amount;
+            if (symbol.equals("usdt")) {
+                Wallet wallet = this.walletService.saveWalletByPartyId(entity.getPartyId());
+                amount_before = wallet.getMoney().doubleValue();
+                amount_after = Arith.add(amount_before, get_amount);
+                amount = get_amount;
+                this.walletService.update(wallet.getUserId(), get_amount);
+            } else {
+                //USDT转对应symbol
+                Realtime realtime = this.dataService.realtime(symbol).get(0);
+                amount = Arith.div(get_amount, realtime.getClose().doubleValue(), 8);
+
+                WalletExtend walletExtend = walletService.saveExtendByPara(entity.getPartyId(), symbol);
+                amount_before = walletExtend.getAmount();
+                amount_after = Arith.add(amount_before, get_amount);
+                this.walletService.updateExtend(walletExtend.getPartyId(), walletExtend.getWallettype(), amount);
+            }
+
+            /**
+             * 保存资金日志
+             */
+            MoneyLog moneylog = new MoneyLog();
+            moneylog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+            moneylog.setAmountBefore(BigDecimal.valueOf(amount_before));
+            moneylog.setAmount(BigDecimal.valueOf(Arith.add(0, amount)));
+            moneylog.setAmountAfter(BigDecimal.valueOf(amount_after));
+            moneylog.setLog("赎回理财产品,订单号[" + entity.getOrderNo() + "]");
+            moneylog.setUserId(entity.getPartyId());
+            moneylog.setWalletType(symbol.toUpperCase());
+            moneylog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_BACK);
+            moneylog.setCreateTime(new Date());
+
+            moneyLogService.save(moneylog);
+            entity.setVolume(amount);
+        }
+
+        entity.setCloseTime(new Date());// 赎回时间
+        this.update(entity);
+
+        this.userDataService.saveSellFinance(entity);
+
+    }
+
+    public void saveClose(FinanceOrder entity) {
+        double get_amount = Arith.add(entity.getAmount(), entity.getProfit());
+        if (get_amount < 0) {
+            entity.setProfit(Arith.sub(0, entity.getAmount()));
+            get_amount = Arith.add(entity.getAmount(), entity.getProfit());
+        }
+
+        if (get_amount > 0) {
+            String symbol = entity.getBuyCurrency().toLowerCase();
+            double amount_before;
+            double amount_after;
+            double amount;
+            if (symbol.equals("usdt")) {
+                Wallet wallet = this.walletService.saveWalletByPartyId(entity.getPartyId());
+                amount_before = wallet.getMoney().doubleValue();
+                amount_after = Arith.add(amount_before, get_amount);
+                amount = get_amount;
+                this.walletService.update(wallet.getUserId(), get_amount);
+            } else {
+                //USDT转对应symbol
+                Realtime realtime = this.dataService.realtime(symbol).get(0);
+                amount = Arith.div(get_amount, realtime.getClose().doubleValue(), 8);
+
+                WalletExtend walletExtend = walletService.saveExtendByPara(entity.getPartyId(), symbol);
+                amount_before = walletExtend.getAmount();
+                amount_after = Arith.add(amount_before, amount);
+                this.walletService.updateExtend(walletExtend.getPartyId(), walletExtend.getWallettype(), amount);
+            }
+
+            /**
+             * 保存资金日志
+             */
+            MoneyLog moneylog = new MoneyLog();
+            moneylog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+            moneylog.setAmountBefore(BigDecimal.valueOf(amount_before));
+            moneylog.setAmount(BigDecimal.valueOf(Arith.add(0, amount)));
+            moneylog.setAmountAfter(BigDecimal.valueOf(amount_after));
+            moneylog.setLog("赎回理财产品,订单号[" + entity.getOrderNo() + "]");
+            moneylog.setUserId(entity.getPartyId());
+            moneylog.setWalletType(symbol.toUpperCase());
+            moneylog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_BACK);
+            moneylog.setCreateTime(new Date());
+
+            moneyLogService.save(moneylog);
+            entity.setVolume(amount);
+        }
+
+        entity.setCloseTime(new Date());// 赎回时间
+        this.update(entity);
+
+        this.userDataService.saveSellFinance(entity);
+
+    }
+
+    @Override
+    public FinanceOrder findByOrder_no(String order_no) {
+        LambdaQueryWrapper<FinanceOrder> queryWrapper = new LambdaQueryWrapper<FinanceOrder>()
+                .eq(FinanceOrder::getOrderNo, order_no)
+                .last("LIMIT 1");
+        return getOne(queryWrapper);
+    }
+
+    public List<FinanceOrder> findByState(String partyId, String state) {
+        /**
+         * 如果是查询已赎回的,则将提前赎回和正常赎回的都查出来
+         */
+        //暂时隐藏
+        List<FinanceOrder> list = null;
+        if ("2".equals(state)) {
+//			list = (List<FinanceOrder>)getHibernateTemplate().find(" FROM FinanceOrder WHERE partyId =?0 and state = ?1 or state =?2  ",
+//					new Object[] { partyId, "0", "2" });
+            LambdaQueryWrapper<FinanceOrder> queryWrapper = new LambdaQueryWrapper<FinanceOrder>().and(
+                    wq -> wq.eq(FinanceOrder::getState, 0).or().eq(FinanceOrder::getState, 2))
+                    .eq(FinanceOrder::getPartyId, partyId);
+            list = this.getBaseMapper().selectList(queryWrapper);
+        }
+        if ("0".equals(state) || "1".equals(state)) {
+//			list = (List<FinanceOrder>)getHibernateTemplate().find(" FROM FinanceOrder WHERE state = ?0 and partyId =?1",
+//					new Object[] { state, partyId });
+            LambdaQueryWrapper<FinanceOrder> queryWrapper = new LambdaQueryWrapper<FinanceOrder>()
+                    .eq(FinanceOrder::getState, state).eq(FinanceOrder::getPartyId, partyId);
+            list = this.getBaseMapper().selectList(queryWrapper);
+        } else {
+//			list = (List<FinanceOrder>)getHibernateTemplate().find(" FROM FinanceOrder WHERE  partyId =?0", new Object[] { partyId });
+            LambdaQueryWrapper<FinanceOrder> queryWrapper = new LambdaQueryWrapper<FinanceOrder>()
+                    .eq(FinanceOrder::getPartyId, partyId);
+            list = this.getBaseMapper().selectList(queryWrapper);
+        }
+
+        if (!list.isEmpty())
+            return list;
+        return null;
+    }
+
+    public Page pagedQuery(int pageNo, int pageSize, String partyId, String state) {
+        Page page = new Page(pageNo, pageSize);
+        LambdaQueryWrapper<FinanceOrder> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotEmpty(partyId), FinanceOrder::getPartyId, partyId);
+        if(Objects.equals(state, "4")){
+            queryWrapper.eq(FinanceOrder::getState, "0").or().eq(FinanceOrder::getState, "2").eq(StringUtils.isNotEmpty(partyId), FinanceOrder::getPartyId, partyId);;
+        }else{
+            queryWrapper.eq(StringUtils.isNotEmpty(state), FinanceOrder::getState, state);
+        }
+
+        return baseMapper.selectPage(page, queryWrapper);
+    }
+
+//	public Page pagedQuery(int pageNo, int pageSize, String partyId, String state) {
+//		/**
+//		 * 如果是查询已赎回的,则将提前赎回和正常赎回的都查出来
+//		 */
+//		StringBuffer queryString = new StringBuffer("");
+//		queryString.append(" FROM FinanceOrder WHERE 1=1 ");
+//		Map parameters = new HashMap();
+//		queryString.append("AND partyId=:partyId ");
+//		parameters.put("partyId", partyId);
+//		if (StringUtils.isNotEmpty(state)) {
+//			if ("2".equals(state)) {
+//				queryString.append(" AND (state =:state_2 OR state =:state_0 )");
+//				parameters.put("state_2", "0");
+//				parameters.put("state_0", "2");
+//
+//			} else if ("02".equals(state)) {
+//				/**
+
+//				 * 兼容其他项目所写,2提前赎回 (违约)
+//				 */
+//				queryString.append("AND state=:state ");
+//				parameters.put("state", "2");
+//			} else {
+//				queryString.append("AND state=:state ");
+//				parameters.put("state", state);
+//			}
+//		}
+//		queryString.append(" order by create_time desc ");
+//
+//		Page page = this.pagedDao.pagedQueryHql(pageNo, pageSize, queryString.toString(), parameters);
+//
+//		return page;
+//	}
+
+    /**
+     * 根据日期获取到当日的购买订单
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param date
+     * @return
+     */
+    public Page pagedQueryByDate(int pageNo, int pageSize, String date) {
+        /**
+         * 如果是查询已赎回的,则将提前赎回和正常赎回的都查出来
+         */
+        Page page = new Page(pageNo, pageSize);
+        return baseMapper.pagedQueryByDate(page, date);
+
+//		StringBuffer queryString = new StringBuffer("");
+//		queryString.append(" FROM FinanceOrder WHERE 1=1 ");
+//		Map parameters = new HashMap();
+//		queryString.append("AND DATE(create_time) = DATE(:date) ");
+//		parameters.put("date", date);
+//
+//		queryString.append(" order by create_time asc ");
+//
+//		Page page = this.pagedDao.pagedQueryHql(pageNo, pageSize, queryString.toString(), parameters);
+//
+//		return page;
+    }
+
+    public void setWalletService(WalletService walletService) {
+        this.walletService = walletService;
+    }
+
+    public void setMoneyLogService(MoneyLogService moneyLogService) {
+        this.moneyLogService = moneyLogService;
+    }
+
+    public void setFinanceService(FinanceService financeService) {
+        this.financeService = financeService;
+    }
+
+    @Override
+    public List<FinanceOrder> getAllStateBy_1() {
+        LambdaQueryWrapper<FinanceOrder> queryWrapper = new LambdaQueryWrapper<FinanceOrder>().eq(FinanceOrder::getState, 1);
+        return list(queryWrapper);
+    }
+
+    public void addListProfit(FinanceOrder order) {
+
+        /**
+         * 截止时间要大于现在这个时间则计算收益 赎回时间如果小于现在时间则不计算收益
+         */
+        List<Finance> finances = financeService.findAll();
+        Finance finance = new Finance();
+        Date now_date = new Date();
+        String date_string = DateUtils.format(now_date, DateUtils.DF_yyyyMMdd);
+
+        /**
+         * 现在时间是否大于赎回时间,如果大于等于,则赎回,不计算收益了,并将状态改变为已赎回 只计算年月日
+         */
+        String order_date = DateUtils.format(order.getCloseTime(), DateUtils.DF_yyyyMMdd);
+        String order_earn = DateUtils.format(order.getEarnTime(), DateUtils.DF_yyyyMMdd);
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date_now = null;
+        Date close_date = null;
+        Date earn_date = null;
+        try {
+            date_now = dateFormat.parse(date_string);
+            close_date = dateFormat.parse(order_date);
+            earn_date = dateFormat.parse(order_earn);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        /**
+         * 理财收益赎回时统一下发1还是每日下发2
+         */
+        String finance_profit_days = sysparaService.find("finance_profit_days").getSvalue();
+        System.out.println("finance_profit_days2 = " + finance_profit_days);
+        if ("1".equals(finance_profit_days)) {
+
+            // 如果赎回时间close_date < 现在时间date_now 则 arrive_close > 0
+            int arrive_close = date_now.compareTo(close_date);
+            if (arrive_close >= 0) {
+                order.setState("0");
+                saveClose(order);
+                return;
+            }
+            // 如果起息时间earn_date < 现在时间date_now 则 arrive_close > 0
+            // 起息时间要大于等于今天
+            int arrive_earn = date_now.compareTo(earn_date);
+            if (arrive_earn < 0) {
+                return;
+            }
+
+            for (int j = 0; j < finances.size(); j++) {
+                finance = finances.get(j);
+                if (finance.getUuid().equals(order.getFinanceId())) {
+                    break;
+                }
+            }
+            /**
+             * 当日获取的收益
+             */
+            double today_rate = Arith.mul(finance.getTodayRate(), 0.01);
+            double get_amount = Arith.mul(order.getAmount(), today_rate);
+            order.setProfit(Arith.add(order.getProfit(), get_amount));
+
+            this.update(order);
+        }
+
+        if ("2".equals(finance_profit_days)) {
+
+            // 如果赎回时间close_date < 现在时间date_now 则 arrive_close > 0
+            int arrive_close = date_now.compareTo(close_date);
+            if (arrive_close >= 0) {
+                order.setState("0");
+                // 自动赎回调用,只返回本金
+                saveClosePrincipal(order);
+                return;
+            }
+            // 如果起息时间earn_date < 现在时间date_now 则 arrive_close > 0
+            /**
+             * 起息时间要大于等于今天
+             */
+            int arrive_earn = date_now.compareTo(earn_date);
+            if (arrive_earn < 0) {
+                return;
+            }
+
+            for (int j = 0; j < finances.size(); j++) {
+                finance = finances.get(j);
+                if (finance.getUuid().equals(order.getFinanceId())) {
+                    break;
+                }
+            }
+            /**
+             * 当日获取的收益
+             */
+            double today_rate = Arith.mul(finance.getTodayRate(), 0.01);
+            double get_amount = Arith.mul(order.getAmount(), today_rate);
+
+            // 5,0.5,3,0.3,2,0.2
+            String finance_level_profit = sysparaService.find("finance_level_profit").getSvalue();
+            boolean finance_level_profit_open = StringUtils.isNotEmpty(finance_level_profit);
+            // 判断是否有理财推荐奖励,如果有,需要扣除30%给推荐人
+            String finance_bonus_parameters = "";
+            finance_bonus_parameters = this.sysparaService.find("finance_bonus_parameters").getSvalue();
+            if ((finance_bonus_parameters != null && !"".equals(finance_bonus_parameters))
+                    || finance_level_profit_open) {
+                String[] finance_bonus_array = StringUtils.isNotEmpty(finance_bonus_parameters)
+                        ? finance_bonus_parameters.split(",")
+                        : new String[]{};
+                List<UserRecom> list_parents = this.userRecomService.getParents(order.getPartyId().toString());
+
+                if (CollectionUtils.isNotEmpty(list_parents)) {
+
+                    int loop = 0;
+                    for (int i = 0; i < list_parents.size(); i++) {
+                        if (finance_level_profit_open) {// 等级奖励只给推荐一人
+                            if (loop >= 1) {
+                                break;
+                            }
+                        } else {
+                            if (loop >= 3) {
+                                break;
+                            }
+                        }
+
+                        User party_parent = this.partyService.cacheUserBy(list_parents.get(i).getRecomUserId());
+                        if (!Constants.SECURITY_ROLE_MEMBER.equals(party_parent.getRoleName())) {
+                            continue;
+                        }
+                        get_amount = Arith.mul(order.getAmount(), today_rate);
+                        /**
+                         * 增加推荐人理财收益
+                         */
+                        double parent_get_money = 0d;
+                        if (finance_level_profit_open) {
+                            parent_get_money = levelProfit(party_parent.getUserId(), get_amount,
+                                    finance_level_profit);
+                        } else {
+                            double finance_pip_amount = Double.valueOf(finance_bonus_array[loop]);
+                            parent_get_money = Arith.mul(get_amount, finance_pip_amount);
+                        }
+                        if (parent_get_money == 0d) {
+                            break;
+                        }
+
+                        Wallet wallet_parent = walletService.saveWalletByPartyId(party_parent.getUserId());
+                        double amount_before_parent = wallet_parent.getMoney().doubleValue();
+                        walletService.update(wallet_parent.getUserId(), parent_get_money);
+                        /**
+                         * 保存资金日志
+                         */
+                        MoneyLog moneyLog = new MoneyLog();
+                        moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+                        moneyLog.setAmountBefore(BigDecimal.valueOf(amount_before_parent));
+                        moneyLog.setAmount(BigDecimal.valueOf(parent_get_money));
+                        moneyLog.setAmountAfter(
+                                BigDecimal.valueOf(
+                                        Arith.add(wallet_parent.getMoney().doubleValue(), parent_get_money)));
+                        moneyLog.setLog("第" + (i + 1) + "代下级用户,每日理财收益奖励金");
+                        moneyLog.setUserId(party_parent.getUserId());
+                        moneyLog.setWalletType(Constants.WALLET);
+                        moneyLog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_RECOM_PROFIT);
+                        moneyLogService.save(moneyLog);
+
+                        loop++;
+                    }
+                }
+                /**
+                 * 理财收益减少百分之30给上级
+                 */
+                if (!finance_level_profit_open) {// 等级奖励则无需扣除本人收益
+                    get_amount = Arith.sub(get_amount, Arith.mul(order.getAmount(), 0.3));
+                }
+            }
+
+            Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId().toString());
+            double amount_before = wallet.getMoney().doubleValue();
+//			wallet.setMoney(Arith.add(wallet.getMoney(), get_amount));
+            this.walletService.update(wallet.getUserId(), get_amount);
+//			this.walletService.update(wallet);
+            /**
+             * 保存资金日志
+             */
+            MoneyLog moneylog = new MoneyLog();
+            moneylog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+            moneylog.setAmountBefore(BigDecimal.valueOf(amount_before));
+            moneylog.setAmount(BigDecimal.valueOf(Arith.add(0, get_amount)));
+            moneylog.setAmountAfter(BigDecimal.valueOf(
+                    Arith.add(wallet.getMoney().doubleValue(), get_amount)));
+            moneylog.setLog("理财产品每日收益,订单号[" + order.getOrderNo() + "]");
+            moneylog.setUserId(order.getPartyId().toString());
+            moneylog.setWalletType(Constants.WALLET);
+            moneylog.setContentType(Constants.MONEYLOG_CONTENT_FINANCE_PROFIT);
+
+            moneyLogService.save(moneylog);
+
+            order.setProfit(Arith.add(order.getProfit(), get_amount));
+
+            this.update(order);
+        }
+
+    }
+
+    public void addListProfit(FinanceOrder order, Date systemTime) {
+
+        /**
+         * 截止时间要大于现在这个时间则计算收益 赎回时间如果小于现在时间则不计算收益
+         */
+        List<Finance> finances = financeService.findAll();
+        Finance finance = new Finance();
+        Date now_date = systemTime != null ? systemTime : new Date();
+        String date_string = DateUtils.format(now_date, DateUtils.DF_yyyyMMdd);
+
+        /**
+         * 现在时间是否大于赎回时间,如果大于等于,则赎回,不计算收益了,并将状态改变为已赎回 只计算年月日
+         */
+        String order_date = DateUtils.format(order.getCloseTime(), DateUtils.DF_yyyyMMdd);
+        String order_earn = DateUtils.format(order.getEarnTime(), DateUtils.DF_yyyyMMdd);
+        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date_now = null;
+        Date close_date = null;
+        Date earn_date = null;
+        try {
+            date_now = dateFormat.parse(date_string);
+            close_date = dateFormat.parse(order_date);
+            earn_date = dateFormat.parse(order_earn);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+
+        /**
+         * 理财收益赎回时统一下发1还是每日下发2
+         */
+        String finance_profit_days = sysparaService.find("finance_profit_days").getSvalue();
+        System.out.println("finance_profit_days = " + finance_profit_days);
+
+        /**
+         * 1计算收益,赎回统一发放
+         */
+        if ("1".equals(finance_profit_days)) {
+            // 如果赎回时间close_date < 现在时间date_now 则 arrive_close > 0
+            int arrive_close = date_now.compareTo(close_date);
+            if (arrive_close >= 0) {
+                order.setState("0");
+                saveClose(order, systemTime);
+                return;
+            }
+            // 如果起息时间earn_date < 现在时间date_now 则 arrive_close > 0
+            /**
+             * 起息时间要大于等于今天
+             */
+            int arrive_earn = date_now.compareTo(earn_date);
+            if (arrive_earn < 0) {
+                return;
+            }
+
+            for (int j = 0; j < finances.size(); j++) {
+                finance = finances.get(j);
+                if (finance.getUuid().equals(order.getFinanceId())) {
+                    break;
+                }
+            }
+            /**
+             * 当日获取的收益
+             */
+            double today_rate = Arith.mul(finance.getTodayRate(), 0.01);
+            double get_amount = Arith.mul(order.getAmount(), today_rate);
+
+            order.setProfit(Arith.add(order.getProfit(), get_amount));
+
+            this.update(order);
+
+        }
+
+        /**
+         * 2每日下发收益
+         */
+        if ("2".equals(finance_profit_days)) {
+
+            // 如果赎回时间close_date < 现在时间date_now 则 arrive_close > 0
+            int arrive_close = date_now.compareTo(close_date);
+            if (arrive_close >= 0) {
+                order.setState("0");
+                /**
+                 * 自动赎回调用,只返回本金
+                 */
+                saveClosePrincipal(order);
+                return;
+            }
+            // 如果起息时间earn_date < 现在时间date_now 则 arrive_close > 0
+            /**
+             * 起息时间要大于等于今天
+             */
+            int arrive_earn = date_now.compareTo(earn_date);
+            if (arrive_earn < 0) {
+                return;
+            }
+
+            for (int j = 0; j < finances.size(); j++) {
+                finance = finances.get(j);
+                if (finance.getUuid().equals(order.getFinanceId())) {
+                    break;
+                }
+            }
+
+            /**
+             * 当日获取的收益
+             */
+
+            double today_rate = Arith.mul(finance.getTodayRate(), 0.01);
+            double get_amount = Arith.mul(order.getAmount(), today_rate);
+
+            // 5,0.5,3,0.3,2,0.2
+            String finance_level_profit = sysparaService.find("finance_level_profit").getSvalue();
+            boolean finance_level_profit_open = StringUtils.isNotEmpty(finance_level_profit);
+            // 判断是否有理财推荐奖励,如果有,需要扣除30%给推荐人
+            String finance_bonus_parameters = "";
+            finance_bonus_parameters = this.sysparaService.find("finance_bonus_parameters").getSvalue();
+            if ((finance_bonus_parameters != null && !"".equals(finance_bonus_parameters))
+                    || finance_level_profit_open) {
+                String[] finance_bonus_array = StringUtils.isNotEmpty(finance_bonus_parameters)
+                        ? finance_bonus_parameters.split(",")
+                        : new String[]{};
+                List<UserRecom> list_parents = this.userRecomService.getParents(order.getPartyId().toString());
+
+                if (CollectionUtils.isNotEmpty(list_parents)) {
+
+                    int loop = 0;
+                    for (int i = 0; i < list_parents.size(); i++) {
+                        if (finance_level_profit_open) {// 等级奖励只给推荐一人
+                            if (loop >= 1) {
+                                break;
+                            }
+                        } else {
+                            if (loop >= 3) {
+                                break;
+                            }
+                        }
+                        User party_parent = this.partyService.cacheUserBy(list_parents.get(i).getRecomUserId());
+                        if (!Constants.SECURITY_ROLE_MEMBER.equals(party_parent.getRoleName())) {
+                            continue;
+                        }
+                        get_amount = Arith.mul(order.getAmount(), today_rate);
+                        /**
+                         * 增加推荐人理财收益
+                         */
+                        double parent_get_money = 0d;
+                        if (finance_level_profit_open) {
+                            parent_get_money = levelProfit(party_parent.getUserId(), get_amount,
+                                    finance_level_profit);
+                        } else {
+                            double finance_pip_amount = Double.valueOf(finance_bonus_array[loop]);
+                            parent_get_money = Arith.mul(get_amount, finance_pip_amount);
+                        }
+                        if (parent_get_money == 0d) {
+                            break;
+                        }
+                        Wallet wallet_parent = walletService.saveWalletByPartyId(party_parent.getUserId());
+                        double amount_before_parent = wallet_parent.getMoney().doubleValue();
+                        walletService.update(wallet_parent.getUserId(), parent_get_money);
+                        /**
+                         * 保存资金日志
+                         */
+                        MoneyLog moneyLog = new MoneyLog();
+                        moneyLog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+                        moneyLog.setAmountBefore(BigDecimal.valueOf(amount_before_parent));
+                        moneyLog.setAmount(BigDecimal.valueOf(parent_get_money));
+                        moneyLog.setAmountAfter(
+                                BigDecimal.valueOf(Arith.add(wallet_parent.getMoney().doubleValue(), parent_get_money)));
+                        moneyLog.setLog("第" + (i + 1) + "代下级用户,每日理财收益奖励金");
+                        moneyLog.setUserId(party_parent.getUserId());
+//						moneyLog.setPartyId(party_parent.getId().toString());
+                        moneyLog.setWalletType(Constants.WALLET);
+                        moneyLog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_RECOM_PROFIT);
+                        moneyLog.setCreateTime(systemTime);
+                        moneyLogService.save(moneyLog);
+
+                        loop++;
+                    }
+                }
+                /**
+                 * 理财收益减少百分之30给上级
+                 */
+                if (finance_level_profit_open) {// 等级奖励则无需扣除本人收益
+                    get_amount = Arith.sub(get_amount, Arith.mul(get_amount, 0.3));
+                }
+            }
+
+            Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId().toString());
+            double amount_before = wallet.getMoney().doubleValue();
+//			wallet.setMoney(Arith.add(wallet.getMoney(), get_amount));
+            this.walletService.update(wallet.getUserId().toString(), get_amount);
+//			this.walletService.update(wallet);
+            /**
+             * 保存资金日志
+             */
+            MoneyLog moneylog = new MoneyLog();
+            moneylog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+            moneylog.setAmountBefore(BigDecimal.valueOf(amount_before));
+            moneylog.setAmount(BigDecimal.valueOf(Arith.add(0, get_amount)));
+            moneylog.setAmountAfter(BigDecimal.valueOf(Arith.add(wallet.getMoney().doubleValue(), get_amount)));
+            moneylog.setLog("理财产品每日收益,订单号[" + order.getOrderNo() + "]");
+            moneylog.setUserId(order.getPartyId().toString());
+            moneylog.setWalletType(Constants.WALLET);
+            moneylog.setContentType(Constants.MONEYLOG_CONTENT_FINANCE_PROFIT);
+            moneylog.setCreateTime(systemTime);
+            moneyLogService.save(moneylog);
+            order.setProfit(Arith.add(order.getProfit(), get_amount));
+            this.update(order);
+
+        }
+
+    }
+
+    /**
+     * 每日下发收益,自动赎回调用,只返回本金
+     */
+    public void saveClosePrincipal(FinanceOrder entity) {
+        double get_amount = Arith.add(entity.getAmount(), entity.getProfitBefore());
+        if (get_amount < 0) {
+            entity.setProfit(Arith.sub(0, entity.getAmount()));
+            get_amount = Arith.add(entity.getAmount(), entity.getProfit());
+        }
+
+        if (get_amount > 0) {
+            Wallet wallet = this.walletService.saveWalletByPartyId(entity.getPartyId().toString());
+            double amount_before = wallet.getMoney().doubleValue();
+            this.walletService.update(wallet.getUserId().toString(), get_amount);
+            /**
+             * 保存资金日志
+             */
+            MoneyLog moneylog = new MoneyLog();
+            moneylog.setCategory(Constants.MONEYLOG_CATEGORY_FINANCE);
+            moneylog.setAmountBefore(BigDecimal.valueOf(amount_before));
+            moneylog.setAmount(BigDecimal.valueOf(Arith.add(0, get_amount)));
+            moneylog.setAmountAfter(BigDecimal.valueOf(Arith.add(wallet.getMoney().doubleValue(), get_amount)));
+            moneylog.setLog("赎回理财产品,订单号[" + entity.getOrderNo() + "]");
+            moneylog.setUserId(entity.getPartyId().toString());
+            moneylog.setWalletType(Constants.WALLET);
+            moneylog.setContentType(WalletConstants.MONEYLOG_CONTENT_FINANCE_BACK);
+
+            moneyLogService.save(moneylog);
+
+        }
+
+        this.update(entity);
+
+        this.userDataService.saveSellFinance(entity);
+
+    }
+
+    /**
+     * 等级奖励
+     *
+     * @param partyId
+     * @param profit
+     * @return 返回奖励
+     */
+    public double levelProfit(String partyId, double profit, String finance_level_profit) {
+        // 5,0.5,3,0.3,2,0.2
+        double levelProfitMoney = 0d;
+        if (StringUtils.isEmptyString(finance_level_profit)) {
+            return levelProfitMoney;
+        }
+        List<UserRecom> listRecoms = this.userRecomService.findRecoms(partyId);
+        int recomsNum = listRecoms.size();
+        String[] finance_level_profit_array = finance_level_profit.split(",");
+
+        for (int i = 0; i < finance_level_profit_array.length; i++) {
+            double levelNeed = Double.valueOf(finance_level_profit_array[i]);
+
+            if (recomsNum >= levelNeed) {// 等级满足要求
+                double pipAmount = Double.valueOf(finance_level_profit_array[i + 1]);
+                levelProfitMoney = Arith.mul(profit, pipAmount);
+                break;
+            }
+            i++;
+        }
+        return levelProfitMoney;
+    }
+
+    public FinanceOrder findById(String id) {
+        return getById(id);
+    }
+
+    public void update(FinanceOrder entity) {
+       updateById(entity);
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceServiceImpl.java
new file mode 100644
index 0000000..3811f6b
--- /dev/null
+++ b/trading-order-service/src/main/java/com/yami/trading/service/finance/service/impl/FinanceServiceImpl.java
@@ -0,0 +1,123 @@
+package com.yami.trading.service.finance.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yami.trading.bean.finance.Finance;
+import com.yami.trading.dao.finance.FinanceMapper;
+import com.yami.trading.service.finance.service.FinanceRedisKeys;
+import com.yami.trading.service.finance.service.FinanceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Service
+@Transactional
+public class FinanceServiceImpl extends ServiceImpl<FinanceMapper, Finance> implements FinanceService {
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    public void save(Finance entity, String login_safeword, String operaterUsername) {
+
+
+        //todo
+//		User sec =  this.secUserService.findByUserName(operaterUsername);
+//		String sysSafeword = sec.getSafePassword();
+//		String safeword_md5 = passwordEncoder.encode(login_safeword);
+//		if (!safeword_md5.equals(sysSafeword)) {
+//			throw new BusinessException("资金密码错误");
+//		}
+        this.save(entity);
+//		redisHandler.setSync(FinanceRedisKeys.FINANCE_ID + entity.getId().toString(), entity);
+        redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_ID + entity.getUuid(), entity);
+
+        Map<String, Finance> cacheMap = (Map<String, Finance>) redisTemplate.opsForValue().get(FinanceRedisKeys.FINANCE_MAP);
+        if (cacheMap == null) {
+            cacheMap = new ConcurrentHashMap<String, Finance>();
+        }
+        cacheMap.put(entity.getUuid(), entity);
+//		redisHandler.setSync(FinanceRedisKeys.FINANCE_MAP, cacheMap);
+        redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_MAP, cacheMap);
+
+    }
+
+    public void update(Finance entity, String login_safeword, String operaterUsername) {
+
+        System.out.println("operaterUsername => " + operaterUsername);
+        //todo
+//		User sec =  this.secUserService.findByUserName(operaterUsername);
+
+//		String sysSafeword = sec.getSafePassword();
+//		String safeword_md5 = passwordEncoder.encode(login_safeword);
+//		if (!safeword_md5.equals(sysSafeword)) {
+//			throw new BusinessException("资金密码错误");
+//		}
+
+        this.updateById(entity);
+//		redisHandler.setSync(FinanceRedisKeys.FINANCE_ID + entity.getId().toString(), entity);
+        redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_ID + entity.getUuid(), entity);
+
+        Map<String, Finance> cacheMap = (Map<String, Finance>) redisTemplate.opsForValue().get(FinanceRedisKeys.FINANCE_MAP);
+        if (cacheMap == null) {
+            cacheMap = new ConcurrentHashMap<String, Finance>();
+        }
+        cacheMap.put(entity.getUuid(), entity);
+        redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_MAP, cacheMap);
+
+    }
+
+    public void delete(String id, String login_safeword, String operaterUsername) {
+
+        //todo
+//		User sec =  this.secUserService.findByUserName(operaterUsername);
+//		String sysSafeword = sec.getSafePassword();
+//		String safeword_md5 = passwordEncoder.encode(login_safeword);
+//		if (!safeword_md5.equals(sysSafeword)) {
+//			throw new BusinessException("资金密码错误");
+//		}
+
+
+        Finance entity = findById(id);
+        this.removeById(entity);
+//		redisHandler.remove(FinanceRedisKeys.FINANCE_ID + entity.getUuid().toString());
+        redisTemplate.delete(FinanceRedisKeys.FINANCE_ID + entity.getUuid());
+
+        Map<String, Finance> cacheMap = (Map<String, Finance>) redisTemplate.opsForValue().get(FinanceRedisKeys.FINANCE_MAP);
+        if (cacheMap != null && !cacheMap.isEmpty()) {
+            cacheMap.remove(entity.getUuid());
+            redisTemplate.opsForValue().set(FinanceRedisKeys.FINANCE_MAP, cacheMap);
+        }
+
+
+    }
+
+    public Finance findById(String id) {
+        return (Finance) redisTemplate.opsForValue().get(FinanceRedisKeys.FINANCE_ID + id);
+    }
+
+    public List<Finance> findAll() {
+        Map<String, Finance> cacheMap = (Map<String, Finance>) redisTemplate.opsForValue().get(FinanceRedisKeys.FINANCE_MAP);
+        if (cacheMap != null && !cacheMap.isEmpty()) {
+            return new ArrayList<>(cacheMap.values());
+        }
+        return new ArrayList<>();
+    }
+
+    public List<Finance> findAllState_1() {
+        LambdaQueryWrapper<Finance> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Finance::getState, 1);
+        queryWrapper.orderByAsc(Finance::getInvestmentMin);
+        return list(queryWrapper);
+    }
+
+    @Override
+    public List<Finance> selectAllNoCache() {
+        return list();
+    }
+}
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderProfitServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderProfitServiceImpl.java
index eefdfb9..365bd41 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderProfitServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderProfitServiceImpl.java
@@ -273,19 +273,19 @@
 		String miner_buy_symbol = sysparaService.find("miner_buy_symbol").getSvalue();
 		if (StringUtils.isNotEmpty(miner_buy_symbol)) {
 			if (miner_buy_symbol.equals(miner_profit_symbol)) {
-				day_profit = Arith.mul(day_profit, realtime.getClose());
+				day_profit = Arith.mul(day_profit, realtime.getClose().doubleValue());
 			} else {
 				List<Realtime> realtime_list = this.dataService.realtime(miner_buy_symbol);
 				Realtime realtimeBuySymbol = null;
 				if (realtime_list.size() > 0) {
 					realtimeBuySymbol = realtime_list.get(0);
 				}
-				day_profit = Arith.mul(day_profit, realtimeBuySymbol.getClose());
+				day_profit = Arith.mul(day_profit, realtimeBuySymbol.getClose().doubleValue());
 			}
 		}
 		// 非USDT币种收益
 		if (StringUtils.isNotEmpty(miner_profit_symbol)) {
-			double getSymbolVolume = Arith.div(day_profit, realtime.getClose());
+			double getSymbolVolume = Arith.div(day_profit, realtime.getClose().doubleValue());
 
 			WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), miner_profit_symbol);
 			double amountBefore = walletExtend.getAmount();
@@ -336,19 +336,19 @@
 		String miner_buy_symbol = sysparaService.find("miner_buy_symbol").getSvalue();
 		if (StringUtils.isNotEmpty(miner_buy_symbol)) {
 			if (miner_buy_symbol.equals(miner_profit_symbol)) {
-				day_profit = Arith.mul(day_profit, realtime.getClose());
+				day_profit = Arith.mul(day_profit, realtime.getClose().doubleValue());
 			} else {
 				List<Realtime> realtime_list = this.dataService.realtime(miner_buy_symbol);
 				Realtime realtimeBuySymbol = null;
 				if (realtime_list.size() > 0) {
 					realtimeBuySymbol = realtime_list.get(0);
 				}
-				day_profit = Arith.mul(day_profit, realtimeBuySymbol.getClose());
+				day_profit = Arith.mul(day_profit, realtimeBuySymbol.getClose().doubleValue());
 			}
 		}
 		// 非Usdt币种收益
 		if (StringUtils.isNotEmpty(miner_profit_symbol)) {
-			double get_symbol_volume = Arith.div(day_profit, realtime.getClose());
+			double get_symbol_volume = Arith.div(day_profit, realtime.getClose().doubleValue());
 
 			WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), miner_profit_symbol);
 			double amountBefore = walletExtend.getAmount();
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderServiceImpl.java b/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderServiceImpl.java
index be05886..5f600ce 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderServiceImpl.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/miner/service/impl/MinerOrderServiceImpl.java
@@ -167,7 +167,7 @@
 			if (null == realtimes || realtimes.size() <= 0) {
 				throw new BusinessException("行情获取异常,稍后再试");
 			}
-			close = realtimes.get(0).getClose();
+			close = realtimes.get(0).getClose().doubleValue();
 			saveMinerBuyOtherCoin(entity, buyCurrency);
 		}
 
@@ -330,7 +330,7 @@
 			if (CollectionUtils.isEmpty(realtimes) || null == realtimes.get(0)) {
 				throw new BusinessException("系统错误,请稍后重试 saveCreate");
 			}
-			close = realtimes.get(0).getClose();
+			close = realtimes.get(0).getClose().doubleValue();
 
 			saveMinerBuyOtherCoin(entity, minerBuySymbol);
 		} else {
@@ -678,7 +678,7 @@
 			if (null == realtimes || realtimes.size() <= 0) {
 				throw new BusinessException("行情获取异常,稍后再试");
 			}
-			close = realtimes.get(0).getClose();
+			close = realtimes.get(0).getClose().doubleValue();
 			saveMinerCloseOtherCoin(entity, buyCurrency);
 		}
 
@@ -742,7 +742,7 @@
 			if (CollectionUtils.isEmpty(realtimes) || null == realtimes.get(0)) {
 				throw new BusinessException("系统错误,请稍后重试 saveClose");
 			}
-			close = realtimes.get(0).getClose();
+			close = realtimes.get(0).getClose().doubleValue();
 
 			saveMinerCloseOtherCoin(entity, minerBuySymbol);
 		} else if (entity.getAmount() != 0) {// 体验矿机,购买价为0
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 5ccb055..55e051d 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
@@ -145,7 +145,7 @@
 			} else {
 				throw new BusinessException("行情获取异常,稍后再试");
 			}
-			symbol_profit = Arith.mul(symbol_profit, realtime.getClose());
+			symbol_profit = Arith.mul(symbol_profit, realtime.getClose().doubleValue());
 		}
 
 		if (StringUtils.isNotEmpty(miner_profit_symbol) && !"usdt".equalsIgnoreCase(miner_profit_symbol)) {
@@ -156,7 +156,7 @@
 			} else {
 				throw new BusinessException("行情获取异常,稍后再试");
 			}
-			symbol_profit = Arith.div(symbol_profit, realtime.getClose());
+			symbol_profit = Arith.div(symbol_profit, realtime.getClose().doubleValue());
 			result.put("symbol_profit", symbol_profit);
 		} else {
 			result.put("symbol_profit", symbol_profit);
diff --git a/trading-order-service/src/main/java/com/yami/trading/service/user/UserDataService.java b/trading-order-service/src/main/java/com/yami/trading/service/user/UserDataService.java
index 6b0ef64..4d1785a 100644
--- a/trading-order-service/src/main/java/com/yami/trading/service/user/UserDataService.java
+++ b/trading-order-service/src/main/java/com/yami/trading/service/user/UserDataService.java
@@ -4,7 +4,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yami.trading.bean.contract.domain.ContractOrder;
 import com.yami.trading.bean.exchange.ExchangeApplyOrder;
+import com.yami.trading.bean.finance.FinanceOrder;
 import com.yami.trading.bean.future.domain.FuturesOrder;
+import com.yami.trading.bean.miner.MinerOrder;
 import com.yami.trading.bean.model.User;
 import com.yami.trading.bean.model.UserData;
 import com.yami.trading.bean.user.dto.ChildrenLever;
@@ -85,4 +87,29 @@
     public List<Map<String, Object>> getChildrenLevelPagedForGalaxy(int pageNo, int pageSize, String partyId, Integer level);
 
     List<Map<String, UserData>> findByPartyIds(List<String> children);
+
+    /**
+     * 赎回理财产品
+     */
+    public void saveSellFinance(FinanceOrder order);
+
+    /**
+     * 矿机买入
+     *
+     * @param order
+     */
+    public void saveMinerBuy(MinerOrder order);
+
+    /**
+     * 矿机赎回
+     */
+    public void saveMinerClose(MinerOrder order);
+
+    /**
+     * 矿机利息
+     *
+     * @param partyId 获利人
+     * @param profit  利息
+     */
+    public void saveMinerProfit(String partyId, double profit);
 }
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 850f82d..cd9d7df 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
@@ -8,7 +8,9 @@
 import com.yami.trading.bean.contract.domain.ContractOrder;
 import com.yami.trading.bean.data.domain.Realtime;
 import com.yami.trading.bean.exchange.ExchangeApplyOrder;
+import com.yami.trading.bean.finance.FinanceOrder;
 import com.yami.trading.bean.future.domain.FuturesOrder;
+import com.yami.trading.bean.miner.MinerOrder;
 import com.yami.trading.bean.model.User;
 import com.yami.trading.bean.model.UserData;
 import com.yami.trading.bean.model.UserDataSum;
@@ -806,4 +808,135 @@
 //			}
     }
 
+    /**
+     * 理财产品平仓
+     */
+    @Override
+    public void saveSellFinance(FinanceOrder order) {
+        User user = this.userService.findUserByUserCode(order.getFinanceId());
+//		SecUser user = this.userService.findUserByPartyId(order.getPartyId());
+//		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) {
+            return;
+        }
+
+        User party = userService.cacheUserBy(order.getPartyId().toString());
+        UserData userData = new UserData();
+
+        userData.setRolename(party.getRoleName());
+        userData.setCreateTime(new Date());
+        userData.setUserId(order.getPartyId().toString());
+        userData.setFinanceAmount(order.getAmount());
+        userData.setFinanceIncome(order.getProfit());
+        save(userData);
+
+//		UserRecom userRecom = this.userRecomService.findByPartyId(order.getPartyId());
+//		if (userRecom == null) {
+//			return;
+//		}
+//		List<UserRecom> parents = this.userRecomService.getParents(userRecom.getPartyId());
+//
+//		for (int i = 0; i < parents.size(); i++) {
+//			Party party_parent = partyService.cachePartyBy(parents.get(i).getReco_id());
+//
+//			if (Constants.SECURITY_ROLE_AGENT.equals(party_parent.getRolename())) {
+//				UserData userData_reco = new UserData();
+//				userData_reco.setRolename(party_parent.getRolename());
+//				userData_reco.setCreateTime(new Date());
+//				userData_reco.setPartyId(parents.get(i).getReco_id());
+//				userData_reco.setFinance_amount(order.getAmount());
+//				userData_reco.setFinance_income(order.getProfit());
+//				save(userData_reco);
+//			}
+//		}
+    }
+
+    /**
+     * 矿机买入
+     */
+    @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) {
+            return;
+        }
+
+        UserData userData = new UserData();
+        userData.setRolename(user.getRoleName());
+        userData.setCreateTime(new Date());
+        userData.setUserId(order.getPartyId().toString());
+        userData.setMinerAmount(order.getAmount());
+        save(userData);
+    }
+
+    /**
+     * 矿机赎回
+     */
+    @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) {
+            return;
+        }
+
+//        Party party = partyService.cachePartyBy(order.getPartyId(), false);
+        UserData userData = new UserData();
+        userData.setRolename(user.getRoleName());
+        userData.setCreateTime(new Date());
+        userData.setUserId(order.getPartyId().toString());
+        userData.setMinerAmount(Arith.sub(0, order.getAmount()));
+        save(userData);
+    }
+
+    /**
+     * 矿机利息
+     *
+     * @param partyId 获利人
+     * @param profit  利息
+     */
+    @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) {
+            return;
+        }
+
+//        Party party = partyService.cachePartyBy(partyId, true);
+        UserData userData = new UserData();
+        userData.setRolename(user.getRoleName());
+        userData.setCreateTime(new Date());
+        userData.setUserId(partyId);
+        userData.setMinerIncome(profit);
+        save(userData);
+    }
+
 }
diff --git a/trading-order-service/src/main/resources/mapper/finance/FinanceMapper.xml b/trading-order-service/src/main/resources/mapper/finance/FinanceMapper.xml
new file mode 100644
index 0000000..1391774
--- /dev/null
+++ b/trading-order-service/src/main/resources/mapper/finance/FinanceMapper.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yami.trading.dao.finance.FinanceMapper">
+
+    <select id="pagedQuery" resultType="java.util.HashMap">
+        select finance.uuid id,finance.name name,finance.name_en name_en,finance.name_cn name_cn,
+        finance.name_kn name_kn,finance.name_jn name_jn,finance.img img,finance.cycle cycle,
+        finance.daily_rate daily_rate  ,finance.daily_rate_max daily_rate_max  ,finance.today_rate today_rate ,finance.state state,
+        finance.default_ratio default_ratio  ,finance.investment_min investment_min,finance.investment_max investment_max
+        from t_finance finance where 1=1
+        <if test="name_para!=null and name_para!=''">
+            and  finance.name like CONCAT('%', #{name_para}, '%')
+        </if>
+    </select>
+
+    <select id="findAll" resultType="java.util.HashMap">
+        FROM Finance
+    </select>
+
+</mapper>
diff --git a/trading-order-service/src/main/resources/mapper/finance/FinanceOrderMapper.xml b/trading-order-service/src/main/resources/mapper/finance/FinanceOrderMapper.xml
new file mode 100644
index 0000000..56d10fd
--- /dev/null
+++ b/trading-order-service/src/main/resources/mapper/finance/FinanceOrderMapper.xml
@@ -0,0 +1,100 @@
+<?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.finance.FinanceOrderMapper">
+<!--    FROM FinanceOrder WHERE 1=1-->
+<!--    AND partyId=:partyId-->
+<!--    AND (state =:state_2 OR state =:state_0-->
+<!--    &#45;&#45; AND state=:state-->
+<!--    &#45;&#45; AND state=:state-->
+<!--    order by create_time desc-->
+
+    <select id="pagedQuery" resultType="java.util.HashMap">
+        select * from t_finance_order where 1=1
+        <if test="partyId!=null and partyId!=''">
+            and party_id=#{partyId}
+        </if>
+
+        <if test="state!=null and state==2">
+            AND t_finance_order.state in('0','2')
+        </if>
+
+        <if test="state!=null and state==1">
+            AND t_finance_order.state=#{state}
+        </if>
+
+        order by create_time desc
+    </select>
+
+    <select id="pagedQueryByDate" resultType="java.util.HashMap">
+        select * from t_finance_order where 1=1
+        <if test="date!=null and date!=''">
+            and create_time=#{date}
+        </if>
+
+        order by create_time desc
+    </select>
+
+    <select id="sumVolumeByBuyCurrency" resultType="java.lang.Double">
+        SELECT IFNULL(sum(volume),0) FROM t_finance_order
+        WHERE 1=1
+        <if test="partyId!=null and partyId!=''">
+            and party_id=#{partyId}
+        </if>
+        <if test="buyCurrency!=null and buyCurrency!=''">
+            and buy_currency=#{buyCurrency}
+        </if>
+    </select>
+
+
+    <select id="pagedQuery1" resultType="java.util.HashMap">
+        SELECT financeOrder.uuid id,financeOrder.order_no order_no  ,financeOrder.finance_id financeId  ,
+        financeOrder.amount amount,financeOrder.create_time create_time,
+        financeOrder.close_time close_time,financeOrder.profit profit,
+        financeOrder.state state,
+        party.user_name username,party.user_code usercode,party.role_name rolename,
+        finance.name,finance.name_en,
+        finance.name_kn,finance.name_jn
+        FROM t_finance_order financeOrder
+        LEFT JOIN tz_user party ON financeOrder.party_id = party.user_id
+        LEFT JOIN t_finance finance ON finance.uuid = financeOrder.finance_id
+        WHERE 1 = 1
+        <if test="name_para!=null and name_para!=''">
+            AND (party.user_name like CONCAT('%', #{name_para}, '%') OR party.user_code like CONCAT('%', #{name_para}, '%') )
+        </if>
+
+        <if test="finance_para!=null and finance_para!=''">
+            and  (finance.name=#{finance_para} or finance.name_en =#{finance_para} or finance.name_cn =#{finance_para})
+        </if>
+
+        <if test="orderNo!=null and orderNo!=''">
+            and  (finance.order_no=#{orderNo})
+        </if>
+
+        <if test="rolename_para!=null and rolename_para!=''">
+            and party.role_name=#{rolename_para}
+        </if>
+
+        <if test="children != null and children.size() >0">
+            AND financeOrder.party_id in
+            <foreach collection="children" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+
+        <if test="status_para!=null and status_para!=''">
+            and financeOrder.state=#{status_para}
+        </if>
+
+        <if test="createTime !=null and createTime!=''">
+            and financeOrder.create_time <![CDATA[ >= ]]>  #{createTime}
+        </if>
+
+        <if test="closeTime !=null and closeTime!=''">
+            and financeOrder.close_time <![CDATA[ >= ]]>  #{closeTime}
+        </if>
+
+        order by financeOrder.create_time desc
+    </select>
+
+
+</mapper>

--
Gitblit v1.9.3