package com.yami.trading.admin.controller.contract; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import com.yami.trading.bean.contract.domain.ContractApplyOrder; import com.yami.trading.bean.data.domain.Realtime; import com.yami.trading.common.domain.Result; import com.yami.trading.common.exception.YamiShopBindException; import com.yami.trading.common.query.QueryWrapperGenerator; import com.yami.trading.common.util.ThreadUtils; import com.yami.trading.service.data.DataService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yami.trading.bean.contract.domain.ContractOrder; import com.yami.trading.bean.contract.dto.ContractOrderDTO; import com.yami.trading.bean.contract.mapstruct.ContractOrderWrapper; import com.yami.trading.service.contract.ContractOrderService; import com.yami.trading.bean.contract.query.ContractOrderQuery; import java.io.IOException; import java.math.BigDecimal; import java.util.List; /** * 非按金额订单Controller * * @author lucas * @version 2023-03-29 */ @Api(tags = "永续持仓单(state传 submitted),历史持仓单 ") @RestController @RequestMapping(value = "normal/adminContractOrderAction!") @Slf4j public class ContractOrderController { @Autowired private ContractOrderService contractOrderService; @Autowired private ContractOrderWrapper contractOrderWrapper; @Autowired(required = false) @Qualifier("dataService") private DataService dataService; /** * 非按金额订单列表数据 */ @ApiOperation(value = "查询非按金额订单列表数据") @GetMapping("list.action") public Result> list(ContractOrderQuery contractOrderQuery, Page page) throws Exception { IPage result = contractOrderService.listRecord(page, contractOrderQuery); result.getRecords().forEach(d -> { String symbol = d.getSymbol(); List realtimes = dataService.realtime(symbol); if (CollectionUtil.isEmpty(realtimes)) { d.setMark_price(BigDecimal.ZERO); d.setClose(BigDecimal.ZERO); } else { d.setMark_price(realtimes.get(0).getClose()); d.setClose(realtimes.get(0).getClose()); } //持仓单不显示平仓价格 if("submitted".equals(contractOrderQuery.getState())){ d.setCloseAvgPrice(null); } } ); return Result.succeed(result); } /** * 撤单 *

* order_no 订单号 */ @GetMapping("close.action") @ApiOperation(value = "平仓或撤单") public Result cancel(@RequestParam @NotBlank String orderNo) throws IOException { try { ContractOrder order = this.contractOrderService.findByOrderNo(orderNo); if (order != null) { CloseDelayThread lockDelayThread = new CloseDelayThread(order.getPartyId().toString(), orderNo, this.contractOrderService); Thread t = new Thread(lockDelayThread); t.start(); } } catch (Exception e) { log.error("执行撤单异常", e); throw new YamiShopBindException("执行撤单异常"); } return Result.succeed("success"); } /** * 新线程处理,直接拿到订单锁处理完成后退出 */ public class CloseDelayThread implements Runnable { private String partyId; private String order_no; private ContractOrderService contractOrderService; public void run() { try { while (true) { if (this.contractOrderService.lock(order_no)) { this.contractOrderService.saveClose(partyId, order_no,null); // 处理完退出 break; } ThreadUtils.sleep(500); } } catch (Throwable t) { log.error("error:", t); } finally { this.contractOrderService.unlock(order_no); } } public CloseDelayThread(String partyId, String order_no, ContractOrderService contractOrderService) { this.partyId = partyId; this.order_no = order_no; this.contractOrderService = contractOrderService; } } }