新版仿ok交易所-后端
1
zj
2026-06-04 bf362d7ee6ab091cd26d69be9095440e5000928c
trading-order-service/src/main/java/com/yami/trading/service/future/FuturesOrderService.java
@@ -255,6 +255,84 @@
    }
    /**
     * 修改持仓订单方向(买涨/买跌)
     */
    public String saveOrderDirection(String orderNo, String direction, String operaName) {
        if (!FuturesOrder.DIRECTION_BUY.equals(direction) && !FuturesOrder.DIRECTION_SELL.equals(direction)) {
            return "方向参数错误";
        }
        String message = "";
        boolean lock = false;
        while (true) {
            try {
                if (!FuturesLock.add(orderNo)) {
                    continue;
                }
                lock = true;
                FuturesOrder futuresOrder = (FuturesOrder) RedisUtil.get(FuturesRedisKeys.FUTURES_SUBMITTED_ORDERNO + orderNo);
                if (futuresOrder == null) {
                    futuresOrder = getOne(new LambdaQueryWrapper<FuturesOrder>()
                            .eq(FuturesOrder::getOrderNo, orderNo)
                            .eq(FuturesOrder::getState, FuturesOrder.STATE_SUBMITTED));
                }
                if (futuresOrder == null) {
                    message = "订单已结算或不存在";
                    break;
                }
                if (direction.equals(futuresOrder.getDirection())) {
                    message = "方向未变化";
                    break;
                }
                Map<String, Double> futuresAssetsOld = this.walletService.getMoneyFuturesByOrder(futuresOrder);
                String oldDirection = futuresOrder.getDirection();
                futuresOrder.setDirection(direction);
                List<Realtime> realtimeList = this.dataService.realtime(futuresOrder.getSymbol());
                if (CollectionUtil.isNotEmpty(realtimeList) && realtimeList.get(0).getClose() != null) {
                    refreshCache(futuresOrder, realtimeList.get(0).getClose().doubleValue());
                } else {
                    RedisUtil.set(FuturesRedisKeys.FUTURES_SUBMITTED_ORDERNO + futuresOrder.getOrderNo(), futuresOrder);
                    cache.put(futuresOrder.getOrderNo(), futuresOrder);
                    updateById(futuresOrder);
                }
                Map<String, Double> futuresAssetsOrder = this.walletService.getMoneyFuturesByOrder(futuresOrder);
                Double futuresAssets = (Double) RedisUtil.get(FuturesRedisKeys.FUTURES_ASSETS_PARTY_ID + futuresOrder.getPartyId());
                Double futuresAssetsProfit = (Double) RedisUtil.get(FuturesRedisKeys.FUTURES_ASSETS_PROFIT_PARTY_ID + futuresOrder.getPartyId());
                RedisUtil.set(FuturesRedisKeys.FUTURES_ASSETS_PARTY_ID + futuresOrder.getPartyId(),
                        Arith.add(null == futuresAssets ? 0.000D : futuresAssets, futuresAssetsOrder.get("money_futures") - futuresAssetsOld.get("money_futures")));
                RedisUtil.set(FuturesRedisKeys.FUTURES_ASSETS_PROFIT_PARTY_ID + futuresOrder.getPartyId(),
                        Arith.add(null == futuresAssetsProfit ? 0.000D : futuresAssetsProfit, futuresAssetsOrder.get("money_futures_profit") - futuresAssetsOld.get("money_futures_profit")));
                User party = userService.getById(futuresOrder.getPartyId());
                String oldDirLabel = FuturesOrder.DIRECTION_BUY.equals(oldDirection) ? "买涨" : "买跌";
                String newDirLabel = FuturesOrder.DIRECTION_BUY.equals(direction) ? "买涨" : "买跌";
                Log log = new Log();
                log.setCategory(Constants.LOG_CATEGORY_OPERATION);
                log.setOperator(operaName);
                log.setUsername(party.getUserName());
                log.setUserId(party.getUserId());
                log.setCreateTime(new Date());
                log.setLog("管理员手动修改交割订单方向。订单号[" + futuresOrder.getOrderNo() + "],原方向[" + oldDirLabel + "],修改后方向[" + newDirLabel + "].");
                this.logService.save(log);
                updateById(futuresOrder);
                ThreadUtils.sleep(100);
            } catch (Throwable e) {
                log.error("saveOrderDirection error:", e);
                message = "修改错误";
            } finally {
                if (lock) {
                    FuturesLock.remove(orderNo);
                    break;
                }
            }
        }
        return message;
    }
    /**
     * 业绩交易奖励
     */
    public void saveRecomProfit(String partyId, BigDecimal volume) {