⏳ 正在加载管理平台…
{{ toastMsg }}
{{ tab.icon }} {{ tab.label }}
{{ pageTitle }}
{{ currentUser.role === 'super' ? '⭐' : currentUser.role === 'boss' ? '🏆' : currentUser.role === 'manager' ? '👔' : currentUser.role === 'finance' ? '💰' : '👤' }}
{{ currentUser.name }} · {{ roleLabel }}

📝 考试中心

题库管理 · 组卷发卷 · 成绩排名(权限受控)

添加题目
方式A · 粘贴/上传解析 或 方式B · AI 根据材料自动出题(提交前请核对答案)
出题构成:
解析到 {{ examParsed.length }} 题,请核对题目与答案
{{ qi+1 }}. [{{ {judge:'判断',single:'单选',multi:'多选'}[q.type] || q.type }}] {{ q.stem }}
{{ q.options.map((o,i)=>String.fromCharCode(65+i)+'. '+o).join('  ') }}
答案:{{ q.answer }}  解析:{{ q.explain }}
📚 题库({{ examBankTotal }})
#题型题干答案分值分类来源创建
题库为空 · 请在上方添加或导入题目
{{ (examBankPage-1)*examBankPageSize + i + 1 }} {{ {judge:'判断',single:'单选',multi:'多选'}[q.type] || q.type }} {{ q.stem }} {{ q.answer }} {{ q.score }} {{ q.category_name || '未分类' }} {{ q.source }} {{ q.created_at ? q.created_at.slice(0,10) : '' }}
{{ examBankPage }} / {{ Math.max(examBankTotalPages,1) }}
✨ AI 整卷向导
上传/粘贴培训材料 → AI 自动生成整卷 → 逐题审核编辑 → 选考生 · 预约或立即发卷
📄 试卷列表({{ examPapers.length }})
ID名称题数满分来源状态更新时间操作
暂无试卷 · 点右上角「🚀 新建试卷」开始 AI 整卷向导
{{ p.id }} {{ p.name || '未命名试卷' }} {{ p.question_count !== undefined ? p.question_count : '—' }} {{ p.total_score }} {{ p.source || '—' }} {{ p.status === 'published' ? '已发布' + (p.exam_id ? ' · #' + p.exam_id : '') : '草稿' }} {{ p.updated_at ? p.updated_at.slice(0,16) : '' }}
✨ AI 整卷向导(新)
材料 → AI 整卷 → 审核编辑 → 选人预约/发卷,一条龙生成正式试卷;原手动组卷方式保留在下方
新建考试
题型分类题数每题分值
共 {{ examComposeTotalQty }} 题 · 满分 {{ examComposeTotalScore }} 分
{{ u.name }}
{{ u.name }}
考试列表
ID名称开始时长状态考生已交卷操作
暂无考试
{{ e.id }}{{ e.name }} {{ e.start_at ? e.start_at.slice(0,16) : '' }} {{ e.duration_min }}分 {{ {draft:'待发',pending:'待开始',active:'进行中',finished:'已结束'}[e.status] || e.status }} {{ e.candidate_count }}{{ e.result_count }}
选择考试:
选择一场已结束的考试查看成绩排名
名次考生得分满分答对操作
🏅 {{ r.rank }}{{ examUserName(r.userid) }} {{ r.total }}{{ r.full }}{{ r.correct_count }}题

🏪 收银派单

判定「需安装」= 自动拆双工单(售后安装单 + 物流配送单,独立流转互不阻塞);「免安装」= 仅物流配送单;电话空白可在此补录;退货单自动剔除不出现;直发/云仓/自提单判定「免安装」后进「收银闭环」由收银点已送达完结

上次同步:{{ cashierLastSync }}
#出库单号日期客户电话(补录)地址门店业务员品牌产品型号/规格家电类型数量金额{{ cashierMode==='mine' ? '判定结果' : (cashierMode==='close' ? '操作' : '判定') }}
{{ cashierLoading ? '加载中…' : (cashierMode==='mine' ? '暂无已判定未派工的单' : (cashierMode==='close' ? '暂无待收银完结的直发/云仓/自提单' : '暂无待判定工单')) }}
{{ ((cashierMode==='mine' ? cashierMinePage : (cashierMode==='close' ? cashierClosePage : cashierPage))-1)*cashierPageSize + i + 1 }} {{ o.source_voucher_code }}{{ channelTag(o).text }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }}{{ o.group_cnt }}件 {{ o.customer_phone || '—' }} {{ o.customer_address || '—' }} {{ o.department || '—' }} {{ o.salesman || '—' }} {{ o.brand || '—' }} {{ o.product_type || '—' }} {{ installModelLabel(o) }} {{ o.product_spec }} {{ o.appliance_type || '常规家电' }} {{ o.quantity }} {{ o.amount }}
详情
详情
详情 合并{{ o.merged_cnt }}件 {{ String(o.judge_at).slice(5,16) }}
{{ cashierMode==='mine' ? cashierMinePage : (cashierMode==='close' ? cashierClosePage : cashierPage) }} / {{ Math.max(cashierMode==='mine' ? Math.ceil(cashierMineTotal/cashierPageSize) : (cashierMode==='close' ? Math.ceil(cashierCloseTotal/cashierPageSize) : cashierTotalPages),1) }} · 共 {{ cashierMode==='mine' ? cashierMineTotal : (cashierMode==='close' ? cashierCloseTotal : cashierTotal) }} 单

🔧 售后安装派单

待指派安装单按家电类型匹配师傅,人工指派;黄底=地址待补录

已选 {{ mergeSel.length }} 条独立安装单(同客户+同电话+同地址可合并派单)
#出库单号日期客户紧急电话业务员地址品牌产品型号/规格数量家电类型派单
{{ dispatchLoading ? '加载中…' : '暂无待指派安装单' }}
{{ (dispatchPage-1)*dispatchPageSize + i + 1 }} {{ o.source_voucher_code }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }} 🚨 加急 {{ o.customer_phone || '—' }} {{ o.salesman || '—' }} {{ o.salesman_phone }} ⚠️{{ o.customer_address || '地址待补录' }} {{ o.brand || '—' }} {{ o.product_type || '—' }} {{ installModelLabel(o) }} {{ o.product_spec }}
📝 {{ o.judge_memo }}
× {{ o.detail_pieces || o.quantity || '—' }} {{ o.appliance_type || '常规家电' }}
详情 改产品
删除 🚫 终止
{{ dispatchPage }} / {{ Math.max(dispatchTotalPages,1) }} · 共 {{ dispatchTotal }} 单
家电类型 → 技能筛选:
#出库单号日期客户电话地址品牌产品型号/规格数量状态超期操作
{{ overdueLoading ? '加载中…' : '🎉 暂无超期未跟进的单' }}
{{ (overduePage-1)*overduePageSize + i + 1 }} {{ o.source_voucher_code || '—' }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }} {{ o.customer_phone || '—' }} ⚠️{{ o.customer_address || '地址待补录' }} {{ o.brand || '—' }} {{ o.product_type || '—' }} {{ installModelLabel(o) }} {{ o.product_spec }}
📝 {{ o.judge_memo }}
× {{ o.detail_pieces || o.quantity || '—' }} {{ o.status }} {{ o.overdue_days ?? '—' }} 天
详情 🏪 去判定 🚫 终止
{{ overduePage }} / {{ Math.max(overdueTotalPages,1) }} · 共 {{ overdueTotal }} 单
#工单号类型出库单号日期客户电话品牌/产品型号/规格数量师傅接单时间开工时间完工提交状态操作
{{ activeLoading ? '加载中…' : '暂无进行中工单(已接单/施工中/配送中/外派中/待审核/待验收)' }}
{{ (activePage-1)*activePageSize + i + 1 }} {{ o.order_no || '—' }} {{ o.order_type==='delivery'?'物流':'安装' }} {{ o.source_voucher_code }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }} {{ o.customer_phone || '—' }} {{ o.brand || '' }} {{ o.product_type || '' }} {{ installModelLabel(o) }} {{ o.product_spec }} {{ o.quantity }} 外派{{ o.outsourcer_name ? ' · ' + o.outsourcer_name : '' }} {{ o.accept_at ? (o.accept_at||'').slice(5,16) : '—' }} {{ o.start_at ? (o.start_at||'').slice(5,16) : '—' }} {{ o.submitted_at ? (o.submitted_at||'').slice(5,16) : '—' }} {{ o.status || '—' }} 子单 详情
{{ activePage }} / {{ Math.max(activeTotalPages,1) }} · 共 {{ activeTotal }} 单
#出库单号日期客户产品型号/规格家电类型师傅完工提交操作
{{ reviewLoading ? '加载中…' : '暂无待审核/待验收安装单' }}
{{ (reviewPage-1)*reviewPageSize + i + 1 }} {{ o.source_voucher_code }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }} {{ o.customer_phone }} {{ o.product_type || '—' }} {{ installModelLabel(o) }} {{ o.product_spec }} {{ o.appliance_type || '常规家电' }} {{ o.technician_name || '—' }} {{ o.submitted_at || '—' }}
详情
🚫 终止
{{ reviewPage }} / {{ Math.max(reviewTotalPages,1) }} · 共 {{ reviewTotal }} 单
#工单号出库单号日期客户电话品牌/产品型号/规格师傅审核通过回访记录操作
{{ visitLoading ? '加载中…' : '暂无待回访工单(安装审核通过后自动进入本列表,回访后方可结单归档)' }}
{{ (visitPage-1)*visitPageSize + i + 1 }} {{ o.order_no || '—' }} {{ o.source_voucher_code }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }} {{ o.customer_phone || '—' }} {{ o.brand || '' }} {{ o.product_type || '' }} {{ installModelLabel(o) }} {{ o.product_spec }} {{ o.technician_name || '—' }} {{ o.review_at ? (o.review_at||'').slice(0,16) : '—' }} 查看
详情
{{ visitPage }} / {{ Math.max(visitTotalPages,1) }} · 共 {{ visitTotal }} 单
#工单号类型出库单号日期客户电话品牌/产品型号/规格数量金额师傅接单·开工·完工状态审核/送达
{{ historyLoading ? '加载中…' : '暂无历史工单' }}
{{ (historyPage-1)*historyPageSize + i + 1 }} {{ o.order_no || '—' }} {{ o.order_type==='delivery'?'物流':'安装' }} {{ o.source_voucher_code }} {{ o.voucher_date || '—' }} {{ o.customer_name || '—' }} {{ o.customer_phone || '—' }} {{ o.brand || '' }} {{ installModelLabel(o) }} {{ installModelLabel(o) }} {{ o.product_spec }} {{ o.quantity }} {{ o.amount != null ? Number(o.amount).toFixed(2) : '—' }} 外派{{ o.outsourcer_name ? ' · ' + o.outsourcer_name : '' }}
接单 {{ (o.accept_at||'').slice(5,16) }}
接单 —
开工 {{ (o.start_at||'').slice(5,16) }}
开工 —
完工 {{ (o.submitted_at||'').slice(5,16) }}
完工 —
{{ o.status || '—' }} 🚨 加急 子单 含子单 详情 🚫 终止:{{ o.terminate_reason }} — {{ o.terminated_by }} {{ (o.terminated_at||'').slice(0,16) }} 外派完工:{{ o.outsource_done_by }} {{ (o.outsource_done_at||'').slice(0,16) }} {{ o.review_by }} {{ (o.review_at||'').slice(0,16) }} 送达 {{ (o.deliver_at||'').slice(0,16) }}
{{ historyPage }} / {{ Math.max(historyTotalPages,1) }} · 共 {{ historyTotal }} 单

🚚 物流派单

需安装商品(收银判定为需安装)会自动拆出物流单,免安装商品直接走物流配送;配送员在「维修工管理」维护物流标签

已勾选 {{ deliveryCheckedCount }}
#出库单号仓库日期客户电话地址品牌产品型号/规格数量派单
{{ deliveryLoading ? '加载中…' : '暂无待指派物流单' }}
{{ o._rowType !== 'detail' ? (o._seq || (deliveryPage-1)*deliveryPageSize + i + 1) : '' }} {{ o._rowType === 'detail' ? ('↳ ' + (o._det.product_type || '')) : (o.source_voucher_code || '—') }} {{ o._rowType !== 'detail' ? (o.warehouse || '—') : '' }} {{ o._rowType !== 'detail' ? (o.voucher_date || '—') : '' }} {{ o._rowType !== 'detail' ? (o.customer_name || '—') : '' }} {{ o._rowType !== 'detail' ? (o.customer_phone || '—') : '' }} ⚠️{{ o.customer_address || '地址待补录' }} {{ o.brand || '—' }} {{ o.product_type || '—' }} {{ installModelLabel(o) }} {{ o.product_spec }}
📝 {{ o.judge_memo }}
× {{ o._rowType === 'detail' ? (o._det.quantity ?? '—') : (o.detail_pieces || o.quantity || '—') }} 外派{{ o.outsourcer_name ? ' · ' + o.outsourcer_name : '' }} 详情 🚫 终止 删除
{{ deliveryPage }} / {{ Math.max(deliveryTotalPages,1) }} · 共 {{ deliveryTotal }} 单
配送员缺「配送」技能标签?→ 维修工管理 里给该师傅勾选「配送」标签即可(如肖羽/杨志/陈周)。
#出库单号仓库日期客户电话地址品牌产品型号/规格数量配送员运费派单时间状态送达
{{ deliveryActiveLoading ? '加载中…' : '暂无在途物流单(已派单的物流单会出现在这里,送达后在「送达完结」)' }}
{{ o._rowType !== 'detail' ? (o._seq || (deliveryActivePage-1)*deliveryActivePageSize + i + 1) : '' }} {{ o._rowType === 'detail' ? ('↳ ' + (o._det.product_type || '')) : (o.order_no || '—') }} {{ o._rowType !== 'detail' ? (o.warehouse || '—') : '' }} {{ o._rowType !== 'detail' ? (o.voucher_date || '—') : '' }} {{ o._rowType !== 'detail' ? (o.customer_name || '—') : '' }} {{ o._rowType !== 'detail' ? (o.customer_phone || '—') : '' }} ⚠️{{ o.customer_address || '地址待补录' }} {{ o.brand || '—' }} {{ o.product_type || '—' }} {{ installModelLabel(o) }} {{ o.product_spec }} × {{ o._rowType === 'detail' ? (o._det.quantity ?? '—') : (o.detail_pieces || o.quantity || '—') }} 外派{{ o.outsourcer_name ? ' · ' + o.outsourcer_name : '' }}{{ o.technician_name || '—' }} ¥{{ o.freight_fee != null && o.freight_fee !== '' ? Number(o.freight_fee).toFixed(2) : '—' }} 已确认 待确认 {{ o._rowType !== 'detail' ? (o.assigned_at ? o.assigned_at.replace('T',' ').slice(0,16) : '—') : '' }} {{ o.status }} 详情 🚫 终止
{{ deliveryActivePage }} / {{ Math.max(deliveryActiveTotalPages,1) }} · 共 {{ deliveryActiveTotal }} 单

🌡️ 前装安装派工

中央空调 / 地暖 / 暖气片明装 / 暖气片暗装 / 铜管预埋 · 收银拆单判定「需安装」的中央空调与地暖单自动流转本链路,不再进常规安装派单 · 结单=售后手动 · 外派以环节为准,外派完工后恢复流转

环节:
#工单号凭证号来源出库单日期业务线客户电话品牌产品当前环节状态操作
{{ hvacLoading ? '加载中…' : '暂无暖通单' }}
{{ (hvacPage-1)*hvacPageSize + i + 1 }} {{ o.order_no }} {{ o.source_voucher_code || '—' }} {{ o.hvac_src_voucher || '—' }}🔗 {{ o.voucher_date || '—' }} {{ o.line_name || '—' }} {{ o.customer_name || '—' }} {{ o.customer_phone || '—' }} {{ o.brand || '—' }} {{ o.product_type || '—' }} {{ o.product_model }} {{ hvacCurrentStage(o) }} {{ hvacOrderStatus(o) }}
详情
✅ 结单 ⚠️ 外派 📥 外派完成 删除
{{ hvacPage }} / {{ Math.max(hvacTotalPages,1) }} · 共 {{ hvacTotal }} 单

🧑‍🤝‍🧑 客户档案

已成交档案(已购客户,仅存档不参与销售)· 公海 · 保护中 · 已成交 客户池;销售账号绑定企微免登,超7天未跟进流入公海,其他销售可抢单

共 {{ crmTotal }} 条
{{ c.name }} {{ c.status }} {{ c.status }} {{ c.status }} {{ c.status }} {{ c.status }}
📍 {{ c.building || '暂无楼盘' }} · 📱 {{ c.phone }}
🎯 购买意向:{{ c.intention }}
{{ crmTypeLabel(c.customer_type) }} 来源:{{ c.source }} 📦 {{ c.appliance_count }}台家电 🧰 {{ c.appliance_types }} {{ t }} 📝 {{ c.remark }}
归属:{{ c.owner_name }} 未分配 · 录入 {{ c.first_report_at }} · 保护至 {{ c.protection_deadline }} · 最近跟进 {{ c.last_follow_at }}
暂无客户
第 {{ crmPage }} 页
服务号登记的客户归属登记人本人,点击人员卡片查看名下客户;已购买客户不会被回收公海。
👤 {{ s.owner_name || ('账号#'+s.owner_id) }}
名下客户 {{ s.total }}
A {{ s.a_cnt }} B {{ s.b_cnt }} C {{ s.c_cnt }}
✅ 已购买 {{ s.bought_cnt }} · ⏳ 待跟进 {{ s.pending_cnt }}
暂无登记客户
👤 {{ crmRegOwner.owner_name }} 的登记客户 共 {{ crmRegTotal }} 条
{{ c.name }} ✅ 已购买 🔍 老客户({{ c.appliance_count }}台家电) 未购买 {{ c.status }} {{ c.status }}
📍 {{ c.building || '暂无地址' }} · 📱 {{ c.phone }} · 💬 {{ c.wechat }}
{{ crmTypeLabel(c.customer_type) }} 来源:{{ c.source }} · 🛒 购买于 {{ c.bought_at }}
录入 {{ c.first_report_at }} · 保护至 {{ c.protection_deadline }} · 最近跟进 {{ c.last_follow_at }} 📝 {{ c.remark }}
暂无客户
第 {{ crmRegPage }} 页
新增 / 绑定销售账号
点「👥 从通讯录选择」直接勾选企微成员批量添加为销售账号(自动绑定免登 UserID);也可手动填写。
{{ a.name }} 铭品 {{ a.phone }} 📍 {{ a.location }}
已绑定中企微ID 未绑定,无法免登 停用

📈 经营看板

经营数据总览 · {{ bossCurrentMonth }}

查看月份 ⏳ 加载中...
今年至今销售额
📅
{{ n15Kpi ? fmtMoney(n15Kpi.ytd_sales) : '—' }}
{{ n15Kpi ? n15Kpi.ytd_label : '加载中' }} · T+ 真实数据
今年至今毛利
🎯
{{ n15Kpi ? fmtMoney(n15Kpi.ytd_gross_profit) : '—' }}
{{ n15Kpi ? '毛利率 ' + fmtPct1(n15Kpi.ytd_margin_rate) : '加载中' }}
当月销售额
💰
{{ n15Kpi ? fmtMoney(n15Kpi.month_sales) : '—' }}
{{ n15Kpi ? n15Kpi.month_label : '加载中' }} · T+ 真实数据
当月毛利
📈
{{ n15Kpi ? fmtMoney(n15Kpi.month_gross_profit) : '—' }}
{{ n15Kpi ? '毛利率 ' + fmtPct1(n15Kpi.month_margin_rate) : '加载中' }}
今年至今出库额
📦
{{ n15Kpi ? fmtMoney(n15Kpi.ytd_delivery_sales) : '—' }}
{{ n15Kpi ? n15Kpi.ytd_label : '加载中' }} · 出库单口径
今年至今出库毛利
{{ n15Kpi ? fmtMoney(n15Kpi.ytd_delivery_gross_profit) : '—' }}
{{ n15Kpi ? '毛利率 ' + fmtPct1(n15Kpi.ytd_delivery_margin_rate) : '加载中' }}
当月出库金额
🚚
{{ n15Kpi ? fmtMoney(n15Kpi.month_delivery_sales) : '—' }}
{{ n15Kpi ? n15Kpi.month_label : '加载中' }} · 出库单口径
当月出库毛利
🚚
{{ n15Kpi ? fmtMoney(n15Kpi.month_delivery_gross_profit) : '—' }}
{{ n15Kpi ? '毛利率 ' + fmtPct1(n15Kpi.month_delivery_margin_rate) : '加载中' }}
{{ c.label }}
{{ c.key==='self'?'🏬':(c.key==='jd'?'📦':(c.key==='suning'?'🏪':'🛒')) }}
{{ fmtMoney(c.sales) }}
毛利 {{ fmtMoney(c.gross_profit) }}
{{ c.note }}
数据期间 指定月份
🏠 门店经营(销售毛利 + 渠道经营)
期间:{{ n15PeriodLabel }} · 门店维度(departmentName)· 客户数/客单价/销售占比/退货 · 剔除终止订单
↩️ 退货额 (率 {{ n15ChannelTotals?.return_rate ?? 0 }}%)
{{ fmtMoney(n15ChannelTotals?.return_sales ?? 0) }}
🎁 赠品成本 (量 {{ n15ChannelTotals?.gift_qty || 0 }})
{{ fmtMoney(n15ChannelTotals?.gift_cost ?? 0) }}
🔖 折扣销售 ({{ n15ChannelTotals?.discount_rows || 0 }} 行)
{{ fmtMoney(n15ChannelTotals?.discount_sales ?? 0) }}
⚠️ 折扣待核
{{ n15ChannelTotals?.pending_rows || 0 }}
门店 销售额 毛利额 毛利率 客户数 客单价 占比 退货额 退货率
{{ s.store }} {{ fmtMoney(s.sales) }} {{ fmtMoney(s.gross_profit) }} {{ fmtPct1(s.margin_rate) }} {{ fmtInt(s.order_count) }} {{ fmtMoney(s.avg_order) }} {{ fmtPct1(s.ratio) }} {{ fmtMoney(s?.return_sales ?? 0) }} {{ fmtPct1(s?.return_rate ?? 0) }}
暂无数据
🛠️ 安装/配送工单运行 直读 N12 install_orders 表 · 与收银判定/派单页同源
待判定
🏪
{{ bossInstallStats.pending_judge ?? '—' }}
等待收银判定 →
待指派
🧭
{{ bossInstallStats.pending_assign ?? '—' }}
安装+物流 →
在途
🚚
{{ bossInstallStats.in_transit ?? '—' }}
接单/施工/配送中 →
待审核
{{ bossInstallStats.pending_review ?? '—' }}
师傅已完工提交 →
待回访
📞
{{ bossInstallStats.pending_visit ?? '—' }}
审核通过待回访 →
本周完成
🎉
{{ bossInstallStats.week_done ?? '—' }}
审核通过/已送达 →
超期未跟进
{{ bossInstallStats.overdue ?? '—' }}
待判定/待指派 >3天 →
👷 师傅负荷榜
# 师傅 待办 在途
{{ i + 1 }} {{ t.name }} {{ fmtInt(t.todo) }} {{ fmtInt(t.transit) }}
📇 企业微信加客户统计
员工使用自己的企业微信添加的客户数(外部联系人首次添加时间口径) · 本月累计今日新增 {{ fmtInt(n15Wecom.total) }} 人 · 员工 {{ fmtInt(n15Wecom.data.length) }} 人 · ⏳ 加载中...
# 员工 加客户数
{{ i + 1 }} {{ d.name }} {{ fmtInt(d.count) }}
{{ n15WecomLoading ? '⏳ 加载中...' : '暂无数据(员工用企业微信添加客户后产生)' }}
🏷️ 品牌品类排行
期间:{{ n15PeriodLabel }} · 共 {{ n15CatRankSum.category_count ?? 0 }} 个品类 · 销售额 {{ fmtMoney(n15CatRankSum.total_sales ?? 0) }} · 毛利 {{ fmtMoney(n15CatRankSum.total_gross_profit ?? 0) }}
👤 销售人员排行
留空=跟随上方数据期间
共 {{ fmtInt(n15SpTotal) }} 人 · 销售额 {{ fmtMoney(n15SpSum.total_sales ?? 0) }} · 毛利 {{ fmtMoney(n15SpSum.total_gross_profit ?? 0) }} · 毛利率 {{ fmtPct1(n15SpSum.overall_margin_rate ?? 0) }}
排名 姓名 角色 门店/部门 销售额 毛利额 毛利率
🥇 🥈 🥉 {{ i + 1 }} {{ sp.name }} {{ sp.role_label }} {{ sp.dept }} {{ fmtMoney(sp.sales) }} {{ fmtMoney(sp.gross_profit) }} {{ fmtPct1(sp.margin_rate) }}
{{ n15SpLoading ? '加载中…' : '暂无销售人员数据' }}
📊 销售任务看板({{ drPeriod }} · 实时)
{{ saleTaskUpdatedAt }}
部门 姓名 冲刺任务(元) 已完成(元) 完成率 退货(元) 今日(元)
暂无数据{{ saleTaskBoard?.sync?.status === 'none' ? '—— 报表中心先点「立即同步」从 T+ 拉取' : '' }}
总计 {{ fmtInt(saleTaskBoard.m_total_target_sales || 0) }} {{ fmtInt(rtDoneSalesTotal()) }} {{ pct(rtDoneSalesTotal(), saleTaskBoard.m_total_target_sales) }} {{ fmtInt(saleTaskTodayTotalReturn) }} {{ fmtInt(saleTaskTodayTotal) }}
📌 口径说明:今日(元)=当天销售净额(真实销售额−退货额,T+ 销售订单含税金额,剔除已关闭单,按销售员汇总,退货另列、不计入今日销售);退货(元)=当天退货额(负数行取绝对值,红字,无退货显示 —);已完成(元)/完成率=本月累计,点「立即同步」/「刷新」后实时从 T+ 整月拉取({{ saleTaskMonthRTDate || '—' }}),拉取失败时回退每日 18:20 快照;总计行「合计退货」同样实时。
⚡ 快捷提问
📝 回答结果
{{ bossAnswer }}
🏷️ 品牌销售 Top10
期间:{{ n15PeriodLabel }} · 月份:{{ n15BrandMonth }}(选月份后按该月统计,留空恢复数据期间) · 共 {{ n15BrandTotal }} 个品牌 · 品类:{{ n15BrandCat1 }}
# 品牌 销售额 毛利额 毛利率 占比
{{ i + 1 }} {{ b.brand }} {{ fmtMoney(b.sales) }} {{ fmtMoney(b.gross_profit) }} {{ fmtPct1(b.margin_rate) }} {{ fmtPct1(b.ratio) }}
暂无品牌销售数据
合计 {{ fmtMoney(n15BrandSum.total_sales) }} {{ fmtMoney(n15BrandSum.total_gross_profit) }} {{ fmtPct1(n15BrandSum.total_sales ? n15BrandSum.total_gross_profit / n15BrandSum.total_sales * 100 : 0) }} 100%
📣 销售推广二维码统计
累计扫码人数
{{ n15SaleQr?.total_openid ?? '—' }}
累计扫码次数
{{ n15SaleQr?.total_scan ?? '—' }}
近7天扫码客户
{{ n15SaleQr?.week_openid ?? '—' }}
销售在「客户系统-我的二维码」展示推广码,客户扫码关注公众号即归因到该销售 · 每人 30 天内同码持续累计
# 销售 扫码人数 扫码次数 关注 最近扫码
{{ i + 1 }} {{ d.name || '—' }} {{ fmtInt(d.openid_cnt) }} {{ fmtInt(d.scan_cnt) }} {{ fmtInt(d.subscribe_cnt) }} {{ d.last_scan || '—' }}
暂无扫码数据(销售在「客户系统-我的二维码」展示后产生)
🏢 装修公司价值
期间:{{ n15PeriodLabel }} · 按销售额降序 · 共 {{ n15CompanyTotal }} 家装修公司(括号内为数字/日常备注的客户已剔除)
# 装修公司 客户数 销售额 毛利额 毛利率 销量 单数 占比
{{ i + 1 }} {{ d.company }} {{ fmtInt(d.customer_count) }} {{ fmtMoney(d.sales) }} {{ fmtMoney(d.gross_profit) }} {{ fmtPct1(d.margin_rate) }} {{ fmtInt(d.qty) }} {{ fmtInt(d.order_count) }} {{ fmtPct1(d.ratio) }}
暂无装修公司数据
合计 {{ fmtInt(n15CompanySum.customer_count) }} {{ fmtMoney(n15CompanySum.sales) }} {{ fmtMoney(n15CompanySum.gross_profit) }} {{ fmtPct1(n15CompanySum.margin_rate) }} {{ fmtInt(n15CompanySum.qty) }} {{ fmtInt(n15CompanySum.order_count) }} 100%

📚 知识库

品牌政策 · 返利规则 · 操作手册

分类筛选
全部 {{ kbTotal }}
{{ c.label }} {{ kbTotal }}
加载中...
📭
暂无匹配的知识条目
{{ item.title }}
{{ item.content_preview || (item.content ? item.content.slice(0,120) : '') }}
🏷️ {{ kbCategoryLabel(item.category) }} 🏢 {{ item.brand }} 📅 {{ item.created_at ? item.created_at.slice(0,10) : '' }} 编辑 删除

📞 业务员电话

维护销售人员电话,安装/物流工单与派单弹窗将自动展示(姓名需与出库单业务员逐字一致)

业务员姓名电话操作
{{ salesmanPhoneLoading ? '加载中…' : '暂无业务员电话,请点击右上角「+ 新增业务员」添加' }}

📋 应报名单

工作日报应报人员(门店归属、应报/未报统计的唯一口径)。门店销售 + 店长应报;其余管理岗置为「不报」后不进未交名单与统计

企微 userid姓名门店归属角色应报操作
{{ rosterLoading ? '加载中…' : '暂无名单,请点击「同步企微名单」导入或「+ 新增成员」添加' }}

说明:名单以本表为准,次日日报构建时生效;「同步企微名单」从企微通讯录 + 各门店日报模板应报范围按 userid 去重导入,管理岗自动置为「不报」。

📤 上传资料

支持 PDF、Excel、Word、图片等文件格式

📁
拖拽文件到此处上传
或点击选择文件 · 最大 50MB
上传中... {{ uploadProgress }}%
上传历史
文件名大小类型上传时间状态
{{ f.name }} {{ f.size }} {{ f.type }} {{ f.time }} {{ f.status }}

💬 对话日志

用户与 AI 助手的对话记录

{{ msg.role === 'user' ? '👤' : '🤖' }}
{{ msg.content }}
{{ msg.time }}
💬
暂无对话记录

📨 推送治理

出站推送统一台账 · 近7天接收统计 · 订阅矩阵开关

近 {{ pushSummaryDays }} 天推送统计(接收人 × 类别)

接收人总条数类别分布
{{ r.receiver }} {{ r.total }} {{ pushCatLabel(cat) }} × {{ cnt }}
暂无台账数据(推送模块发送后自动记录)

🎛️ 订阅矩阵(关闭后该接收人不再收到对应类别推送,立即生效)

{{ c[1] }} {{ pushSubState(c[0]) === null ? '' : (pushSubState(c[0]) ? '✅' : '🚫') }}

亮=接收,暗=已关闭;未配置过的类别默认接收。点击切换。

现有配置(全部)

接收人类别状态更新时间
{{ s.receiver }} {{ pushCatLabel(s.category) }} {{ s.enabled ? '✅ 接收' : '🚫 已关闭' }} {{ (s.updated_at || '').toString().slice(0, 19) }}

📜 推送台账明细

时间接收人类型类别摘要errcode任务
{{ (r.ts || '').toString().slice(0, 19) }} {{ r.receiver }} {{ r.msg_type }} {{ pushCatLabel(r.category) }} {{ r.summary }} {{ r.errcode }} {{ r.task }}
共 {{ pushAuditTotal }} 条 · 第 {{ pushAuditPage }}/{{ Math.max(1, Math.ceil(pushAuditTotal / 20)) }} 页
暂无推送记录

📋 售后维修管理

工单派发 · 维修进度 · 服务闭环

待派单
📋
{{ serviceStats?.pendingDispatch || 0 }}
待处理
进行中
🔧
{{ serviceStats?.inProgress || 0 }}
维修中
今日完成
{{ serviceStats?.todayDone || 0 }}
已完成
紧急工单
🚨
{{ serviceStats?.urgentOrders || 0 }}
需加急
工单号 客户名 产品型号 紧急程度 状态 维修工 创建时间 操作
暂无工单数据
{{ o.order_no }} {{ o.customer_name }} {{ o.product_model }} {{ o.urgency === 'emergency' ? '紧急' : o.urgency === 'urgent' ? '一般' : '普通' }} {{ orderStatusLabel(o.status) }} 外包:{{ o.outsourcer_name || '—' }} {{ o.technician_name || '—' }} {{ o.created_at }} 详情 ✅ 验收 📞 回访 🤝 转外派 ✅ 外派完工 ↩ 退回 📌 每日跟进 派单 取消 🚫 终止 删除

🛰️ 外派监管

聚合 售后外派 · 安装外派 · 暖通外派 三线未闭环工单;外派中单售后必须每日跟进

外派未闭环
🛰️
{{ outsourceBoard?.stats?.unfinished || 0 }}
总单数
逾期未闭环
⏱️
{{ outsourceBoard?.stats?.overdue || 0 }}
需催办
今日待跟进
📌
{{ (outsourceBoard?.pending_followups || []).length }}
请逐单填写进度
外包师傅
👷
{{ Object.keys(outsourceBoard?.stats?.by_outsourcer || {}).length || 0 }}
在服数量
🔄 刷新
📌 今日待跟进({{ (outsourceBoard?.pending_followups || []).length }} 单)——外派中单每天必须跟进一次,进度如实填写,断档触发预警
工单号客户电话外包师傅最近跟进连续跟进操作
今日外派单均已跟进 ✅
{{ pf.order_no }} {{ pf.customer_name }} {{ pf.customer_phone }} {{ pf.outsourcer_name || '—' }} {{ (pf.last_followup_at || '—').toString().slice(0,16) }} {{ pf.followup_streak || 0 }} 天
来源工单号客户电话产品/环节外包师傅派发时间在服天数状态操作
{{ outsourceBoardLoading ? '加载中...' : '暂无外派中的工单' }}
{{ row.line === 'service' ? '售后' : row.line === 'install' ? '安装' : '暖通' }} {{ row.order_no }} {{ row.customer_name }} {{ row.customer_phone }} {{ row.product }} {{ row.outsourcer_name || '—' }} {{ (row.outsource_at || '').toString().slice(0,16) }} {{ row.days }} 天 {{ row.status }}{{ row.days > 0 ? ' 逾期' : '' }} ✅ 完工 📌 跟进 ➡️ 去处理 ↩ 取消外派 🗑️ 删除

* 逾期判定:售后按转外派时间、安装按外派子单派发时间、暖通按环节最近变更时间(阈值在「预警设置」页配置)。

⏰ 预警设置

配置售后外派/回访/派工/每日跟进的预警阈值;预警每日合并推送售后群,当日幂等不刷屏

预警项说明阈值单位启用操作
{{ rule.label }} {{ rule.key === 'outsource_overdue_days' ? '外派派发超过 N 天仍未完工闭环' : rule.key === 'review_overdue_days' ? '工单进入待验收后超 N 天未回访(建议转人工电话回访)' : rule.key === 'manual_dispatch_hours' ? '手工创建的工单超过 N 小时仍未派工' : '外派中单断跟进超过 N 天(售后需每天跟进一次)' }} {{ rule.key === 'manual_dispatch_hours' ? '小时' : '天' }}

* 预警任务每 30 分钟扫描一次,发现预警合并为一条推送至售后群;当日已推则不再重复推送。

🔧 维修工管理

工人信息 · 技能管理 · 工作状态

🌙 今日休假 {{ techLeaveToday.length }} 人

各品类可匹配师傅数

{{ c }}
{{ (skillCoverage[c] || []).length }} 人

售后技能分布

{{ skill }} ({{ techsBySkill(skill) }})
暂无维修工数据
{{ t.name.charAt(0) }}
{{ t.name }}
{{ t.phone }}
🌙 休假{{ t.leave_title ? '·' + t.leave_title : '' }} {{ t.status === 'idle' ? '空闲' : t.status === 'busy' ? '忙碌' : '离线' }}
{{ t.technician_type === 'delivery' ? '🚚 物流配送' : (t.technician_type === 'all' ? '🧰 全能' : '🛠 ' + ({install:'安装',drilling:'打孔',commissioning:'调试',measure:'测量',survey:'勘察'}[t.technician_type] || t.technician_type)) }} {{ skill }}
📍 {{ t.area || '未指定' }} 📋 {{ t.active_orders || 0 }} 个工单

📦 备件库存

T+实时库存 · 备件入库出库 · 库存预警

T+在售SKU
📦
{{ tplusInvSummary?.total_sku || 0 }}
种商品有库存
总现存量
📊
{{ fmtNum(tplusInvSummary?.total_existing) }}
{{ tplusInvSummary?.brand_count || 0 }}个品牌 · {{ tplusInvSummary?.warehouse_count || 0 }}个仓库
总可用量
{{ fmtNum(tplusInvSummary?.total_avail) }}
可立即销售
共 {{ tplusInvTotal }} 项 · 刷新于 {{ tplusSyncTime }}
商品编码 名称 型号 品牌 品类 渠道 仓库 现存量 可用量
{{ tplusSearch || tplusBrandFilter ? '无匹配结果' : 'T+库存同步中...首次加载需1分钟' }}
{{ item.code }} {{ item.name }} {{ item.spec || '-' }} {{ item.brand }} {{ item.category }} {{ item.channel || '-' }} {{ item.warehouse }} {{ item.existing_qty }} {{ item.avail_qty }}
第 {{ tplusInvPage }} / {{ Math.ceil(tplusInvTotal / 50) || 1 }} 页

🔧 售后备件管理

名称 型号 品牌 兼容机型 库存量 最低阈值 单位 操作
暂无库存数据
{{ item.name }} {{ item.model }} {{ item.brand }} {{ item.compatible_models || '—' }} {{ item.stock }} {{ item.threshold }} {{ item.unit }} 入库 出库 编辑 删除

👥 用户管理

管理后台登录账号 · 按角色分配权限

账号姓名角色可见页面状态创建时间操作
暂无用户 · 点击右上角「+ 添加用户」创建
{{ u.user_id }}{{ u.name }} {{ {super:'⭐超管',boss:'🏆老板',manager:'👔部门负责人',finance:'💰财务'}[u.role] || u.role }} {{ u.pages ? u.pages.map(p => { const _f = allPages.find(x=>x.value===p); return _f ? _f.label : p; }).join('·') : '' }} {{ u.is_active?'启用':'停用' }} {{ u.created_at ? u.created_at.slice(0,10) : '' }}

🤖 AI 使用统计

AI 对话使用情况分析 · 活跃用户与热门问题

总对话数
💬
{{ usageStats.total_conversations || usageStats.total || 0 }}
活跃用户数
👥
{{ usageStats.active_users || 0 }}
平均响应时间
{{ usageStats.avg_response_time || 0 }} s
错误数
⚠️
{{ usageStats.error_count || usageStats.errors || 0 }}
📅 日期范围: ~

🏆 TOP 活跃用户

#用户名部门对话次数
暂无数据
{{ i+1 }} {{ u.name || u.user_id || '-' }} {{ u.department || '-' }} {{ u.count || u.conversations || 0 }}

🔥 TOP 热门问题

#问题分类次数占比
暂无数据
{{ i+1 }} {{ q.category || q.question || '-' }} {{ q.count || 0 }} {{ q.percentage || (q.ratio ? (q.ratio*100).toFixed(1)+'%' : '0%') }}

🔔 反馈管理

处理用户对 AI 回答的反馈与错误报告

待处理
{{ feedbackStats.pending || 0 }}
已处理
{{ feedbackStats.handled || 0 }}
🔍 状态: 共 {{ feedbackList.length }} 条
用户问题AI回答反馈类型状态时间操作
暂无反馈
{{ f.user_name || f.user_id || '-' }} {{ f.question || '-' }} {{ (f.ai_answer||f.answer||'-').slice(0,50) }} {{ feedbackTypeLabel(f.feedback_type||f.type) }} {{ f.status==='pending'?'待处理':'已处理' }} {{ f.created_at ? String(f.created_at).slice(0,16).replace('T',' ') : '' }} 已处理

标签识别

批量上传产品标签图片,自动OCR识别文字并生成文本文件

📤
拖拽图片到此处,或点击选择文件
支持 JPG / PNG 格式,最多 50 张
正在识别中... ({{ ocrCurrentIdx }}/{{ ocrTotalCount }})

识别结果 ({{ ocrSuccessCount }}/{{ ocrResults.length }} 成功)

【图{{ r.index }}】{{ r.filename }} {{ r.success ? '✅ 识别成功' : '❌ 识别失败: ' + r.error }}
{{ r.text }}

📦 SN台账导入

上传历史销售SN台账 Excel,清洗校验后导入「家电档案」库,供公众号我的家电查询

📤
选择历史销售 SN 台账 Excel 文件
支持 .xlsx / .xls · 需含 SN/序列号列(品牌、型号、客户姓名、电话、购买日期列自动识别)
正在解析 Excel 并做清洗评估...

📊 导入预检报告 {{ snReport.file_name }}

{{ snReport.total_rows }}
数据总行
{{ snReport.sn_valid }}
SN 有效({{ snPct(snReport.sn_rate) }})
{{ snReport.distinct_sn }}
去重后 SN
{{ snReport.dup_groups }}
重复 SN 组
{{ snReport.reject_count }}
无SN弃行
列识别:SN←{{ snReport.sn_col || '—' }} · 电话←{{ snReport.phone_col || '—' }} · 型号←{{ snReport.model_col || '—' }} · 购买日期←{{ snReport.date_col || '—' }}
⚠️ 重复 SN 需注意(同 SN 多行,自动取最近购买日期):
{{ c.sn }} · {{ c.rows }} 行 · 日期 {{ (c.dates||[]).join(' / ') || '—' }}
前 {{ snReport.preview.length }} 行预览:
SN 品牌 型号 客户 电话 购买日期
{{ p.sn || '—' }} {{ p.brand || '—' }} {{ p.product_model || '—' }} {{ p.customer_name || '—' }} {{ p.customer_phone || '—' }} {{ p.purchase_date || '—' }}

📜 导入历史(共 {{ snTotal }} 条)

加载中...
SN 品牌 型号 客户 电话 购买日期 来源 核对
{{ it.sn || '—' }} {{ it.brand || '—' }} {{ it.product_model || '—' }} {{ it.customer_name || '—' }} {{ it.customer_phone || '—' }} {{ snFmtDate(it.purchase_date) }} {{ it.source === 'customer' ? '客户自助' : (it.source === 'import' ? '台账导入' : (it.source||'—')) }} {{ it.review_status=='pending' ? '待核对' : '已核对' }}
暂无台账数据
{{ snPage }} / {{ Math.ceil(snTotal / snPageSize) }}

📋 待核对清单(共 {{ snReviewTotal }} 条)

加载中...
SN 品牌 型号 客户 电话 购买日期 操作
{{ it.sn || '—' }} {{ it.brand || '—' }} {{ it.product_model || '—' }} {{ it.customer_name || '—' }} {{ it.customer_phone || '—' }} {{ snFmtDate(it.purchase_date) }}
🎉 无待核对记录
{{ snReviewPage }} / {{ Math.ceil(snReviewTotal / snReviewPageSize) }}

📅 报表中心

销售/前装/内机三口径自动从 T+ 取数,人只需填每月目标任务;支持四表一键导出 xlsx

报表月份
{{ rcSyncMeta.text }} 月销售 {{ fmtWan(rcTables.m_total_sales) }} 万 · 前装 {{ rcTables.m_total_qz }} 户 · 内机 {{ rcTables.m_total_nj }} 台
数据源:T+ 销售订单明细(不含已关闭单)· 每日 18:20 自动同步
⚠️ 本期快照与 T+ 对账不平(差 {{ fmtWan(rcTables.sync.diff) }} 万)。请勿直接导出报表,先点「立即同步」修复。
未分配业务员(不在人员名册,金额不丢失但需尽快补映射):
日期 业务员 销售额(元)
{{ u.date }} {{ u.person }} {{ u.sales.toLocaleString() }}
暂无未分配数据
部门 姓名 {{ rcTab === 't1' || rcTab === 't2' ? '冲刺任务(元)' : (rcTab === 't3' ? '前装任务(户)' : '内机任务(台)') }} {{ rcTab === 't3' ? '已完成(户)' : (rcTab === 't4' ? '已完成(台)' : '已完成(元)') }} 完成率 最近日({{ rcTables?.rows?.[0]?.date ? String(rcTables.rows[0].date).slice(5) : '—' }})
暂无数据{{ rcTables?.sync?.status === 'none' ? '—— 点击「立即同步」从 T+ 拉取' : '' }}
总计 {{ rcTab === 't3' ? (rcTables.m_total_target_qz || 0) + ' 户' : (rcTab === 't4' ? '—' : fmtYuan(rcTables.m_total_target_sales || 0) + ' 元') }} {{ rcTab === 't3' ? (rcTables.m_total_qz || 0) + ' 户' : (rcTab === 't4' ? (rcTables.m_total_nj || 0) + ' 台' : fmtYuan(rcTables.m_total_sales || 0) + ' 元') }} {{ rcTab === 't4' ? '—' : (rcTab === 't3' ? pct(rcTables.m_total_qz, rcTables.m_total_target_qz) : pct(rcTables.m_total_sales, rcTables.m_total_target_sales)) }}
口径:销售额=销售订单含税金额(剔除已关闭单);前装户数=风管机套机+多联机外机,整月同地址只算一户;内机台数=多联机内机+风管机套机数量合计。 预览为简化视图,完整版式(合并/冻结/小计总计)以导出 xlsx 为准。

🎯 人级月度目标({{ drPeriod }})

仅需人工填目标;业绩从 T+ 自动取数。单位:销售=元、前装=户、内机=台
🔒 本期已锁定
门店 姓名 销售目标(元) 前装目标(户) 内机目标(台) 状态
{{ t.store }} {{ t.person_name }} 🔒 已锁 {{ t.in_db ? 'draft' : '骨架' }}
暂无名册,请先在下方人员归属映射中添加业务员

👤 业务员归属映射

{{ drImportMsg }}
店面 子店面 业务员 排序 状态 操作
暂无人员映射,点击「+ 新增业务员」添加
提示:业务员姓名需与 T+ personName 逐字一致;子店面可为空(归该店主档)。领导姓名不会出现在报表中。

🎯 月度目标看板({{ drPeriod }})

目标单元格修改后自动保存;实际数来自 T+ 月至今(与日报口径一致)
门店 子店 销售目标(元) 实际销售(元) 销售达成 毛利目标(元) 实际毛利(元) 毛利达成 冲刺目标(元) 冲刺达成
{{ t.store }} {{ t.sub_label || '—' }} {{ fmtNum(t.order) }}
{{ rateTxt(t.sales_rate) }}
{{ fmtNum(t.gp) }}
{{ rateTxt(t.gp_rate) }}
{{ rateTxt(t.sprint_rate) }}
暂无目标数据,点击「建立目标骨架」生成行

✅ 生成预检({{ drPreview.period }})

已聚合业务员 {{ drPreview.person_count }} 人
部门(门店) 订单金额 出库金额 毛利额
{{ k }} {{ fmtNum(v.order) }} {{ fmtNum(v.delivery) }} {{ fmtNum(v.gp) }}

📊 库存周转

⚡ 年化周转率主卡 实际 {{ tcAnnualRateFmt(tcAnnual.annual_rate) }} 次/年  vs  行业标准 {{ tcAnnualRateFmt(tcAnnual.std_annual_rate) }} 次/年 {{ tcAnnualLevel.txt }} {{ tcAnnual.period_start }} ~ {{ tcAnnual.period_end }}({{ tcAnnual.period_days }} 天) 绿(正常) {{ tcAnnual.buckets?.normal?.n ?? 0 }} 个 | 黄(关注) {{ tcAnnual.buckets?.watch?.n ?? 0 }} 个 | 红(需处置) {{ tcAnnual.buckets?.red?.n ?? 0 }} 个(占压 {{ tcAnnualPct(tcAnnual.red_ratio) }}) 口径:年化周转率 = 365 ÷ 实际周转天数;行业标准 = 365 ÷ 标准周转天数;金额加权;红占比 <10% 绿 / <25% 黄 / ≥25% 红
⚠️ 采购异常(尚有库存仍进货) 共 {{ tcAbn.total }} 个 SKU ℹ️ 判定依据
判定:进货前可用量 > 0(= 当前可用量 − 最后一次进货数量 + 最后进货日之后出库量);标黄行请优先清理、停止补货。核对列:最后一次进货数量 / 其后出库量 / 进货前可用量。
序号存货编码品牌品名+规格型号 一级品类二级品类所在仓库 现存量可用量 最后一次进货日最后一次进货数量其后出库量 进货前可用量 库存金额 建议动作
{{ ((tcAbn.page - 1) * 50) + i + 1 }} {{ r.code }} {{ r.brand }} {{ r.name + (r.spec ? ' ' + r.spec : '') }} {{ r.cat1 }} {{ r.cat2 }} {{ r.warehouses }} {{ tcAbnFmtNum(r.existing_qty) }} {{ tcAbnFmtNum(r.available_qty) }} {{ r.last_in_date || '—' }} {{ tcAbnFmtNum(r.last_in_qty) }} {{ tcAbnFmtNum(r.out_after_li) }} {{ tcAbnFmtNum(r.pre_li_qty) }} {{ tcOverFmt(r.cost) }} {{ r.action }}
{{ tcAbnBusy ? '加载中...' : '无采购异常 SKU(进货前可用量均 ≤ 0)' }}
采购异常 = 最后一次进货前可用量 > 0(当前可用量 − 最后一次进货数量 + 最后进货日之后出库量 > 0,即进货前已有库存仍继续补货),仅此一个条件;不要求近30天进货,进货后卖没卖都不豁免。
解读:进货前可用量越大 = 补货前压货越多,越应先清理;库存金额 = 本地档案最新成本,成本未知行留空。
🗄️ 呆滞存货分析表(T+ 版式) 分析日期 {{ tcStale?.calc_date || '—' }} 呆滞标准:
品牌 一级分类 二级分类 仓库 排序
呆滞总金额:{{ tcStaleFmt(tcStale.stale_total_amount) }} 共 {{ tcFmtNum(tcStale.total) }} 行(S{{ tcStale.page }} / {{ tcStaleTotalPages }} 页) 最近变动日期 = max(最后入库日, 最后出库日);呆滞天数 = 分析日期 − 最近变动日期;占比 = 行金额 ÷ 呆滞总金额
序号 一级分类 二级分类 所在仓库 存货编码 存货 规格型号 主计量 数量 单价 库存金额 最近变动日期 呆滞天数 占比
{{ ((tcStale.page - 1) * 50) + i + 1 }} {{ r.cat1 || '—' }} {{ r.cat2 || '—' }} {{ r.warehouse || '—' }} {{ r.code }} {{ r.name || '—' }} {{ r.spec || '—' }} {{ r.unit || '—' }} {{ tcFmtNum(r.qty) }} {{ r.price != null ? tcStaleFmt(r.price) : '—' }} {{ r.amount != null ? tcStaleFmt(r.amount) : '—' }} {{ r.last_move_date || '从未变动' }} {{ r.move_days != null ? tcFmtNum(r.move_days) : '从未变动' }} {{ r.ratio != null ? tcStalePct(r.ratio) : '—' }}
{{ tcStaleBusy ? '加载中...' : '无符合条件的呆滞存货' }}
合计 {{ tcFmtNum(tcStale?.rows?.reduce((s, r) => s + (Number(r.qty) || 0), 0)) }} {{ tcStaleFmt(tcStale.stale_total_amount) }} {{ tcStalePct(1) }}
列序对齐 T+ 样表《呆滞存货分析表》;数量=期末全量现存量(含售后材料);单价=本地档案最新成本,成本未知行金额留空、不计入呆滞总金额与占比(与样表一致)。
解读:呆滞天数越大 = 货压得越久、风险越高,越小越好;可按「数量」或「呆滞天数」降序排列查看重点。
注意:本地库存/单价口径与 T+ 存在系统差(T+ 含调拨等本地无源变动、单价含自身成本口径),本表金额与样表可能有偏差,属已知差异,不复刻 T+ 数值。
🔄 周转率分析表(T+ 版式) {{ tcTurnoverPeriodLabel }} 排序
共 {{ tcFmtNum(tcTurnover.total) }} 行(S{{ tcTurnover.page }} / {{ tcTurnoverTotalPages }} 页) 期间默认自 2024-01-01;周转率 = 期间出库次数;标准周转天数 = 行业基准(n73_industry_benchmark 可配置);标准周转率 = 期间天数 ÷ 标准周转天数;差异 = 实际 − 标准
序号 存货编码 存货 标准周转天数 规格型号 主计量 数量 库存金额 周转率 标准周转率 实际周转天数 差异
{{ ((tcTurnover.page - 1) * 50) + i + 1 }} {{ r.code }} {{ r.name || '—' }} {{ r.std_days != null ? tcFmtNum(r.std_days) : '—' }} {{ r.spec || '—' }} {{ r.unit || '—' }} {{ r.qty != null ? tcFmtNum(r.qty) : '—' }} {{ r.amount != null ? tcTurnoverFmt(r.amount) : '—' }} {{ r.rate != null ? tcTurnoverFmt(r.rate) : '—' }} {{ r.std_rate != null ? tcTurnoverFmt(r.std_rate) : '—' }} {{ r.actual_days != null ? tcTurnoverFmt(r.actual_days) : '—' }} {{ r.diff != null ? tcTurnoverFmt(r.diff) : '—' }}
{{ tcTurnoverBusy ? '加载中...' : '无符合条件的数据' }}
列序对齐 T+ 样表《库存周转率分析表》并补「标准周转率」列;期间可选,默认从 2024 年 1 月起至最近快照日(对齐样表长窗 2024.01-今);周转率 = 期间有出库的去重天数;实际周转天数 = 期间天数 ÷ 周转率;标准周转天数 = 行业基准(后台表 n73_industry_benchmark 可配置,未覆盖品类默认 90 天);标准周转率 = 期间天数 ÷ 标准周转天数;差异 = 实际 − 标准。
数量/库存金额 = 分析期末快照,期末无库存行照空(禁补 0);库存金额 = 数量 × 本地档案最新成本,成本未知行留空;主计量 = T+ 现存量档案单位(已做单位回填)。
解读:周转天数 = 从进货到卖出平均压货天数,越小越好(卖得快、压钱少);周转率 = 期间卖了几轮库存,越大越好(转得快、库存活)。差异 = 实际 − 标准:差异为负数更好(实际比行业标准周转更快),正数说明慢于行业基准,可重点排查。
金额口径仅 super / boss / finance 可见;本地库存/单价口径与 T+ 存在系统差(T+ 含调拨等本地无源变动),表值与样表可能有偏差,属已知差异。
🚩 超标处置清单(红·需处置) {{ tcOverPeriodLabel }} 处置状态 排序
超标 {{ tcFmtNum(tcOver.summary?.count) }} 项 占压金额:{{ tcOverFmt(tcOver.summary?.amount) }} 待处理 {{ tcFmtNum(tcOver.summary?.todo) }} / 处理中 {{ tcFmtNum(tcOver.summary?.doing) }} / 已清 {{ tcFmtNum(tcOver.summary?.done) }} 判定:实际周转天数 > 标准周转天数 × 1.5(warn_multiplier 后台可改,改后即时重算)→ 红·需处置;清零或回落后自动移出清单
序号 存货编码 存货 品类 现存量 占压金额 实际周转天数 标准周转天数 超标倍数 建议处置方向 处置状态
{{ ((tcOver.page - 1) * 50) + i + 1 }} {{ r.code }} {{ r.name || '—' }} {{ (r.cat1 || '') + (r.cat2 ? ' / ' + r.cat2 : '') || '—' }} {{ tcFmtNum(r.qty) }} {{ r.amount != null ? tcOverFmt(r.amount) : '—' }} {{ r.actual_days != null ? tcOverFmt(r.actual_days) : '—' }} {{ r.std_days != null ? tcFmtNum(r.std_days) : '—' }} {{ r.exceed != null ? tcOverFmt(r.exceed) : '—' }} {{ r.suggest || '—' }}
{{ r.status_by }} {{ (r.status_at || '').slice(0, 16) }}
{{ tcOverBusy ? '加载中...' : '暂无超标 SKU(全部在行业标准内或已清零)' }}
清单判定:实际周转天数 > 标准周转天数 × 超标倍数(warn_multiplier,默认 1.5) = 红·需处置; 标准 < 实际 ≤ 标准 ×1.5 = 黄·关注(不列本清单);实际 ≤ 标准 = 绿·正常。标准周转天数 = 行业基准(后台表 n73_industry_benchmark 可配置)。
处置闭环:每条超标项在「处置状态」下拉点选 待处理 → 处理中 → 已清 回填进度(记录操作人/时间);清零(现存量归零或回落到阈值内)自动移出清单;建议处置方向沿用呆滞清仓口径(折价/员工内购/退厂/冻结采购),系统建议需人工复核。
🧾 欠货待进货(可用量为负,共 {{ tcFmtNum(tcSummary.shortage.length) }} 行) 代表客户已购买但仓库无货可发,需立即进货补货;此类不参与呆滞/断货判断,也不计入呆滞清单
序号 存货编码 品牌 品名+规格型号 一级品类 所在仓库 现存量(件) 可用量(件) 最后一次出库日 近90天出库量 库存金额(元) 建议动作
{{ i + 1 }} {{ r.code }} {{ r.brand }} {{ r.name }} {{ r.spec }} {{ r.cat1 || r.class || '—' }} {{ r.warehouses || '—' }} {{ tcFmtNum(r.existing_qty) }} {{ tcFmtNum(r.available_qty) }} {{ r.last_out_date || '从未出库' }} {{ tcFmtNum(r.out_90d) }} {{ r.cost != null ? tcFmtYuan(r.cost) : '—' }} {{ r.action }}
可用量为负 = 已开单/已售但库存不足(超卖欠货),需按可用量绝对值补货;明细同时保留在导出附《账实异常》表。

✅ 国补待审核

出库单OCR结案 · 无系统单号记录,财务一键复核(待审核 {{ gbrPending.length }} 条)

⏳ 待审核 {{ gbrPending.length }} 条
ID 日期 师傅 客户 手机 地址 品牌 型号 SN 照片 操作
#{{ r.id }} {{ r.deliver_date || '—' }} {{ r.worker_name || '—' }} {{ r.customer_name || '—' }} {{ r.customer_phone || '—' }} {{ r.customer_addr || '—' }} {{ r.product_brand || '—' }} {{ r.product_model || '—' }} {{ r.sn || '—' }}
{{ gbrBusy ? '加载中...' : '暂无待审核记录 🎉' }}
📋 最近已审核(近 7 天 · {{ gbrRecent.length }} 条) {{ gbrShowRecent ? '点击收起' : '点击展开' }}
ID 日期 师傅 客户 手机 地址 品牌 型号 SN 照片 审核时间
#{{ r.id }} {{ r.deliver_date || '—' }} {{ r.worker_name || '—' }} {{ r.customer_name || '—' }} {{ r.customer_phone || '—' }} {{ r.customer_addr || '—' }} {{ r.product_brand || '—' }} {{ r.product_model || '—' }} {{ r.sn || '—' }} {{ r.reviewed_at || '—' }}
近 7 天暂无已审核记录

🎟️ 清洗服务管理

全屋家电基础免费清洗券 · 预约 / 一键建单 / 核销工单驱动

{{ cpMsg }}

② 全部券列表

共 {{ cpListTotal }} 张券(未核销 = 已领取+已预约,均可用)

券号 类型 领用客户 手机 地址 状态 领用时间 核销时间 核销人 工单号
{{ c.coupon_no }} {{ c.coupon_type === 'paid_clean' ? '💰付费' : '免费' }} {{ c.customer_name || '—' }} {{ c.customer_phone }} {{ c.addr_norm || c.addr_raw || '—' }} {{ cpStatusTxt(c.status) }} {{ c.active_at || '—' }} {{ c.used_at || '—' }} {{ c.verify_by || '—' }} {{ c.order_no || '—' }}
第 {{ cpListPage }} / {{ cpListTotalPages }} 页

暂无券记录,请先筛选或刷新

④ 9.9 元购买订单

共 {{ cpOrdersTotal }} 单(支付成功自动发券;发券失败可在下方补发)

订单号 客户 手机 地址 金额 支付状态 发券状态 券号 支付时间 下单时间 操作
{{ o.order_no }} {{ o.customer_name || '—' }} {{ o.customer_phone }} {{ o.addr_norm || o.addr_raw || '—' }} {{ (o.amount / 100).toFixed(2) }} 元 {{ ({ PAID: '✅已支付', PAYING: '⏳支付中', CREATED: '📝已下单', CLOSED: '🚫已关闭' })[o.pay_status] || o.pay_status }} {{ ({ ISSUED: '已发券', FAILED: '发券失败', PENDING: '待发券' })[o.coupon_status] || o.coupon_status }} {{ o.coupon_no || '—' }} {{ o.paid_at || '—' }} {{ o.created_at || '—' }}
第 {{ cpOrdersPage }} / {{ cpOrdersTotalPages }} 页

暂无购买订单

⑤ 清洗预约看板 (用户自助预约的上门时段,含客服手动预约)
{{ cpBkSummary.today_visit || 0 }}
今日待上门
{{ cpBkSummary.pending || 0 }}
待派工
{{ cpBkSummary.dispatched || 0 }}
已派工
{{ cpBkSummary.done || 0 }}
已完成
{{ cpBkSummary.overdue || 0 }}
逾期未上门

共 {{ cpBkTotal }} 条预约(逾期 = 预约时段已过且工单未完成,请尽快催办/派工)

客户 手机 地址 预约上门时段 券号 工单号 工单状态 师傅 建单时间 操作
{{ b.customer_name || '—' }} {{ b.customer_phone || '—' }} {{ b.addr_norm || b.addr_raw || '—' }} {{ b.booked_slot || '—' }} {{ b.coupon_no }} {{ b.order_no || '—' }} {{ b.order_status || '未建单' }} {{ b.technician_name || '—' }} {{ b.order_created_at || b.booked_at || '—' }}
第 {{ cpBkPage }} / {{ cpBkTotalPages }} 页

暂无清洗预约记录

📈 B 类运营看板 (已领未约跟进 / 家电档案与商机 / 漏斗防刷)
{{ ubbSummary.t_new || 0 }}
新领
{{ ubbSummary.t_7d || 0 }}
7天
{{ ubbSummary.t_30d || 0 }}
30天
{{ ubbSummary.t_overdue || 0 }}
逾期
券号 客户 电话 地址 领取时间 未约天数 跟进标记 操作
{{ b.coupon_no }} {{ b.customer_name || '—' }} {{ b.customer_phone }} {{ b.addr_raw || '—' }} {{ (b.active_at || '').slice ? String(b.active_at).slice(0,16) : (b.active_at || '—') }} {{ b.days_ago }}天 done √
{{ b.follow_done_by }}
已派客服 已提醒
第 {{ ubFilter.page }} 页 · 共 {{ ubbSummary.total || 0 }} 条

暂无已领未约券

➕ 手动登记家电

共 {{ applTotal }} 条家电档案

客户 电话 品类 品牌 型号 年份 来源 登记数 激励标记
{{ a.customer_name || '—' }} {{ a.customer_phone }} {{ a.category || '—' }} {{ a.brand || '—' }} {{ a.model || '—' }} {{ a.purchased_year || '—' }} {{ a.source || 'h5' }} {{ a.count }} {{ a.incentive || '—' }}

暂无家电档案

{{ pillarFunnel.claimed || 0 }}
{{ pillarFunnel.booked || 0 }}
{{ pillarFunnel.dispatched || 0 }}
{{ pillarFunnel.verified || 0 }}
自洽: {{ pillarFunnelSelfOk ? '✓ 漏斗自洽' : '✗ 漏斗倒挂' }}
{{ d.label }} {{ d.value }}/{{ d.prev }} {{ d.ok ? '正常' : '⚠️倒挂' }}
🛡️ 防刷三组 (各取最近 50 条)
{{ tab }}({{ acTables[key].length }})
券号 工单 客户 电话 师傅 核销时间 说明
{{ r.coupon_no }} {{ r.order_no }} {{ r.customer_name || '—' }} {{ r.customer_phone }} {{ r.technician_name || '—' }} {{ (r.used_at || '').toString().slice(0,16) }} {{ r.detail }}

🏷️ 品牌品类明细

品牌 × 二级分类 销售毛利 · 仅展示家电白名单类目({{ n15PeriodLabel }})

共 {{ n15BcTotal }} 行 · 排除非家电 {{ n15BcExcluded }} 元 反馈:{{ n15BcLoadMsg }}
# 品牌 销售门店 二级分类 销售额 毛利额 毛利率 销量 单数 均价
{{ (n15BcPage - 1) * 50 + i + 1 }} {{ r.brand }} {{ r.store }} {{ r.category }} {{ fmtMoney(r.sales) }} {{ fmtMoney(r.gross_profit) }} {{ r.margin_rate }}% {{ r.qty }} {{ r.order_count }} {{ fmtMoney(r.avg_price) }}
暂无数据(数据源不可用或该期间无销售)
{{ n15BcPage }} / {{ n15BcTotalPages }}

📦 库存管理

T+ 现存量 · 总库存不含售后材料(售后材料单独统计)· 只读 · 服务器缓存 {{ n15StockTtl }} 秒 · 更新于 {{ n15StockUpdated || '未加载' }}

存货SKU数(不含售后)
📦
{{ n15Stock?.summary?.total_codes || 0 }}
当前筛选:{{ n15StockFiltered.length }} 行
总现存量(不含售后)
📊
{{ num(n15Stock?.summary?.total_existing) }}
库存金额 {{ fmtMoney(n15Stock?.summary?.total_amount) }}
总可用量(不含售后)
✔️
{{ num(n15Stock?.summary?.total_avail) }}
可用金额 {{ fmtMoney(n15Stock?.summary?.total_avail_amount) }}
售后材料库存
🧰
{{ num(n15Stock?.summary?.spare_existing) }}
{{ n15Stock?.summary?.spare_codes || 0 }} 个SKU · 金额 {{ fmtMoney(n15Stock?.summary?.spare_amount) }}
一级分类二级分类存货规格型号单位渠道 现存量可用量
库存加载中…
{{ n15StockError }}
暂无匹配的存货(清空筛选试试)
{{ n15StockPage }} / {{ n15StockTotalPages }}(共 {{ n15StockFiltered.length }} 行)

{{ kbDetail.title }}

🏷️ {{ kbCategoryLabel(kbDetail.category) }} 🏢 {{ kbDetail.brand }} 📅 {{ kbDetail.created_at ? kbDetail.created_at.slice(0,10) : '' }}
{{ kbDetail.content }}

工单详情 · {{ orderDetail?.order_no }}

客户:{{ orderDetail?.customer_name }}
电话:{{ orderDetail?.customer_phone }}
品牌:{{ orderDetail?.product_brand || orderDetail?.brand || '—' }}
紧急程度: 🚨 紧急
状态: {{ orderStatusLabel(orderDetail?.status) }}
{{ orderDetailIsService ? '维修工:' : '安装人员:' }} {{ orderDetail?.outsourcer_name || '外派师傅' }}外派 {{ orderDetail?.technician_name || '未分配' }}
创建时间:{{ (orderDetail?.created_at || '').toString().slice(0,19).replace('T', ' ') }}
派单人:{{ orderDetail.assign_by }}
派单时间:{{ String(orderDetail.assigned_at).slice(0,16).replace('T', ' ') }}
接单时间:{{ String(orderDetail.accept_at).slice(0,16).replace('T', ' ') }}
开工时间:{{ String(orderDetail.start_at).slice(0,16).replace('T', ' ') }}
完工提交:{{ String(orderDetail.submitted_at).slice(0,16).replace('T', ' ') }}
商品明细({{ orderDetail.items.length }} 款 / 共 {{ orderDetail.item_total_qty ?? orderDetail.items.reduce((s, i) => s + (i.quantity || 0), 0) }} 件):
# 品牌 产品 型号 规格 数量
{{ ii + 1 }} {{ it.brand || '—' }} {{ it.product_type || '—' }} {{ it.product_model || '—' }} {{ it.product_spec || '—' }} {{ it.quantity || 1 }}
产品:{{ [orderDetail?.product_type, (orderDetail?.item_summary || orderDetail?.product_model)].filter(Boolean).join(' ') }}
📝 收银判定备注:
{{ orderDetail.judge_memo }}
📋 工单备注
派单备注:{{ orderDetail.dispatch_note }}
师傅备注:{{ orderDetail.worker_note }}
验收备注:{{ orderDetail.accept_remark }}
辅材:{{ orderDetail.accessories }}
故障描述:
{{ orderDetail?.fault_description || orderDetail?.fault_desc || '无' }}
✅ 验收详情
完工提交:{{ (orderDetail.submitted_at||'').toString().slice(0,16).replace('T',' ') }} 维修师傅:{{ orderDetail.repair.technician_name }}
{{ f.k }} {{ f.v || '—' }}
上门打卡照:
验收照片({{ orderAcceptPhotos(orderDetail).length }} 张,点击查看大图):
客户地址:
{{ orderDetail?.address }}
🤝 外派信息
外包师傅:{{ orderDetail?.outsourcer_name || '—' }}({{ orderDetail?.outsourcer_phone || '—' }})
外派原因:{{ orderDetail?.outsource_reason || '—' }}
派发时间:{{ (orderDetail?.outsource_at || '').toString().slice(0,19).replace('T',' ') || '—' }}
完工确认:{{ orderDetail?.outsource_done_by || '—' }} @ {{ orderDetail?.outsource_done_at.toString().slice(0,19).replace('T',' ') }}
报修来源:{{ orderDetail.source_channel }}(电话已核实)
📌 每日跟进
+ 填写今日跟进
{{ fu.followup_date }} ({{ fu.followup_by || '售后' }})
{{ fu.progress }}
明日计划:{{ fu.next_plan }}
{{ orderDetail?.status==='outsourcing' ? '暂无跟进记录——外派中单需每天跟进一次,进度如实填写,断档将触发预警。' : '暂无跟进记录' }}
状态流转:
{{ tl.action }}
{{ tl.time }}
操作日志:
{{ log.time }} — {{ log.content }}
✏️ 修改记录({{ orderDetail.edit_logs.length }} 条)
{{ el.field_label || el.field_name }} {{ el.old_value || '空' }} {{ el.new_value || '空' }}
{{ el.operator || '—' }} @ {{ (el.created_at || '').toString().slice(0,16).replace('T',' ') }}
📞 售后回访({{ orderVisits.length }} 条)
{{ v.visit_result || '—' }} 方式:{{ v.visit_method || '—' }} {{ v.visit_by || '—' }} @ {{ (v.visit_at || '').slice(0,16).replace('T',' ') }}
{{ v.visit_comment }}
暂无回访记录——验收审核通过后,售后需电话/上门回访客户满意度。
📞 维修回访(客户满意度)
客户评分: ({{ orderDetail.customer_rating }} 星)
客户反馈:{{ orderDetail.customer_feedback }}
回访方式:{{ serviceVisitSourceLabel(orderDetail.feedback_source) }} | {{ (orderDetail.feedback_at||'').toString().slice(0,16).replace('T',' ') }}
暂无回访记录——验收通过时可一并记录回访,或点列表「📞 回访」补录。
🏦 收款码(客户扫码付款)
收款码