Add shared records review pagination for all three exchanges.

Paginate trade records, journals, and AI history at 5 per page with soft in-card flips; hide the journal form until 填入复盘.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-17 11:52:02 +08:00
parent 57f8d6761c
commit d9b8069906
14 changed files with 999 additions and 361 deletions
+83
View File
@@ -0,0 +1,83 @@
"""records_list_lib pagination."""
from __future__ import annotations
import sqlite3
import unittest
from lib.instance.records_list_lib import list_trade_records_page
from lib.trade.trade_result_lib import filter_trade_records_excluding_miss
def _to_effective(row):
d = dict(row)
d["effective_result"] = d.get("result")
d["effective_pnl_amount"] = d.get("pnl_amount")
return d
class RecordsListLibTest(unittest.TestCase):
def setUp(self):
self.conn = sqlite3.connect(":memory:")
self.conn.row_factory = sqlite3.Row
self.conn.execute(
"""
CREATE TABLE trade_records (
id INTEGER PRIMARY KEY,
closed_at TEXT,
created_at TEXT,
opened_at TEXT,
result TEXT,
pnl_amount REAL
)
"""
)
for i in range(12):
self.conn.execute(
"INSERT INTO trade_records(id, closed_at, created_at, opened_at, result, pnl_amount) "
"VALUES (?,?,?,?,?,?)",
(i + 1, f"2026-07-1{i % 9}-10:00:00", None, None, "止盈", 1.0),
)
self.conn.execute(
"INSERT INTO trade_records(id, closed_at, created_at, opened_at, result, pnl_amount) "
"VALUES (?,?,?,?,?,?)",
(99, "2026-07-15-10:00:00", None, None, "错过", 0),
)
self.conn.commit()
def tearDown(self):
self.conn.close()
def test_pages_exclude_miss(self):
out = list_trade_records_page(
self.conn,
"2026-07-01",
"2026-07-31",
tr_ts="COALESCE(closed_at, created_at, opened_at)",
to_effective_fn=_to_effective,
filter_fn=filter_trade_records_excluding_miss,
limit=5,
offset=0,
)
self.assertTrue(out["ok"])
self.assertEqual(out["total"], 12)
self.assertEqual(out["pages"], 3)
self.assertEqual(len(out["items"]), 5)
def test_second_page(self):
out = list_trade_records_page(
self.conn,
"2026-07-01",
"2026-07-31",
tr_ts="COALESCE(closed_at, created_at, opened_at)",
to_effective_fn=_to_effective,
filter_fn=filter_trade_records_excluding_miss,
limit=5,
offset=5,
)
self.assertEqual(out["page"], 2)
self.assertEqual(len(out["items"]), 5)
if __name__ == "__main__":
unittest.main()