v1.9.0: ①自动化开关即时保存(切换即生效不回落) ②持仓跟踪推送方式(聚合一起发默认/分散发) ③行情数据增量延续到最新交易日(每小时自动+手动按钮)

This commit is contained in:
2026-09-09 15:59:35 +08:00
parent 9340577f7b
commit f20fe2f4f0
9 changed files with 317 additions and 32 deletions
+3 -1
View File
@@ -47,13 +47,15 @@
<div class="card-title"><span class="bar" style="background:var(--gold)"></span>系统维护</div>
<div class="flex wrap">
<button class="btn btn-primary" onclick="reseed()">♻️ 一键重灌数据(含向量重建)</button>
<button class="btn btn-primary" onclick="updateData()">📅 更新行情到最新交易日</button>
<button class="btn" onclick="rebuildBt()">📈 重建量化回测</button>
<button class="btn" onclick="health()">🔌 依赖连通性检查</button>
<button class="btn" onclick="refreshStats()">🔄 刷新统计</button>
</div>
<div id="healthBox" class="mt16"></div>
<div class="mt16" style="border-top:1px solid var(--border);padding-top:14px;color:var(--muted);font-size:13px;line-height:2">
<b>当前为模拟数据</b>,用于功能演示与系统验证。接入真实数据后(行情/新闻/机构),修改 <code>config.py</code> 中的 <code>IS_MOCK=False</code>,并替换 <code>seed_data.py</code> 为真实数据源即可,其余分析/检索逻辑无需改动<br>
<b>当前为模拟数据</b>,用于功能演示与系统验证。<b>📅 更新行情</b>会把模拟行情/新闻/指数从库内最新日期<b>增量延续</b>到最新交易日(服务每小时自动检查一次,无需手动)<br>
接入真实数据后(行情/新闻/机构),修改 <code>config.py</code> 中的 <code>IS_MOCK=False</code>,并替换 <code>seed_data.py</code> 为真实数据源即可,其余分析/检索逻辑无需改动。<br>
技术栈:Python Flask + SQLite + Chroma 向量库 + bge-large-zh 语义检索 + DeepSeek 大模型(RAG 增强研报)。
</div>
</div>
+28 -18
View File
@@ -12,30 +12,30 @@
<div class="tab-panel" id="panel-monitor">
<div class="between mt16">
<div class="card-title" style="margin-bottom:0"><span class="bar" style="background:var(--cyan)"></span>定期扫描最新新闻,重要信息邮件通知</div>
<label class="switch"><input type="checkbox" id="monitorEnabled"><span></span></label>
<label class="switch"><input type="checkbox" id="monitorEnabled" onchange="saveMonitor()"><span></span></label>
</div>
<div class="mt8 settings-form">
<div class="sf-row"><label>扫描间隔(分钟)</label><input class="input" id="monitorInterval" type="number" min="5" style="width:120px"></div>
<div class="sf-row"><label>重要度阈值 (0-100)</label><input class="input" id="monitorImportance" type="number" min="0" max="100" style="width:120px"></div>
<div class="sf-row"><label>情感权重</label><input class="input" id="monitorSentiment" type="number" step="0.05" style="width:120px"></div>
<div class="sf-row"><label>扫描间隔(分钟)</label><input class="input" id="monitorInterval" type="number" min="5" style="width:120px" onchange="saveMonitor()"></div>
<div class="sf-row"><label>重要度阈值 (0-100)</label><input class="input" id="monitorImportance" type="number" min="0" max="100" style="width:120px" onchange="saveMonitor()"></div>
<div class="sf-row"><label>情感权重</label><input class="input" id="monitorSentiment" type="number" step="0.05" style="width:120px" onchange="saveMonitor()"></div>
<div class="sf-row" style="align-items:flex-start"><label>监控分类</label>
<div class="chk-group" id="monitorCats">
<label><input type="checkbox" value="公司"> 公司</label>
<label><input type="checkbox" value="业绩"> 业绩</label>
<label><input type="checkbox" value="机构观点"> 机构观点</label>
<label><input type="checkbox" value="行业"> 行业</label>
<label><input type="checkbox" value="市场"> 市场</label>
<label><input type="checkbox" value="公司" onchange="saveMonitor()"> 公司</label>
<label><input type="checkbox" value="业绩" onchange="saveMonitor()"> 业绩</label>
<label><input type="checkbox" value="机构观点" onchange="saveMonitor()"> 机构观点</label>
<label><input type="checkbox" value="行业" onchange="saveMonitor()"> 行业</label>
<label><input type="checkbox" value="市场" onchange="saveMonitor()"> 市场</label>
</div>
</div>
<div class="sf-row" style="align-items:flex-start"><label>关键词(逗号分隔)</label><textarea class="input" id="monitorKeywords" rows="2" style="width:100%"></textarea></div>
<div class="sf-row" style="align-items:flex-start"><label>关键词(逗号分隔)</label><textarea class="input" id="monitorKeywords" rows="2" style="width:100%" onchange="saveMonitor()"></textarea></div>
</div>
<div class="mt16" style="border-top:1px solid var(--border);padding-top:6px">
<div class="between mt16">
<div class="card-title" style="font-size:14px;margin-bottom:0"><span class="bar" style="background:#f472b6"></span>🌙 静默期 —— 某些时段不发送邮件通知</div>
<label class="switch"><input type="checkbox" id="monitorQuietEnabled"><span></span></label>
<label class="switch"><input type="checkbox" id="monitorQuietEnabled" onchange="saveMonitor()"><span></span></label>
</div>
<div class="mt8 settings-form">
<div class="sf-row" style="align-items:flex-start"><label>静默时段</label><input class="input" id="monitorQuietRanges" placeholder="如 22:00-07:30(跨午夜)或 23:00-07:30,12:00-13:00(多段逗号分隔)" style="width:100%"></div>
<div class="sf-row" style="align-items:flex-start"><label>静默时段</label><input class="input" id="monitorQuietRanges" placeholder="如 22:00-07:30(跨午夜)或 23:00-07:30,12:00-13:00(多段逗号分隔)" style="width:100%" onchange="saveMonitor()"></div>
</div>
<div style="color:var(--muted);font-size:12px;line-height:1.8">开启后,落在静默时段内的扫描将<span style="color:var(--gold)">不发送邮件</span>(通知日志标记为“静默”,水位正常推进,不会在结束后补发积压)。</div>
</div>
@@ -59,22 +59,32 @@
<div class="tab-panel" id="panel-tracking" style="display:none">
<div class="between mt16">
<div class="card-title" style="margin-bottom:0"><span class="bar" style="background:#8b5cf6"></span>AI 智能体定期跟踪持仓,深度分析产业链上下游</div>
<label class="switch"><input type="checkbox" id="trackingEnabled"><span></span></label>
<label class="switch"><input type="checkbox" id="trackingEnabled" onchange="saveTracking()"><span></span></label>
</div>
<div class="mt8 settings-form">
<div class="sf-row"><label>跟踪间隔(分钟)</label><input class="input" id="trackingInterval" type="number" min="15" style="width:120px"></div>
<div class="sf-row"><label>重大判定阈值</label><input class="input" id="trackingImpact" type="number" min="0" max="100" style="width:120px"></div>
<div class="sf-row"><label>跟踪间隔(分钟)</label><input class="input" id="trackingInterval" type="number" min="15" style="width:120px" onchange="saveTracking()"></div>
<div class="sf-row"><label>重大判定阈值</label><input class="input" id="trackingImpact" type="number" min="0" max="100" style="width:120px" onchange="saveTracking()"></div>
<div class="sf-row"><label>重大变化邮件通知</label>
<label class="switch"><input type="checkbox" id="trackingNotify"><span></span></label>
<label class="switch"><input type="checkbox" id="trackingNotify" onchange="saveTracking()"><span></span></label>
</div>
<div class="sf-row"><label>重大变化推送方式</label>
<select class="input" id="trackingPushMode" style="width:150px" onchange="saveTracking()">
<option value="aggregate">聚合一起发</option>
<option value="scattered">分散发</option>
</select>
</div>
<div style="color:var(--muted);font-size:12px;line-height:1.8">
聚合一起发(默认):一轮跟踪全部完成后再统一发一封汇总邮件,不刷屏;<br>
分散发:每只股票分析完出结果立即单独发一封邮件。
</div>
</div>
<div class="mt16" style="border-top:1px solid var(--border);padding-top:6px">
<div class="between mt16">
<div class="card-title" style="font-size:14px;margin-bottom:0"><span class="bar" style="background:#f472b6"></span>🌙 静默期 —— 某些时段不发送邮件通知</div>
<label class="switch"><input type="checkbox" id="trackingQuietEnabled"><span></span></label>
<label class="switch"><input type="checkbox" id="trackingQuietEnabled" onchange="saveTracking()"><span></span></label>
</div>
<div class="mt8 settings-form">
<div class="sf-row" style="align-items:flex-start"><label>静默时段</label><input class="input" id="trackingQuietRanges" placeholder="如 22:00-07:30(跨午夜)或 23:00-07:30,12:00-13:00(多段逗号分隔)" style="width:100%"></div>
<div class="sf-row" style="align-items:flex-start"><label>静默时段</label><input class="input" id="trackingQuietRanges" placeholder="如 22:00-07:30(跨午夜)或 23:00-07:30,12:00-13:00(多段逗号分隔)" style="width:100%" onchange="saveTracking()"></div>
</div>
<div style="color:var(--muted);font-size:12px;line-height:1.8">开启后,落在静默时段内发现的重大变化将<span style="color:var(--gold)">不发送邮件</span>(跟踪报告照常生成入库)。</div>
</div>