数据加载中…
›
实时汇率看板
基准:人民币 CNY 今日 {{ todayLabel }} 数据较旧,建议刷新 {{ rateUpdatedAt }}1 {{ r.currency }} =
¥ {{ fmtRate(r.rate_to_cny) }}
{{ r.currency==='CNY' ? '本位币' : rateDayLabel(r) }}
数据来源:{{ rateSource }}(自动获取,网络不可用时回退内置兜底汇率)。欧洲央行按工作日发布汇率,周末与节假日沿用最近一个交易日,卡片小字标注的即该汇率的统计日。
{{ briefTitle() }}
晨报加载中…
{{ c.t }}
{{ c.v }}
{{ c.n }}
今天要盯的事(点击直达对应模块)
{{ t.label }} {{ t.count }}{{ t.amount_cny ? '(¥' + fmtInt(t.amount_cny) + ')' : '' }}
系统播报备份 / 服务器错误 / 库存等系统健康提示
{{ n }}
AI 经营讲评模型只写文字 · 数字以上方卡片为准
AI 讲评未生成:{{ brief.data.ai_error }}
今天还没有 AI 讲评,点「重新生成」补一段(数字不受影响)。
今天还没有晨报
{{ brief.error }}
加载中…
{{ c.t }}
{{ c.v }}
{{ c.n }}
环比上一期数字由后端按同一口径算好
{{ c.label }}
{{ pbrCmpVal(c) }}
{{ pbrCmpText(c) }}
本期 TOP 客户按订单额排序
{{ i + 1 }}
{{ c.customer }} · {{ c.country || '—' }}
{{ c.order_count }} 单 · 毛利率 {{ c.gross_rate }}%
¥ {{ fmtInt(c.amount_cny) }}
数据完整度
{{ pbrCov().daily_label }}(日报缺档不影响本期数字 —— 数字直接取自报表口径)
{{ pbrCov().prev_label }}
系统播报
{{ n }}
AI 经营讲评模型只写文字 · 数字以上方卡片为准
AI 讲评未生成:{{ pbrRow().ai_error }}
这一期还没有 AI 讲评,点「重新生成」补一段(数字不受影响)。
这一期还没有简报
{{ pbr.error }}
周报每周一 08:00 自动生成上周,月报每月 1 号 08:05 自动生成上月;只出完整周期 ——
半月 / 半周不出简报(避免半截数据被当成结论)。期次可在下拉里往前翻,补齐历史期。
累计出口订单额
$ {{ fmtInt(dash.cards.order_amount) }}
折合 ¥ {{ fmtInt(dash.cards.order_amount_cny) }} · 客户 {{ dash.cards.total_customers }} 家
订单毛利合计
¥ {{ fmtInt(dash.cards.profit_cny) }}
综合毛利率 {{ dash.cards.avg_profit_rate }}% · 成本合计 ¥ {{ fmtInt(dash.cards.cost_cny) }}
应收未收
¥ {{ fmtInt(dash.cards.outstanding_cny) }}
已收汇 ¥ {{ fmtInt(dash.cards.received_cny) }}
逾期应收账款
¥ {{ fmtInt(dash.cards.overdue_amount_cny) }}
{{ dash.cards.overdue_count }} 笔订单已逾期
在执行订单
{{ dash.cards.active_order_count }}
在执行金额 ¥ {{ fmtInt(dash.cards.active_order_amount_cny) }}
在途采购
{{ dash.cards.open_po_count }}
金额 ¥ {{ fmtInt(dash.cards.open_po_amount_cny) }} · 逾期 {{ dash.cards.po_overdue_count }} 单
在途出运
{{ dash.cards.transit_ship_count }}
在制工单 {{ dash.cards.wip_count }} · 待报关 {{ dash.cards.customs_pending }}
经营待办
{{ dash.cards.todo_count }}
项待处理 · 询盘 {{ dash.cards.total_inquiries }} 条 / 单证 {{ dash.cards.pending_docs }} 份
经营待办提醒
{{ dash.business.todo_count ? dash.business.todo_count + ' 项待处理' : '全部处理完毕' }} 点任意一项直达对应模块 看流程图 →
{{ t.label }}
{{ t.count }}
{{ t.amount_cny ? '¥ ' + fmtInt(t.amount_cny) : '项' }}
✓
暂无待办,询盘、采购、生产、出运、报关、收款各环节均已处理完毕
该联系的客户
{{ churnHeadline() }} 沉默 · 未回信 · 报价无下文 · 询盘停滞 · 复购断档 · 逾期欠款 六项评分 看全部 →| 客户 | 风险分 | 主要理由 | 最近往来 | 操作 |
|---|---|---|---|---|
| {{ r.company }} · {{ r.grade }} 级 | {{ r.score }} {{ r.level }} | {{ r.reason }} | {{ r.last_contact_at || '从未往来' }} | — |
✓
{{ churn.loading ? '正在计算风险分…' : (churn.error || '暂无需要提醒的客户') }}
应收账款账龄
单位:人民币 应收台账 →
未收合计 ¥ {{ fmtInt(dash.business.receivable.total_outstanding_cny) }}
其中逾期 ¥ {{ fmtInt(dash.business.receivable.overdue_amount_cny) }}
({{ dash.business.receivable.overdue_count }} 笔)
| 逾期订单 | 客户 | 未收 ¥ | 逾期 |
|---|---|---|---|
| {{ o.order_no }} | {{ o.customer }} | {{ fmtInt(o.outstanding_cny) }} | {{ o.overdue_days }} 天 |
订单毛利 TOP 5
收入折¥ − 采购 − 加工费 − 运费 − 报关费 订单管理 →| 订单号 | 客户 | 收入 ¥ | 毛利 ¥ | 毛利率 |
|---|---|---|---|---|
| {{ o.order_no }} | {{ o.customer }} | {{ fmtInt(o.amount_cny) }} | {{ fmtInt(o.profit) }} | {{ Number(o.cost_total) <= 0 ? '未核算' : o.profit_rate + '%' }} |
◫
暂无已核算毛利的订单
提示:手工创建、未关联采购/工单的订单毛利未核算,可在订单页点「重算毛利」补算。
月度毛利趋势
单位:人民币◫
暂无毛利数据生产与出运进度
出运单 →生产工单
暂无工单
出运单
暂无出运单
采购交期预警
逾期 {{ p.days_late }} 天 · {{ p.po_no }} · {{ p.supplier }}
{{ p.days_left }} 天后到货 · {{ p.po_no }} · {{ p.supplier }}
月度出口订单额趋势
单位:美元◫
暂无订单数据订单状态分布
◫
暂无数据客户订单额 TOP 5
| 客户 | 订单额(USD) | 订单数 |
|---|---|---|
| {{ c.company }} | $ {{ fmtInt(c.amount) }} | {{ c.orders }} |
◫
暂无数据客户国家/地区分布
◫
暂无数据最近询盘
查看全部 →| 客户 | 产品 | 数量 | 状态 | 日期 |
|---|---|---|---|---|
| {{ r.company }} | {{ r.product_name }} | {{ r.qty }} {{ r.unit }} | {{ r.status }} | {{ r.inquiry_date }} |
库存告警
去补货 →| 产品 | 仓库 | 当前 | 安全库存 |
|---|---|---|---|
| {{ a.product }} | {{ a.warehouse }} | {{ a.qty }} {{ a.unit }} | {{ a.safety_qty }} {{ a.unit }} |
✓
库存充足,无告警最近订单
查看全部 →| 订单号 | 客户 | 金额 | 折人民币 | 毛利 ¥ | 毛利率 | 状态 | 下单日期 |
|---|---|---|---|---|---|---|---|
| {{ r.order_no }} | {{ r.company }} | {{ r.currency }} {{ fmtInt(r.amount) }} | ¥ {{ fmtInt(r.amount_cny) }} | {{ fmtInt(r.profit) }} | {{ r.profit_rate }}% | {{ r.status }} | {{ r.order_date }} |
业务全流程 · 从询盘到回款
{{ flow.total ? flow.total + ' 项待办' : '各环节均已处理完毕' }} {{ flow.scope || '我的数据' }}一张外贸订单从头到尾要过 8 个环节。链上带数字的是该环节现在压着的未完成单据, 点环节链或下方卡片的「去办理」直接跳到对应模块处理;数字与首页看板、数据大屏、每日晨报同源,不会两处对不上。
{{ s.no }}
{{ s.name }}
{{ flowBadge(s.no).count ? flowBadge(s.no).count + ' 项待办' : '无待办' }}
→
{{ s.no }}
{{ s.name }}
{{ flowBadge(s.no).count ? flowBadge(s.no).count + ' 项待办' : '无待办' }}
- {{ a }}
{{ t.label }} {{ t.count }}{{ t.amount_cny ? '(¥' + fmtInt(t.amount_cny) + ')' : '' }}
✦ {{ s.ai }}
图例:红 = 逾期 / 超期风险,黄 = 待审批 / 待办理,蓝 = 在办在途。
「打印版」是 A4 横版全业务流程图,可直接满版打印贴在工位上。
| 邮箱 | 姓名 | 部门 | 角色 | 状态 | 注册时间 | 最后登录 | 审批人 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ u.email }} | {{ u.name }} | {{ u.department || '—' }} | {{ statusLabel(u.status) }} | {{ u.created_at }} | {{ u.last_login || '从未登录' }} | {{ u.approved_by || '—' }} |
|
◌
暂无用户跟进中
{{ followStats.ongoing }}
范围:{{ followStats.scope }}
已完成
{{ followStats.done }}
完成率 {{ followStats.completion_rate }}%
记录总数
{{ followStats.total }}
近 7 天 +{{ followStats.recent_7 }} · 近 30 天 +{{ followStats.recent_30 }}
跟进方式分布
{{ mm.name }} {{ mm.value }}
负责人跟进统计
全公司 · 管理员可见{{ o.owner }}
{{ c.t }}
{{ c.money ? '¥ ' + fmtInt(c.v) : c.v }}
{{ b.title }}
{{ (getPath(repData, b.key) || []).length }} 行| {{ c.label }} |
|---|
| {{ r[c.key] }} {{ fmtInt(r[c.key]) }} {{ short(r[c.key], c.text) }} {{ r[c.key] }} |
{{ repData ? '该表暂无数据' : '报表加载中…' }}
⚠ 异常订单归因
异常 {{ exp.data.summary.anomaly_count }} 单 / 可核算 {{ exp.data.summary.analyzable }} 单 基线 低于基线
基线口径:{{ exp.data.basis_note }}。{{ exp.data.note }}
| 订单号 | 客户 | 收入 ¥ | 毛利率 % | 基线 % | 落后基线 | 差额 ¥ | 亏在哪(五因子) |
|---|---|---|---|---|---|---|---|
| {{ r.order_no }} | {{ r.customer }}{{ r.country }} | {{ fmtInt(r.amount_cny) }} | {{ r.gross_rate }} | {{ r.baseline.gross_rate }}{{ r.baseline.label }} · {{ r.baseline.sample }} 单 | {{ r.gap_pp }} pp | {{ fmtInt(r.gap_cny) }} |
{{ f.name }}
{{ f.pp > 0 ? '+' : '' }}{{ f.pp }}pp
|
✓ 当前条件下没有低于基线 {{ exp.data.threshold_pp }} 个点的订单
(成本未归集的 {{ exp.data.summary.skipped_no_cost }} 单未参与判定,补上采购单 / 工单后自动纳入)
归因数据加载中…
✦ AI 归因诊断 · 生成中…
{{ exp.err }}
⚠ {{ currentReport.emptyHint || '当前筛选条件下没有数据——调整上方时间段 / 窗口后重试' }}
⚠ 数据一致性检查({{ docGenM.data.issues.length }} 项待补齐):
· {{ it }}
· {{ it }}
✓ 订单数据完整,可直接生成
| 生成 | 单据类型 | 单据号(可改) | 预览 |
|---|---|---|---|
| {{ t }} |
生成结果
{{ docGenM.result.message }}| 单据类型 | 单据号 | 导出状态 | 操作 |
|---|---|---|---|
| {{ d.doc_type }} | {{ d.doc_no }} | {{ d.file_path ? 'PDF 已导出' : '仅生成数据' }} |
双语标准条款
中英对照,可直接贴进报价单 / PI / 销售合同{{ docGenM.termsErr }}
{{ c.title_zh }} / {{ c.title_en }}
{{ c.body_zh }}
{{ c.body_en }}
补充说明 / NotesAI 备注 · 非条款
{{ docGenM.terms.note_zh }}
{{ docGenM.terms.note_en }}
条款正文全部来自「单证管理 → 标准条款库」,占位符已按订单事实填写;AI 只负责挑选与备注,不生成条款文本。
{{ c.t }}
{{ c.v }}
{{ c.n }}
| 审批单号 | 单据号 | 金额 | 申请人 | 状态 | 当前环节 | 进度 | 提交时间 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ row.record_no }} | {{ row.biz_no }} | {{ row.currency }} {{ fmtInt(row.amount) }} | {{ row.applicant }} | {{ row.status }} 我提交 | {{ row.status==='审批中' ? (row.current_step || '待处理') : (row.finished_at ? '已完成' : '—') }} | {{ row.current_seq }}/{{ row.total_steps }} | {{ row.submitted_at }} |
|
◌
{{ apScope==='todo' ? '当前没有需要我审批的单据'
: (apScope==='mine' ? '我还没有提交过审批单' : '暂无审批记录') }}
它自己决定查哪几张表、查几步(最多 5 步);查数只读、写作只出草稿,落库要你点确认
「自动」先按口径找系统里的数字,口径对不上再去资料里找说法;也可以手动锁定一条通道
待确认草稿 {{ patrol.drafts.length }} 张
不确认就不会写进业务表;过期后需重新起草
{{ qaDraftLab(d) }}
{{ d.summary }}
◈
一句话问下去,系统自己分流
问「数字」走白名单取数(AI 不碰库),问「说法」走本地资料检索(答案带出处、查不到直说);
要串几张表才答得上来的问题,切到「◈ 智能体(多步查)」—— 它自己决定查哪几步,过程全程可见。
试试这样问(要串几张表的):
{{ s }}
试试这样问(数字):
{{ s }}
试试这样问(资料):
{{ s }}
{{ it.label }}{{ it.desc }}
{{ s }}
能力清单加载中…
{{ m.q }}
◈
智能体查到的
{{ (qaMBiz(m) && qaMBiz(m).label) || '系统数字' }}
{{ (qaMKb(m) && qaMKb(m).hit) ? '资料里查到了' : '知识库暂未收录' }}
{{ s.phase==='start' ? '⟳' : (s.ok ? '✓' : '⊘') }}
{{ s.step }}
{{ s.label }}
{{ s.phase==='start' ? '执行中…' : (s.ok ? s.summary : (s.error || '没查到')) }}
{{ qaMs(s.ms) }}
调用参数
{{ qaArgsText(s) }}
返回内容
{{ s.detail || '(无返回)' }}
{{ p.k }}{{ p.v }}
没听懂这个问题,换个说法再试;下面这些我一定答得上来:
{{ s }}
{{ qaMBiz(m).reason }}
{{ c.label }}
{{ c.value }}{{ c.unit || '' }}
| {{ c }} |
|---|
| {{ x }} |
共 {{ qaMBiz(m).rows_total }} 条,上表列出前 {{ qaMRows(m) }} 条
{{ qaMBiz(m).empty_hint }}
· {{ n }}
{{ qaMKb(m).reason }}
换个更贴近资料的说法再试;如果确实缺资料,管理员在「知识库管理 → 资料库」补一条,
再到「索引与切片」重建一次索引,之后就能问到。
最接近:{{ r.heading }}(相似度 {{ r.score }})
{{ qaIsAgent ? '正在查…(每执行一步,上面的查询过程会实时更新)' : '正在把结果讲成人话…' }}
上面的数字已经算好;AI 解读暂未生成。
已检索到依据;AI 作答暂未生成。
〔{{ r.n }}〕
{{ r.heading || r.title }}
{{ r.source_kind }}
相似度 {{ r.score }}
{{ r.text }}
{{ qaDraftState(d) }}
· {{ d.kind_label }}
草稿 {{ di + 1 }}/{{ m.drafts.length }}
{{ x.label }} · 草稿值
{{ x.after }}
{{ qaFieldLabel(k) }} · 现在值
{{ v }}
{{ qaDraftLab(d) }}
{{ x.label }}
{{ x.after }}
依据
{{ d.basis }}
⚠ {{ w }}
{{ d.msg }}
{{ d.expires_at }} 前有效
{{ d.applied_at }} 由 {{ d.applied_by }} 确认
{{ m.error }}
按 ⌘/Ctrl + Enter 发送,或点右侧 ↑ 让它去查;它最多走 5 步,查数只读、写作只出草稿
按 ⌘/Ctrl + Enter 发送;数字由系统算(AI 不碰库)、资料带出处(查不到直说没有)
已聊 {{ qaFlow.length }} 轮
同一个功能组:资料库管「喂什么」,索引与切片看「收了多少、向量齐不齐」,检索测试查「为什么答不出来」,来源开关定「哪几类资料参与检索」
这里每一条都会在重建索引时被切分进知识库,供「智能问答 → 查资料」引用。
首次启动时系统已把 docs/kb/*.md 里的文件语料导入进来(导入的条目会标注来源),之后直接在界面上改即可。
加载中…
| 标题 | 分类 | 标签 | 字数 | 状态 | 最后修改 | 操作 |
|---|---|---|---|---|---|---|
|
{{ r.title }}
来源:{{ r.source_ref }}
|
{{ r.category || '—' }} | {{ r.tags || '—' }} | {{ (r.content || '').length }} | 参与建库 已停用 | {{ kbWhen(r.updated_at) }} · {{ kbmgmt.verCounts[r.id] }} 版 |
✎
还没有人工语料。点右上角「+ 新建语料」写第一条。
正在重建:{{ kbmgmt.buildState.state.label || '解析语料…' }}
({{ kbmgmt.buildState.state.done }}/{{ kbmgmt.buildState.state.total }})
—— 可以先去干别的,跑完会自动提示。
上次重建没跑完:{{ kbmgmt.buildState.state.error }}
上次重建完成于 {{ kbWhen(kbmgmt.buildState.state.finished_at) }}
还没有在界面上重建过(用命令行 tools/build_kb.py 建的结果同样有效)。
索引状态加载中…
{{ s.label }}:{{ s.chunks }} 片
{{ l }}
已收录语料
{{ kbmgmt.inspect.stats.docs }} 篇
{{ kbmgmt.inspect.stats.chars }} 字
切片总数
{{ kbmgmt.inspect.stats.chunks }}
每片约 480 字(相邻片有重叠)
向量覆盖
{{ kbmgmt.inspect.stats.chunks_with_vec }} / {{ kbmgmt.inspect.stats.chunks }}
{{ kbmgmt.inspect.health.missing_vec_docs
? ('有 ' + kbmgmt.inspect.health.missing_vec_docs + ' 篇还没算向量') : '全部切片都已向量化' }}
向量档案
{{ kbmgmt.inspect.health.embed_ready ? '已配置' : '未配置' }}
{{ kbmgmt.inspect.health.embed_ready
? ('维度 ' + ((kbmgmt.inspect.health.dims || []).join(' / ') || '—'))
: '去「AI 设置」补一个「用途 = 向量」的档案' }}
资料库条目
{{ kbmgmt.inspect.manual.enabled }} / {{ kbmgmt.inspect.manual.total }}
参与建库 / 全部(其余为已停用)
{{ s.label }}:{{ s.docs }} 篇 / {{ s.chunks }} 片{{ s.enabled ? '' : '(已关闭)' }}
有 {{ kbmgmt.inspect.health.missing_vec_docs }} 篇语料还没算向量(检索时会跳过它们):
{{ (kbmgmt.inspect.health.missing_vec_titles || []).join('、') }}
点上面的「重建索引」即可补齐 —— 已算好的切片不会重复花钱。
| 语料 | 类型 | 切片 | 已向量 | 字数 | 维度 | 最后更新 |
|---|---|---|---|---|---|---|
|
{{ d.title }}
{{ d.source_ref }}
|
{{ d.source_kind || '—' }} | {{ d.chunk_count }} | {{ d.vec_count }} | {{ d.char_count }} | {{ d.dim || '—' }} | {{ kbWhen(d.updated_at) }} |
{{ kbmgmt.loading ? '加载中…' : '索引信息加载失败,点「刷新」重试。' }}
试试这样问:
{{ s }}
{{ kbmgmt.stRes.reason }}
判定「未收录」:最接近的一片相似度只有 {{ kbmgmt.stRes.top_score }},
没到阈值 {{ kbmgmt.stRes.min_score }}。正式问答在这种情况下不会调模型,直接说没查到。
判定「命中」:top1 相似度 {{ kbmgmt.stRes.top_score }} > 阈值 {{ kbmgmt.stRes.min_score }},
正式问答会用下面这些片段让模型作答。
第 {{ i + 1 }} 名
{{ r.heading || r.title }}
{{ r.source_kind }}
相似度 {{ r.score }}
{{ r.text }}
⌕
输入一句话试检索,看它能不能命中、命中了哪几片、相似度离阈值差多少。
系统会把这些来源里的内容自动切分进知识库。语料换版、临时想停用某类资料时,
关掉对应开关再重建一次索引即可,不用删数据;重新打开后重建就能恢复。
加载中…
| 语料来源 | 状态 | 操作 |
|---|---|---|
|
{{ s.label }}
语料源键:{{ s.key }}
|
参与建库 已关闭 |
{{ kbmgmt.loading ? '加载中…' : '来源列表加载失败,点「刷新」重试。' }}
{{ kbmgmt.docForm.id ? '编辑语料' : '新建语料' }}
×保存后要到「索引与切片」点一次「重建索引」,这条语料才会被问答用上。
变更历史 · {{ kbmgmt.verDoc && kbmgmt.verDoc.title }}
×
每次新建 / 修改 / 删除都留一整篇快照(每篇最多留最近 {{ kbmgmt.verKeep }} 版,更早的自动清掉)。
回滚会先把你「现在这一版」也存进历史,随时能再切回来。
加载中…
第 {{ v.version }} 版
{{ v.action_label }}
{{ v.by || '—' }} · {{ kbWhen(v.at) }} ·
{{ v.chars }} 字({{ kbdDelta(v) }})
{{ (v.content || '').slice(0, 140) }}{{ (v.content || '').length > 140 ? '…' : '' }}
{{ v.note }}
这篇还没有历史版本(V2.94 之后才有留痕)。
导入语料
×
两种来源都行:① 直接选一个用「导出」存下来的 .md 文件;② 把内容粘贴到下面。
导入是幂等的 —— 先按「来源」找、再按标题找,命中就覆盖,不会造出重名条目。
新建 {{ kbmgmt.impRes.created }} 条 · 覆盖 {{ kbmgmt.impRes.updated }} 条 ·
跳过 {{ kbmgmt.impRes.skipped }} 条(库内共 {{ kbmgmt.impRes.total }} 条)
· 第 {{ e.index + 1 }} 段{{ e.title ? '「' + e.title + '」' : '' }}:{{ e.reason }}
导入完要到「索引与切片」重建一次索引,问答才会用上新语料。
AI 配置加载中…
调用状态
{{ aiStatus && aiStatus.ready ? '已就绪' : '未就绪' }}
{{ aiStatus && aiStatus.ready ? (aiStatus.provider + ' · ' + aiStatus.model) : '看下方提示补齐配置' }}
今日调用
{{ aiStatus ? aiStatus.today_used : 0 }} 次
{{ aiStatus && aiStatus.daily_limit > 0 ? ('每日上限 ' + aiStatus.daily_limit + ' 次,剩余 ' + aiStatus.today_left) : '未设上限' }}
今日成功 / 失败
{{ aiLogs.stats ? aiLogs.stats.today_ok : 0 }} / {{ aiLogs.stats ? aiLogs.stats.today_fail : 0 }}
每次调用都留痕,可逐条查看与清理
接口密钥
{{ aiS.has_key ? '已配置' : '未配置' }}
{{ aiS.api_key_masked || '—' }}
还不能调用:{{ aiStatus.reason }}
网关配置
{{ aiNote() }}
前往控制台取密钥 ↗
换厂商选一次上面的下拉就会自动带入;自建网关或本地模型(如 Ollama)直接填它的地址
下拉里的名字随厂商迭代会变,以控制台为准,可直接手填
写邮件、做摘要建议 0.2–0.4;创意文案可调高
生成长文时给足时间,建议 60 秒以上
防止误刷把额度用光;超出后当天该用户不可再调用
保存后点「测试连通」会真发一条极短请求验证密钥与模型是否可用;配置里填的时间来自
{{ aiS.updated_at }}尚未保存过
({{ aiS.updated_by }})
{{ aiTest.ok ? '✓ 测试通过' : '✗ 测试未通过' }}:{{ aiTest.message }}
模型回复:{{ aiTest.reply }}
主动巡检 · 不用你问它自己看(出厂默认关) {{ patrol.enabled ? ('已开 ' + patrolOnCount() + ' 项') : '全关' }}
巡检只看不动手:产出的待办进右上角「通知」,产出的草稿要你自己点「确认执行」才落库。
一轮巡检不调模型(判定全部取现有的应收台账 / 客户风险榜 / 催款模板口径),所以不花 token ——
花的是「有人替你看一眼」这件事本身。
{{ t.every }} · {{ t.desc }}
{{ t.last ? ('上次 ' + t.last.slice(0, 16).replace('T', ' ')) : '还没跑过' }}
{{ patrol.msg }}
多模态 · 看图(单据智能录入) {{ (aiStatuses.vision && aiStatuses.vision.ready) ? '已就绪' : '未配置' }}
用于「单据智能录入」:拖入客户发来的 PI / 装箱单图片,自动识别成表单字段(只预填,需人工复核后保存)。
不配置时业务界面不显示该按钮,其它功能不受影响。
上次保存 {{ aiVision.updated_at }}
{{ aiTest.ok ? '✓ 视觉连通' : '✗ 视觉未通过' }}:{{ aiTest.message }}
向量 · 知识库(资料问答) {{ (aiStatuses.embedding && aiStatuses.embedding.ready) ? '已就绪' : '未配置' }}
用于「知识库问答」:把公司资料切成分片存进本地库,提问时先检索再作答(答案必须带出处)。
不配置时帮助中心不显示问答入口。
{{ aiNote('embedding') }}
前往控制台取密钥 ↗
火山方舟的向量走独立端点,本系统已自动适配为 /embeddings/multimodal,此处填到 /api/v3 即可
只用于把文字转成向量;不支持批量,本系统已自动逐条处理
上次保存 {{ aiEmbed.updated_at }}
{{ aiTest.ok ? '✓ 向量连通' : '✗ 向量未通过' }}:{{ aiTest.message }}
试一句(不接业务数据,纯验证效果)
结果逐字流式显示;AI 说的话仅供参考,涉及对外内容请人工复核
{{ aiAsk.error }}
{{ aiAsk.answer }}▌
调用留痕(谁 / 什么场景 / 哪个模型 / 耗时 / 结果)
| 时间 | 场景 | 模型 | 经办人 | 耗时 | 结果 | 摘要 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.scene }} | {{ r.model }} | {{ r.user_name }} | {{ r.elapsed_ms }} ms | {{ r.status }} | {{ r.error_msg || r.preview || '—' }} |
✦
还没有调用记录 —— 点上面的「测试连通」或「试一句」就会产生第一条留痕
角色加载中…
{{ r.name }}
系统
内置
已停用
{{ r.code }}
{{ r.unconfigured }} 个模块未配置,该角色对这些模块无权限(点「编辑」可换模板重铺)
下方矩阵正显示此角色
{{ permRole.label }}
{{ permRole.read_count }} 读 / {{ permRole.write_count }} 写
{{ permFieldCount }} 个字段受限
超级管理员拥有全部权限(含系统设置),不可调整。
勾选即生效:取消「可查看」会自动取消「可编辑」;「仅管理员」的模块(角色权限 / 字段权限)不可下放。
{{ g.group }}
{{ m.label }}{{ m.key }}
已自定义
仅管理员
保存后立即生效:该角色重新打开页面(或刷新)即按新权限显示
系统角色权限固定,如需自定义请「新建角色」按模板复制一份再调整。
不勾「可见」的字段不会下发给该角色;不勾「可编辑」的字段保存时会被忽略(改也改不动)。未列出的字段一律可见可编辑,所以这里只有「被限制的」才需要勾。
字段清单加载中…
| 字段名称 | 字段键 | 可见 | 可编辑 | 当前状态 |
|---|---|---|---|---|
| {{ f.label }} | {{ f.key }} | 已限制 默认全开 |
该模块暂无可配置字段(或尚未选择模块)
保存后立即生效:该角色下次请求即按新口径出参 / 入参
{{ roleM.id ? '编辑角色' : '新建角色' }}
×
新建后权限矩阵按模板一次铺满;以后系统新增模块时,自定义角色对这些新模块默认无权限,
需要回到这里勾选(矩阵上方会提示「N 个模块未配置」)。
字段限制同样随模板复制,之后可点卡片上的「字段权限」单独调整。
权限自查 · {{ roleM.pv.name }}
×{{ w }}
{{ g.group }}
{{ it.label }}写
该角色目前没有任何模块权限
字段限制 {{ roleM.pv.field_restricted }} 项
(未列出的字段一律可见可编辑)
{{ g.module_label }}
{{ it.label }}{{ it.can_view ? '只读' : '不可见' }}
字段限制:0 项 —— 该角色对所有字段可见可编辑
累计留痕
{{ audit.stats.total }}
新建 / 修改 / 删除 / 授权各算一条
今日新增
{{ audit.stats.today }}
近 7 天共 {{ audit.stats.week }} 条
今日操作人数
{{ audit.stats.who_today }}
当天产生过写操作的账号数
建议保留期
{{ audit.retention.keep_days }} 天
已超期 {{ audit.retention.expired }} 条(早于 {{ audit.retention.cutoff }}),可考虑清理
暂无超期记录 · 日志只增不自动删
🛡 留痕完整性
每条留痕落库时都会算一个指纹(sha256),并与上一条首尾相接串成一条链。
点「立即校验」把全部留痕重算一遍:任何一行被改过、被抽掉、被插队,这里会直接
指出第一处断点的编号与时间。
通过:已链化 {{ audit.integrity.checked }} 条全部一致,另有 {{ audit.integrity.legacy }} 条为本版之前的未链化历史留痕;期间有 {{ audit.integrity.truncations.length }} 次已登记的历史清理。
链尾 {{ (audit.integrity.tail || '').slice(0, 32) }}…
⚠ 发现不一致:第 {{ audit.integrity.broken && audit.integrity.broken.id }} 条
({{ audit.integrity.broken && audit.integrity.broken.at }})——
{{ audit.integrity.broken && audit.integrity.broken.reason === 'content_modified'
? '内容被改动过(哈希对不上)'
: (audit.integrity.broken && audit.integrity.broken.reason === 'head_missing'
? '链条头部被删除(前面本该有记录)'
: '与上一条接不上(中间有记录被删或插入)') }}。
请立即导出举证包并联系运维排查。
📦 异地备份
归档包 = 库快照 + 清单(版本 / 行数 / 审计链尾)+ SHA256,
落到本机 data/backups/offsite/;配了异地目录(环境变量
TRADE_OFFSITE_DIR)就再复制一份过去并回读校验 —— 机器整台坏掉时,
这一份才是真正的退路。
本机 {{ offsite.data.local.count }} 份{{ offsite.data.local.latest_at ? '(最近 ' + offsite.data.local.latest_at + ')' : '' }};
异地 {{ offsite.data.offsite.count }} 份 · {{ offsite.data.offsite.path }}
未配置异地目录 —— 备份与源库在同一台机器上,机器坏了会一起没。
异地目录已配但还没有归档包,点上方的「立即归档」。
{{ offsite.msg }}
| 时间 | 操作人 | 模块 | 动作 | 目标对象 | 摘要 / 变更字段 | 操作 |
|---|---|---|---|---|---|---|
| {{ r.created_at }} | {{ r.user_name }} · {{ r.user_role }} | {{ r.module_label }} | {{ r.action }} | {{ r.target_type }}:{{ r.target_label }} | {{ r.summary || '—' }} ▸ {{ r.diff.length }} 处改动:{{ auditDiffText(r) }} |
⛨
{{ audit.loading ? '正在读取审计日志…' : '当前筛选条件下没有留痕 —— 换个条件或点「重置」试试' }}
留痕详情 · {{ audit.cur.action }}
{{ audit.cur.module_label }} ×变更对照({{ (audit.cur.diff || []).length }} 处)
| 字段 | 改前 | 改后 |
|---|---|---|
| {{ d.label || d.f }} | {{ d.b === '' || d.b == null ? '(空)' : d.b }} | {{ d.a === '' || d.a == null ? '(空)' : d.a }} |
这条留痕没有字段级差异 —— 新建 / 删除记的是整体内容清单,领取公海、拉黑一类动作看上面「摘要」即可。
审计只记录「变化的字段」;密码 / 密钥 / 令牌类字段一律不记内容(连「变了」这件事也不写)。
留痕与业务写入落在同一事务里:业务回滚,留痕也一起消失,不会出现「业务没改成、日志却说改了」。
同一个功能组:台账看「记了什么」,配置定「上不上链、用哪家」,说明教「怎么用、数据怎么变资产」
存证总数
{{ chainOv.total }}
今日新增 {{ chainOv.today }} 条
上链状态
{{ chainOv.done }} / {{ chainOv.pending }} / {{ chainOv.failed }}
已上链 / 待上链 / 失败
核验结果
{{ chainOv.verified }}
{{ chainOv.bad ? '有 ' + chainOv.bad + ' 条核验不符' : '已核验通过(无不符)' }}
存证平台
{{ chainOv.platform }}
{{ chainOv.local_mode ? '本地模式:只攒指纹不上链' : '已启用,新存证自动推平台' }}
规范化口径
{{ chainOv.schema_version }}
口径变更会产生新版本
{{ t.ref_type }}
{{ t.count }}
条存证
中世寰球外贸系统 · 操作手册
轻资产贸易型出口AI业务平台 —— 覆盖客户 / 报价 / 订单 / 采购 / 生产 / 库存 / 物流出运 / 单证 / 财务 / 审批全链路。左侧点目录直达对应章节,右上可按关键字全文检索;升级新版本后这里的内容会同步更新。
{{ s.icon }}{{ s.title }}
{{ c }}
没有匹配「{{ helpSearch }}」的帮助内容,换个关键词试试(如:报价、审批、汇率、退税)
{{ c.t }}
¥ {{ fmtInt(c.v) }}
{{ c.n }}
{{ c.t }}
{{ c.v }}
{{ c.n }}
已归类分布:
{{ p.category }} {{ p.count }} ·
{{ c.t }}
{{ c.v }}
{{ c.n }}
各平台订单分布:
{{ p.platform }} {{ p.count }} 单 / ¥{{ fmtInt(p.amount_cny) }} ·
{{ c.t }}
{{ c.v }}
{{ c.n }}
{{ c.t }}
{{ c.v }}
{{ c.n }}
{{ c.t }}
{{ c.v }}
{{ c.n }}
⚠ 证书到期提醒({{ docStats.alerts.length }} 份):
{{ a.title }}({{ a.expire_date }}{{ a.days_left < 0 ? ' 已过期 ' + (-a.days_left) + ' 天' : ' 剩 ' + a.days_left + ' 天' }})
、
等
同一个功能的两个视角:汇率管折算,币种档案管属性
同一个功能组:档案定规则、库存看现状、批次管有效期、流水留痕迹、盘点调差异
{{ c.t }}
{{ c.v }}
{{ c.n }}
仓库数
{{ stockOv.warehouse_count }}
有库存的在册仓库
库存行数
{{ stockOv.row_count }}
产品 × 仓库 × 批次
库存总量
{{ fmtInt(stockOv.qty_total) }}
全部仓库合计
库存流水
{{ stockOv.movement_count }}
每一次数量变动留痕
盘点单
{{ stockOv.stocktake_count }}
账实差异核查记录
调拨在途
{{ fmtInt(stockOv.transfer_inflight_qty || 0)
}}({{ stockOv.transfer_inflight }} 单)
发出未收货 · 共 {{ stockOv.transfer_count }} 单
{{ w.warehouse }}
{{ w.rows }} 行 · 数量 {{ fmtInt(w.qty) }}
原料 {{ w.raw }} / 成品 {{ w.finished }}
临期 {{ w.near }}
过期 {{ w.expired }}
冻结 {{ w.frozen }}
{{ t.move_type }}({{ t.count }} 条)
{{ fmtInt(t.net) }}
入 {{ fmtInt(t.in_qty) }} · 出 {{ fmtInt(t.out_qty) }}
留痕总条数
{{ imStats.total }}
本月新增 {{ imStats.this_month }} 条
收件 / 发件
{{ imStats.inbound }} / {{ imStats.outbound }}
客户发来 / 我方发出
已挂靠客户
{{ imStats.linked }} 挂靠率 {{ imStats.linked_rate }}%
未挂靠 {{ imStats.unlinked }} 条建议补客户
往来最多客户
{{ imStats.top_customers[0].company }}
暂无
{{ imStats.top_customers[0].count }} 条往来
还没有挂到客户的记录
⚠ 交期预警
共 {{ supplyAlerts.overdue.length + supplyAlerts.near.length }} 单待处理,最急的排在最前
已逾期 {{ supplyAlerts.overdue.length }} 单
{{ p.po_no }}
{{ p.supplier }}
超 {{ p.days_late }} 天
另有 {{ supplyAlerts.overdue.length - 5 }} 单,见下方列表
3 日内到货 {{ supplyAlerts.near.length }} 单
{{ p.po_no }}
{{ p.supplier }}
{{ p.days_left ? '剩 ' + p.days_left + ' 天' : '今日到货' }}
另有 {{ supplyAlerts.near.length - 5 }} 单,见下方列表
| {{ c.label }} | 操作 |
|---|---|
|
未上传
{{ row[c.key] }}
{{ row[c.key] }}
{{ row.currency || 'USD' }} {{ fmtInt(row[c.key]) }}
{{ short(row[c.key], c.text) }}
{{ cellDisp(row, c) }}
|
审批:{{ row.approval_status || '未提交' }}
审批:{{ row.approval_status || '未提交' }}
已归档
规则兜底
审批:{{ row.approval_status || '未提交' }}
审批:{{ row.approval_status || '未提交' }}
已转 {{ row.local_order_no }}
已结案
未挂客户
已执行 · 留档
{{ row.status === '已完成' ? '已完成 · 留档' : row.status }}
系统台账 · 只读
归档记录
|
◌
{{ search ? '没有匹配「'+search+'」的记录' : '暂无数据' }}