业务大盘
线索漏斗(10 态)
{{ viewTitle }}
| 推广员点位 | 阶段 | 负责咨询 | 期次 / 本期课时 | 负责人 / 交接 | 家长微信 | 扫码次数 | 扫码时间 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ l.partnerName }} | {{ stageText[l.stage] || l.stage }} |
{{ l.consultName }}
公共池
|
{{ l.termNo || 1 }} 期 · {{ l.termLessonCount || 0 }}/{{ l.lessonTotal || 0 }} 次 | {{ l.studentOwnerName || '学管' }} 学管 待学管接手 {{ l.studentOwnerName || l.consultName || '—' }} 咨询期 | {{ l.parentWechat }} 未登记 | {{ l.scanCount }} | {{ fmtTime(l.createdAt) }} | |
| 暂无线索 |
账号管理
待审批申请({{ pendingUsers.length }})
| 姓名 | 站内ID | 手机号 | 申请角色 | 店铺名 | 归属业务员 | 申请时间 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ u.name }} | {{ u.userNo || '—' }} |
{{ u.phone }} | {{ roleName(u.applyRole || u.role) }} | {{ u.partnerName || '—' }} | {{ staffName(u.staffId) }} 未归属 | {{ fmtTime(u.appliedAt || u.createdAt) }} |
实名与提现资格({{ kycList.length }})
实名只决定「钱能不能打走」:没实名的推广员照样能推广、能看收益。核对「姓名 + 身份证后 4 位 + 手机号」一致再通过;手机号与登录号不一致的标黄,建议电话核验一次;有疑问先驳回,别先放款。
| 姓名 | 站内ID | 实名姓名 | 身份证 | 收款手机 | 微信号 | 住址 | 状态 | 提交时间 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ k.name }}重提自动 | {{ k.userNo || '—' }} |
{{ k.realName }} | {{ k.idCardMasked }} |
{{ k.payeePhone }} 与登录号不一致 | {{ k.wechat }} | {{ k.address }} | 已实名 待审 未过 | {{ fmtTime(k.submittedAt) }} |
暂无记录。
| 姓名 | 站内ID | 角色 | 手机号 | 状态 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|
| {{ u.name }} | {{ u.userNo || '—' }} |
{{ roleName(u.role) }} | {{ u.phone }} | {{ u.status === 'active' ? '正常' : (u.status === 'dismissed' ? '业务关系已解除' : '已停用') }} 免审 免审失败 | {{ fmtTime(u.createdAt) }} |
通过申请:{{ approveForm.name }}
申请角色:{{ roleName(approveForm.applyRole) }} | 手机号:{{ approveForm.phone }}
新增账号
角色管理
一个账号只有一个角色,角色决定「能看什么、能写什么」。改角色必须填原因,系统写操作日志并留角色变更史,可追溯。改完对方重新登录小程序或刷新后台即生效。
| 姓名 | 站内ID | 角色 | 手机号 | 状态 | 最近改派 | 操作 |
|---|---|---|---|---|---|---|
| {{ u.name }} | {{ u.userNo || '—' }} |
{{ roleName(u.role) }} | {{ u.phone }} | {{ u.status === 'active' ? '正常' : (u.status === 'dismissed' ? '已解除' : '已停用') }} | {{ u.roleChangedAt ? fmtTime(u.roleChangedAt) : '—' }} | 本人 |
| 该角色下暂无成员 | ||||||
权限矩阵(代码实际校验口径,改动须改云函数)
| 能力 | {{ r.name }} |
|---|---|
| {{ p.name }} | {{ p.allow.indexOf(r.code) >= 0 ? '✓' : '—' }} |
记课时只有教学侧(业务管理/课程管理/主讲教师/学管)能写;业务员和推广员无权记课,这是防刷单的核心闸门。提现只有推广员能申请、只有业务管理能打款。
改角色:{{ roleForm.name }}
当前角色:{{ roleName(roleForm.from) }} | 手机号:{{ roleForm.phone }}
影响提示:改角色不会动历史佣金与提现记录(只影响之后的权限);改成推广员后未绑点位按只读处理,建议当场绑定。离开推广员岗位的,已产生的佣金仍按原规则解锁、结算。
点位管理
固定点位 = 长期合作的线下渠道(自习室、书店、文具店、超市、托管等)。每个点位一张专属渠道二维码,扫码线索永久归属该点位。新点位建好后,到「账号管理」审批一个推广员账号并绑定这个点位,即可开工。
| 点位名称 | 类型 | 归属推广员 | 合作模式 | 状态 | 二维码 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ p.name }} | {{ p.channelType }} | {{ ownerName(p.ownerId) }} | {{ p.mode === 'follow' ? '可跟进' : '只读' }} | {{ p.status === 'active' ? '合作中' : '已停用' }} | {{ p.qrValid ? '有效' : '已失效' }} | {{ fmtTime(p.createdAt) }} | |
| 暂无点位,点右上「新增点位」创建第一个 | |||||||
新增固定点位
创建后系统立即为该点位生成专属渠道二维码(scene=点位ID_推广员ID),扫码进来的线索永久归属该点位,不受后续移交影响。
业务员绩效
业务员是公司员工:拿「底薪 + 五险 + 小额绩效」,绩效只是激励、不是分成。绩效 = 当月团队成单量 × 阶梯单价,月末随工资发放,不进提现体系。
绩效明细({{ staffPerf.month }})
| 业务员 | 手机号 | 业务员代码 | 推广员 | 线索 | 累计成单 | 本月成单 | 单价 | 本月绩效 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ s.name }} | {{ s.phone }} | {{ s.staffCode || '—' }} |
{{ s.teamSize }} | {{ s.leadTotal }} | {{ s.enrolledTotal }} | {{ s.monthEnrolled }} | {{ s.unitPrice ? s.unitPrice + ' 元/单' : '—' }} | ¥{{ s.perfAmount }} | {{ s.status === 'active' ? '在职' : '已解除' }} | |
| 还没有业务员,先在下方生成代码发给新同事 | ||||||||||
{{ s.name }} 旗下推广员({{ s.teamSize }} 人 · 线索 {{ s.leadTotal }} · 累计成单 {{ s.enrolledTotal }})
| 推广员 | 手机号 | 渠道 | 状态 | 扫码线索 | 累计成单 | 转化率 | 本月成单 | 本月成交额 |
|---|---|---|---|---|---|---|---|---|
| {{ t.name }} | {{ t.phone || '—' }} | {{ t.channelType || '—' }} | {{ t.status === 'active' ? '在职' : (t.status === 'pending' ? '待培训' : '已停用') }} | {{ t.leadCount }} | {{ t.enrolledCount }} | {{ Math.round(t.enrolledCount / t.leadCount * 100) }}% 还没人扫码 | {{ t.monthEnrolled }} | {{ t.monthAmount ? '¥' + t.monthAmount : '—' }} |
还没有推广员。把他的业务员代码发给新同事,或在工作台直接建号。
解除业务关系:{{ dismissForm.name }}
解除后:该账号小程序登录与工作台立即失效、PC 后台登录失效、入职代码作废;历史线索与成单记录全部保留,不做删除。
{{ dismissForm.teamSize }} 个推广员将按上面选择处理;不选接手人则归属清空,后续在账号管理里重新指定。
业务员代码(入职凭证)
生成后发给新业务员,他在小程序「业务员入职」里填码即可直接开通,一个代码只能用一次。
| 代码 | 状态 | 使用者 | 手机号 | 生成时间 |
|---|---|---|---|---|
{{ c.code }} |
{{ c.status === 'used' ? '已使用' : (c.status === 'revoked' ? '已作废(业务关系解除)' : '未使用') }} | {{ c.userName || '—' }} | {{ c.userPhone || '—' }} | {{ fmtTime(c.createdAt) }} |
| 还没有生成过业务员代码 | ||||
定向通知 · 派工与触达回执
小程序订阅消息是一次性的,推广员不主动打开就收不到推送。真正让人知道任务的办法是业务员打电话——所以这里发出去的不是「公告」,是「派工单」:每条都要求业务员逐人回执,总部才看得见任务到底有没有落地。
新建派工
派出去之后,业务员在小程序「我的推广员 → 待回执」里逐个标记:接通答应 / 未接通 / 拒接 / 不做 / 需培训。最后一个会自动变成一条培训待办。
派工批次与覆盖率
| 批次 | 类型 | 标题 | 发送人 | 时间 | 目标 | 已回执 | 接通 | 覆盖率 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
{{ g.dispatchId }} |
{{ g.kindText }} | {{ g.title || '—' }} | {{ g.fromName }} | {{ g.timeText }} | {{ g.target }} | {{ g.ackCount }} | {{ g.reached }} | {{ g.covText }} | |
| 还没有派工记录 | |||||||||
覆盖率 = 已接通并答应做 ÷ 应触达。低于 80% 的任务等于没落地——这时候该追的是业务员,不是推广员。
派工明细 · {{ dispatchDetail.data ? (dispatchDetail.data.title || dispatchDetail.data.dispatchId) : '' }}
{{ dispatchDetail.data.content }}
| 推广员 | 手机号 | 是否已看 | 电话回执 | 备注 |
|---|---|---|---|---|
| {{ m.promoterName }} | {{ m.phone || '—' }} | {{ m.isRead ? '已看' : '没看' }} | {{ m.ackText }} | {{ m.ackNote || '—' }} |
资产移交
移交仅业务管理可操作;originalBizId(引流口径)永不变更,只改 currentBizId。操作全程留痕。
课程库
| 课程名 | 年级 | 模块 | 价格(元) | 总课时 | 容量 |
|---|---|---|---|---|---|
| {{ c.name }} | {{ c.grade }} | {{ c.module }} | ¥{{ c.price }} | {{ c.totalLessons || 17 }} | {{ c.capacity }} |
| 暂无课程 | |||||
新增课程
试听排期
| 线索 | 课程 | 试听时间 | 状态 | 反馈 | 操作 |
|---|---|---|---|---|---|
| {{ t.leadLabel }} | {{ t.courseName }} | {{ fmtTime(t.sessionTime) }} | {{ trialStatus[t.status] || t.status }} | {{ t.feedback || '—' }} | |
| 暂无试听排期 | |||||
系统配置
每行一项;修改后保存至 config/global,所有端即时生效。
填了以后家长扫码落地页会出现「复制课程链接」入口;留空 = 不显示。家长在小鹅通付款后,仍需咨询师在小程序登记报名+实收金额,备注填小鹅通订单号。
推广员工作台最顶部滚动轮播。适合发:冲刺节点提醒、活动截止时间、结算日提醒。全部删空 = 不显示公告栏。发布前自己读一遍,公告对全部推广员可见。
只对「有邀请码」的申请生效。没有邀请码的自助申请一律进待审批 + 待认领池,不会被自动开通。
佣金 = min(每节单价 × 报名节数, 封顶)。当前口径(24 元/节,封顶 240):10 节 = 240 元、8 节 = 192、5 节 = 120、3 节 = 72。不看实收金额——首期 10 节优惠价 100 元/节、续费 80 元/节,实收会随政策变,按节数算规则一句话能讲清。
基数是「下线该单的直推佣金」,不是学费。3000 元单:前 5 单 96 元、第 6 单起 60 元。用佣金做基数,结构上不会出现上线比下线拿得多(旧口径按学费 2%,12000 元单会变成 240 元,与下线一样多)。招募奖只给下线首单,注册不发。
当前 3%。3000 元单:推广员 240 + 咨询 90 = 330(11%);再加管理奖 60 是 13%。业务员不按比例提成,走工资绩效(30/40/50 元/单),不在此处。
加成叠加在该单直推佣金上(不是替换),随该单走同一套冷静期 + 课时闸门,不单独发奖、不单独设解锁。当前:第 5 单 240+120=360、第 10 单 240+240=480、第 15 单起每单 240+40=280。多个节点同时命中取最高加成。
闸门只用于防作弊(防虚假报课、防自己记课时刷解锁),不承担防退费职能——退费走「课时闸门」表里的退费冲减。实际门槛 = min(上满次数, 该线索课包总课时):4 次包上满 4 次、17 次包上满 5 次,课包小于门槛时按课包算,不会出现永远解锁不了。
注意:改门槛只对之后新产生的佣金生效。已记在台账上的佣金按生成时快照的 unlockNeed 判定,不会被追溯;调整后已有的锁定记录,等下一次记课时才会按新口径重新判定,必要时用「手动解锁」兜底。
对标美团众包:起提额、单笔上限、每日/每月次数、到账时效都要公示。冷静期 21 天覆盖 3 个上课周期(每周 1 节),配合课时闸门,避免「缴了费上了 1 次就退」还被拿走 240。改这里要同步改小程序规则弹窗与公示文案。
withhold(推荐):按税务总局 2026 年配套公告的累计预扣法,扣 20% 费用 + 每月 5000 元减除,月佣金 6250 元以下不产生预扣个税,我们 95% 的推广员都在这一档 → 实际到手 = 税前。发票闸门自动失效(想开票仍可上传备查)。
invoice:推广员自行代开经营所得发票,公司凭票全额支付,不再代扣税费。
both:既扣又票,同一笔所得收两次——只保留兼容,后台看到有人选它要立刻纠正。
口径:余额按税前扣、打款按税后打。综合费率适合走灵活用工平台代发(平台按经营所得核定,通常 1%~2%);「代开票+劳务预扣」是自然人代开走劳务报酬的真实税负,金额大时到手会明显变少,慎用。
示例:税前 2760 元、综合 2.5%、手续费 0.6% → 到手 2760 − 69 − 16.56 = 2674.44 元。
勾选后:可用开票额度不足时,推广员连提现申请都发不出去;后台「标记已打款」也会被拦住。一张票可覆盖多次提现,按开票日期先开先用核销,驳回提现时自动退回额度。
推广员是灵活用工人员而不是公司员工,公司支付推广服务费必须凭票列支;没有票就打款,既过不了账也过不了税。业务员给推广员做培训时要当面演示一次开票流程。
按当月团队成单量命中最高一档,整月按该档单价算,0 单不产生绩效。业务员是公司员工,不参与按比例分成,这笔钱随工资发、不进提现体系。
建议:实名是「取钱闸门」不是「使用门槛」。先保持自动通过;真出冒领再收紧成全部人工审核。
操作日志(append-only,不可改删)
| 时间 | 操作人 | 动作 | 明细 |
|---|---|---|---|
| {{ fmtTime(g.createdAt) }} | {{ g.operatorName }} | {{ g.action }} | {{ JSON.stringify(g.detail) }} |
| 暂无日志 | |||
提现管理
余额口径:已结算净额 − 待解锁 −(申请中 + 已打款)。佣金要过两道闸门:① 报名满冷静期转「已结算」;② 学员把课包上完(最多 5 次)解锁。驳回后余额自动释放。每月 5 日定时任务会自动结算上月;此按钮用于手动补跑。
扣款 / 冲减台账(已认定合计 {{ dedTotal }} 元)
公告里写「恶意刷单一经证实冲减全部佣金」,这里就是它的账。建单后 7 日内可申诉,认定后从可提现余额里先扣,撤销则不影响余额。 扣款类型:退费冲减(家长退费按比例扣回)、虚假线索(空号/同行/自己人)、恶意刷单、物料损失、其他。
| 时间 | 推广员 | 类型 | 金额 | 原因 | 申诉 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ x.timeText }} | {{ x.userName || x.userId }} | {{ x.kindText }} | -{{ x.amountText }} | {{ x.reason }} | {{ x.appealReason }} 剩 {{ x.appealLeftDays }} 天 — | {{ x.statusText }} | 已撤销 |
| 暂无扣款记录 | |||||||
发票台账(待核对 {{ invPending }} 张)
推广员属灵活用工人员,须就「推广服务费」给公司开票,公司凭票入账。核验通过后才计入可用额度,提现时按开票日期先开先用核销;缺票的提现单不能标记打款。核对要点:购买方名称与税号是否为本公司、金额是否够覆盖、票面是否清晰、发票号码是否重复。
| 提交时间 | 推广员 | 发票号码 | 开票日期 | 类型 | 价税合计 | 已核销 / 剩余 | 状态 | 票面 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ fmtTime(i.submittedAt) }} |
{{ i.userName || i.userId }}
{{ i.userNo || '—' }} {{ i.userPhone || '' }} |
{{ i.invoiceNo }} | {{ i.invoiceDate }} | {{ i.invoiceType }} | {{ Number(i.amount || 0).toFixed(2) }} | {{ Number(i.usedAmount || 0).toFixed(2) }} / {{ Number(i.leftAmount || 0).toFixed(2) }} |
{{ i.statusText }}
{{ i.rejectReason }}
|
票面{{ idx + 1 }} — | 已入额度 |
| 当前筛选下没有发票 | |||||||||
| 申请时间 | 推广员 | 收款人(快照) | 税前(元) | 代扣税费 | 手续费 | 应打款(税后) | 发票 | 时效 | 状态 | 打款时间 | 流水号 | 备注 | 操作 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ w.appliedText }} | {{ w.userName || w.userId }} |
{{ w.payeeText }}
微信 {{ w.payeeWechat }}
|
{{ w.grossText }} | -{{ w.taxText }} | — | -{{ w.feeText }} | — | {{ w.netText }} |
{{ w.invoiceText }}
NO.{{ w.invoiceNo }}
|
{{ w.waitText }} · 超 T+{{ w.slaDays }} 按时 {{ w.waitText }} | {{ w.statusText }} | {{ w.paidText }} | {{ w.payRef || '—' }} | {{ w.failReason || '—' }} | 已完成 |
| 暂无提现申请 | |||||||||||||||
课时闸门 · 待解锁佣金(合计 {{ lessonLockedTotal }} 元)
解锁=第 6 期「结课期」:学员把课包上完(门槛 = min(5, 总课时),4 次包满 4 次、17 次包满 5 次)且 课程金已覆盖该笔佣金。第 5 期(覆盖)只说明账已收回,仍不可提。此闸门目的是防刷单作弊,不是防退费——退费单独走「退费冲减」按实收比例扣。老学员课时未入库、线下已上完课等可手动解锁,必须写原因,全程写操作日志与线索时间线。
| 家长微信 | 佣金(元) | 笔数 | 当前期次 | 已上课时 | 课程金覆盖 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ g.leadLabel }} | {{ g.amountText }} | {{ g.count }} | {{ g.phaseText }} | {{ g.progressText }} | {{ g.coverText }} | {{ g.remain > 0 ? '还差 ' + g.remain + ' 次' : '已达标待解锁' }} | |
| 没有待解锁佣金 | |||||||