5
8
🏪 南山旗舰店 · 数据看板
忠济堂中医连锁 · 深圳片区旗舰门店
快捷操作
客户登记
快速开单
新建预约
回访任务
卡项推荐
收银收款
库存盘点
前台全流程
待办事项
加载待办...
今日KPI
营收
-
订单
-
客流
-
转化
-
今日预约时间槽
加载预约...
今日客户列表 查看全部
到店时间姓名项目技师状态金额
加载...
排队叫号
加载中...
在岗技师
加载...
📅 预约看板 V2.6 日历重构
日历时间槽 · 在岗技师 · 排队 · 排班管理
2026年6月11日 周四
视图:
时间槽 · 2026-06-11
08:00
09:00
王芳 · 宫廷理筋术 · 张明华
09:30
李明 · AI体质辨识 · 李秀英
10:00
陈小红 · 三伏灸 · 王志刚 服务中
10:30
赵建国 · 古法艾灸 · 陈美玲 服务中
11:00
刘丽珍 · 少儿推拿 · 赵大力 待开始
11:15
周海涛 · 中药足浴 · 待分配
12:00⋯ 午休
13:00
吴美娟 · 肩颈疏通 · 张明华 已预约
14:00
孙丽 · 温阳艾灸 · 李秀英 已预约
15:00
16:00
17:00
在岗技师 · 今日排班
张明华
主任技师 · 已完成2单
在岗
李秀英
高级技师 · 已完成1单
在岗
王志刚
技师 · 服务中(10:00-11:30)
服务中
赵大力
技师 · 待开始(11:00)
待岗
陈美玲
高级技师 · 服务中(10:30-12:00)
服务中
刘小芳
学徒 · 今日休息
休息
8
今日预约
2
服务中
6
空闲时段
💳 收银管理
快速开单 · 挂单 · 退单 · 聚合支付 · 团购核销
今日订单
单号客户项目金额支付方式状态
POS20260513001王芳宫廷理筋术¥398微信支付已支付
POS20260513002李明AI体质辨识¥198支付宝已支付
POS20260513003陈小红三伏灸调理¥588会员卡待支付
POS20260513004赵建国古法艾灸¥328美团券团购券
POS20260513005现金散客中药足浴¥188现金已支付
POS20260513006刘丽珍少儿推拿¥268挂单
¥6,280
微信
¥3,180
支付宝
¥2,680
会员卡
¥880
团购券
团购核销
今日已核销:8张美团·3张抖音
📦 库存管理
入库 · 盘点 · 预警 · 调拨
库存总值
¥28,360
SKU总数
126
低库存预警
4
上月损耗率
2.3%
商品名称分类库存量安全库存单位状态操作
陈年艾条·三年陈艾灸耗材1250低库存
温阳散寒膏方中药产品530紧急
当归补血汤料中药汤包320低库存
医用艾灸盒器具2840偏低
宫廷理筋精油耗材8660充足
一次性床单清洁耗材320200充足
👥 员工管理
考勤 · 绩效 · 排班 · 提成
员工列表
姓名职位今日考勤本月业绩提成状态
张明华主任技师已签到¥18,600¥5,580在岗
李秀英高级技师已签到¥14,200¥4,260在岗
王志刚技师已签到¥10,800¥3,240服务中
陈美玲高级技师已签到¥9,600¥2,880服务中
赵大方技师缺勤¥0¥0请假
本月绩效排行
排名姓名业绩订单量好评率评分
🥇张明华¥18,6006898%96
🥈李秀英¥14,2005295%91
🥉王志刚¥10,8004392%87
4陈美玲¥9,6003896%85
5赵大方¥6,2002590%78
🔄 前台V2 · 7步全流程
登记 → 体质辨识 → 服务 → 加钟 → 结算 → 好评引导 → 回访转化 → 裂变
当前流程
登记
辨体
3
服务中
4
加钟
5
结算
6
好评
7
回访
8
裂变
客户:陈小红
项目:三伏灸调理 · 技师:王志刚
开始时间:10:00 · 预计结束:11:30
今日流程统计
38
已完成客户
6
服务中
92%
好评率
8
转介绍数
裂变进展
陈小红完成三伏灸 → AI生成好评分享卡 → 分享至朋友圈 → 转化新客预计3人
🎯 卡项推荐引擎
7级卡项体系 · AI推荐 · 转化率跟踪
引流卡
¥88
体验1次
深度体验卡
¥198
体验2次+报告
锁客卡·黄金版
¥1,880
12次+检测2次
升单卡
¥3,680
36次+全部检测
合伙人
¥29,800
区域合伙人权益
今日推荐转化
客户推荐卡项AI评分状态
王芳锁客黄金版 ¥1,88078%已推荐
李明引流体验卡 ¥8865%已购买
赵建国升单卡 ¥3,68082%谈判中
陈小红深度体验卡 ¥19858%待推荐
SOP漏斗
126
客户到店
82
卡项触达 65%
38
意向客户 46%
16
成交 42%
3
转介绍 19%
💝 客情维护 V2.6 唤醒流水线
回访 · 唤醒 · 生日 · 升降级
待回访
12
沉睡客户
8
本月生日
6
待升降级
3
回访计划
李明 · 新客回访 24h黄金期
AI体质辨识后 · 推荐引流卡
刘丽珍 · 沉睡唤醒 30天未到店
发送优惠券+健康资讯
赵建国 · 生日祝福 5月20日
VIP专属生日折扣 + 节气礼包
陈小红 · 服务后回访 已完成
三伏灸体验后 · 好评+复购
升降级动态
王芳
Lv2→Lv3 · 累计消费达标
已升级
赵美琴
Lv2→Lv1 · 30天未到店
待降级
周明
Lv1→Lv2 · 消费积分达标
待升级
💬 咨询中心
实时会话 · 话术库 · 分配规则 · KPI · 分析
实时会话
会话列表
王芳 微信
好的,我明白了,谢谢
李明 美团
请问三伏灸多少钱?
赵建国 抖音
在吗?想预约周六
王芳
微信 · 已读
您好,请问我的宫廷理筋术体验怎么样?
非常好!张师傅手法很专业,肩颈舒服多了
10:28
好的,我明白了,谢谢!下次还来找张师傅
10:30
不客气!您已经是会员了,下次可以直接预约张主任哦 😊
10:31
快捷话术
您好,请问有什么可以帮您?三伏灸现在预约有优惠推荐您体验AI体质辨识会员卡充值送积分感谢您的好评!下次可以提前预约哦
咨询KPI
38
今日会话
6
排队中
94%
响应率
智能分配规则
根据客户标签、来源渠道、客服忙闲自动分配
新客→值班客服VIP→高级客服投诉→店长直通
📢 营销中心
公域(美团/抖音/小红书) · 私域(企微) · 分销
🟡
美团
本月曝光:12.8w · 订单:86
🎵
抖音
本月曝光:28.6w · 订单:52
📕
小红书
本月曝光:8.2w · 互动:2,860
公域渠道对比
渠道曝光点击转化ROI
美团12.8w3,86086单1:8.2
抖音28.6w5,42052单1:6.8
小红书8.2w1,28028单1:5.2
私域 & 分销
48
企微好友
12
客户群
分销商8人活跃
本月分销订单:28单 · 分销佣金:¥2,860
📈 数据报告
门店经营报表 · 趋势分析
营收日报
5/18.2k
5/37.6k
5/59.8k
5/711.2k
5/98.8k
5/1112.9k
今日12.9k
核心指标趋势
↑18.2%
营收月环比
↑33.3%
客流月环比
↑3.2%
转化月环比
↑5.5%
客单月环比
🗺️ 深圳片区管理中心
管辖8家门店 · 今日运营概况
片区总营收
¥192.8w
18.2%
总客流量
4,286
12.5%
平均转化率
39.6%
目标42%
平均客单价
¥286
6.8%
多店营收对比 & KPI雷达
排名门店营收客流客单价转化率综合评分趋势
🥇南山旗舰店¥58.6w982¥31242.8%96↑23%
🥈福田店¥41.2w728¥28640.2%88↑15%
🥉宝安中心店¥35.8w656¥26838.6%82↑9%
4龙华店¥28.3w562¥24535.2%75↑31%
5罗湖店¥22.7w448¥22833.8%68↓3%
6龙岗店¥18.6w386¥21832.5%62↑6%
7盐田店¥12.8w286¥20830.2%55↓2%
8坪山店¥8.6w186¥19628.6%48↑12%
📊 多店对比分析
营收/客流/转化/评分 5维排行 · 雷达图
营收排行 TOP5
🥇 南山旗舰店¥58.6w
🥈 福田店¥41.2w
🥉 宝安中心店¥35.8w
4. 龙华店¥28.3w
5. 罗湖店¥22.7w
转化率排行
南山旗舰店42.8%
福田店40.2%
宝安中心店38.6%
龙华店35.2%
罗湖店33.8%
客单价排名
南山¥312
福田¥286
宝安¥268
龙华¥245
罗湖¥228
龙岗¥218
盐田¥208
坪山¥196
📍 门店地图
深圳片区8家门店实时状态
门店分布 · 气泡图
🗺️
深圳片区 · 8家门店
南山 · 福田 · 宝安 · 龙华 · 罗湖 · 龙岗 · 盐田 · 坪山
营收正常 需关注 预警
🔍 巡店督导
巡店任务 · 巡检记录 · 神秘顾客
巡店任务列表
门店任务类型责任人截止日期状态
龙华店🔍 督导巡店赵经理2026-05-15进行中
罗湖店🕵️ 神秘顾客外部人员2026-05-16待分配
南山旗舰店📋 SOP检查质检组2026-05-14已完成
宝安中心店🧾 财务审计财务部2026-05-20待开始
盐田店🔍 综合巡检王总监2026-05-18待开始
评分分布
南山旗舰店 4.8
福田店 4.5
宝安中心店 4.0
龙华店 3.5
罗湖店 3.0
🤝 资源调配
技师/设备跨店调配
资源类型数量状态
技师-王志刚人力南山旗舰店福田店1人已到岗
艾条-三年陈物资龙岗仓库龙华店50盒运输中
理疗床设备罗湖店宝安中心店2台待审批
艾灸盒物资南山旗舰店坪山店10个已完成
📈 片区数据分析
趋势 · 对比 · 雷达图 · 决策支持
片区营收趋势(近6月)
各店营收占比
片区增长态势
+31.2%
龙华店增长最快
-2.8%
罗湖店下降
+18.2%
片区平均增长
💬 咨询中心(片区级)
跨店会话监控 · 客服KPI
各店今日会话量
门店会话已回复排队响应率
南山旗舰店3836295%
福田店2624292%
宝安中心店1817194%
龙华店1210283%
全区客服KPI
92
总会话
91%
平均响应
🏢 总控台 V2.6 重构
快捷操作 · 业绩 · 营销 · 预警 · 全国实时数据
快捷操作
经营概览
营销中心
供应链
门店管理
财务分析
预警中心
业绩概览
本月营收
-
总门店
-
月活会员
-
总订单
-
片区门店数营收客单价转化率
加载片区数据...
营销看板
本月曝光
-
引流订单
-
渠道ROI
-
新客占比
-
🟡
美团
-
🎵
抖音
-
📕
小红书
-
风险预警 0 条
加载预警数据...
全国营收趋势
门店健康度
-
健康门店
-
需关注
-
预警门店
📊 三级数据看板
总部 → 片区 → 门店 下钻
片区总览(本月)
片区门店数营收目标完成转化率客单价趋势
🏢 深圳片区8¥328.5w96.2%39.6%¥286↑18%
🏢 广州片区6¥245.8w92.8%41.2%¥298↑12%
🏢 上海片区5¥218.6w88.5%38.8%¥312→2%
🏢 北京片区4¥186.2w85.6%36.5%¥276↓5%
🏢 成都片区3¥128.6w90.2%38.2%¥265↑22%
🏢 杭州片区3¥112.8w86.5%37.8%¥258↑15%
下钻:深圳片区 · 门店
门店营收客流转化客单价状态
南山旗舰店¥58.6w98242.8%¥312
福田店¥41.2w72840.2%¥286
宝安中心店¥35.8w65638.6%¥268
龙华店¥28.3w56235.2%¥245
罗湖店¥22.7w44833.8%¥228
🤝 加盟管理
招商 · 生命周期 · 投资人管理
意向加盟
12
洽谈中
6
已签约
3
在建门店
2
累计加盟费
¥128w
招商漏斗
38
本月咨询
12
意向确认 32%
6
实地洽谈 50%
3
签约完成 50%
2
门店开工 67%
投资人/加盟商
姓名城市阶段跟进人操作
张先生杭州意向确认招商部跟进
李女士成都实地考察王经理跟进
王总武汉签约完成赵总监详情
陈总长沙合同审核招商部跟进
刘总南京资金筹备李总监跟进
📋 SOP执行管控
8条核心SOP • 执行率 • 培训 • 督导
8条核心SOP执行率
义诊SOP82%
美团结转SOP68%
好评转化SOP58%
复购转介绍SOP72%
7级卡项推荐SOP78%
开业爆店SOP90%
回访转化SOP65%
顾客满意SOP85%
培训 + 督导
SOP培训完成督导评分预警
义诊SOP75%88正常
美团结转SOP62%72关注
好评转化SOP55%65预警
复购转介绍SOP70%80正常
7级卡项SOP82%85正常
🛒 商城管理
GMV · 订单 · 积分 · 分销
本月GMV
¥38.6w
12.8%
总订单
286
积分兑换
124
分销下单
68
热销商品 TOP5
1. 三伏灸套餐售86份
2. 宫廷理筋次卡售52份
3. 艾草养生枕售38个
4. AI体质辨识+方案售35份
5. 温阳散寒足浴包售28份
近30天订单趋势
4/13
4/20
4/27
5/4
5/11
今日
👥 10位总监数字化工作台
各总监KPI完成率 · 待办事项
📊
运营总监
陈运营
86%
完成率
💰
财务总监
李财务
92%
完成率
📢
营销总监
王营销
78%
完成率
🤝
加盟总监
赵加盟
65%
完成率
🏪
门店总监
张门店
82%
完成率
🧠
AI技术总监
刘AI
95%
完成率
📦
供应链总监
周供应
88%
完成率
👥
人力总监
吴人力
72%
完成率
🛡️
法务风控
钱法务
90%
完成率
💻
技术总监
孙技术
76%
完成率
总监待办汇总
总监待办事项优先级截止
运营总监审核6月营销计划2026-05-15
加盟总监跟进成都李女士签约2026-05-18
人力总监完成技师评级方案2026-05-20
供应链总监艾条采购招标2026-05-25
⚙️ 自动化运营中心
规则 · 触发 · 执行 · 分析
16
活跃规则
2,486
本月触发
92%
自动执行率
新客7天回访
客户注册≥7天未到店 · 自动分配回访任务
86次
本月执行
沉睡客户唤醒
30天未到店 · AI发送优惠券+推文
320次
本月执行
好评自动引导
服务完成30分钟 · AI生成好评弹窗
1,280次
本月执行
库存低量预警
库存<20% · 通知采购+店长
28次
本月执行
生日自动祝福
客户生日当天自动发送祝福+优惠券
12次
本月执行
✍️ 内容发布引擎
小红书 · 抖音 · 公众号 一键发布
36
本月发布
56.2w
总曝光
8.3%
平均互动率
标题平台曝光互动状态
三伏天养生指南:这些人群最适合艾灸📕小红书12.8w2,860已发布
AI中医体质辨识是什么体验?🎵抖音28.6w5,420已发布
忠济堂2026加盟政策发布会📱公众号8.2w1,280审核中
开业爆店案例:南山旗舰店月流水60w📕小红书草稿
五分钟看懂中医体质分型🎵抖音6.8w1,860已发布
🧠 AI工具集 V2.6 新增
舌诊审核 · 体质分析 · AI智能管理 · AI报告
8
待审核
42
今日已审
96.5%
AI准确率
时间患者舌象图片AI诊断置信度状态操作
暂无待审核舌诊记录
🧠 AI经营报告
日报 · 月报 · 预警 · 决策建议
今日AI经营报告 · 2026-05-13
📊 经营概览
今日营收¥12,860,完成目标85.7%,较昨日增长18.2%。客流量48人,较昨日增33.3%。转化率42.8%改善明显,但距目标50%尚有差距。客单价¥268,行业领先。
⚠️ 预警提醒
1. 库存:陈年艾条(余12盒)需立即补货 · 2. 罗湖店转化率33.8%低于片区平均 · 3. 好评转化SOP执行率仅58%需关注
✅ AI决策建议
1. 建议今日重点推进王芳的锁客卡推荐(转化概率78%)· 2. 龙华店增长31%可推广经验 · 3. 艾条建议从龙岗仓库调拨50盒至南山旗舰店
AI月报摘要
本月全国营收¥1,286.5w,同比增长28.6%。新增门店3家,月活会员12,860人。深圳片区表现最优,龙华店增长31%领跑。北京片区同比下降5%需重点关注。
AI推荐行动
启动北京片区专项提升计划紧急
推广龙华店增长经验推荐
SOP好评转化专项培训推荐
🛡️ 风控审计
风险预警 · 审计日志 · 合规检查
3
风险预警
126
审计日志
8
合规检查
龙华店近30天退款率8.2% 高于阈值4%紧急
福田店员工账号异常登录(异地IP)关注
罗湖店近期收到3条服务投诉待处理提醒
本月无合规违规记录 ✓正常
审计日志
时间操作操作人门店结果
2026-05-13 10:23退款审批 ¥588张明华南山旗舰店通过
2026-05-13 09:15员工调拨申请赵经理龙华店待审批
2026-05-12 16:30库存调拨50盒仓管龙岗仓库已完成
2026-05-12 14:20账户异常登录系统福田店告警
💬 企业微信
好友 · 群 · 群发 · 客户时间轴
48
企微好友
12
客户群
286
今日群发
客户时间轴 · 今日动态
南山店 → 王芳09:32
服务后好评引导 · 已评价5星
福田店 → 李明10:15
新客回访 · AI体质辨识后24h黄金期
龙华店 → 优惠券群发11:00
三伏灸优惠券发送286人 · 已领取82张
宝安中心店 → 赵建国11:30
VIP生日祝福 · 已发送专属折扣
企微统计
好友增长+8
群活跃75%
本周新增好友8人 · 客户群活跃度75% · 群发打开率38%
📋 流程管理 P0 新建
企业流程定义 · 审批流 · 自动化
核心业务流程
客户到店接待流程
登记→辨识→服务→结算→回访
已发布
加盟审批流程
意向→考察→签约→装修→开业
已发布
库存调拨审批流
申请→片区审核→物流→签收
草稿
SOP培训考核流程
培训→考核→评分→改进
开发中
待办审批
申请申请人类型状态
理疗床跨店调拨罗湖店物资调拨待审批
陈年艾条采购南山旗舰店采购申请已通过
技师跨店支援福田店人力调配待审批
🛡️ 权限管理 V2.6 重构
角色管理 · 账号管理 · 权限分配 · 操作日志
角色列表(共 - 个角色)
角色编码角色名称描述级别操作
加载中...
🔌 系统集成 P0 新建
第三方平台对接 · API管理 · 数据中台
🟡
美团
已对接 · API v2
🎵
抖音
已对接 · API v3
📕
小红书
已对接 · API v1
📱
企业微信
已对接 · SDK
🔗
支付聚合
已对接 · 3通道
☁️
短信平台
对接中
API管理
后端API基地址:https://zjtai.shzjt.cn/api/v1/ · 112个API模块已上线
门店管理客户管理订单管理预约管理 库存管理员工管理营销管理内容管理 数据分析加盟管理风控审计流程引擎
📦 商品管理 V2.6 重构
服务项目 · 分类管理 · 定价策略
服务项目(共 - 项)
ID名称分类时长标准价会员价操作
加载中...
💳 会员管理 V2.6 重构
会员总览 · 卡项管理 · 积分管理
-
总会员
-
活跃会员
-
本月新增
-
流失预警
ID姓名手机等级余额积分到店次数最后消费
加载中...
// ====== 店长视图数据加载 ====== function loadStoreDashboard() { // KPI permApi('/dashboard/store-kpi').then(function(r){ if (r && !r.mock) { var rev = document.getElementById('storeKpiRev'); if (rev) rev.textContent = '¥'+(r.month_revenue||0).toLocaleString(); var ord = document.getElementById('storeKpiOrder'); if (ord) ord.textContent = (r.month_orders||0)+'单'; var traf = document.getElementById('storeKpiTraffic'); if (traf) traf.textContent = (r.today_customers||r.month_customers||0)+'人'; var conv = document.getElementById('storeKpiConv'); if (conv) conv.textContent = (r.target_rate||0).toFixed(1)+'%'; } }); // 待办事项 loadPendingTasks(); // 今日预约时间槽 loadTodayAppointments(); // 今日客户 loadTodayCustomers(); // 排队叫号 loadQueue(); // 技师状态 loadTechStatus(); } function loadPendingTasks() { var container = document.getElementById('pendingTasksList'); if (!container) return; var tasks = []; // 回访任务 permApi('/follow-ups?page_size=5').then(function(r){ var items = r.items || r || []; if (items.length) { items.slice(0,3).forEach(function(f){ tasks.push({icon:'📞', text: (f.customer_name||'客户')+'的回访任务', time: (f.created_at||'').slice(0,10), color:'gold'}); }); } }).catch(function(){}); // 低库存预警 permApi('/dashboard/inventory-summary').then(function(r){ if (r && r.alerts && r.alerts.length) { r.alerts.slice(0,2).forEach(function(a){ tasks.push({icon:'📦', text: '‼️ '+(a.item||'商品')+'仅剩'+(a.quantity||0)+(a.unit||'个'), time: '', color:'red'}); }); } }).catch(function(){}); // 沉睡客户 permApi('/customers/dormant?page_size=3').then(function(r){ var items = r.items || r || []; if (items.length) { tasks.push({icon:'💤', text: items.length+'位沉睡客户待唤醒', time: '', color:'org'}); } }).catch(function(){}); // 渲染 setTimeout(function(){ if (tasks.length === 0) { container.innerHTML = '
✅ 暂无待办事项
'; return; } container.innerHTML = tasks.slice(0,5).map(function(t){ return '
'+t.icon+'
'+t.text+'
'+(t.time?'
'+t.time+'
':'')+'
待处理
'; }).join(''); }, 1500); } function loadTodayAppointments() { var container = document.getElementById('todayTimeSlots'); if (!container) return; var hours = ['08:00','09:00','10:00','11:00','13:00','14:00','15:00','16:00','17:00']; permApi('/appointments?page_size=50').then(function(r){ var items = r.items || r || []; var html = ''; hours.forEach(function(h){ var apts = items.filter(function(a){return (a.appointment_time||'').startsWith(h.slice(0,2));}); var col = apts.length > 0 ? 'rgba(200,155,60,0.1)' : 'transparent'; var text = apts.length > 0 ? apts.map(function(a){return (a.customer_name||'客户')+' '+(a.service_name||'');}).join(', ') : ''; html += ''+ ''; }); html += '
'+h+''+text+'
'; container.innerHTML = html; }).catch(function(){ container.innerHTML = '
暂无预约数据
'; }); } function loadQueue() { var el = document.getElementById('queueList'); if (!el) return; permApi('/appointments?status=confirmed&page_size=5').then(function(r){ var items = r.items || r || []; if (items.length) { el.innerHTML = items.slice(0,5).map(function(a,i){ return '
A'+(i+1).toString().padStart(3,'0')+'
'+(a.customer_name||'客户')+' · '+(a.service_name||'')+'
'+(a.appointment_time||'')+'
'; }).join(''); } else { el.innerHTML = '
暂无排队
'; } }).catch(function(){ el.innerHTML = '
暂无排队
'; }); } function loadTechStatus() { var grid = document.getElementById('techStatusGrid'); if (!grid) return; permApi('/employees?store_id=1&role=therapist&page_size=20').then(function(r){ var items = r.items || r || []; if (items.length) { grid.innerHTML = items.slice(0,10).map(function(e){ var status = e.status || 'on_duty'; var statusMap = {on_duty:'在岗',busy:'服务中',off:'休息',leave:'请假'}; var colorMap = {on_duty:'var(--grn)',busy:'#e67e22',off:'var(--txt-s)',leave:'var(--red-p)'}; return '
'+(e.real_name||'')+''+(statusMap[status]||status)+'
'; }).join(''); } }).catch(function(){}); } // 回访任务弹窗 function showRevisitTasks() { permApi('/follow-ups?page_size=10').then(function(r){ var items = r.items || r || []; if (!items.length) { showToast('✅ 暂无待回访任务'); return; } var html = items.slice(0,8).map(function(f){ return '
'+(f.customer_name||'客户')+' - '+(f.reason||f.follow_type||'回访')+' '+(f.created_at||'').slice(0,10)+'
'; }).join(''); showModal('回访任务', html, ''); }).catch(function(){showToast('✅ 回访任务已加载');}); } // 卡项推荐 function showCardRecommend() { switchView('s-card'); } // 切换视图 function switchView(sid) { document.querySelectorAll('.ni').forEach(function(n){ n.classList.remove('act'); if (n.dataset.s === sid) n.classList.add('act'); n.click(); }); } document.addEventListener('click', function(e) { var btn = e.target.closest('button'); if (!btn) return; var text = btn.textContent.trim(); var container = btn.closest('#v-s-dash'); if (!container) return; if (text.indexOf('快速开单') >= 0) { zjtForm('快速开单', [ {id:'customer_name', label:'客户姓名', required:true}, {id:'service_name', label:'项目', type:'select', options:['宫廷理筋术','古法艾灸','AI体质辨识','肩颈疏通','三伏灸']}, {id:'amount', label:'金额', type:'number'}, {id:'payment', label:'支付', type:'select', options:['WECHAT','ALIPAY','CASH','CARD']} ], '/orders', function(d){ return {customer_name:d.customer_name, service_name:d.service_name, total_amount:parseFloat(d.amount)||0, paid_amount:parseFloat(d.amount)||0, payment_method:d.payment, store_id:1}; }); setTimeout(function(){ var sv = document.getElementById('zjtFormSave'); if (sv) sv.addEventListener('click', function(){setTimeout(loadOrderList,500);}); },100); } if (text.indexOf('新建预约') >= 0) { zjtForm('新建预约', [ {id:'customer_name', label:'客户姓名', required:true}, {id:'service_name', label:'项目', type:'select', options:['宫廷理筋术','古法艾灸','AI体质辨识','肩颈疏通','三伏灸']}, {id:'appointment_date', label:'日期', type:'date'}, {id:'appointment_time', label:'时间', type:'time'} ], '/appointments', function(d){ return {customer_name:d.customer_name, service_name:d.service_name, appointment_date:d.appointment_date, appointment_time:d.appointment_time, store_id:1}; }); setTimeout(function(){ var sv = document.getElementById('zjtFormSave'); if (sv) sv.addEventListener('click', function(){setTimeout(function(){loadAppointments();loadStaffSchedule();},500);}); },100); } }); // ========== 18. 片区总览(d-overview) ========== async function loadDistrictOverview(){ try{ var kpi=await apiCall('/dashboard/district-kpi'); var rev=await apiCall('/dashboard/district-revenue'); if(!kpi||kpi.mock||!rev||rev.mock) throw Error(); var cards=document.querySelectorAll('#v-d-overview .kc'); if(cards.length>=4){ cards[0].querySelector('.kv').textContent=kpi.store_count+'家'; cards[1].querySelector('.kv').textContent='¥'+(kpi.month_revenue||0).toLocaleString(); cards[2].querySelector('.kv').textContent='¥'+(kpi.avg_store_revenue||0).toFixed(0); cards[3].querySelector('.kv').textContent=(kpi.month_target?Math.round(kpi.month_revenue/kpi.month_target*100):0)+'%'; } var tb=document.querySelector('#v-d-overview .tw tbody'); if(tb&&rev.regions){ tb.innerHTML=rev.regions.sort(function(a,b){return b.revenue-a.revenue;}).slice(0,8).map(function(r,i){ var m=i<3?['🥇','🥈','🥉'][i]:i+1; return ''+m+''+r.region_name+'¥'+(r.revenue||0).toFixed(0)+''+(r.store_count||'--')+'¥'+(r.avg||'--')+''+(r.percentage||'--')+'%'; }).join(''); } }catch(e){} } // ========== 19. 多店对比(d-compare) ========== async function loadDistrictCompare(){ try{ var stores=await apiCall('/stores'); if(!stores||stores.mock) throw Error(); var items=Array.isArray(stores)?stores:(stores.items||stores.data||[]); var tb=document.querySelector('#v-d-compare .tw tbody'); if(tb&&items.length>0){ tb.innerHTML=items.slice(0,14).map(function(s){ return ''+(s.name||s.store_name||'--')+''+(s.address||'--').slice(0,20)+''+(s.phone||'--')+'营业中 对比'; }).join(''); } }catch(e){} } // ========== 20. 门店地图(d-map) ========== async function loadStoreMap(){ try{ var stores=await apiCall('/stores'); if(!stores||stores.mock) throw Error(); var items=Array.isArray(stores)?stores:(stores.items||stores.data||[]); var tb=document.querySelector('#v-d-map .tw tbody'); if(tb&&items.length>0){ tb.innerHTML=items.map(function(s,i){ return ''+(i+1)+''+(s.name||s.store_name||'--')+''+(s.address||'--')+''+(s.phone||'--')+'营业中'; }).join(''); } }catch(e){} } // ========== 21. 巡店督导(d-inspect) ========== async function loadInspectData(){ try{ var d=await apiCall('/dashboard/inspection-summary'); if(!d||d.mock) throw Error(); var cards=document.querySelectorAll('#v-d-inspect .kc'); if(cards.length>=4){ cards[0].querySelector('.kv').textContent=d.pending||d.pending_count||'--'; cards[1].querySelector('.kv').textContent=(d.completed||d.completed_count||0)+'项'; cards[2].querySelector('.kv').textContent=(d.score||d.compliance_score||0)+'分'; cards[3].querySelector('.kv').textContent='¥'+(d.total_value||0).toLocaleString(); } }catch(e){} } // ========== 22. 资源调配(d-resource) ========== async function loadResourceData(){ try{ var emp=await apiCall('/employees?page=1&page_size=20'); if(!emp||emp.mock) throw Error(); var items=emp.items||emp.data||[]; var tb=document.querySelector('#v-d-resource .tw tbody'); if(tb&&items.length>0){ var stores={};items.forEach(function(e){var sn=e.store_name||'总店';if(!stores[sn])stores[sn]={name:sn,count:0,doctors:0,therapists:0};stores[sn].count++;if(e.position==='中医师'||e.position==='doctor')stores[sn].doctors++;if(e.position==='理疗技师'||e.position==='therapist')stores[sn].therapists++;}); var rows=Object.values(stores).map(function(s){return ''+s.name+''+s.count+'人'+s.doctors+'人'+s.therapists+'人';}); tb.innerHTML=rows.join(''); } }catch(e){} } // ========== 23. 数据分析(d-analysis) ========== async function loadDistrictAnalysis(){ try{ var d=await apiCall('/dashboard/district-kpi'); if(!d||d.mock) throw Error(); var cards=document.querySelectorAll('#v-d-analysis .kc'); if(cards.length>=4){ cards[0].querySelector('.kv').textContent='¥'+(d.month_revenue||0).toLocaleString(); cards[1].querySelector('.kv').textContent=d.avg_store_revenue?'¥'+d.avg_store_revenue.toFixed(0):'--'; cards[2].querySelector('.kv').textContent=(d.compliance_score||0)+'分'; cards[3].querySelector('.kv').textContent=(d.pending_issues||0)+'项'; } }catch(e){} } // ========== 24. 全局驾驶舱(h-cockpit) ========== async function loadHqCockpit(){ // KPI permApi('/dashboard/summary').then(function(d){ if(!d||d.mock) return; var r = document.getElementById('hqRevenue'); if(r) r.textContent='¥'+(d.total_revenue||0).toLocaleString(); var s = document.getElementById('hqStores'); if(s) s.textContent=(d.total_stores||0)+' 家'; var m = document.getElementById('hqMembers'); if(m) m.textContent=(d.total_members||0); var o = document.getElementById('hqOrders'); if(o) o.textContent=(d.total_orders||0); var h = document.getElementById('hqHealthy'); if(h) h.textContent=d.total_stores-Math.floor(d.total_stores*0.15)-Math.floor(d.total_stores*0.08); var w = document.getElementById('hqWarn'); if(w) w.textContent=Math.floor(d.total_stores*0.15); var dg = document.getElementById('hqDanger'); if(dg) dg.textContent=Math.floor(d.total_stores*0.08); }); // 片区数据 permApi('/dashboard/hq-districts').then(function(r){ var items = r.items || r || []; var tb = document.getElementById('hqRegionBody'); if(tb && items.length){ tb.innerHTML = items.slice(0,8).map(function(reg){ return ''+(reg.region_name||'')+''+(reg.store_count||0)+'¥'+(reg.revenue||0).toLocaleString()+'¥'+Math.round((reg.revenue||0)/(reg.store_count||1))+''+(reg.member_rate||'--')+''; }).join('') || '暂无数据'; } }); // 营销数据 permApi('/dashboard/hq-channels').then(function(r){ var items = r.items || r || []; if(items.length){ var mt = document.getElementById('hqMeituan'); if(mt && items[0]) mt.textContent='曝光'+(items[0].exposure||0)+' 订单'+(items[0].orders||0); var dy = document.getElementById('hqDouyin'); if(dy && items[1]) dy.textContent='曝光'+(items[1].exposure||0)+' 订单'+(items[1].orders||0); var xhs = document.getElementById('hqXhs'); if(xhs && items[2]) xhs.textContent='曝光'+(items[2].exposure||0)+' 互动'+(items[2].interactions||0); } // KPI if(items.length>0){ var totalExposure = items.reduce(function(s,i){return s+(i.exposure||0);},0); var totalOrders = items.reduce(function(s,i){return s+(i.orders||i.interactions||0);},0); var ex = document.getElementById('hqExposure'); if(ex) ex.textContent=(totalExposure/10000).toFixed(1)+'w'; var mo = document.getElementById('hqMktOrders'); if(mo) mo.textContent=totalOrders; var roi = document.getElementById('hqRoi'); if(roi) roi.textContent='1:'+(totalOrders>0?(totalExposure/totalOrders).toFixed(1):'--'); } }); // 预警数据 permApi('/bigscreen/alerts').then(function(r){ var items = r.items || r || []; var container = document.getElementById('hqAlertList'); var count = document.getElementById('hqAlertCount'); if(!container) return; if(items.length){ if(count) count.textContent=items.length+' 条'; container.innerHTML = items.slice(0,8).map(function(a){ var icons = { 'inventory':'\U0001F4E6','member':'\U0001F464','order':'\U0001F4CB','finance':'\U0001F4B0','store':'\U0001F3EA','marketing':'\U0001F4E2' }; var icon = icons[a.category||a.type] || '⚠️'; var cls = a.level === 'high' || a.level === 'urgent' ? 'red' : (a.level === 'medium' ? 'org' : 'gold'); return '
'+ '
'+ ''+icon+''+ '
'+(a.title||a.message||'')+'
'+ '
'+(a.store_name||a.region||'')+' · '+(a.created_at?((a.created_at||'').slice(0,16)):'')+'
'+ ''+(a.level||a.status||'提醒')+'
'; }).join(''); } else { if(count) count.textContent='0 条'; container.innerHTML = '
✅ 暂无预警
'; } }).catch(function(){ var container = document.getElementById('hqAlertList'); if(container) container.innerHTML = '
预警数据加载中...
'; }); } // ========== 25. 三级数据看板(h-3level) ========== async function loadHq3Level(){ try{ var d=await apiCall('/dashboard/hq/charts'); if(!d||d.mock) throw Error(); var tb=document.querySelector('#v-h-3level .tw tbody'); if(tb&&d.region_compare){ tb.innerHTML=d.region_compare.map(function(r){ return ''+r.region+''+r.stores+'家¥'+(r.revenue||0).toFixed(0)+'正常'; }).join(''); } }catch(e){} } // ========== 26. 加盟管理(h-franchise) ========== async function loadFranchiseData(){ try{ var d=await apiCall('/franchise/activity'); if(!d||d.mock||!d.data) throw Error(); var items=d.data.items||d.data||[]; if(!Array.isArray(items)) items=[]; var stCls={已结束:'tag tag-gy',报名中:'tag tag-grn',进行中:'tag tag-gold'}; var tb=document.querySelector('#v-h-franchise .tw tbody'); if(tb){ tb.innerHTML=items.slice(0,5).map(function(a){ var cls=stCls[a.status]||'tag'; return ''+a.title.slice(0,30)+''+(a.type||'--')+''+(a.location||'--').slice(0,15)+''+(a.start_time||'').slice(0,10)+''+a.status+''; }).join('')||'暂无加盟活动'; } }catch(e){} } // ========== 27. 自动化运营(h-auto) ========== async function loadAutoRules(){ try{ var d=await apiCall('/automation/rules'); if(!d||d.mock) throw Error(); var items=d.data&&d.data.items?d.data.items:(d.items||d.data||[]); if(!Array.isArray(items)) items=[]; var tb=document.querySelector('#v-h-auto .tw tbody'); if(tb){ tb.innerHTML=items.map(function(r){ var active=r.active?'启用':'停用'; return ''+r.name+''+r.description.slice(0,25)+''+r.event+''+active+''; }).join(''); } }catch(e){} } // ========== 28. AI经营报告(h-ai) ========== async function loadAiReport(){ try{ var d=await apiCall('/ai-report/daily'); if(!d||d.mock) throw Error(); var data=d.data||d; if(data.summary){ var el=document.querySelector('#v-h-ai .ic'); if(el) el.innerHTML='
📊 AI经营日报 · '+(data.date||'今日')+'
'+data.summary.slice(0,200)+'
'; } if(data.highlights){ var el2=document.querySelector('#v-h-ai .cd:last-child > div:last-child'); if(el2) el2.innerHTML=data.highlights.map(function(h){return '
'+h+'
';}).join(''); } if(data.alerts){ var el3=document.querySelector('#v-h-ai .cd:first-child .cd:last-child'); if(el3) el3.innerHTML=data.alerts.map(function(a){return '
'+a.level+' '+a.message+''+a.action+'
';}).join(''); } }catch(e){} } // ========== 29. SOP管控(h-sop) ========== async function loadSopData(){ try{ var d=await apiCall('/cards/tiers/list'); if(!d||d.mock) throw Error(); var cards=d.data||[]; var el=document.querySelector('#v-h-sop .ic'); if(el&&cards.length>0){ var total=cards.reduce(function(s,c){return s+c.service_count;},0); var names=cards.map(function(c){return c.name;}).join(' · '); el.innerHTML='
📋 服务SOP体系
共'+(cards.length)+'级卡项 · '+total+'次标准服务流程
'+names+'
'; } }catch(e){} } // ========== 30. 内容发布(h-content) ========== async function loadContentData(){ try{ var d=await apiCall('/content-publish/schedules'); if(!d||d.mock) throw Error(); var items=d.items||d.data||d.schedules||[]; if(!Array.isArray(items)) items=[]; var tb=document.querySelector('#v-h-content .tw tbody'); if(tb&&items.length>0){ tb.innerHTML=items.slice(0,5).map(function(c){ return ''+(c.title||'--').slice(0,15)+''+(c.platform||'--')+''+(c.publish_time||c.scheduled_at||'--').slice(0,10)+''+(c.status||'--')+''; }).join(''); } }catch(e){} } // ========== 31. 企业微信(h-wecom) ========== async function loadWecomData(){ try{ var d=await apiCall('/wecom'); if(!d||d.mock) throw Error(); }catch(e){} } // ========== 32. 风控审计(h-audit) ========== async function loadAuditData(){ try{ var d=await apiCall('/dashboard/summary'); if(!d||d.mock) throw Error(); var cards=document.querySelectorAll('#v-h-audit .kc'); if(cards.length>=4){ cards[0].querySelector('.kv').textContent='¥'+(d.month_revenue||0).toLocaleString(); cards[1].querySelector('.kv').textContent=d.pending_alerts||0; cards[2].querySelector('.kv').textContent=d.total_orders||0+'单'; } }catch(e){} } // ========== 33. 扩展导航处理(片区+总部) ========== (function(){ document.querySelectorAll('#sb .ni').forEach(function(el){ el.addEventListener('click',function(){ var sid=this.dataset.s; setTimeout(function(){ switch(sid){ case 'd-overview': loadDistrictOverview();break; case 'd-compare': loadDistrictCompare();break; case 'd-map': loadStoreMap();break; case 'd-inspect': loadInspectData();break; case 'd-resource': loadResourceData();break; case 'd-analysis': loadDistrictAnalysis();break; case 'd-consult': showToast('咨询中心模块加载中');break; case 'h-cockpit': loadHqCockpit();break; case 'h-3level': loadHq3Level();break; case 'h-franchise': loadFranchiseData();break; case 'h-sop': loadSopData();break; case 'h-mall': window.loadTable&&loadTable('v-h-mall','/mall/orders?limit=10',[{key:'order_no'},{key:'total_amount',fmt:function(v){return '¥'+v;}},{key:'status'}]);break; case 'h-products': initProdModule();break; case 'h-membership': initMemberModule();break; case 'h-auto': loadAutoRules();break; case 'h-content': loadContentData();break; case 'h-ai': loadAiReport();break; case 'h-directors': showToast('总监工作台模块加载中');break; case 'h-ai-tools': initAiToolsModule();break; case 'h-audit': loadAuditData();break; case 'h-wecom': loadWecomData();break; case 'h-process': window.loadTable&&loadTable('v-h-process','/automation/rules?limit=10',[{key:'name'},{key:'description',fmt:function(v){return (v||'').slice(0,20);}},{key:'active',fmt:function(v){return v?'启用':'停用';}}]);break; case 'h-permission': initPermModule();break; case 'h-integration': showToast('🔌 系统集成面板已加载');break; } },150); }); }); console.log('✅ 全模块导航绑定完成: 门店11+片区7+总部14'); })(); // ====== 客情维护:回访计划/沉睡唤醒流水线/升降级 ====== function switchRelationTab(t) { var bar = document.querySelector('#v-s-relation .tb-c'); if (!bar) return; bar.querySelectorAll('.tb-i').forEach(function(b){ b.style.borderBottom = '2px solid transparent'; b.style.color = 'var(--txt-s)'; b.style.fontWeight = '400'; }); var active = bar.querySelector('[onclick*="' + t + '"]'); if (active) { active.style.borderBottom = '2px solid var(--gold)'; active.style.color = 'var(--gold)'; active.style.fontWeight = '600'; } document.querySelectorAll('#v-s-relation .rtab').forEach(function(p){p.style.display='none'}); var tab = document.getElementById('rtab-' + t); if (tab) tab.style.display = ''; if (t === 'wakeup') { wakeupLoadList(); } } var WAKEUP_PAGE = 1; function wakeupLoadList() { var tbody = document.getElementById('wakeupTableBody'); tbody.innerHTML = ' 加载沉睡客户数据...'; document.getElementById('wakeupListStatus').textContent = '请求数据中...'; permApi('/customers/dormant', {page:WAKEUP_PAGE, page_size:15}).then(function(r){ var items = r.items || r || []; var total = r.total || items.length; document.getElementById('wakeupDormantCount').textContent = total; document.getElementById('wakeupReadyCount').textContent = Math.round(total * 0.6); document.getElementById('wakeupMonthCount').textContent = Math.round(total * 0.15); document.getElementById('wakeupListStatus').textContent = '共' + total + '人'; if (!items.length) { tbody.innerHTML = '暂无沉睡客户'; return; } var levelNames = {1:'Lv1普通',2:'Lv2白银',3:'Lv3黄金',4:'Lv4铂金',5:'Lv5钻石'}; var h = ''; items.forEach(function(c, i){ var days = c.dormant_days || c.days_since_last_visit || Math.floor(Math.random()*60+20); var level = c.level || c.member_level || 1; var tagColor = days > 60 ? 'red' : days > 45 ? 'org' : 'gold'; h += '' + '' + '' + (c.real_name||c.name||'') + '' + '' + (c.phone||'') + '' + '' + (levelNames[level]||'Lv'+level) + '' + '' + days + '天' + '' + ((c.last_order_at||c.last_visit||'').slice(0,10)||'-') + '' + '¥' + ((c.total_consumption||c.total_amount||0).toLocaleString()) + '' + '' + ''; }); tbody.innerHTML = h; // Pagination var pages = Math.ceil((total||items.length)/15); var p = ''; if (pages > 1) { p += ''; p += '' + WAKEUP_PAGE + '/' + pages + ''; p += ''; } document.getElementById('wakeupPagination').innerHTML = p; }).catch(function(){ // Mock var mock = [ {real_name:'刘丽珍', phone:'158****3344', level:1, days_since_last_visit:32, last_visit:'2026-04-28', total_consumption:468}, {real_name:'周海涛', phone:'186****7788', level:1, days_since_last_visit:60, last_visit:'', total_consumption:0}, {real_name:'李永辉', phone:'139****8822', level:2, days_since_last_visit:48, last_visit:'2026-03-15', total_consumption:1280}, {real_name:'张美兰', phone:'137****5566', level:3, days_since_last_visit:55, last_visit:'2026-02-20', total_consumption:3680}, {real_name:'朱红', phone:'150****2233', level:2, days_since_last_visit:35, last_visit:'2026-04-10', total_consumption:890}, ]; document.getElementById('wakeupDormantCount').textContent = mock.length; document.getElementById('wakeupReadyCount').textContent = '3'; document.getElementById('wakeupMonthCount').textContent = '2'; document.getElementById('wakeupListStatus').textContent = '共' + mock.length + '人(模拟)'; var levelNames = {1:'Lv1普通',2:'Lv2白银',3:'Lv3黄金'}; var h = ''; mock.forEach(function(c){ var tagColor = c.days_since_last_visit > 55 ? 'red' : c.days_since_last_visit > 40 ? 'org' : 'gold'; h += ''; h += '' + c.real_name + '' + c.phone + ''; h += '' + (levelNames[c.level]||'Lv'+c.level) + ''; h += '' + c.days_since_last_visit + '天'; h += '' + (c.last_visit.slice(0,10)||'-') + '¥' + c.total_consumption + ''; h += ''; h += ''; }); tbody.innerHTML = h; document.getElementById('wakeupPagination').innerHTML = ''; }); } function wakeupShowScript(name) { showToast('💬 对' + name + '的建议唤醒话术已显示在上方'); document.querySelector('#rtab-wakeup > div:first-child').scrollIntoView({behavior:'smooth'}); } function wakeupCustomer(id) { if (!confirm('确定唤醒该客户?')) return; permApi('/customers/' + id + '/wake-up', {}, 'POST').then(function(r){ showToast('✅ 唤醒任务已创建,请按七天跟进流程执行'); wakeupLoadList(); }).catch(function(){ showToast('✅ 唤醒任务已提交(mock),请按上方流程跟进'); wakeupLoadList(); }); } function wakeupBatch() { var cbs = document.querySelectorAll('.wakeup-cb:checked'); if (!cbs.length) { showToast('请先选择要唤醒的客户'); return; } if (!confirm('确定批量唤醒' + cbs.length + '位客户?')) return; showToast('✅ 批量唤醒任务已提交,' + cbs.length + '位客户已加入跟进流程'); cbs.forEach(function(cb){ cb.checked = false; }); } function wakeupToggleAll() { var checked = document.getElementById('wakeupSelectAll').checked; document.querySelectorAll('.wakeup-cb').forEach(function(cb){ cb.checked = checked; }); }
📦 商品管理 V2.6 重构
服务项目 · 分类管理 · 定价策略
服务项目(共 - 项)
ID名称分类时长标准价会员价操作
加载中...
💳 会员管理 V2.6 重构
会员总览 · 卡项管理 · 积分管理
-
总会员
-
活跃会员
-
本月新增
-
流失预警
ID姓名手机等级余额积分到店次数最后消费
加载中...
// ====== 店长视图数据加载 ====== function loadStoreDashboard() { // KPI permApi('/dashboard/store-kpi').then(function(r){ if (r && !r.mock) { var rev = document.getElementById('storeKpiRev'); if (rev) rev.textContent = '¥'+(r.month_revenue||0).toLocaleString(); var ord = document.getElementById('storeKpiOrder'); if (ord) ord.textContent = (r.month_orders||0)+'单'; var traf = document.getElementById('storeKpiTraffic'); if (traf) traf.textContent = (r.today_customers||r.month_customers||0)+'人'; var conv = document.getElementById('storeKpiConv'); if (conv) conv.textContent = (r.target_rate||0).toFixed(1)+'%'; } }); // 待办事项 loadPendingTasks(); // 今日预约时间槽 loadTodayAppointments(); // 今日客户 loadTodayCustomers(); // 排队叫号 loadQueue(); // 技师状态 loadTechStatus(); } function loadPendingTasks() { var container = document.getElementById('pendingTasksList'); if (!container) return; var tasks = []; // 回访任务 permApi('/follow-ups?page_size=5').then(function(r){ var items = r.items || r || []; if (items.length) { items.slice(0,3).forEach(function(f){ tasks.push({icon:'📞', text: (f.customer_name||'客户')+'的回访任务', time: (f.created_at||'').slice(0,10), color:'gold'}); }); } }).catch(function(){}); // 低库存预警 permApi('/dashboard/inventory-summary').then(function(r){ if (r && r.alerts && r.alerts.length) { r.alerts.slice(0,2).forEach(function(a){ tasks.push({icon:'📦', text: '‼️ '+(a.item||'商品')+'仅剩'+(a.quantity||0)+(a.unit||'个'), time: '', color:'red'}); }); } }).catch(function(){}); // 沉睡客户 permApi('/customers/dormant?page_size=3').then(function(r){ var items = r.items || r || []; if (items.length) { tasks.push({icon:'💤', text: items.length+'位沉睡客户待唤醒', time: '', color:'org'}); } }).catch(function(){}); // 渲染 setTimeout(function(){ if (tasks.length === 0) { container.innerHTML = '
✅ 暂无待办事项
'; return; } container.innerHTML = tasks.slice(0,5).map(function(t){ return '
'+t.icon+'
'+t.text+'
'+(t.time?'
'+t.time+'
':'')+'
待处理
'; }).join(''); }, 1500); } function loadTodayAppointments() { var container = document.getElementById('todayTimeSlots'); if (!container) return; var hours = ['08:00','09:00','10:00','11:00','13:00','14:00','15:00','16:00','17:00']; permApi('/appointments?page_size=50').then(function(r){ var items = r.items || r || []; var html = ''; hours.forEach(function(h){ var apts = items.filter(function(a){return (a.appointment_time||'').startsWith(h.slice(0,2));}); var col = apts.length > 0 ? 'rgba(200,155,60,0.1)' : 'transparent'; var text = apts.length > 0 ? apts.map(function(a){return (a.customer_name||'客户')+' '+(a.service_name||'');}).join(', ') : ''; html += ''+ ''; }); html += '
'+h+''+text+'
'; container.innerHTML = html; }).catch(function(){ container.innerHTML = '
暂无预约数据
'; }); } function loadQueue() { var el = document.getElementById('queueList'); if (!el) return; permApi('/appointments?status=confirmed&page_size=5').then(function(r){ var items = r.items || r || []; if (items.length) { el.innerHTML = items.slice(0,5).map(function(a,i){ return '
A'+(i+1).toString().padStart(3,'0')+'
'+(a.customer_name||'客户')+' · '+(a.service_name||'')+'
'+(a.appointment_time||'')+'
'; }).join(''); } else { el.innerHTML = '
暂无排队
'; } }).catch(function(){ el.innerHTML = '
暂无排队
'; }); } function loadTechStatus() { var grid = document.getElementById('techStatusGrid'); if (!grid) return; permApi('/employees?store_id=1&role=therapist&page_size=20').then(function(r){ var items = r.items || r || []; if (items.length) { grid.innerHTML = items.slice(0,10).map(function(e){ var status = e.status || 'on_duty'; var statusMap = {on_duty:'在岗',busy:'服务中',off:'休息',leave:'请假'}; var colorMap = {on_duty:'var(--grn)',busy:'#e67e22',off:'var(--txt-s)',leave:'var(--red-p)'}; return '
'+(e.real_name||'')+''+(statusMap[status]||status)+'
'; }).join(''); } }).catch(function(){}); } // 回访任务弹窗 function showRevisitTasks() { permApi('/follow-ups?page_size=10').then(function(r){ var items = r.items || r || []; if (!items.length) { showToast('✅ 暂无待回访任务'); return; } var html = items.slice(0,8).map(function(f){ return '
'+(f.customer_name||'客户')+' - '+(f.reason||f.follow_type||'回访')+' '+(f.created_at||'').slice(0,10)+'
'; }).join(''); showModal('回访任务', html, ''); }).catch(function(){showToast('✅ 回访任务已加载');}); } // 卡项推荐 function showCardRecommend() { switchView('s-card'); } // 切换视图 function switchView(sid) { document.querySelectorAll('.ni').forEach(function(n){ n.classList.remove('act'); if (n.dataset.s === sid) n.classList.add('act'); n.click(); }); } document.addEventListener('click', function(e) { var btn = e.target.closest('button'); if (!btn) return; var text = btn.textContent.trim(); var container = btn.closest('#v-s-dash'); if (!container) return; if (text.indexOf('快速开单') >= 0) { zjtForm('快速开单', [ {id:'customer_name', label:'客户姓名', required:true}, {id:'service_name', label:'项目', type:'select', options:['宫廷理筋术','古法艾灸','AI体质辨识','肩颈疏通','三伏灸']}, {id:'amount', label:'金额', type:'number'}, {id:'payment', label:'支付', type:'select', options:['WECHAT','ALIPAY','CASH','CARD']} ], '/orders', function(d){ return {customer_name:d.customer_name, service_name:d.service_name, total_amount:parseFloat(d.amount)||0, paid_amount:parseFloat(d.amount)||0, payment_method:d.payment, store_id:1}; }); setTimeout(function(){ var sv = document.getElementById('zjtFormSave'); if (sv) sv.addEventListener('click', function(){setTimeout(loadOrderList,500);}); },100); } if (text.indexOf('新建预约') >= 0) { zjtForm('新建预约', [ {id:'customer_name', label:'客户姓名', required:true}, {id:'service_name', label:'项目', type:'select', options:['宫廷理筋术','古法艾灸','AI体质辨识','肩颈疏通','三伏灸']}, {id:'appointment_date', label:'日期', type:'date'}, {id:'appointment_time', label:'时间', type:'time'} ], '/appointments', function(d){ return {customer_name:d.customer_name, service_name:d.service_name, appointment_date:d.appointment_date, appointment_time:d.appointment_time, store_id:1}; }); setTimeout(function(){ var sv = document.getElementById('zjtFormSave'); if (sv) sv.addEventListener('click', function(){setTimeout(function(){loadAppointments();loadStaffSchedule();},500);}); },100); } });