Administrator
2026-09-20 61759071dc7bc474b3bdbf25992e6c7271ae1cc6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package com.xcong.excoin.modules.station.controller;
 
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.modules.station.model.InstanceInfo;
import com.xcong.excoin.modules.station.registry.InstanceRegistry;
import com.xcong.excoin.modules.station.service.StationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
 
import javax.annotation.Resource;
import java.util.Collection;
 
/**
 * Station 管理接口 — 实例列表 / 启停 / 状态 / 事件查询
 */
@Slf4j
@Api(value = "Gate 策略管理", tags = "Gate 策略管理")
@RestController
@RequestMapping("/api/gate/station")
public class StationController {
 
    @Resource
    private InstanceRegistry instanceRegistry;
 
    @Resource
    private StationService stationService;
 
    @ApiOperation("获取所有在线 JAR 实例")
    @GetMapping("/list")
    public Result list() {
        // 内存注册表只维护心跳信息,别名从 DB 合并(心跳重建实例对象时不会丢失)
        Collection<InstanceInfo> instances = instanceRegistry.list();
        for (InstanceInfo info : instances) {
            info.setAliasName(stationService.getAlias(info.getApiKeyMd5()));
        }
        return Result.ok(instances);
    }
 
    @ApiOperation("获取单个实例状态")
    @GetMapping("/status")
    public Result status(@RequestParam String apiKeyMd5) {
        InstanceInfo info = instanceRegistry.get(apiKeyMd5);
        if (info != null) {
            info.setAliasName(stationService.getAlias(apiKeyMd5));
        }
        return Result.ok(info);
    }
 
    @ApiOperation("编辑实例别名(空白 = 清除别名)")
    @PostMapping("/alias")
    public Result saveAlias(@RequestParam String apiKeyMd5,
                            @RequestParam(required = false) String alias) {
        stationService.saveAlias(apiKeyMd5, alias);
        return Result.ok("别名已保存");
    }
 
    @ApiOperation("启动指定 apiKeyMd5 的策略")
    @PostMapping("/start")
    public Result start(@RequestParam String apiKeyMd5) {
        stationService.startByMd5(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("停止指定 apiKeyMd5 的策略")
    @PostMapping("/stop")
    public Result stop(@RequestParam String apiKeyMd5) {
        stationService.stopByMd5(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("查询策略事件日志")
    @GetMapping("/events")
    public Result events(@RequestParam String apiKeyMd5) {
        return Result.ok(stationService.getEvents(apiKeyMd5));
    }
 
    @ApiOperation("查询策略实时状态")
    @GetMapping("/strategy-status")
    public Result strategyStatus(@RequestParam String apiKeyMd5) {
        return Result.ok(stationService.getStrategyStatus(apiKeyMd5));
    }
 
    @ApiOperation("更新策略参数(仅持久化,需手动启动生效)")
    @PostMapping("/config")
    public Result updateConfig(@RequestParam String apiKeyMd5, @RequestBody java.util.Map<String, Object> params) {
        stationService.updateConfig(apiKeyMd5, params);
        return Result.ok("参数已保存,请手动点击「启动」使新配置生效");
    }
 
    @ApiOperation("取消多仓止盈止损挂单")
    @PostMapping("/cancel-long-tp-sl")
    public Result cancelLongTpSl(@RequestParam String apiKeyMd5) {
        stationService.cancelLongTpSl(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("取消空仓止盈止损挂单")
    @PostMapping("/cancel-short-tp-sl")
    public Result cancelShortTpSl(@RequestParam String apiKeyMd5) {
        stationService.cancelShortTpSl(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("生成多仓止盈止损挂单")
    @PostMapping("/rebuild-long-tp-sl")
    public Result rebuildLongTpSl(@RequestParam String apiKeyMd5) {
        stationService.rebuildLongTpSl(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("生成空仓止盈止损挂单")
    @PostMapping("/rebuild-short-tp-sl")
    public Result rebuildShortTpSl(@RequestParam String apiKeyMd5) {
        stationService.rebuildShortTpSl(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("多单平仓")
    @PostMapping("/close-long")
    public Result closeLong(@RequestParam String apiKeyMd5) {
        stationService.closeLong(apiKeyMd5);
        return Result.ok("指令已发送");
    }
 
    @ApiOperation("空单平仓")
    @PostMapping("/close-short")
    public Result closeShort(@RequestParam String apiKeyMd5) {
        stationService.closeShort(apiKeyMd5);
        return Result.ok("指令已发送");
    }
}