package com.yami.trading.api.controller.exchange; import com.yami.trading.bean.exchangelever.ExchangeLeverOrder; import com.yami.trading.bean.model.Wallet; import com.yami.trading.bean.purchasing.dto.ExchangeLeverLock; import com.yami.trading.common.domain.Result; import com.yami.trading.common.util.ThreadUtils; import com.yami.trading.security.common.util.SecurityUtils; import com.yami.trading.service.WalletService; import com.yami.trading.service.exchange.ExchangeLeverOrderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; 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.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Map; @RestController() @CrossOrigin @Slf4j @RequestMapping("api/exchangeLeverOrder") @Api(tags = "现货杠杆持仓 -api") public class ApiExchangeLeverOrderController { @Autowired ExchangeLeverOrderService exchangeLeverOrderService; @Autowired WalletService walletService; @ApiOperation("列表") @PostMapping("list") public Result list(String page_no, String symbol, String type) { List> data = exchangeLeverOrderService.getPaged(Integer.valueOf(page_no), 10, SecurityUtils.getCurrentUserId(), symbol, type); return Result.succeed(data); } /** * 平仓 */ @ApiOperation("平仓") @PostMapping("close") public Result close(String order_no) { CloseDelayThread lockDelayThread = new CloseDelayThread(SecurityUtils.getCurrentUserId(), order_no, exchangeLeverOrderService); Thread t = new Thread(lockDelayThread); t.start(); return Result.succeed(); } @ApiOperation("获取详情") @PostMapping("get") public Result get(String order_no) throws IOException { ExchangeLeverOrder data = this.exchangeLeverOrderService.findByOrderNo(order_no); Wallet wallet= walletService.saveWalletByPartyId(SecurityUtils.getCurrentUserId()); double sumVolume= exchangeLeverOrderService.sumVolume(SecurityUtils.getCurrentUserId(),data.getSymbol()); sumVolume+=wallet.getMoney().doubleValue(); return Result.succeed(exchangeLeverOrderService.bulidOne(data,sumVolume)); } /** * 新线程处理,直接拿到订单锁处理完成后退出 */ public class CloseDelayThread implements Runnable { private String partyId; private String order_no; private ExchangeLeverOrderService exchangeLeverOrderService; public void run() { try { while (true) { if (ExchangeLeverLock.add(order_no)) { exchangeLeverOrderService.saveClose(partyId, order_no); /** * 处理完退出 */ break; } ThreadUtils.sleep(500); } } catch (Exception e) { log.error("error:", e); } finally { ExchangeLeverLock.remove(order_no); } } public CloseDelayThread(String partyId, String order_no, ExchangeLeverOrderService exchangeLeverOrderService) { this.partyId = partyId; this.order_no = order_no; this.exchangeLeverOrderService = exchangeLeverOrderService; } } }