Line data Source code
1 : /**
2 : * @file order_event.hpp
3 : * @brief 订单事件定义
4 : *
5 : * 定义从 Application 传递到撮合引擎的订单事件结构。
6 : * 事件使用内部 Order 结构,与 FIX 协议解耦。
7 : */
8 :
9 : #pragma once
10 :
11 : #include <string>
12 : #include <variant>
13 : #include "app/model/order.hpp"
14 :
15 : namespace fix40 {
16 :
17 : /**
18 : * @enum OrderEventType
19 : * @brief 订单事件类型
20 : */
21 : enum class OrderEventType {
22 : NEW_ORDER, ///< 新订单
23 : CANCEL_REQUEST, ///< 撤单请求
24 : SESSION_LOGON, ///< 会话登录
25 : SESSION_LOGOUT ///< 会话登出
26 : };
27 :
28 : /**
29 : * @struct OrderEvent
30 : * @brief 订单事件
31 : *
32 : * 封装从 Application 回调传递到撮合引擎的事件数据。
33 : * 使用内部数据结构(Order/CancelRequest),与 FIX 协议解耦。
34 : *
35 : * @par 数据流
36 : * 1. SimulationApp::fromApp() 收到 FixMessage
37 : * 2. 解析 FixMessage,转换为 Order 或 CancelRequest
38 : * 3. 封装为 OrderEvent,push 到队列
39 : * 4. MatchingEngine 消费 OrderEvent,处理内部结构
40 : */
41 : struct OrderEvent {
42 : OrderEventType type; ///< 事件类型
43 : SessionID sessionID; ///< 来源会话标识
44 : std::string userId; ///< 用户ID(从 Session 提取的真实身份)
45 :
46 : /// 事件数据(根据 type 使用不同类型)
47 : /// - NEW_ORDER: Order
48 : /// - CANCEL_REQUEST: CancelRequest
49 : /// - SESSION_LOGON/LOGOUT: std::monostate(无数据)
50 : std::variant<std::monostate, Order, CancelRequest> data;
51 :
52 : // =========================================================================
53 : // 构造函数
54 : // =========================================================================
55 :
56 : /**
57 : * @brief 默认构造函数
58 : */
59 46 : OrderEvent()
60 46 : : type(OrderEventType::SESSION_LOGON)
61 46 : , data(std::monostate{})
62 46 : {}
63 :
64 : /**
65 : * @brief 构造会话事件(登录/登出)
66 : */
67 3 : OrderEvent(OrderEventType t, const SessionID& sid, const std::string& uid = "")
68 3 : : type(t)
69 3 : , sessionID(sid)
70 3 : , userId(uid)
71 3 : , data(std::monostate{})
72 3 : {}
73 :
74 : /**
75 : * @brief 构造新订单事件
76 : * @param order 订单数据
77 : * @param uid 用户ID(从 Session 提取)
78 : */
79 6 : static OrderEvent newOrder(const Order& order, const std::string& uid) {
80 6 : OrderEvent event;
81 6 : event.type = OrderEventType::NEW_ORDER;
82 6 : event.sessionID = order.sessionID;
83 6 : event.userId = uid;
84 6 : event.data = order;
85 6 : return event;
86 0 : }
87 :
88 : /**
89 : * @brief 构造撤单事件
90 : * @param req 撤单请求
91 : * @param uid 用户ID(从 Session 提取)
92 : */
93 2 : static OrderEvent cancelRequest(const CancelRequest& req, const std::string& uid) {
94 2 : OrderEvent event;
95 2 : event.type = OrderEventType::CANCEL_REQUEST;
96 2 : event.sessionID = req.sessionID;
97 2 : event.userId = uid;
98 2 : event.data = req;
99 2 : return event;
100 0 : }
101 :
102 : // =========================================================================
103 : // 访问器
104 : // =========================================================================
105 :
106 : /**
107 : * @brief 获取订单数据(仅 NEW_ORDER 有效)
108 : * @return const Order* 订单指针,类型不匹配返回 nullptr
109 : */
110 6 : const Order* getOrder() const {
111 6 : return std::get_if<Order>(&data);
112 : }
113 :
114 : /**
115 : * @brief 获取撤单请求(仅 CANCEL_REQUEST 有效)
116 : * @return const CancelRequest* 撤单请求指针,类型不匹配返回 nullptr
117 : */
118 1 : const CancelRequest* getCancelRequest() const {
119 1 : return std::get_if<CancelRequest>(&data);
120 : }
121 : };
122 :
123 : } // namespace fix40
|