新版仿ok交易所-后端
1
zj
2026-05-21 31e6203a5bb778ad9d1c599171606c89c8edd3a3
trading-order-admin/src/main/java/com/yami/trading/admin/facade/MarketQuotationsFacade.java
@@ -184,24 +184,88 @@
    }
    public void adjust(String symbol, Double second, BigDecimal value) {
    /**
     * 提交调整(与 getValue.action 预计算使用同一套 type 规则)。
     */
    public void adjust(String symbol, Double second, BigDecimal value, String type) {
        AdjustmentValueCache.getDelayValue().remove(symbol);
        AdjustmentValueCache.getPreAllocatedAdjustments().remove(symbol);
        AdjustmentValueCache.getCurrentAdjustmentIndex().remove(symbol);
        AdjustmentValueCache.getFrequency().remove(symbol);
        BigDecimal currentValue = this.adjustmentValueService.getCurrentValue(symbol);
        if (currentValue == null) {
            Realtime realtime = this.dataService.realtime(symbol).get(0);
            currentValue = realtime.getClose();
        String adjustType = StringUtils.isBlank(type) ? "2" : type;
        BigDecimal effectiveDelta = resolveEffectiveAdjustDelta(symbol, adjustType, value);
        if (effectiveDelta == null || effectiveDelta.compareTo(BigDecimal.ZERO) == 0) {
            log.warn("行情调整无效 symbol={} value={} type={}", symbol, value, adjustType);
            return;
        }
        String log = MessageFormat.format("ip:" + IPHelper.getIpAddr() + ",管理员调整行情,币种:{0},原值:{1},调整值:{2},调整时间:{3}",
                symbol, currentValue.toPlainString(), value.toPlainString(), second);
        this.adjustmentValueService.adjust(symbol, value, second);
        saveLog(log);
        ThreadUtils.sleep(1000);
        BigDecimal beforeAdjust = adjustmentValueService.getCurrentValue(symbol);
        double secondVal = second == null ? 0D : second;
        String logContent = MessageFormat.format(
                "ip:" + IPHelper.getIpAddr() + ",管理员调整行情,币种:{0},调整前累计:{1},本次增量:{2},type:{3},延迟秒:{4}",
                symbol,
                beforeAdjust == null ? "0" : beforeAdjust.toPlainString(),
                effectiveDelta.toPlainString(),
                adjustType,
                secondVal);
        adjustmentValueService.adjust(symbol, effectiveDelta, secondVal);
        // 立即生效时同步内存行情,避免只改缓存累计值但页面仍显示旧价
        if (secondVal <= 0) {
            syncRealtimeCacheAfterAdjust(symbol, effectiveDelta);
        } else {
            log.info("延迟调整已提交 symbol={} 目标增量={} 时长约{}秒,价格将分步变化(非瞬间到位)",
                    symbol, effectiveDelta.toPlainString(), secondVal);
        }
        saveLog(logContent);
        ThreadUtils.sleep(500);
    }
    /**
     * 与 calculateValue 一致:type 0/1 在输入值基础上加减 pips,type 2 直接使用输入值作为本次增量。
     */
    private BigDecimal resolveEffectiveAdjustDelta(String symbol, String type, BigDecimal inputValue) {
        if (inputValue == null) {
            return null;
        }
        Item item = itemService.findBySymbol(symbol);
        if (item == null) {
            return inputValue;
        }
        double pips = item.getPips() != null ? item.getPips().doubleValue() : 0D;
        double v = inputValue.doubleValue();
        if ("0".equalsIgnoreCase(type)) {
            return BigDecimal.valueOf(Arith.add(v, pips));
        }
        if ("1".equalsIgnoreCase(type)) {
            return BigDecimal.valueOf(Arith.sub(v, pips));
        }
        return inputValue;
    }
    /** 将本次增量反映到 DataCache,与 WebSocket/采集任务展示逻辑一致 */
    private void syncRealtimeCacheAfterAdjust(String symbol, BigDecimal effectiveDelta) {
        Realtime realtime = DataCache.getRealtime(symbol);
        if (realtime == null) {
            List<Realtime> list = dataService.realtime(symbol);
            if (CollectionUtil.isEmpty(list)) {
                return;
            }
            realtime = list.get(0);
        }
        Integer decimal = itemService.getDecimal(symbol);
        realtime.setClose(realtime.getClose().add(effectiveDelta).setScale(decimal, RoundingMode.HALF_UP));
        if (realtime.getAsk() != null) {
            realtime.setAsk(realtime.getAsk().add(effectiveDelta).setScale(decimal, RoundingMode.HALF_UP));
        }
        if (realtime.getBid() != null) {
            realtime.setBid(realtime.getBid().add(effectiveDelta).setScale(decimal, RoundingMode.HALF_UP));
        }
        DataCache.putRealtime(symbol, realtime);
    }
    public void saveLog(String content) {