package com.yami.trading.admin.controller.exchange; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yami.trading.admin.controller.exchange.model.CloseModel; import com.yami.trading.admin.controller.exchange.model.ResetFreezeModel; import com.yami.trading.admin.controller.exchange.model.ResetLockModel; import com.yami.trading.admin.controller.exchange.model.SuccessModel; import com.yami.trading.admin.model.exchange.ExchangeApplyOrderListModel; import com.yami.trading.bean.data.domain.Realtime; import com.yami.trading.bean.exchange.ExchangeApplyOrder; import com.yami.trading.bean.exchange.dto.ExchangeApplyOrderDto; import com.yami.trading.bean.item.domain.Item; 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.YamiShopBindException; import com.yami.trading.common.util.IPHelper; import com.yami.trading.common.util.LockFilter; import com.yami.trading.common.util.StringUtils; import com.yami.trading.common.util.ThreadUtils; import com.yami.trading.security.common.util.SecurityUtils; import com.yami.trading.service.exchange.ExchangeApplyOrderService; import com.yami.trading.service.exchange.job.ExchangeApplyOrderHandleJobService; import com.yami.trading.service.item.ItemService; import com.yami.trading.service.system.LogService; import com.yami.trading.service.user.UserService; import com.yami.trading.sys.service.SysUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.math.BigDecimal; import java.util.List; @RestController @RequestMapping("exchangeApplyOrder") @Api(tags = "币币交易") public class ExchangeApplyOrderController { @Autowired ExchangeApplyOrderService exchangeApplyOrderService; @Autowired SysUserService sysUserService; @Autowired ExchangeApplyOrderHandleJobService exchangeApplyOrderHandleJobService; @Autowired UserService userService; @Autowired LogService logService; @Autowired ItemService itemService; /** * 币币交易订单 列表查询 */ @ApiModelProperty("币币交易订单 列表查询") @PostMapping("list") public Result> list(@RequestBody @Valid ExchangeApplyOrderListModel model) { Page page = new Page(model.getCurrent(), model.getSize()); exchangeApplyOrderService.listPage(page, model.getRolename(), model.getUserName(), model.getOrderNo(), model.getState(), model.getOffset(), model.getType(),model.getUserCode(), model.getSymbol()); List list = page.getRecords(); for (int i = 0; i < list.size(); i++) { ExchangeApplyOrderDto dto = list.get(i); if (StringUtils.isNotEmpty(dto.getRoleName())) { dto.setRoleName(Constants.ROLE_MAP.containsKey(dto.getRoleName()) ? Constants.ROLE_MAP.get(dto.getRoleName()) : dto.getRoleName()); Item bySymbol = itemService.findBySymbol(dto.getSymbol()); if (bySymbol != null) { dto.setSymbolName(bySymbol.getName()); } } } return Result.succeed(page); } /** * 币币交易订单 详情查询 */ @ApiModelProperty("币币交易订单 详情查询") @GetMapping("/{id}") public Result getById(@PathVariable String id) { ExchangeApplyOrder exchangeApplyOrder = exchangeApplyOrderService.getById(id); // Item bySymbol = itemService.findBySymbol(exchangeApplyOrder.getSymbol()); // if (bySymbol != null) { // exchangeApplyOrderDto.setSymbolName(bySymbol.getName()); // } return Result.succeed(exchangeApplyOrder); } /** * 平仓或撤单 */ @PostMapping("close") @ApiOperation("平仓或撤单") public Result close(@RequestBody @Valid CloseModel model) { ExchangeApplyOrder order = exchangeApplyOrderService.findByOrderNo(model.getOrderNo()); if (ExchangeApplyOrder.STATE_CREATED.equals(order.getState())) { throw new YamiShopBindException("委托已完成无法撤销"); } exchangeApplyOrderService.saveCancel(order.getPartyId(), model.getOrderNo()); return Result.succeed(); } /** * 限价成交 */ @PostMapping("success") @ApiOperation("限价成交") public Result success(@RequestBody SuccessModel successModel) { sysUserService.checkSafeWord(successModel.getLoginSafeword()); ExchangeApplyOrder order = exchangeApplyOrderService.findByOrderNo(successModel.getOrderNo()); if (order == null) { throw new YamiShopBindException("委托单不存在或请稍后再试"); } if (ExchangeApplyOrder.STATE_CREATED.equals(order.getState())) throw new YamiShopBindException("委托已完成无法操作"); if (!"limit".equals(order.getOrderPriceType())) { throw new YamiShopBindException("委托并非限价单,无法限价成交"); } Realtime realtime = new Realtime(); realtime.setClose(new BigDecimal(order.getPrice())); exchangeApplyOrderHandleJobService.handle(order, realtime); User party = userService.getById(order.getPartyId()); Log log = new Log(); log.setCategory(Constants.LOG_CATEGORY_OPERATION); log.setExtra(order.getOrderNo()); log.setOperator(SecurityUtils.getSysUser().getUsername()); log.setUsername(party.getUserName()); log.setUserId(order.getPartyId()); log.setLog("币币限价单,操作限价成交。订单号[" + order.getOrderNo() + "]。"); logService.save(log); return Result.succeed(); } private String verificationResetLock(String money_revise, String reset_type, String coin_type, String login_safeword) { if (StringUtils.isNullOrEmpty(money_revise)) { throw new YamiShopBindException("账变金额必填"); } if (!StringUtils.isDouble(money_revise)) { throw new YamiShopBindException("账变金额输入错误,请输入浮点数"); } if (Double.valueOf(money_revise).doubleValue() <= 0) { throw new YamiShopBindException("账变金额不能小于等于0"); } if (StringUtils.isNullOrEmpty(login_safeword)) { throw new YamiShopBindException("请输入资金密码"); } if (StringUtils.isNullOrEmpty(reset_type)) { throw new YamiShopBindException("请选择转移方向"); } if (StringUtils.isNullOrEmpty(coin_type)) { throw new YamiShopBindException("请选择转移币种"); } return null; } /** * 交易所 转移账户冻结金额 */ @PostMapping(value = "resetFreeze") @ApiOperation(("转移账户冻结金额")) public Result resetFreeze(@RequestBody ResetFreezeModel model) { boolean lock = false; try { String error = this.verificationResetLock(model.getMoneyRevise(), model.getResetType(), model.getCoinType(), model.getLoginSafeword()); if (!StringUtils.isNullOrEmpty(error)) { throw new YamiShopBindException(error); } sysUserService.checkSafeWord(model.getLoginSafeword()); if (!LockFilter.add(model.getId())) { throw new YamiShopBindException("请稍后再试"); } lock = true; double money_revise = Double.valueOf(model.getMoneyRevise()).doubleValue(); userService.saveResetLock(model.getId(), money_revise, model.getLoginSafeword(), SecurityUtils.getSysUser().getUsername(), model.getResetType(), IPHelper.getIpAddr(), model.getCoinType()); ThreadUtils.sleep(300); } catch (YamiShopBindException e) { throw new YamiShopBindException(e.getMessage()); } catch (Throwable t) { throw new YamiShopBindException("程序错误"); } finally { if (lock) { LockFilter.remove(model.getId()); } } return Result.succeed(); } /** * 交易所 减少账户锁定金额(root) */ @RequestMapping("resetLock") @ApiOperation("减少账户锁定金额(root)") public Result resetLock(ResetLockModel lockModel) { boolean lock = false; try { String error = this.verificationResetLock(lockModel.getMoneyRevise(), lockModel.getResetType(), lockModel.getCoinType(), lockModel.getLoginSafeword()); if (!StringUtils.isNullOrEmpty(error)) { throw new YamiShopBindException(error); } sysUserService.checkSafeWord(lockModel.getLoginSafeword()); if (!LockFilter.add(lockModel.getId())) { throw new YamiShopBindException("请稍后再试"); } lock = true; double money_revise = Double.valueOf(lockModel.getMoneyRevise()).doubleValue(); userService.saveResetLock(lockModel.getId(), money_revise, lockModel.getLoginSafeword(), SecurityUtils.getSysUser().getUsername(), "addLock", IPHelper.getIpAddr(), lockModel.getCoinType()); ThreadUtils.sleep(300); } catch (YamiShopBindException e) { e.printStackTrace(); throw new YamiShopBindException(e.getMessage()); } finally { if (lock) { LockFilter.remove(lockModel.getId()); } } return Result.succeed(); } }