{{ title }}

{{ subText }}
{{ t.k }}
{{ t.v }}
{{ t.s }}
库存结构
{{ p.k }} {{ p.fmt }} {{ p.pct.toFixed(1) }}%

补货底座全部 {{ dashTotal }} 条 · 远程分页

左列冻结 · 拖表头调整列序 · 点表头排序 · 点行看明细 · 右上「列设置」可显隐/冻结

数据来自 dws / ads(只读,契约 §1)

查询失败
{{ detail.error }}
选择店铺并输入 MSKU
将展示该 SKU 的 listing、销量特征、库存快照、库龄、补货底座,以及近 30 天日销走势。
{{ k.k }}
{{ k.v }} {{ k.delta <= 0 ? '↓' : '↑' }}{{ Math.abs(k.delta * 100).toFixed(2) }}pp
{{ k.s }}

退货率趋势与同比加权口径(合计退货量 ÷ 合计销量)· 随上方店铺 / 品名 / SPU 筛选变化 · 区间由数据最新月份决定

{{ (retCatTrendChart.last.rate * 100).toFixed(2) }}% {{ retCatTrendChart.last.month }} 退货率 峰值 {{ (retCatTrendChart.peak.rate * 100).toFixed(2) }}%({{ retCatTrendChart.peak.month }})
{{ l.text }}
{{ m }}
{{ retCat.trend.cur_year }} 年逐月退货率 · y 轴 0 ~ {{ (retCatTrendChart.yMax * 100).toFixed(0) }}%
{{ retCatYoyChart.pct(retCatYoyChart.kCur.rate) }} {{ retCat.trend.cur_year }} 年 1-{{ retCat.trend.last_month }} 月 {{ retCat.trend.prev_year }} 年同区间 {{ retCatYoyChart.pct(retCatYoyChart.kPrev.rate) }}
{{ l.text }}
{{ m }}
{{ retCat.trend.cur_year }} 年 {{ retCatYoyChart.pct(retCatYoyChart.kCur.rate) }} {{ retCat.trend.prev_year }} 年(虚线) {{ retCatYoyChart.pct(retCatYoyChart.kPrev.rate) }}

销量 · 退货量 · 退货率柱 = 月度件数(左轴)· 线 = 退货率(右轴)· 用来区分「率真的变差了」和「销量涨了、率没动」

{{ fmtN(retCatQtyChart.totalRet) }} 件退货 / {{ fmtN(retCatQtyChart.totalSale) }} 件销量 区间退货率 {{ retCatQtyChart.avgRate === null ? '—' : (retCatQtyChart.avgRate * 100).toFixed(2) + '%' }}
{{ l.text }} {{ l.text }} {{ t.text }} {{ t.text }}
{{ m }}
销量 退货量 退货率(右轴)

同比恶化 / 改善排行 去年 → 今年同区间 · 只统计两期都有销量、且今年销量达门槛的{{ retCat.level === 'spu' ? '品+SPU' : '品' }},共 {{ retCatRank.total }} 个可比较 · 鼠标悬停看销量

退货率上升 Top {{ retCatRank.worse.length }}最该优先处理的
品名去年今年变化退货量
{{ r.name }} / {{ r.spu }} {{ r.prev }} {{ r.cur }} ↑{{ r.pp }} {{ r.ret }}
没有符合条件的{{ retCat.level === 'spu' ? '品+SPU' : '品' }}
退货率下降 Top {{ retCatRank.better.length }}可以复盘做对了什么
品名去年今年变化退货量
{{ r.name }} / {{ r.spu }} {{ r.prev }} {{ r.cur }} ↓{{ r.pp }} {{ r.ret }}
没有符合条件的{{ retCat.level === 'spu' ? '品+SPU' : '品' }}

品类退货率行 = 店铺 + 品名 · 退货率 = 退货量 / 销量;销量=0 有退货按 100% · 当年列 = 1 月到上月(YTD)· 无效品名(含「沃尔玛/商标」、CD 或 RD 开头)已剔除

店铺
品名
共 {{ fmtN(retCat.total) }} 行
{{ k.k }}
{{ k.v }}
{{ k.s }}

筛选结果占比当前筛选全量汇总(不受分页影响)· 共 {{ fmtN(retPart.shares[0].total) }} 件 · 上条 = 占全量比例 · 下条 = 偏小/偏大构成(分母是**该维度**自己的总数)

{{ s.title }}占比共 {{ s.kinds }} 类

具体部位原因分析偏小率 = 太小/区间总数 · 偏大率 = 太大/区间总数 · 无效品名(含「沃尔玛/商标」、CD 或 RD 开头)已剔除

店铺
品名
月份区间

原因分布 · Top {{ retReason.top.items.length }}当前筛选全量汇总(不受分页影响)· 共 {{ retReason.top.kinds }} 类原因 / {{ fmtN(retReason.top.total) }} 件

店铺级退货原因行 = 店铺 + 品名(月份区间内合并成一行)· 区间退货量 = 该行区间退货总量(27 个原因列之和)· 区间退货率 = 区间退货量 ÷ 区间销量 · 底部总计行为全量合计 · 无效品名已剔除

店铺
品名
月份区间
共 {{ fmtN(retReason.total) }} 行

复盘总览单月 · 店铺×父ASIN×品名 · 复刻飞书「月度销售目标数据」 共 {{ fmtN(prm.total) }} 行

目标达成
{{ g.pct }}
{{ g.label }}
目标 {{ g.target }}
口径对照 · 订单利润 vs 财务
{{ row.ml }}
{{ row.opp.cal }}{{ row.opp.num }}
{{ row.fin.cal }}{{ row.fin.num }}
效率与库存
{{ e.label }}{{ e.v }}
{{ y.label }}{{ y.v }}{{ y.cls === 'good' ? '▲' : '▼' }}

复盘明细单月 · 粒度 店铺×父ASIN×品名 · 复刻飞书「月度销售目标数据」 共 {{ fmtN(prm.total) }} 行

视图
店铺
负责人
品名
月份

复盘总览按年汇总 · 店铺×父ASIN×品名 · 复刻飞书「2026年度销售数据」 共 {{ fmtN(pra.total) }} 行

目标达成
{{ g.pct }}
{{ g.label }}
目标 {{ g.target }}
口径对照 · 订单利润 vs 财务
{{ row.ml }}
{{ row.opp.cal }}{{ row.opp.num }}
{{ row.fin.cal }}{{ row.fin.num }}
效率 · 库存 · 同比
{{ e.label }}{{ e.v }}
{{ y.label }}{{ y.v }}{{ y.cls === 'good' ? '▲' : '▼' }}

复盘明细按年汇总 · 粒度 店铺×父ASIN×品名 · 复刻飞书「2026年度销售数据」 共 {{ fmtN(pra.total) }} 行

视图
店铺
负责人
品名
年份

负责人 · 目标维护店铺×父ASIN×月 · 提交后立即对复盘明细生效 · 不回写飞书

月份
店铺
负责人
搜索
范围
产品数
{{ fmtN(prt.kpi?.rows_total) }}
当前筛选
已维护目标
{{ fmtN(prt.kpi?.with_target) }}
销量或利润目标非空
销量目标合计
{{ fmtN(prt.kpi?.sales_target_sum) }}
件
本地覆盖
{{ fmtN(prt.kpi?.overridden) }}
改过(优先于飞书底值)
直接在格子里改(浅蓝底 = 可改);清空某格 = 该项恢复继承飞书值。 共 {{ fmtN(prt.total) }} 个产品

开发产品表现SPU × 月 · 销量按 SPU 归属开发者 · 补货等级由 MSKU 标签上卷(多标签保留)

开发
店铺
起始月
结束月
负责人
补货等级
搜索
SPU 数
{{ fmtN(dp.kpi?.spu_total) }}
当前筛选
销量合计
{{ fmtN(dp.kpi?.qty_total) }}
件
零销量 SPU
{{ fmtN(dp.kpi?.zero_spu) }}
区间内无销量
多标签 SPU
{{ fmtN(dp.kpi?.multi_tag_spu) }}
MSKU 标签不一致
口径:销量 = 该 SPU 下全部 SKU × 全部店铺合计;2026-10 为当月(截至采集日,非整月)。 共 {{ fmtN(dp.total) }} 个 SPU

开发人员绩效每月新增计入的 SPU 数 · 按补货等级分类 · NEW 满 6 个月提醒更新

月份
SPU 数 = 当月首次有销量的 SPU(每个 SPU 只在首次计入月份算一次,之后月份不重复计入);NEW 超期 = 存量口径:当月有销量且等级仍为「NEW」已满 6 个月。
当月新增 SPU
{{ fmtN(dpa.data?.kpi?.spu_total) }}
{{ dpa.month || '—' }} · 首次计入
{{ d.name }}
{{ fmtN(d.spu_total) }}
当月新增
累计 SPU
{{ fmtN(dpa.data?.kpi?.spu_cum) }}
截至当月 · 已去重
NEW 超期
{{ fmtN(dpa.data?.kpi?.new_overdue) }}
当月有销量 · 满 6 个月
未标注
{{ fmtN(dpa.data?.kpi?.unlabeled) }}
当月有销量 · 待补标
月度新增计入的 SPU 数 (蓝=罗丹 青=陈水榕 柱顶红字=当月 NEW 超期数(存量) · 每个 SPU 只在其首次有销量的月份计入一次 · 2026-02 起有完整销量数据)
{{ t.total }}
{{ t.month.slice(2) }}
{{ t.new_overdue || '' }}
开发补货等级 SPU 数占比
{{ r.developer }} {{ r.tag }} {{ fmtN(r.spu_cnt) }} {{ r.share }}%
明细
搜索
共 {{ fmtN(dpa.detail?.total) }} 个 SPU(全部历史池,不按当月筛选)
SPU店铺开发 补货等级首单时间已上架(月) listing负责人MSKU
{{ r.spu }} {{ r.store_name }} {{ r.developer }} {{ r.tag }} {{ r.first_order_time ? String(r.first_order_time).slice(0,10) : '—' }} {{ r.age_months === null || r.age_months === undefined ? '—' : r.age_months }} {{ r.principals }} {{ r.mskus }}
加载中…
没有数据
{{ dpa.detail?.page || 1 }} / {{ dpa.detail?.pages || 1 }}

① 调度与来源(全局 · cron / 30m / 一次性 / 手工)

定时日更
{{ sched.enabled ? '启用' : '未启用' }}
{{ sched.spec }}
临时停更
{{ sched.disabled === null ? '—' : (sched.disabled ? '已置' : '未置') }}
state/daily.disabled
上次日更启动
{{ sched.lastHeartbeat || '—' }}
心跳 = run_daily.sh 拿锁时间
数据新鲜度
{{ freshText }}
ads/dws 最新快照日
来源最新一轮状态 任务(成/败)写入行开始 → 结束
暂无轮次记录

② 当前轮次进度(ops.collect_run · 按轮次,非历史遗留)

{{ runPct && runPct.live ? '本轮进度(进行中)' : '最近一轮进度' }}
{{ runPct.pct }}%
任务 完成 / 总数
{{ fmtN(runPct.done) }} / {{ fmtN(runPct.round) }}
剩余 {{ fmtN(runPct.remain) }} 个任务
暂无轮次记录
{{ runPct.run.run_id }} · {{ sourceLabel(runPct.run.source) }} · {{ shortTs(runPct.run.started_at) }}
当前轮次
{{ monitor.data?.current_run ? '进行中' : '空闲' }}
{{ monitor.data.current_run.run_id }} · source={{ monitor.data.current_run.source }} 疑似遗留
没有进行中的采集(历史轮次见 ③)
当前在途并发 Redis 实时
{{ live.conc ?? '—' }}
{{ live.redis_ok ? '(GLOBAL_CONCURRENCY 为上限)' : (live.error || 'Redis 未连通,降级') }}
Redis 检查点数 含历史遗留
{{ fmtN(live.totals?.tasks) }}
ⓘ 仅供排查,**不代表本轮进度**(进度看上面环形)
Redis 累计已抓页 含历史遗留
{{ fmtN(live.totals?.pages_fetched) }}
跨轮累积值,非当天
剩余页数
{{ fmtN(live.totals?.pages_remaining) }}
{{ live.totals?.pages_remaining ? '未跑完' : '全部完成' }}
接口任务(抓完)已抓页一轮总页 剩余页已抓行页/秒预计剩余进度
{{ e.endpoint }} {{ e.tasks }} 抓完{{ e.exhausted }} {{ fmtN(e.pages_fetched) }}{{ fmtN(e.pages_round) }} {{ fmtN(e.pages_remaining) }}{{ fmtN(e.rows_fetched) }} {{ e.pages_per_s ? fmtN(e.pages_per_s, 2) : '—' }} {{ e.eta_min ? fmtN(e.eta_min, 0) + ' 分' : '—' }}
暂无采集进度(没有正在跑或近期跑过的任务)

③ 接口采集情况(近 {{ monitor.epDays }} 天 · 每接口每天) 数据源 ops.endpoint_day(按轮次自动汇总)

覆盖**全部轮次来源**(daily / realtime / harness / 一次性);「今天」列 = 该接口今天的写入行数, 「最近完成」标明数据所属时间。点「明细」→ 单接口下钻(各轮次 + 失败原因 + 日志)。

中文名接口频率模块 今天行数近{{ monitor.epDays }}天行数 失败最近完成状态
{{ e.name_cn || '—' }} {{ e.endpoint }} {{ e.cadence || '—' }} {{ e.module || '—' }} {{ e.today_rows ? fmtN(e.today_rows) : (e.today_runs ? '0' : '—') }} {{ fmtN(e.rows) }} {{ e.failed || 0 }} {{ shortTs(e.last_at) }} {{ e.last_status || '—' }}
没有匹配的接口

单接口明细 · {{ monitor.epDetail.dim?.name_cn || monitor.epDetail.endpoint }}

{{ monitor.epDetail.endpoint }} {{ monitor.epDetail.dim.cadence }} tk={{ monitor.epDetail.dim.tk }} 日更白名单 按需 · 模块 {{ monitor.epDetail.dim?.module || '—' }} · 近 {{ monitor.epDetail.days }} 天

每天汇总

日期轮次任务 失败写入行最后
{{ String(d.biz_date).slice(0,10) }} {{ d.runs }}{{ d.tasks }} {{ d.tasks_failed }} {{ fmtN(d.rows_written) }} {{ shortTs(d.last_at) }}
近 {{ monitor.epDetail.days }} 天无数据

日志 / 死信(只读采集仓 state 目录)

文件类型大小
{{ f.name }} 提到了本接口 {{ f.kind }} {{ fmtN(f.size) }}B
没有可读日志
{{ monitor.logView.name }} (共 {{ monitor.logView.total_lines }} 行,显示尾部 {{ monitor.logView.lines.length }} 行)
{{ (monitor.logView.lines || []).join('') }}

各轮次明细(最近 300 条)

轮次来源scope状态 写入行耗时完成错误
{{ t.run_id }} {{ sourceLabel(t.source) }} {{ t.scope }} {{ t.status }} {{ fmtN(t.rows_written) }} {{ t.duration_ms != null ? fmtN(t.duration_ms/1000, 1)+'s' : '—' }} {{ shortTs(t.finished_at) }} {{ t.error || '' }}
该接口近 {{ monitor.epDetail.days }} 天没有任务记录

死信样本(含该接口的轮次)

轮次开始样本
{{ d.run_id }} {{ shortTs(d.started_at) }} {{ JSON.stringify(d.dead_letter_samples).slice(0,180) }}

④ 历史轮次(每轮开始/结束落库 ops.collect_run)

ops 轮次数据暂不可读(DDL 未应用或权限缺失)
run_id来源触发状态 任务(成/败)写入行死信开始 → 结束
暂无历史轮次

轮次详情 · {{ monitor.runDetail.run_id }}

状态 {{ monitor.runDetail.status }} · 任务 {{ monitor.runDetail.tasks_total }}(成 {{ monitor.runDetail.tasks_done }} / 败 {{ monitor.runDetail.tasks_failed }}) · 写入 {{ fmtN(monitor.runDetail.rows_written) }} 行 · 死信 {{ monitor.runDetail.dead_letter_count }}

接口scope状态写入行耗时错误
{{ t.endpoint }} {{ t.scope }} {{ t.status }} {{ fmtN(t.rows_written) }} {{ t.duration_ms != null ? fmtN(t.duration_ms / 1000, 1) + 's' : '—' }} {{ t.error || '' }}
该轮没有任务明细

待消费的重采请求(app.collect_request)

ID接口scope申请人提交时间
{{ r.id }}{{ r.endpoint || '(全量常规集)' }} {{ r.scope || '—' }}{{ r.requested_by }} {{ shortTs(r.created_at) }}
没有待消费的请求

发起重采(差异重采 · 例外通道)

采集主流程由日更自动运行;此处仅用于发现差异数据后按 endpoint+scope 重新发起。Portal 只写 app.collect_request。

历史请求

ID接口scope申请人 状态创建完成说明
{{ r.id }}{{ r.endpoint || '(全量常规集)' }} {{ r.scope || '—' }}{{ r.requested_by }} {{ r.status }} {{ shortTs(r.created_at) }}{{ shortTs(r.finished_at) }} {{ r.message || '' }}
暂无请求

个人设置飞书信息不在此展示

改口令后其它会话失效,需用新口令重新登录。

飞书状态凭证来自 .env(FEISHU_APP_ID / FEISHU_APP_SECRET)

授权范围GET /api/feishu/scope · 应用被授权的部门

部门 {{ feishu.scope.counts?.departments }} 个 · 用户 {{ feishu.scope.counts?.users }} 个
授权部门open_department_id
{{ d.name || '—' }} {{ d.open_department_id }}
未查到授权部门

同步用户到 PortalPOST /api/feishu/sync · 拼音登录名 / 部门→小组

新建 {{ feishu.syncResult.created }} · 更新 {{ feishu.syncResult.updated }} · 不变 {{ feishu.syncResult.unchanged }} · 排除 {{ feishu.syncResult.excluded }} ({{ (feishu.syncResult.excluded_departments || []).join(' / ') }})· 飞书用户 {{ feishu.syncResult.feishu_users }}
预览样例(前 {{ feishu.syncResult.planned_sample.length }} 条):
登录名姓名部门小组
{{ p.username }}{{ p.display_name }} {{ p.department }}{{ p.team || '—' }}

通讯录 · 用户GET /api/feishu/users(需通讯录权限)

已用部门:{{ feishu.usedDept }} {{ feishu.error }}
姓名open_idunion_id 邮箱部门ID
{{ u.name }} {{ u.open_id }} {{ u.union_id || '—' }} {{ u.email || '—' }} {{ (u.department_ids || []).join(',') }}
暂无数据(点「拉取用户」)

通讯录 · 部门GET /api/feishu/departments(根=应用授权部门)

根部门 0 通常不在应用授权范围内 → 这里列出的是**应用授权部门**;点「看用户」或往下钻
部门名open_department_id上级部门操作
{{ d.name || '—' }} {{ d.open_department_id }} {{ d.parent_department_id || '—' }}
暂无数据(点「拉取授权部门」)

发消息POST /api/feishu/send

{{ editUser.id ? ('编辑用户 · ' + editUser.username) : '新增用户' }}

用户共 {{ users.length }} 人找到后点「编辑」改资料、「重置口令」改密码

ID用户名显示名角色 部门小组飞书 openid邮箱 产品负责人启用最后登录操作
{{ u.id }}{{ u.username }}{{ u.display_name }} {{ u.role_code }} {{ u.department || '—' }} {{ u.team || '—' }} {{ u.feishu_openid || '—' }} {{ u.email || '—' }} {{ u.product_owner || '—' }} {{ u.is_active ? '启用' : '停用' }} {{ shortTs(u.last_login_at) }}
{{ users.length ? '没有匹配「' + userQuery + '」的用户 · 换个关键字或清除搜索' : '还没有用户 · 用上方的「新增用户」建一个' }}

访问记录app.access_log · 每次 /api/* 访问

时间用户方法 路径状态耗时msIP
{{ shortTs(r.created_at) }}{{ r.username || '—' }} {{ r.method }} {{ r.path }}{{ r.status }} {{ r.duration_ms }}{{ r.ip }}
暂无记录

操作日志app.audit_log · 写操作/关键动作

时间用户动作详情IP
{{ shortTs(l.created_at) }}{{ l.username }} {{ l.action }} {{ JSON.stringify(l.detail || {}) }}{{ l.ip }}
暂无日志
{{ t.msg }}