feat: 数据流Tab-28张表全量详细说明(写/读/总结)

This commit is contained in:
知微
2026-07-09 08:47:03 +08:00
parent 1e0bf0e00b
commit ea750f2cb3
3 changed files with 907 additions and 162 deletions
+336
View File
@@ -242,6 +242,337 @@ NODE_DESC = {
"未分类": "未被规则匹配的cron自动归入此",
}
# ── 数据流详细描述 ──
# 每张表说明:存什么 + 谁写入(为什么+写什么) + 谁读取(为什么+读什么) + 综合总结
FLOW_DETAIL = {
"signal_news": {
"summary": "全系统信号/新闻的统一存储表,所有宏观分析、风险扫描、小果分析的输出汇聚地,也是下游消费脚本的输入源。7个写入方汇聚不同来源信号,5个读取方按需消费。",
"writers": {
"macro_context_collector": "写入宏观新闻原始数据(标题+摘要+分类),供后续风险扫描消费",
"xiaoguo_news_processor": "写入小果LLM处理后的新闻情感分析结果",
"macro_signal_consumer": "写入宏观风险信号判定结果(等级+来源+建议)",
"divergence_detector": "写入跨市场背离检测信号(A股/港股/美股指数对)",
"xiaoguo_signal_consumer": "写入小果扫描发现的个股/板块信号",
"mofin_news": "写入外部财经常规新闻采集结果",
"xiaoguo_scanner": "写入小果独立扫描的市场机会信号",
},
"readers": {
"macro_signal_consumer": "读取原始宏观新闻和信号,判定风险等级并生成建议",
"system_audit": "读取信号表行数/更新时间,审计数据管道是否畅通",
"intraday_health_check": "读取最新信号,检查盘中是否有新的风险信号到达",
"xiaoguo_signal_consumer": "读取小果相关信号,生成买入/卖出建议",
"server": "读取信号数据供Web Dashboard展示",
},
},
"holdings": {
"summary": "当前持仓表,是系统最核心的数据表之一。import_holding_xls从券商文件导入持仓,mofin_db在价格刷新时更新市值。下游脚本读取持仓做策略分析和推送。",
"writers": {
"mofin_db": "写入price_monitor刷新后的持仓最新市值(通过write_holdings_batch",
"import_holding_xls": "从券商holding.xls导入最新持仓数量/成本/市值",
},
"readers": {
"stale_push_wlin": "读取持仓列表+最新价格,检查是否进入买入区/触发止损",
"mofin_db": "内部读取(get_price_from_db等函数)",
"system_audit": "读取持仓总数/品种分布,审计持仓完整性",
"server": "读取持仓数据供Web Dashboard展示",
"prepare_report_data": "读取持仓数据用于生成分析报告",
"mo_data": "通过read_portfolio()读取持仓结构化数据",
},
},
"portfolio_summary": {
"summary": "组合汇总表(id=1单行),记录总资产=持股市值+可用资金+冻结资金。每笔导入或价格刷新后更新。",
"writers": {
"mofin_db": "价格监控刷新总市值后更新total_mv/total_assets",
"import_holding_xls": "导入持仓后更新cash/frozen/total_assets",
},
"readers": {
"import_holding_xls": "读取当前汇总信息,验证导入后是否正确",
"mo_data": "通过read_portfolio()读取组合汇总",
"price_monitor": "读取当前现金/市值,计算总资产变动",
"prepare_report_data": "读取总资产/现金数据用于报告",
"server": "读取汇总数据供Dashboard展示",
},
},
"holding_strategies": {
"summary": "策略数据表,记录每只持仓/自选股的策略配置(买入价/止损/止盈/目标价/分析维度等)。多写入方按各自职责更新不同字段。",
"writers": {
"data_governance": "归档过期策略、修复异常策略数据",
"sync_decisions_to_db": "从JSON同步策略到DB",
"mofin_db": "策略写入(内部函数)",
"strategy_review": "策略复盘后更新执行结果和评级",
},
"readers": {
"data_governance": "读取所有活跃策略,检查缺失和异常",
"per_stock_reassess": "读取个股策略配置,判断是否需要重评",
"mo_data": "通过read_decisions()读取策略数据",
"stale_push_wlin": "读取买入区/止损/止盈配置,检查价格触发",
},
},
"live_prices": {
"summary": "实时价格缓存表,price_monitor每2分钟写入全量持仓/自选价格。所有脚本必须通过mo_data.get_price()读取——先读此表,无数据才调API。单一写入、多方读取。",
"writers": {
"mofin_db": "price_monitor调用write_live_prices写入最新价格",
"mo_data": "get_price()兜底时从API拉取价格后写回此表",
},
"readers": {
"mo_data": "get_price()/get_prices_batch()优先从此表读取价格",
"mofin_db": "内部读取(get_price_from_db",
"system_audit": "读取价格更新时间和数据量",
"verify_reassess_pipeline": "验证重评管道是否有最新价格",
},
},
"price_events": {
"summary": "价格触发事件表,价格进入/离开买入区或触发止损止盈时记录事件。用于审计和重评触发。",
"writers": {
"mofin_db": "price_monitor检测到价格区间变化时写入事件记录",
},
"readers": {
"mofin_db": "查询历史事件判断是否触发重评",
},
},
"cash_log": {
"summary": "资金流水表,每次资金变动(入金/出金/冻结/解冻)记录一条日志。审计用。",
"writers": {
"mofin_db": "通过write_cash_log记录资金变动",
"mo_data": "write_cash_log函数入口",
},
"readers": {
"prepare_report_data": "读取现金变动历史用于报告",
"mofin_db": "内部查询最近流水",
},
},
"market_snapshots": {
"summary": "市场快照表,market_watch每10分钟采集全市场大盘指数+板块涨跌+上涨下跌家数。下游用于判断市场情绪。",
"writers": {
"mofin_db": "market_watch采集后写入快照数据",
},
"readers": {
"market_screener": "读取最新板块快照,判断热点板块",
"prepare_report_data": "读取市场情绪数据用于报告",
"mofin_db": "内部查询最新快照",
"system_audit": "审计数据新鲜度",
},
},
"sector_snapshots": {
"summary": "板块快照表,market_watch按板块写入涨跌/领涨股/资金流向。market_screener据此判断行业热点。",
"writers": {
"mofin_db": "market_watch采集后写入各板块数据",
},
"readers": {
"market_screener": "读取板块涨跌排名,筛选热点行业",
"strategy_lifecycle": "读取板块数据用于策略生命周期管理",
"mofin_db": "内部查询",
"trend_detector": "读取板块趋势数据用于趋势检测",
},
},
"sector_signals": {
"summary": "板块信号表,多源汇聚的板块级别信号(新闻情感+趋势+资金流向)。用于判断行业轮动。",
"writers": {
"mofin_news": "写入新闻分析得出的板块信号",
"xiaoguo_news_processor": "写入小果LLM分析的板块情感信号",
"trend_detector": "写入技术面趋势检测到的板块信号",
},
"readers": {
"server": "读取供Dashboard展示",
"mofin_news": "读取已有信号做增量更新",
"xiaoguo_news_processor": "读取已有信号避免重复写入",
"trend_detector": "读取信号辅助趋势判定",
},
},
"macro_context_log": {
"summary": "宏观上下文日志,refresh_macro_context每30分钟采集大盘指数/市场情绪/资金面数据。下游多个脚本按需读取最新宏观状态。",
"writers": {
"refresh_macro_context": "每30分钟采集上证/深证/创业板/恒指等指数+情绪指标",
},
"readers": {
"stale_push_wlin": "读取大盘情绪用于策略推送的宏观背景",
"divergence_detector": "读取多市场指数数据做背离检测",
"system_audit": "审计数据采集是否正常",
"xiaoguo_signal_consumer": "读取宏观情绪辅助信号判定",
},
},
"macro_raw_news": {
"summary": "宏观新闻原始数据表,macro_context_collector采集的未经处理的财经新闻。供后续清洗和分析。",
"writers": {
"macro_context_collector": "从财经网站采集原始新闻标题+URL+摘要",
},
"readers": {
"macro_context_collector": "读取最近新闻hash避免重复采集",
"system_audit": "审计新闻采集量",
},
},
"accuracy_stats": {
"summary": "策略准确率统计表,strategy_review复盘后写入各策略的正确/错误/待定计数。",
"writers": {
"strategy_review": "策略复盘后更新准确率统计",
},
"readers": {
"mofin_db": "读取统计结果用于报告",
},
},
"advice_timeline": {
"summary": "建议时间线表,记录每条推送建议的时间/内容/状态。用于审计和对账。",
"writers": {
"advice_reconciliation": "每周对账时写入对账结果",
},
"readers": {
"advice_reconciliation": "读取历史建议做对账",
"mofin_db": "内部查询",
},
},
"candidate_score_history": {
"summary": "候选股评分历史表,记录每次全市场筛选时对候选股的评分。用于评分变化追踪。",
"writers": {
"mofin_db": "market_screener筛选结果写入评分记录",
},
"readers": {
"mofin_db": "查询评分历史供展示",
},
},
"candidates": {
"summary": "候选股池表,market_screener筛选出的值得关注的个股。包含评分/买入区/止损/目标价。",
"writers": {
"mofin_db": "market_screener写入候选股",
"market_screener": "直接写入候选股列表",
},
"readers": {
"mofin_db": "读取候选股数据供展示和后续处理",
},
},
"capital_flow_cache": {
"summary": "资金流向缓存表,capital_flow_collector采集的板块资金流入流出数据。",
"writers": {
"mofin_db": "写入板块资金流向数据",
},
"readers": {
"mofin_db": "读取缓存数据",
},
},
"health_check_log": {
"summary": "健康检查日志表,morning_health_check每次运行记录检查结果。用于追踪系统健康历史。",
"writers": {
"morning_health_check": "每日开盘前体检后写入检查结果",
},
"readers": {
"morning_health_check": "读取历史检查结果比较变化",
},
},
"mtf_cache": {
"summary": "多周期技术指标缓存,refresh_mtf_cache计算MA5/MA20/MA60/支撑阻力位等。下游技术分析脚本从缓存读取避免重复计算。",
"writers": {
"multi_timeframe": "计算并写入多周期MA/支撑阻力位",
"mofin_db": "内部写入函数",
},
"readers": {
"multi_timeframe": "读取已有缓存判断是否需要刷新",
"technical_analysis": "读取MA/支撑阻力位用于技术分析",
"mofin_db": "内部读取",
},
},
"stock_fundamentals": {
"summary": "基本面数据表,存储PE/PB/ROE/市值等财务指标。",
"writers": {
"mofin_db": "基本面数据采集后写入",
},
"readers": {
"strategy_lifecycle": "读取基本面数据用于策略评估",
},
},
"stock_sectors": {
"summary": "股票-板块映射表,记录每只股票所属行业板块。多脚本用于行业分类和板块归因。",
"writers": {
"mofin_db": "股票行业分类数据写入",
},
"readers": {
"xiaoguo_news_processor": "按行业分类新闻",
"mofin_news": "按行业归类新闻",
"mofin_db": "内部查询",
"strategy_lifecycle": "读取行业信息用于策略决策",
},
},
"stocks": {
"summary": "全量股票代码表,所有A股/港股基础信息。供各脚本按code查询股票名称/市场。",
"writers": {
"mofin_db": "初始化时导入全量股票代码",
},
"readers": {
"mofin_news": "按股票代码查找新闻",
"xiaoguo_news_processor": "按股票代码过滤新闻",
"mofin_db": "内部查询",
"trend_detector": "按股票代码获取数据",
},
},
"strategy_evaluations": {
"summary": "策略评估结果表,策略评估脚本每次运行记录评估得分/等级/评语。",
"writers": {
"mofin_collect": "策略评估前采集数据并写入评估结果",
},
"readers": {
"verify_reassess_pipeline": "读取评估结果验证管道完整性",
"mofin_db": "内部查询",
"system_audit": "审计评估是否按时执行",
},
},
"strategy_feedback": {
"summary": "策略反馈表,记录用户对建议的反馈(采纳/忽略/修改)。用于策略自学习。",
"writers": {
"mofin_db": "写入反馈数据",
"server": "通过Web提交反馈后写入",
},
"readers": {
"mofin_db": "读取反馈用于分析和展示",
},
},
"todos": {
"summary": "待办事项表,各脚本发现异常时写入TODOself_todo_executor每10分钟执行修复。异常发现→自动修复的闭环。",
"writers": {
"morning_health_check": "体检发现异常写入TODO",
"intraday_health_check": "盘中自检发现异常写入TODO",
"strategy-staleness-check": "策略过期检测写入TODO",
"self_todo_executor": "执行完成后更新TODO状态",
"preflight_verify": "开盘前验证失败写入TODO",
},
"readers": {
"morning_health_check": "读取待处理的TODO",
"self_todo_executor": "读取待处理的TODO并执行fix_action",
"strategy-staleness-check": "读取TODO避免重复写入",
"intraday_health_check": "读取TODO检查自愈进度",
},
},
"watchlist_stocks": {
"summary": "自选股表,系统自动维护的观察列表。与持仓表分离,用于跟踪潜在买入机会。",
"writers": {
"per_stock_reassess": "策略重评时更新自选状态",
"mofin_db": "内部写入函数",
},
"readers": {
"per_stock_reassess": "读取自选列表做重评",
"stock_quote": "读取自选代码拉取行情",
"mo_alphasift_bridge": "读取自选供Alpha分析",
"mo_data": "通过read_watchlist()读取自选数据",
},
},
"xiaoguo_scan_tracker": {
"summary": "小果扫描追踪表,记录每次小果扫描的状态/耗时/结果数量。用于监控小果服务健康。",
"writers": {
"xiaoguo_scanner": "每次扫描完成后写入状态和统计",
},
"readers": {
"server": "读取扫描状态供Dashboard展示",
"xiaoguo_scanner": "读取上次扫描时间判断是否需要全量扫描",
},
},
"state_meta": {
"summary": "状态元数据表,记录各服务的状态追踪信息(如扫描偏移量/最新处理ID)。",
"writers": {
"xiaoguo_scanner": "写入扫描进度偏移量",
},
"readers": {
"xiaoguo_scanner": "读取上次处理位置继续增量处理",
},
},
}
def build_feature_tree(cron_jobs, db_stats):
# 硬编码分类规则:标签→匹配关键词
@@ -491,6 +822,10 @@ def build_report():
}
if not writers and tname in _manual_writers:
writers = _manual_writers[tname]
# 数据流详细描述
flow_detail = FLOW_DETAIL.get(tname, {})
has_input = len(writers) > 0
has_output = len(readers) > 0
# 排除系统表
@@ -517,6 +852,7 @@ def build_report():
"orphan": flow_status in ("orphan", "read_only", "write_only"),
"flow_status": flow_status,
"warn": flow_status != "healthy",
"flow_detail": flow_detail,
})
# JSON文件
+27 -8
View File
@@ -170,24 +170,43 @@ function renderDataFlow(entities, jsonFiles, architecture) {
const w = e.writers || [];
const r = e.readers || [];
if (w.length === 0 && r.length === 0) return;
const fd = e.flow_detail || {};
const wDesc = fd.writers || {};
const rDesc = fd.readers || {};
html += '<div style="background:#161b22;border:1px solid #30363d;border-radius:6px;padding:10px;margin-bottom:8px">';
html += `<div style="font-weight:bold;font-size:14px;color:#58a6ff;margin-bottom:6px">🗄️ ${e.name}</div>`;
html += `<div style="font-size:11px;color:#8b949e;margin-bottom:6px">${e.desc||''} · ${e.rows}</div>`;
html += `<div style="font-weight:bold;font-size:14px;color:#58a6ff;margin-bottom:4px">🗄️ ${e.name}</div>`;
html += `<div style="font-size:11px;color:#8b949e;margin-bottom:4px">${e.desc||''}</div>`;
// 综合总结
if (fd.summary) {
html += `<div style="font-size:11px;color:#c9d1d9;margin-bottom:6px;padding:4px 8px;background:#0d1117;border-radius:4px">📌 ${fd.summary}</div>`;
}
// 写入方
// 写入方(带详细说明)
if (w.length > 0) {
html += '<div style="margin-bottom:4px">';
html += '<span style="color:#3fb950;font-size:11px">✏️ 写入:</span> ';
html += w.map(s => `<span class="cron-tag ok" style="font-size:11px">${s}</span>`).join(' ');
html += '<span style="color:#3fb950;font-size:11px;font-weight:bold">✏️ 写入:</span> ';
w.forEach(wn => {
const desc = wDesc[wn] || '';
html += `<div style="display:inline-block;margin:2px 4px 2px 0">`;
html += `<span class="cron-tag ok" style="font-size:11px">${wn}</span>`;
if (desc) html += `<span style="font-size:10px;color:#8b949e;margin-left:2px">— ${desc}</span>`;
html += `</div>`;
});
html += '</div>';
}
// 读取方
// 读取方(带详细说明)
if (r.length > 0) {
html += '<div>';
html += '<span style="color:#58a6ff;font-size:11px">📖 读取:</span> ';
html += r.map(s => `<span class="cron-tag" style="border-color:#58a6ff;color:#58a6ff;font-size:11px">${s}</span>`).join(' ');
html += '<span style="color:#58a6ff;font-size:11px;font-weight:bold">📖 读取:</span> ';
r.forEach(rn => {
const desc = rDesc[rn] || '';
html += `<div style="display:inline-block;margin:2px 4px 2px 0">`;
html += `<span class="cron-tag" style="border-color:#58a6ff;color:#58a6ff;font-size:11px">${rn}</span>`;
if (desc) html += `<span style="font-size:10px;color:#8b949e;margin-left:2px">— ${desc}</span>`;
html += `</div>`;
});
html += '</div>';
}
+544 -154
View File
File diff suppressed because it is too large Load Diff