{{ title }}
补货底座全部 {{ dashTotal }} 条 · 远程分页
数据来自 dws / ads(只读,契约 §1)
近 {{ detailChart.count }} 天日销dws.msku_day_summary · 每日出库件数
{{ sec.title }}
| {{ k }} | {{ v }} |
退货率趋势与同比加权口径(合计退货量 ÷ 合计销量)· 随上方店铺 / 品名 / SPU 筛选变化 · 区间由数据最新月份决定
销量 · 退货量 · 退货率柱 = 月度件数(左轴)· 线 = 退货率(右轴)· 用来区分「率真的变差了」和「销量涨了、率没动」
同比恶化 / 改善排行 去年 → 今年同区间 · 只统计两期都有销量、且今年销量达门槛的{{ retCat.level === 'spu' ? '品+SPU' : '品' }},共 {{ retCatRank.total }} 个可比较 · 鼠标悬停看销量
| 品名 | 去年 | 今年 | 变化 | 退货量 |
|---|---|---|---|---|
| {{ r.name }} / {{ r.spu }} | {{ r.prev }} | {{ r.cur }} | ↑{{ r.pp }} | {{ r.ret }} |
| 品名 | 去年 | 今年 | 变化 | 退货量 |
|---|---|---|---|---|
| {{ r.name }} / {{ r.spu }} | {{ r.prev }} | {{ r.cur }} | ↓{{ r.pp }} | {{ r.ret }} |
品类退货率行 = 店铺 + 品名 · 退货率 = 退货量 / 销量;销量=0 有退货按 100% · 当年列 = 1 月到上月(YTD)· 无效品名(含「沃尔玛/商标」、CD 或 RD 开头)已剔除
筛选结果占比当前筛选全量汇总(不受分页影响)· 共 {{ fmtN(retPart.shares[0].total) }} 件 · 上条 = 占全量比例 · 下条 = 偏小/偏大构成(分母是**该维度**自己的总数)
具体部位原因分析偏小率 = 太小/区间总数 · 偏大率 = 太大/区间总数 · 无效品名(含「沃尔玛/商标」、CD 或 RD 开头)已剔除
原因分布 · Top {{ retReason.top.items.length }}当前筛选全量汇总(不受分页影响)· 共 {{ retReason.top.kinds }} 类原因 / {{ fmtN(retReason.top.total) }} 件
店铺级退货原因行 = 店铺 + 品名(月份区间内合并成一行)· 区间退货量 = 该行区间退货总量(27 个原因列之和)· 区间退货率 = 区间退货量 ÷ 区间销量 · 底部总计行为全量合计 · 无效品名已剔除
复盘总览单月 · 店铺×父ASIN×品名 · 复刻飞书「月度销售目标数据」 共 {{ fmtN(prm.total) }} 行
复盘明细单月 · 粒度 店铺×父ASIN×品名 · 复刻飞书「月度销售目标数据」 共 {{ fmtN(prm.total) }} 行
复盘总览按年汇总 · 店铺×父ASIN×品名 · 复刻飞书「2026年度销售数据」 共 {{ fmtN(pra.total) }} 行
复盘明细按年汇总 · 粒度 店铺×父ASIN×品名 · 复刻飞书「2026年度销售数据」 共 {{ fmtN(pra.total) }} 行
负责人 · 目标维护店铺×父ASIN×月 · 提交后立即对复盘明细生效 · 不回写飞书
开发产品表现SPU × 月 · 销量按 SPU 归属开发者 · 补货等级由 MSKU 标签上卷(多标签保留)
开发人员绩效每月新增计入的 SPU 数 · 按补货等级分类 · NEW 满 6 个月提醒更新
| 开发 | 补货等级 | SPU 数 | 占比 |
|---|---|---|---|
| {{ r.developer }} | {{ r.tag }} | {{ fmtN(r.spu_cnt) }} | {{ r.share }}% |
| 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 }} | |
| 加载中… | |||||||
| 没有数据 | |||||||
① 调度与来源(全局 · cron / 30m / 一次性 / 手工)
| 来源 | 最新一轮 | 状态 | 任务(成/败) | 写入行 | 开始 → 结束 |
|---|---|---|---|---|---|
| {{ sourceLabel(r.source) }} | {{ r.run_id }} | {{ r.status }} | {{ r.tasks_done }}/{{ r.tasks_failed }} | {{ fmtN(r.rows_written) }} | {{ shortTs(r.started_at) }} → {{ shortTs(r.finished_at) }} |
| 暂无轮次记录 | |||||
② 当前轮次进度(ops.collect_run · 按轮次,非历史遗留)
| 接口 | 任务(抓完) | 已抓页 | 一轮总页 | 剩余页 | 已抓行 | 页/秒 | 预计剩余 | 进度 |
|---|---|---|---|---|---|---|---|---|
| {{ 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.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)
| run_id | 来源 | 触发 | 状态 | 任务(成/败) | 写入行 | 死信 | 开始 → 结束 |
|---|---|---|---|---|---|---|---|
| {{ r.run_id }} | {{ r.source }} | {{ r.trigger }} | {{ r.status }} 疑似遗留 | {{ r.tasks_done }}/{{ r.tasks_failed }} | {{ fmtN(r.rows_written) }} | {{ r.dead_letter_count || 0 }} | {{ shortTs(r.started_at) }} → {{ shortTs(r.finished_at) }} |
| 暂无历史轮次 | |||||||
轮次详情 · {{ 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 · 应用被授权的部门
| 授权部门 | open_department_id |
|---|---|
| {{ d.name || '—' }} | {{ d.open_department_id }} |
| 未查到授权部门 | |
同步用户到 PortalPOST /api/feishu/sync · 拼音登录名 / 部门→小组
| 登录名 | 姓名 | 部门 | 小组 |
|---|---|---|---|
| {{ p.username }} | {{ p.display_name }} | {{ p.department }} | {{ p.team || '—' }} |
通讯录 · 用户GET /api/feishu/users(需通讯录权限)
| 姓名 | open_id | union_id | 邮箱 | 部门ID |
|---|---|---|---|---|
| {{ u.name }} | {{ u.open_id }} | {{ u.union_id || '—' }} | {{ u.email || '—' }} | {{ (u.department_ids || []).join(',') }} |
| 暂无数据(点「拉取用户」) | ||||
通讯录 · 部门GET /api/feishu/departments(根=应用授权部门)
| 部门名 | open_department_id | 上级部门 | 操作 |
|---|---|---|---|
| {{ d.name || '—' }} | {{ d.open_department_id }} | {{ d.parent_department_id || '—' }} | |
| 暂无数据(点「拉取授权部门」) | |||
发消息POST /api/feishu/send
{{ editUser.id ? ('编辑用户 · ' + editUser.username) : '新增用户' }}
用户共 {{ users.length }} 人 · 匹配 {{ usersShown.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/* 访问
| 时间 | 用户 | 方法 | 路径 | 状态 | 耗时ms | IP |
|---|---|---|---|---|---|---|
| {{ 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 }} |
| 暂无日志 | ||||