机主管理后台
OWNER MANAGEMENT
欢迎登录
请输入您的账号信息
账号
密码
{{ loginError }}
{{ loggingIn ? '登录中...' : '登 录' }}
© 2026 Owner Management
{{ pageTitle }}
{{ currentUser.display_name || currentUser.username }} · {{ isAdmin ? '管理员' : '子账户' }}
·已打卡
·已驳回
{{ statsDate }}
今天
{{ statsWeekday }} · 50岁以上人群
OWNER MGMT · 机主后台
总看板
{{ checkinDate }} · {{ todayWeekdayStr }}
机主数量
{{ adminOverview.summary?.total_owners || 0 }}
已绑定设备的子账户
机器数量
{{ adminOverview.summary?.total_machines || 0 }}
已注册设备
今日打卡
实时打卡状态
{{ adminOverview.summary?.checked_in || 0 }}/{{ adminOverview.summary?.total_owners || 0 }}
已打卡/总机主 · {{ adminOverview.summary?.checked_in_machines || 0 }} 台机器
{{ adminOverview.summary?.checkin_approved || 0 }}
已通过
{{ adminOverview.summary?.checkin_pending || 0 }}
待审核
{{ adminOverview.summary?.checkin_rejected || 0 }}
已驳回
{{ adminOverview.summary?.not_checked_in || 0 }}
未打卡
今日课程数据
总计
{{ adminOverview.age_buckets?.today?.a12_25 + adminOverview.age_buckets?.today?.a26_49 + adminOverview.age_buckets?.today?.a50_plus || 0 }}
人今日已检测
45+今日报名 {{ adminOverview.age45?.today_pending || 0 }}人
12-25岁
{{ adminOverview.age_buckets?.today?.a12_25 || 0 }}
人
全部
{{ adminOverview.age_buckets?.today_all?.a12_25 || 0 }}
26-49岁
{{ adminOverview.age_buckets?.today?.a26_49 || 0 }}
人
全部
{{ adminOverview.age_buckets?.today_all?.a26_49 || 0 }}
50岁+
{{ adminOverview.age_buckets?.today?.a50_plus || 0 }}
人
全部
{{ adminOverview.age_buckets?.today_all?.a50_plus || 0 }}
12-49报名
{{ adminOverview.age_buckets?.today?.pending_12_49 || 0 }}
人
全部
{{ adminOverview.age_buckets?.today_all?.pending_12_49 || 0 }}
50+报名
{{ adminOverview.age_buckets?.today?.pending_50_plus || 0 }}
人
全部
{{ adminOverview.age_buckets?.today_all?.pending_50_plus || 0 }}
子账户数据
合计检测
{{ adminOverview.total?.total || 0 }}
· 待结
¥{{ ((adminOverview.age50Stats?.total_approved||0)*7).toFixed(0) }}
· 已结
¥{{ ((adminOverview.age50Stats?.total_settled||0)*7).toFixed(0) }}
结算
{{ sa.display_name || sa.username }}
{{ sa.uid }} · {{ sa.phone || '未绑定手机' }} · {{ sa.device_count }}台
已打卡
审核中
已驳回
未打卡
今日
{{ sa.today_detected || 0 }}
总检测
{{ sa.total_detected || 0 }}
待结算
¥{{ ((sa.total_approved||0)*7).toFixed(0) }}
{{ sa.total_approved || 0 }}人
已结算
¥{{ ((sa.total_settled||0)*7).toFixed(0) }}
{{ sa.total_settled || 0 }}人
加载中...
OWNER MGMT
{{ profileData.name || '管理员' }}
{{ checkinDate }} · {{ todayWeekdayStr }}
我的设备
共 {{ (currentUser.allowed_device_codes || []).length }} 台
查看
{{ Math.max(0, (currentUser.allowed_device_codes || []).length - approvedDeviceCodes.length - pendingDeviceCodes.length) }}
未打卡
{{ pendingDeviceCodes.length }}
待审核
{{ approvedDeviceCodes.length }}
已通过
{{ rejectedDeviceCodes.length }} 台设备被驳回,请重新打卡
数据概览
50岁以上人群检测数据
Cumulative · 累计总计
{{ totalSummary.total_detected || 0 }}
累计检测人次
OWNER MGMT
自开始以来
已报名
{{ totalSummary.total_pending_review || 0 }}
人
已到课
到课通过
{{ totalSummary.total_approved ?? 0 }}
人
待结算
可结算
{{ totalSummary.total_pending_settlement ?? 0 }}
人
合计
¥{{ ((totalSummary.total_pending_settlement||0)*7).toFixed(0) }}
已结算
已完成
{{ totalSummary.total_settled || 0 }}
人
累计
¥{{ ((totalSummary.total_settled||0)*7).toFixed(0) }}
Today · 今日数据
OWNER MGMT
{{ checkinDate }}
已检测
{{ summary.total_detected ?? 0 }}
≥50检测
{{ summary.total_50plus_detected ?? 0 }}
已报名
{{ summary.total_pending_review ?? 0 }}
我的设备
共 {{ devicesStats.length }} 台设备
查看全部
加载中...
暂无设备数据
{{ d.device_code || d.device_serial }}
{{ d.machine_code }}
{{ d.device_name || '—' }}
{{ d.checked_in_today ? '已打卡' : '未打卡' }}
{{ d.detected || 0 }}
检测
流量奖励系数
自动更新
{{ d.oec_coefficient || 1 }}
{{ (d.oec_coefficient || 1) > 1 ? '奖励加成' : (d.oec_coefficient || 1) < 1 ? '系数扣减' : '基准水平' }}
·
{{ (4 * (d.oec_coefficient||1)).toFixed(2) }}
元/人
接通
{{ (d.oec_connection_rate||0).toFixed(0) }}%
介绍
{{ (d.oec_course_rate||0).toFixed(0) }}%
删除
{{ (d.oec_deletion_rate||0).toFixed(0) }}%
样本 {{ d.oec_total }}
查看全部 {{ devicesStats.length }} 台设备 →
打卡审核({{ checkinDate }})
{{ tab.label }}
({{ tab.count }})
加载中...
暂无{{ reviewStatus === 'pending' ? '待审核' : reviewStatus === 'approved' ? '已通过' : reviewStatus === 'rejected' ? '已驳回' : '' }}打卡记录
{{ c.display_name || c.username }}
{{ c.uid }} · {{ c.phone || '未填手机' }}
{{ c.checkin_status === 'approved' ? '已通过' : c.checkin_status === 'rejected' ? '已驳回' : '待审核' }}
打卡时间: {{ formatTime(c.created_at) }}
完成时间: {{ formatTime(c.checkout_time) }}
{{ c.address || `坐标: ${c.latitude}, ${c.longitude}` }}
设备: {{ ensureArray(c.device_codes).map(code => getDeviceSerial(code)).join(', ') || '未关联' }}
驳回原因
{{ c.reject_reason }}
通过
驳回
驳回打卡申请
取消
确认驳回
批量结算
待结算总量
{{ maxSettleCount }} 人
¥{{ (maxSettleCount*3).toFixed(0) }}
已结算总量
{{ totalSummary.total_settled || 0 }} 人
¥{{ ((totalSummary.total_settled||0)*7).toFixed(0) }}
本次结算数量
+10
+50
+100
全部
金额(3元/人)
¥{{ (settleCountDisplay*3).toFixed(0) }}
取消
结算 ¥{{ (settleCountDisplay*3).toFixed(0) }}
请先完善个人资料
需要填写手机号后才能开始打卡
完善资料
等待机主完善资料
设备账户需等机主账户完善信息后才能开始打卡
{{ todayCheckin?.status === 'active' ? '今日已打卡' : '今日已完成' }}
等待管理员审核
审核通过
审核驳回
{{ todayCheckin.reject_reason }}
打卡时间: {{ formatTime(todayCheckin?.created_at) }}
检测位置
地址
{{ todayCheckin.address || '未填写地址' }}
坐标
{{ Number(todayCheckin.latitude).toFixed(6) }}, {{ Number(todayCheckin.longitude).toFixed(6) }}
检测照片
已打卡设备({{ checkedDeviceCodes.length }} 台)
{{ getDeviceSerial(c) }}
无设备
有设备打卡被驳回,需重新打卡
{{ getDeviceSerial(dc) }}
原因:{{ todayCheckin.reject_reason }}
请选择红色标记的设备重新打卡
{{ checkinForm.selectedDeviceCode && isDeviceRejected(checkinForm.selectedDeviceCode) ? '重新打卡' : '今日打卡' }}
{{ checkinStep }}/4 步
选设备
定位
照片
确认
选择打卡设备
{{ (currentUser.allowed_device_codes || []).length }} 台可选
{{ isDeviceRejected(c) ? '已驳回' : isDevicePending(c) ? '待审核' : isDeviceApproved(c) ? '已打卡' : '未打卡' }}
{{ getDeviceSerial(c) }}
打卡设备
{{ getDeviceSerial(currentUser.allowed_device_codes[0]) }}
{{ isDeviceApproved(currentUser.allowed_device_codes[0]) ? '今日已打卡' : isDevicePending(currentUser.allowed_device_codes[0]) ? '待审核' : isDeviceRejected(currentUser.allowed_device_codes[0]) ? '已驳回·请重打' : '今日未打卡' }}
检测位置
已定位
地图加载中...
地址
{{ checkinForm.address || '未填写地址(可手动补充)' }}
坐标
{{ checkinForm.latitude.toFixed(6) }}, {{ checkinForm.longitude.toFixed(6) }}
{{ locating ? '定位中...' : (checkinForm.latitude ? '重新定位' : '点击获取当前位置') }}
GPS 定位失败时,可直接点击地图选点,或拖动红色标记调整位置
手动补充地址(选填)
检测照片
已上传
点击拍照或选择图片
确认打卡信息
设备
{{ getDeviceSerial(checkinForm.selectedDeviceCode) }}
请先选择设备
位置
{{ checkinForm.latitude.toFixed(4) }}, {{ checkinForm.longitude.toFixed(4) }}
请先定位
照片
已上传
请先拍照
本次打卡将统计所选设备的 50 岁及以上检测人数,审核通过后归属到你名下。
{{ submitting ? '打卡中...' : (checkinForm.selectedDeviceCode && isDeviceRejected(checkinForm.selectedDeviceCode) ? '重新打卡开始工作' : '打卡开始工作') }}
{{ selectedDeviceCheckin.checkin_status === 'approved' ? '审核通过' : selectedDeviceCheckin.checkin_status === 'rejected' ? '已驳回' : '等待管理员审核' }}
驳回原因:{{ selectedDeviceCheckin.reject_reason }}
设备:{{ getDeviceSerial(checkinForm.selectedDeviceCode) }}
打卡时间:{{ formatTime(selectedDeviceCheckin.created_at) }}
检测位置
地址
{{ selectedDeviceCheckin.address || '未填写地址' }}
坐标
{{ Number(selectedDeviceCheckin.latitude).toFixed(6) }}, {{ Number(selectedDeviceCheckin.longitude).toFixed(6) }}
出摊照片
该设备打卡正在审核中,请勿重复打卡
创建设备
加载中...
{{ isAdmin ? '暂无设备,点击上方按钮创建' : '暂无设备' }}
{{ d.device_code || d.device_serial }}
{{ d.device_name && d.device_name !== d.device_code ? d.device_name : '' }}
{{ d.status === 'active' ? '运行中' : '停用' }}
{{ d.checked_in_today ? '已打卡' : '未打卡' }}
今日检测
{{ d.today_all_detected ?? d.today_detected ?? 0 }}
≥50岁
{{ d.today_50plus_detected ?? 0 }}
已报名
{{ d.today_pending_review ?? 0 }}
打卡
{{ d.checkin_days ?? 0 }}
天
流量奖励系数
自动更新
{{ d.oec_coefficient || 1 }}
{{ (d.oec_coefficient || 1) > 1 ? '奖励加成' : (d.oec_coefficient || 1) < 1 ? '系数扣减' : '基准水平' }}
·
{{ (4 * (d.oec_coefficient||1)).toFixed(2) }}
元/人
接通
{{ (d.oec_connection_rate||0).toFixed(0) }}%
介绍
{{ (d.oec_course_rate||0).toFixed(0) }}%
删除
{{ (d.oec_deletion_rate||0).toFixed(0) }}%
·
样本{{ d.oec_total }}
编辑
复制账户
删除
共 {{ filteredDevices.length }} 台
上一页
{{ devicePage }}/{{ deviceTotalPages }}
下一页
创建子账户
批量创建
加载中...
暂无子账户
{{ u.display_name || u.username }}
账号: {{ u.username }} · {{ u.phone || '未填手机' }}
设备权限({{ [...new Set(u.allowed_device_codes||[])].length }}台):
未绑定
{{ getDeviceSerial(c) }}
编辑
删除
共 {{ subList.length }} 个
上一页
{{ subPage }}/{{ subTotalPages }}
下一页
{{ isAdmin ? '总看板' : '看板' }}
{{ isAdmin ? '打卡审核' : '打卡' }}
设备
子账户
{{ (currentUser.display_name || currentUser.username || 'A').charAt(0).toUpperCase() }}
{{ currentUser.display_name || currentUser.username }}
{{ isAdmin ? '管理员' : '子账户' }} · {{ currentUser.username }}
{{ profileData.phone }}
编辑资料
修改昵称、手机号
退出登录
返回登录页
取消
选择日期
今天
打卡须知
请仔细阅读以下要求
打卡后需
管理员审核
照片必须包含
现场环境
报告范本
活动彩页
缺少以上内容,审核将失败
取消
我已知晓,继续打卡
{{ detailDevice.device_code || detailDevice.device_serial }}
打卡 {{ detailDevice.checkin_days || 0 }} 天
{{ detailDevice.device_name && detailDevice.device_name !== detailDevice.device_code ? detailDevice.device_name + ' · ' : '' }}{{ statsDate }}
全部通过
全部删除
检测
{{ detailDevice.detected }}
待审
{{ detailDevice.pending_review }}
通过
{{ detailDevice.approved || detailDevice.pending_settlement }}
已删
{{ detailDevice.deleted }}
加载中...
无记录
{{ r.nickname || '匿名' }}
新用户
已删除
已结算
审核通过
待审核
{{ r.age ? r.age + '岁' : '' }}{{ r.gender ? '·' + r.gender : '' }}
· {{ r.area_mergename.split(',').slice(-2).join('/') }}
{{ formatTime(r.created_at) }}
UID: {{ r.uid || r.legacy_username }}
审核通过
删除
恢复删除
加载更多
取消
{{ editingDevice?.id ? '编辑设备' : '创建设备' }}
保存
设备编号 (xk-XXX格式)
机器码
*
设备地区
加入时间
机主UID
*
状态
启用
停用
取消
{{ editingSub?.id ? '编辑子账户' : '创建子账户' }}
保存
UID
*
账号
*
密码 {{ editingSub?.id ? '(留空不修改)' : '
*
' }}
显示名称
手机号
可查看的设备
{{ allDevicesSelected ? '取消全选' : '全选' }}
请先到「设备管理」创建设备
{{ dev.device_code || dev.device_serial }}
{{ dev.device_name && dev.device_name !== dev.device_code ? dev.device_name : '' }}
取消
批量创建子账户
创建
账号数量 (最多100个)
{{n}}
UID前缀
账号前缀
初始密码
设备权限 (可选)
将为所有新账户绑定相同的设备权限
请先创建设备
{{ getDeviceSerial(dev.device_code) }}
预览前5个账户:
#{{i}}
UID: {{ batchForm.uidPrefix }}{{ String(i).padStart(4, '0') }} | 账号: {{ batchForm.usernamePrefix }}{{ i }}
... 还有 {{ batchCount - 5 }} 个账户
{{ batchResult.message }}
失败: {{ batchResult.errors.map(e => `${e.username || e.index}(${e.error})`).join(', ') }}
取消
编辑个人资料
保存
用户名
显示名称
手机号
*
完善手机号后才能开始打卡工作
{{ toastMsg }}
打卡被驳回
请根据驳回原因修改后重新打卡
涉及设备
{{ getDeviceSerial(dc) }}
打卡时间
{{ formatTime(todayCheckin.created_at) }}
驳回原因
{{ todayCheckin?.reject_reason || '未填写原因,请重新拍照/定位后提交' }}
去重新打卡
稍后处理