diff --git a/docs/development-state.md b/docs/development-state.md
index 329da9d..440d902 100644
--- a/docs/development-state.md
+++ b/docs/development-state.md
@@ -17,7 +17,10 @@
## 股票名称搜索修复(2026-10-09)
- 实际 HTTPS 查询复现:名称“诺普信”无结果,但代码 002215 和名称“诺 普 信”均返回该深交所股票。数据源在名称中填充了空格,原 SQL LIKE 连续匹配漏掉无空格查询,证券并未漏同步。
-- 查询统一忽略名称与输入中的空格、制表符和全角空格,保持原始源名称;转义 LIKE 通配符为字面匹配,避免输入 % 或 _ 返回全部股票。管理端无搜索结果文案与无同步数据区分。真实 PostgreSQL 隔离 schema 的 race 回归覆盖名称/代码/空格和通配符,go vet、管理端类型检查/build/embed 通过;待 PR / CI 上线后实查。
+- 查询统一忽略名称与输入中的空格、制表符和全角空格,保持原始源名称;转义 LIKE 通配符为字面匹配,避免输入 % 或 _ 返回全部股票。管理端无搜索结果文案与无同步数据区分。真实 PostgreSQL 隔离 schema 的 race 回归覆盖名称/代码/空格和通配符,go vet、管理端类型检查/build/embed 通过;已通过 PR #6 合并,待 CI 上线后实查。
+
+- 按用户补充要求,管理端行情列表/详情、候选队列、审核详情/确认、总览观察与信号卡将代码与名称并列展示,代码使用等宽字形;选股、回测、策略证券列表以及 App 候选/计划/持仓/成交原已有代码,继续保留。管理端统一 StockIdentity 组件,类型检查/build/embed 通过。
+- 用户最新指示先不处理 App 安装,保留已有 IPA 产物;当前优先验证名称搜索、股票代码展示与模型运行配置。
## App Expo Go 真机入口(2026-10-09)
diff --git a/web/admin/src/components/CandidatesPanel.tsx b/web/admin/src/components/CandidatesPanel.tsx
index 5c01fee..228f7a3 100644
--- a/web/admin/src/components/CandidatesPanel.tsx
+++ b/web/admin/src/components/CandidatesPanel.tsx
@@ -1,3 +1,4 @@
+import {StockIdentity} from "./StockIdentity"
import {useEffect,useRef,useState,type FormEvent} from "react"
import {ScreeningRunControl} from "./ScreeningRunControl"
import {StockHistoryChart} from "./StockHistoryChart"
@@ -35,10 +36,10 @@ export function CandidatesPanel({onSessionExpired,initialCandidateID}:{onSession
{([["观察逻辑","thesis"],["反证与风险","counter_evidence"],["失效条件","invalidation"]] as const).map(([label,key])=>)}
证据来源
{content.evidence.map((evidence,i)=>
{([["来源 HTTPS 链接","source_url"],["页码 / 段落 / 标题","locator"],["证据摘要","summary"]] as const).map(([label,key])=>)}{content.evidence.length>1&&}
)}
{([["参考区间下限","entry_low"],["参考区间上限","entry_high"],["风险价格","stop_loss"],["目标观察价格","target_price"]] as const).map(([label,key])=>)}
金额最多两位小数;风险价格 < 下限 ≤ 上限 < 目标价格。观察时间限最近 24 小时,有效期最长 7 天。
}
- 候选队列
最近 100 条最新修订及当前发布版本。{loading&&正在读取…
}{!loading&&list.length===0&&尚无符合此状态的股票候选。点击上方自动筛选,命中结果会进入待审核;无需手工录入。
}{list.map(c=>)}
+
候选队列
最近 100 条最新修订及当前发布版本。{loading&&正在读取…
}{!loading&&list.length===0&&尚无符合此状态的股票候选。点击上方自动筛选,命中结果会进入待审核;无需手工录入。
}{list.map(c=>)}
{selected?`${selected.content.name} · ${selected.content.symbol}`:"股票依据与审核"}{selected?`${selected.content.name} ${selected.content.exchange}:${selected.content.symbol} · 修订 ${selected.revision}`:"选择候选查看依据与审核记录。"}{selected&&<>{states[selected.status]}模拟候选版本 {selected.version}
{selected.screening&&自动日线筛选{selected.screening.strategy_name} · 修订 {selected.screening.strategy_revision}
日线 {selected.screening.bar_date} · {selected.screening.source_adapter} 配置版本 {selected.screening.source_version}
输入摘要 {selected.screening.input_hash}
}观察 {new Date(selected.observed_at).toLocaleString("zh-CN")} · 有效截止 {new Date(selected.valid_until).toLocaleString("zh-CN")}
{([["观察逻辑",selected.content.thesis],["反证与风险",selected.content.counter_evidence],["失效条件",selected.content.invalidation]]).map(([label,value])=>)}证据
{selected.content.evidence.map((e,i)=>)}参考区间 ¥{selected.content.reference_plan.entry_low}–{selected.content.reference_plan.entry_high}
风险价格 ¥{selected.content.reference_plan.stop_loss} · 目标观察 ¥{selected.content.reference_plan.target_price}
{selected.is_latest&&selected.status!=="PENDING_REVIEW"&&}{(selected.is_latest&&selected.status==="DRAFT"?["submit"]:selected.is_latest&&selected.status==="PENDING_REVIEW"?["publish","return"]:selected.is_active_publication?["withdraw"]:[]).map(a=>)}
- {action&&}
+ {action&&}
{selected.ai_analysis&&AI 分析与复核
{selected.ai_analysis.analysis?.summary}
风险:{selected.ai_analysis.analysis?.risks}
复核:{selected.ai_analysis.review?.summary}
{selected.ai_analysis.primary_model} / {selected.ai_analysis.review_model}
}审核记录
{selected.reviews?.length?selected.reviews.map(r=>{actions[r.decision.toLowerCase()]??r.decision}{new Date(r.created_at).toLocaleString("zh-CN")} · 输入版本 {r.input_version}{r.reason}
):尚无审核记录。
}>}
}
diff --git a/web/admin/src/components/MarketPanel.tsx b/web/admin/src/components/MarketPanel.tsx
index 02334ec..03ec1d8 100644
--- a/web/admin/src/components/MarketPanel.tsx
+++ b/web/admin/src/components/MarketPanel.tsx
@@ -1,3 +1,4 @@
+import {StockIdentity} from "./StockIdentity"
import {StockHistoryChart} from "./StockHistoryChart"
import {useEffect,useState} from "react"
import {ApiError,request} from "@/lib/auth"
@@ -11,5 +12,5 @@ export function MarketPanel({onSessionExpired,initialSymbol}:{onSessionExpired:(
function fail(e:unknown){if(e instanceof ApiError&&e.status===401)onSessionExpired();else setError(e instanceof Error?e.message:"行情读取失败")}
async function load(){setBusy(true);setError("");try{const [stocks,runs]=await Promise.all([request(`/api/admin/v1/instruments?q=${encodeURIComponent(query)}`),request("/api/admin/v1/market/syncs")]);setList(stocks);setTasks(runs)}catch(e){fail(e)}finally{setBusy(false)}}
useEffect(()=>{void load()},[])
- return 沪深股票池 · 行情与日线启用公开行情适配器后,后端启动即同步沪深股票,此后每五分钟更新。此接口用于开发研究,价格按供应商时间展示,休市或同步失败时保留上次快照。不会把抓取时间当成实时行情时间。
{error&&{error}
}{["股票","价格","行情时间"].map(v=>| {v} | )}
{list.map(v=>{v.exchange}:{v.symbol} | {v.price==="0.00"?"无报价":v.price+" 元"} | {new Date(v.observed_at).toLocaleString("zh-CN")} |
)}
{list.length===0&&
{query.trim()?"未找到匹配股票,请尝试股票代码或其他名称。":"暂无同步数据,请检查系统设置中的行情源与同步记录。"}
}
{selected&&{selected.name}
{selected.exchange}:{selected.symbol}
¥{selected.price} }最近同步记录
{tasks.length===0&&
还没有同步记录。
}{tasks.map(t=>
{new Date(t.finished_at).toLocaleString("zh-CN")} · {t.status==="COMPLETED"?`同步 ${t.instrument_count} 个证券`:t.message}
)}
+ return 沪深股票池 · 行情与日线启用公开行情适配器后,后端启动即同步沪深股票,此后每五分钟更新。此接口用于开发研究,价格按供应商时间展示,休市或同步失败时保留上次快照。不会把抓取时间当成实时行情时间。
{error&&{error}
}{["股票","价格","行情时间"].map(v=>| {v} | )}
{list.map(v=>{v.exchange}:{v.symbol} | {v.price==="0.00"?"无报价":v.price+" 元"} | {new Date(v.observed_at).toLocaleString("zh-CN")} |
)}
{list.length===0&&
{query.trim()?"未找到匹配股票,请尝试股票代码或其他名称。":"暂无同步数据,请检查系统设置中的行情源与同步记录。"}
}
{selected&&
{selected.exchange}:{selected.symbol}
¥{selected.price} }最近同步记录
{tasks.length===0&&
还没有同步记录。
}{tasks.map(t=>
{new Date(t.finished_at).toLocaleString("zh-CN")} · {t.status==="COMPLETED"?`同步 ${t.instrument_count} 个证券`:t.message}
)}
}
diff --git a/web/admin/src/components/StockIdentity.tsx b/web/admin/src/components/StockIdentity.tsx
new file mode 100644
index 0000000..9ea0614
--- /dev/null
+++ b/web/admin/src/components/StockIdentity.tsx
@@ -0,0 +1,8 @@
+type StockIdentityProps = { name: string; symbol: string }
+
+export function StockIdentity({ name, symbol }: StockIdentityProps) {
+ return
+ {name}
+ {symbol}
+
+}
diff --git a/web/admin/src/components/TradingOverview.tsx b/web/admin/src/components/TradingOverview.tsx
index e439307..818b331 100644
--- a/web/admin/src/components/TradingOverview.tsx
+++ b/web/admin/src/components/TradingOverview.tsx
@@ -1,3 +1,4 @@
+import {StockIdentity} from "./StockIdentity"
import {useEffect,useRef,useState} from "react"
import {ArrowUpRight,RefreshCw} from "lucide-react"
import {request,ApiError} from "@/lib/auth"
@@ -20,7 +21,7 @@ export function TradingOverview({onSessionExpired,onNavigate}:{onSessionExpired:
return 沪深 A 股公开行情 · 开发研究
{error&&
{error}
}
{[{title:"已同步股票",value:success?.instrument_count??"—",note:success?`最近成功同步 ${new Date(success.finished_at).toLocaleTimeString("zh-CN")}`:"等待行情源同步",page:"股票行情"},{title:"待审核股票候选",value:data?pending.length:"—",note:"最近 100 条候选修订",page:"候选审核"},{title:"有效发布候选",value:data?published.length:"—",note:"最近 100 条候选修订",page:"候选审核"},{title:"已启用研究策略",value:data?data.strategies.filter(s=>s.status==="ACTIVE").length:"—",note:"最近 100 个策略 · 非收益指标",page:"策略中心"}].map(x=>
)}
void refresh()}/>
- 股票观察 按证券代码排序的行情样本 · 非涨幅排名或投资推荐
{selected&&{selected.exchange} · {selected.symbol}
¥{selected.price}
报价 {new Date(selected.observed_at).toLocaleString("zh-CN")}
}| 股票 / 代码 | 最新报价 | 行情时间 |
{data?.stocks.slice(0,8).map(stock=> | ¥{stock.price} | {new Date(stock.observed_at).toLocaleTimeString("zh-CN")} |
)}
{data?.stocks.length===0&&
暂无股票快照,请在行情源设置中检查同步配置。
}
-
待审核信号 从股票、参考区间与信号依据开始审核
{pending.length===0&&当前没有待审核股票。点击“立即自动筛选”后,真实日线命中结果会自动进入这里;不符合规则的股票不会生成候选。
}{pending.slice(0,8).map(c=>)}
+ 股票观察 按证券代码排序的行情样本 · 非涨幅排名或投资推荐
{selected&&{selected.exchange} · {selected.symbol}
¥{selected.price}
报价 {new Date(selected.observed_at).toLocaleString("zh-CN")}
}| 股票 / 代码 | 最新报价 | 行情时间 |
{data?.stocks.slice(0,8).map(stock=> | ¥{stock.price} | {new Date(stock.observed_at).toLocaleTimeString("zh-CN")} |
)}
{data?.stocks.length===0&&
暂无股票快照,请在行情源设置中检查同步配置。
}
+
待审核信号 从股票、参考区间与信号依据开始审核
{pending.length===0&&当前没有待审核股票。点击“立即自动筛选”后,真实日线命中结果会自动进入这里;不符合规则的股票不会生成候选。
}{pending.slice(0,8).map(c=>)}
价格按供应商观察时间展示,收盘后保留收盘快照。曲线来自实际未复权日线;当前未接入指数、涨跌幅、成交额与行业分类,因此不展示相应统计。
}