package com.yami.trading.admin.controller.exchange; import cn.hutool.core.util.StrUtil; 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.controller.service.SysUserOperService; import com.yami.trading.admin.facade.PermissionFacade; import com.yami.trading.admin.model.exchange.ExchangeApplyOrderListModel; 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.ExchangeApplyOrderHandleJob; 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.model.SysUser; 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.util.List; @RestController @CrossOrigin @RequestMapping("exchangeApplyOrder") @Api(tags = "现货交易-后台管理系统控制层") public class ExchangeApplyOrderController { @Autowired ExchangeApplyOrderService exchangeApplyOrderService; @Autowired SysUserService sysUserService; @Autowired ExchangeApplyOrderHandleJob exchangeApplyOrderHandleJob; @Autowired UserService userService; @Autowired LogService logService; @Autowired ItemService itemService; @Autowired PermissionFacade permissionFacade; @Autowired private SysUserOperService sysUserOperService; /** * 币币交易订单 列表查询 * @return */ @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(), permissionFacade.getOwnerUserIds()); 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); 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()); SysUser secUser = sysUserService.getByUserName(SecurityUtils.getSysUser().getUsername()); sysUserOperService.saveLog(secUser, secUser.getUsername(), StrUtil.format("对 {} 执行撤销", 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 (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) { // 如果后台给的"成交数量" >= 订单实际的数量,则默认按全部数据成交 if (successModel.getNumber() < order.getSymbolValue()) { order.setSuccessVolume(successModel.getNumber()); } } else if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) { if (successModel.getNumber() < order.getVolume()) { order.setSuccessVolume(successModel.getNumber()); } } exchangeApplyOrderHandleJob.handle(order, order.getPrice()); 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; } /** * 交易所 转移账户冻结金额 */ @RequestMapping(value = "resetFreeze") @ApiOperation(("转移账户冻结金额")) public Result resetFreeze(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(), lockModel.getResetType(), 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(); } }