package com.yami.trading.admin.controller.miner; import java.io.IOException; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson2.JSON; import com.yami.trading.bean.miner.Miner; import com.yami.trading.bean.miner.MinerOrder; 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.syspara.SysparaService; import com.yami.trading.service.user.UserService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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 com.yami.trading.service.miner.service.MinerOrderService; import com.yami.trading.service.miner.service.MinerService; /** * 矿池订单 */ @RestController @CrossOrigin public class MinerOrderController { private Logger logger = LogManager.getLogger(MinerOrderController.class); @Autowired protected MinerOrderService minerOrderService; @Autowired protected MinerService minerService; @Autowired protected UserService partyService; @Autowired protected SessionTokenService sessionTokenService; @Autowired protected SysparaService sysparaService; private final String action = "api/minerOrder!"; /** * 矿池订单 列表 */ @RequestMapping(action + "list.action") public ResultObject list(HttpServletRequest request) { ResultObject resultObject = new ResultObject(); // resultObject = readSecurityContextFromSession(resultObject); // if (!"0".equals(resultObject.getCode())) { // return resultObject; // } try { List> datas = null; // String partyId = getLoginPartyId(); String partyId = SecurityUtils.getCurrentUserId(); // DecimalFormat df = new DecimalFormat("#.##"); if (StringUtils.isNullOrEmpty(partyId)) { resultObject.setData(datas); resultObject.setCode("0"); return resultObject; } // 状态。0.正常赎回, 1 托管中 ,2提前赎回 (违约)3.取消 String state = request.getParameter("state"); String page_no = request.getParameter("page_no"); int pageNo = 1; if (StringUtils.isNotEmpty(page_no)) { pageNo = Integer.valueOf(page_no); } datas = minerOrderService.pagedQuery(pageNo, 40, partyId, state).getRecords(); for (Map data : datas) { int intervalDaysByTwoDate = 0; if (null == data.get("stop_time")) { if ("0" != data.get("cycle_close")) { String can_close_time = DateUtils .format(DateUtils.addDay(DateUtils.toDate(data.get("create_time").toString()), new Double(data.get("cycle_close").toString()).intValue()), DateUtils.DF_yyyyMMdd); intervalDaysByTwoDate = DateUtils.getIntervalDaysByTwoDate(DateUtils.toDate(can_close_time), new Date()); } } else { intervalDaysByTwoDate = DateUtils.getIntervalDaysByTwoDate( DateUtils.toDate(data.get("stop_time").toString()), new Date()); } if (intervalDaysByTwoDate < 0) { intervalDaysByTwoDate = 0; } data.put("days", intervalDaysByTwoDate); DecimalFormat df = new DecimalFormat("#.##"); data.put("profit", df.format(data.get("profit"))); data.put("test", null != data.get("test") && "Y".equals(data.get("test").toString())); data.put("can_close", intervalDaysByTwoDate <= 0); data.put("buyCurrency", "usdt"); data.put("outputCurrency", "usdt"); if ((boolean) data.get("test")) { Double minerTestProfit = sysparaService.find("miner_test_profit").getDouble(); data.put("daily_profit", minerTestProfit); data.put("daily_rate", minerTestProfit); data.put("cycle", data.get("cycle")); data.put("all_rate", Arith.mul(minerTestProfit, Integer.valueOf(data.get("cycle").toString()))); } else { double dailyProfitRate = Arith.mul(Double.valueOf(data.get("daily_rate").toString()), 0.01d); double dailyProfitAmount = Arith.mul(dailyProfitRate, Double.valueOf(data.get("amount").toString())); String dailyProfit = df.format(dailyProfitAmount); // 当日收益 data.put("daily_profit", dailyProfit); data.put("daily_rate", data.get("daily_rate")); // 这里的周期,体验矿机是周期,其他矿机是解锁周期(到期后需手动解锁) data.put("cycle", data.get("cycle_close")); double all_rate = Arith.mul(30, Double.valueOf(data.get("daily_rate").toString())); data.put("all_rate", df.format(all_rate)); } } resultObject.setData(datas); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); logger.error("BusinessException:", e); } catch (Exception e) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", e); } return resultObject; } /** * 矿机收益统计 */ @RequestMapping(action + "listSum.action") public Object listSum() { ResultObject resultObject = new ResultObject(); try { // String partyId = getLoginPartyId(); String partyId = SecurityUtils.getCurrentUserId(); List> data = minerOrderService.findByState(partyId, null); MinerOrder order; Map one; List miners = minerService.findAll(); Miner miner = new Miner(); Map map = new HashMap(); // 金额总数 double amount_sum = 0; // 预计今日盈利 double today_profit = 0; // 已获收益 double aready_profit = 0; // 订单数 double order_sum = 0; // 金额总数 换算U double amountSumValue = 0; // 今日盈利 换算U double todayProfitValue = 0; // 已获收益 换算U double areadyProfitValue = 0; String buyCurrency = ""; String outputCurrency = ""; Double miner_test_profit = sysparaService.find("miner_test_profit").getDouble(); if (data != null) { for (int i = 0; i < data.size(); i++) { one = data.get(i); order = JSON.parseObject(JSON.toJSONString(one), MinerOrder.class); if ("1".equals(order.getState())) { order_sum = Arith.add(order_sum, 1d); amount_sum = Arith.add(amount_sum, (Double) order.getAmount()); } aready_profit = Arith.add(aready_profit, (Double) order.getProfit()); for (int j = 0; j < miners.size(); j++) { miner = miners.get(j); if (miner.getUuid().equals(order.getMiner_id()) && "1".equals(order.getState())) { if (miner.getTest().equals("Y")) { today_profit = Arith.add(today_profit, miner_test_profit); } else { double miner_profit = Arith.mul(miner.getDaily_rate(), 0.01d); double get_profit = Arith.mul(miner_profit, (Double) order.getAmount()); today_profit = Arith.add(today_profit, get_profit); break; } } } } } DecimalFormat df = new DecimalFormat("#.##"); map.put("amount_sum", df.format(amount_sum)); map.put("amountSumValue", df.format(amountSumValue)); map.put("today_profit", df.format(today_profit)); map.put("aready_profit", df.format(aready_profit)); map.put("order_sum", order_sum); map.put("buyCurrency", buyCurrency); map.put("outputCurrency", outputCurrency); map.put("areadyProfitValue", df.format(areadyProfitValue)); map.put("todayProfitValue", df.format(todayProfitValue)); resultObject.setData(map); resultObject.setCode("0"); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Exception e) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", e); } 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"); MinerOrder data = minerOrderService.findByOrder_no(order_no); resultObject.setData(bulidData(data)); resultObject.setCode("0"); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); logger.error("BusinessException:", e); } catch (Exception e) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", e); } 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 minerId = request.getParameter("minerId"); String amount = request.getParameter("amount"); String object = this.sessionTokenService.cacheGet(session_token); this.sessionTokenService.del(session_token); if ((!partyId.equals(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; // } MinerOrder order = new MinerOrder(); order.setPartyId(partyId); order.setMinerId(minerId); order.setAmount(Double.valueOf(amount)); order.setOrder_no(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8)); order.setState("1"); this.minerOrderService.saveCreateNew(order, false); Map map = new HashMap(); map.put("order_no", order.getOrder_no()); resultObject.setData(map); resultObject.setCode("0"); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Exception e) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", e); } return resultObject; } /** * 获取订单 */ @RequestMapping(action + "getOpen.action") public Object getOpen(HttpServletRequest request) throws IOException { ResultObject resultObject = new ResultObject(); // resultObject = readSecurityContextFromSession(resultObject); // if (!"0".equals(resultObject.getCode())) { // return resultObject; // } try { String minerId = request.getParameter("minerId"); String amount_temp = request.getParameter("amount"); Miner miner = minerService.findById(minerId); if (StringUtils.isNullOrEmpty(amount_temp) || !StringUtils.isDouble(amount_temp) || Double.valueOf(amount_temp) < 0) { throw new BusinessException("金额错误"); } DecimalFormat df = new DecimalFormat("#.##"); Map map = new HashMap(); map.put("miner_test", miner.getTest()); map.put("miner_name", miner.getName()); map.put("miner_name_en", miner.getName_en()); map.put("miner_name_cn", miner.getName_cn()); map.put("buyCurrenc", miner.getBuy_currency()); map.put("outputCurrency", miner.getOutput_currency()); // String partyId = getLoginPartyId(); String partyId = SecurityUtils.getCurrentUserId(); if (!StringUtils.isNullOrEmpty(partyId)) { String session_token = sessionTokenService.savePut(partyId); map.put("session_token", session_token); } Date date = new Date(); map.put("create_time", date); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); // 把日期往后增加一天.整数往后推 calendar.add(calendar.DATE, 1); date = calendar.getTime(); // 起息时间 // 根据对外展示时区设置,修改时间 Date showEarnTime = DateTimeTools.transferToShowTime(date); map.put("earn_time", DateUtils.format(showEarnTime, DateUtils.DF_yyyyMMdd)); if (miner.getTest().equals("Y")) { map.put("amount", 0); calendar.add(calendar.DATE, miner.getCycle()); date = calendar.getTime(); // 系统时区时间 Date localStopTime = DateUtils.addDay(date, miner.getCycle()); // 根据对外展示时区设置,修改时间 Date showStopTime = DateTimeTools.transferToShowTime(localStopTime); map.put("stop_time", DateUtils.format(showStopTime, DateUtils.DF_yyyyMMdd)); Double minerTestProfit = sysparaService.find("miner_test_profit").getDouble(); map.put("daily_rate", minerTestProfit); map.put("profit_may", String.valueOf(Arith.mul(minerTestProfit, miner.getCycle()))); map.put("cycle", miner.getCycle()); map.put("all_rate", Arith.mul(minerTestProfit, miner.getCycle())); } else { double amount = Double.valueOf(amount_temp); map.put("amount", amount); map.put("stop_time", null); map.put("daily_rate", miner.getDaily_rate()); double rate = Arith.mul(miner.getDaily_rate(), 0.01d); map.put("profit_may", String.valueOf(df.format(Arith.mul(amount, Arith.mul(rate, 30d))))); map.put("cycle", miner.getCycle_close()); double all_rate = Arith.mul(30d, miner.getDaily_rate()); map.put("all_rate", df.format(all_rate)); } map.put("investment_min", miner.getInvestment_min()); map.put("minerId", minerId); map.put("order_no", DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8)); map.put("test", miner.getTest()); resultObject.setData(map); resultObject.setCode("0"); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); logger.error("BusinessException:", e); } catch (Exception e) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", e.fillInStackTrace()); } return resultObject; } /** * 赎回订单 */ @RequestMapping(action + "closOrder.action") public Object closOrder(HttpServletRequest request) throws IOException { ResultObject resultObject = new ResultObject(); // resultObject = readSecurityContextFromSession(resultObject); // if (!"0".equals(resultObject.getCode())) { // return resultObject; // } try { String order_no = request.getParameter("order_no"); CloseDelayThread lockDelayThread = new CloseDelayThread(order_no, minerOrderService); Thread t = new Thread(lockDelayThread); t.start(); } catch (BusinessException e) { resultObject.setCode("1"); resultObject.setMsg(e.getMessage()); } catch (Exception e) { resultObject.setCode("1"); resultObject.setMsg("程序错误"); logger.error("error:", e.fillInStackTrace()); } return resultObject; } /** * 新线程处理,直接拿到订单锁处理完成后退出 */ public class CloseDelayThread implements Runnable { private String orderNo; private MinerOrderService minerOrderService; public void run() { try { // 提前赎回理财产品需要支付违约金 MinerOrder order = minerOrderService.findByOrder_no(orderNo); Miner miner = minerService.findById(order.getMiner_id()); // 取时间 Date date_now = new Date(); double last_days = daysBetween(order.getCreate_time(), date_now); if ("1".equals(order.getState()) && last_days >= miner.getCycle_close()) { // 解锁,不扣违约金 double default_money = 0; order.setState("2"); order.setProfit(Arith.sub(order.getProfit(), default_money)); this.minerOrderService.saveClose(order); } } catch (Exception e) { logger.error("error:", e); } } public CloseDelayThread(String orderNo, MinerOrderService minerOrderService) { this.orderNo = orderNo; this.minerOrderService = minerOrderService; } } protected Map bulidData(MinerOrder order) throws ParseException { System.out.println("bulidData => " + order); Miner miner = new Miner(); miner = minerService.findById(order.getMiner_id()); System.out.println("miner => " + miner); DecimalFormat df = new DecimalFormat("#.##"); Map map = new HashMap(); map.put("miner_name", miner.getName()); map.put("miner_name_en", miner.getName_en()); map.put("miner_name_cn", miner.getName_cn()); Double miner_test_profit = sysparaService.find("miner_test_profit").getDouble(); map.put("daily_rate", miner.getTest().equals("Y") ? miner_test_profit : miner.getDaily_rate()); Date create_time = order.getCreate_time(); map.put("create_timeStr", create_time); map.put("close_timeStr", order.getClose_time()); if (miner.getTest().equals("Y")) { // 根据对外展示时区设置,修改时间 Date showStopTime = DateTimeTools.transferToShowTime(order.getStop_time()); map.put("stop_timeStr", DateUtils.format(showStopTime, DateUtils.DF_yyyyMMdd)); } else { map.put("stop_timeStr", null); } // 根据对外展示时区设置,修改时间 Date showEarnTime = DateTimeTools.transferToShowTime(order.getEarn_time()); map.put("earn_timeStr", DateUtils.format(showEarnTime, DateUtils.DF_yyyyMMdd)); //System.out.println("getTest => "+miner.getTest().equals("Y") ); //System.out.println("stop_timeStr => "+DateUtils.format(order.getStop_time(), DateUtils.DF_yyyyMMdd)); Date date_now = new Date();// 取时间 int daysBetween = order.getStop_time() == null ? 0 : daysBetween(date_now, order.getStop_time()); daysBetween = Math.max(daysBetween, 0); map.put("days", daysBetween); int last_days = daysBetween(create_time, date_now); map.put("can_close", last_days >= miner.getCycle_close()); double rate = Arith.mul(miner.getDaily_rate(), 0.01d); map.put("profit_may", miner.getTest().equals("Y") ? String.valueOf(Arith.mul(miner_test_profit, miner.getCycle())) : String.valueOf(Arith.mul(order.getAmount(), Arith.mul(rate, 30d)))); map.put("order_no", order.getOrder_no()); map.put("amount", order.getAmount()); // map.put("cycle", miner.getCycle()); map.put("id", order.getOrder_no()); map.put("state", order.getState()); map.put("profit", order.getProfit()); int cycle = miner.getTest().equals("Y") ? miner.getCycle() : miner.getCycle_close(); map.put("cycle", cycle); double all_rate = Arith.mul(30, miner.getDaily_rate()); map.put("all_rate", miner.getTest().equals("Y") ? Arith.mul(miner_test_profit, miner.getCycle()) : df.format(all_rate)); map.put("test", miner.getTest()); map.put("buyCurrency", miner.getBuy_currency()); map.put("outputCurrency", miner.getOutput_currency()); if ("1".equals(order.getState())) { map.put("profit", order.getProfit()); map.put("default_amount", 0); map.put("principal_amount", 0); } if ("2".equals(order.getState())) { map.put("profit", 0); map.put("default_amount", 0); map.put("principal_amount", df.format(order.getAmount())); } if ("0".equals(order.getState())) {// 正常 map.put("profit", order.getProfit()); map.put("default_amount", 0); map.put("principal_amount", df.format(order.getAmount())); } 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)); } }