Skip to main content

futu_backend/trade_query/orders/
query_orders.rs

1//! trade_query/orders/query_orders — query_orders + query_orders_inner (real + sim 双路径)
2//! (v1.4.110 CC Batch J: 拆自 orders.rs L336-666)
3
4use futu_cache::trd_cache::{OrderRelationSourceToken, TrdCache};
5use futu_core::error::Result;
6
7use crate::conn::BackendConn;
8
9use super::order_list::query_orders_inner;
10use super::types::{CurrentOrderQueryResult, QueryErrorMode};
11
12pub async fn query_orders(
13    backend: &BackendConn,
14    acc_id: u64,
15    trd_cache: &TrdCache,
16) -> Result<CurrentOrderQueryResult> {
17    query_orders_with_source(
18        backend,
19        acc_id,
20        trd_cache,
21        OrderRelationSourceToken::unknown(backend.connection_generation()),
22    )
23    .await
24}
25
26pub async fn query_orders_with_source(
27    backend: &BackendConn,
28    acc_id: u64,
29    trd_cache: &TrdCache,
30    source: OrderRelationSourceToken,
31) -> Result<CurrentOrderQueryResult> {
32    query_orders_inner(
33        backend,
34        acc_id,
35        trd_cache,
36        QueryErrorMode::LenientCacheRead,
37        source,
38    )
39    .await
40}
41
42/// v1.4.109: strict 版 query_orders for write/push safety paths.
43///
44/// 与 lenient 版区别: decode 失败 / `result != 0` → 返 `Err` (会被 retry 重试).
45/// 不再 silent 当 "Ok(empty)" → silent-success 反模式 D (CLAUDE.md #45) 的修复.
46///
47/// Callers that need a trustworthy order baseline before mutating order state
48/// must use this strict variant, not the read-path lenient cache-miss helper.
49pub async fn query_orders_strict(
50    backend: &BackendConn,
51    acc_id: u64,
52    trd_cache: &TrdCache,
53) -> Result<CurrentOrderQueryResult> {
54    query_orders_strict_with_source(
55        backend,
56        acc_id,
57        trd_cache,
58        OrderRelationSourceToken::unknown(backend.connection_generation()),
59    )
60    .await
61}
62
63pub async fn query_orders_strict_with_source(
64    backend: &BackendConn,
65    acc_id: u64,
66    trd_cache: &TrdCache,
67    source: OrderRelationSourceToken,
68) -> Result<CurrentOrderQueryResult> {
69    query_orders_inner(
70        backend,
71        acc_id,
72        trd_cache,
73        QueryErrorMode::StrictPushRefresh,
74        source,
75    )
76    .await
77}
78
79/// v1.4.106 codex 0932 F3 [P2]: strict 版 query_orders for push-refresh path.
80///
81/// **4 attempts 全失败**: caller (dispatcher) 应触发 F4 `record_f2_exhausted` +
82/// log warn. 不再 silent 当成功流转.
83pub async fn query_orders_strict_for_push_refresh(
84    backend: &BackendConn,
85    acc_id: u64,
86    trd_cache: &TrdCache,
87) -> Result<CurrentOrderQueryResult> {
88    query_orders_strict(backend, acc_id, trd_cache).await
89}
90
91pub async fn query_orders_strict_for_push_refresh_with_source(
92    backend: &BackendConn,
93    acc_id: u64,
94    trd_cache: &TrdCache,
95    source: OrderRelationSourceToken,
96) -> Result<CurrentOrderQueryResult> {
97    query_orders_strict_with_source(backend, acc_id, trd_cache, source).await
98}