feat: 四所独立统计页日历,修复档案盈亏重复与日历交互

四所 index.html 统计分析页接入交易日历;内照明心剔除犯病盈亏列不再重复计入,犯病日点击显示全部交易,选中日历蓝色高亮。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-30 08:27:38 +08:00
parent 14dbf25798
commit ac4cdceb39
6 changed files with 177 additions and 8 deletions
@@ -244,6 +244,7 @@
.stats-period-block .sub{font-size:.78rem;color:#8892b0;margin-bottom:10px;line-height:1.4}
</style>
<link rel="stylesheet" href="/static/instance_theme.css?v=18">
<link rel="stylesheet" href="/static/trade_stats_calendar.css?v=1">
</head>
<body
@@ -773,6 +774,14 @@
</select>
</label>
</div>
<div id="stats-calendar-wrap" class="trade-cal-wrap stats-calendar-wrap">
<div class="trade-cal-head">
<button type="button" id="stats-cal-prev" class="btn" title="上一月"></button>
<span id="stats-cal-title" class="trade-cal-title"></span>
<button type="button" id="stats-cal-next" class="btn" title="下一月"></button>
</div>
<div id="stats-calendar" class="trade-cal-grid-host" role="grid" aria-label="交易日历"></div>
</div>
{% for seg in stats_bundle.segments %}
<div class="stats-segment-block stats-segment-panel" data-stats-segment="{{ seg.key }}"{% if not loop.first %} style="display:none"{% endif %}>
{{ period_stats("日统计", seg.day) }}
@@ -809,6 +818,7 @@
<script src="/static/form_submit_guard.js?v=2"></script>
<script src="/static/manual_order_rr_preview.js?v=5"></script>
<script src="/static/strategy_roll.js?v=5"></script>
<script src="/static/trade_stats_calendar.js?v=1"></script>
<script>
const JOURNAL_ENTRY_REASON_OPTIONS = {{ entry_reason_options | tojson }};
const JOURNAL_ENTRY_REASON_OTHER = {{ entry_reason_other_value | tojson }};
@@ -1467,6 +1477,36 @@ function switchStatsSegment(){
q.set("stats_segment", key);
const qs = q.toString();
history.replaceState(null, "", qs ? (window.location.pathname + "?" + qs) : window.location.pathname);
if(statsCalendarWidget) statsCalendarWidget.load();
}
let statsCalendarWidget = null;
function initStatsCalendarWidget(){
const grid = document.getElementById("stats-calendar");
if(!grid || !window.TradeStatsCalendar) return;
statsCalendarWidget = new TradeStatsCalendar({
gridEl: grid,
titleEl: document.getElementById("stats-cal-title"),
prevBtn: document.getElementById("stats-cal-prev"),
nextBtn: document.getElementById("stats-cal-next"),
apiUrl: "/api/stats/calendar",
showSick: false,
buildQuery: function(year, month){
const q = new URLSearchParams();
q.set("year", String(year));
q.set("month", String(month));
const sel = document.getElementById("stats-segment-select");
if(sel) q.set("segment", sel.value || "all");
return q;
},
parseResponse: function(data){
if(data && data.ok === false) return {};
return (data && data.days) || {};
}
});
statsCalendarWidget.ensureMonth(new Date());
statsCalendarWidget.load();
}
function initStatsSegmentFromUrl(){
@@ -1490,6 +1530,7 @@ function toggleStatsCard(){
attachListWindowToExports();
toggleListWindowCustom();
initStatsSegmentFromUrl();
initStatsCalendarWidget();
if(document.getElementById("journal-list")) loadJournals();
if(document.getElementById("review-list")) loadReviews();
const reviewToggle = document.getElementById("review-mode-toggle");