文件
Henglianshutong/application/admin/view/shopro/commission/agent/detail.html

1062 行
64 KiB
HTML

此文件含有不可见的 Unicode 字符

此文件含有人类无法区分的不可见的 Unicode 字符,但可以由计算机进行不同的处理。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

{include file="/shopro/common/script" /}
<style>
.agent-detail {
background: #fff;
height: 100vh;
overflow: hidden;
}
.agent-detail .panel-block {
height: 100%;
}
.agent-detail .detail-header-bar {
padding: 12px 16px;
margin-bottom: 16px;
background: #fff;
border-radius: 6px;
border: 1px solid var(--sa-border);
}
.agent-detail .detail-title-text {
font-size: 15px;
font-weight: 600;
margin-left: 12px;
color: var(--sa-title);
}
.agent-detail .agent-detail-scrollbar>.el-scrollbar__wrap {
overflow-x: hidden;
}
.agent-detail .agent-detail-scrollbar>.el-scrollbar__bar.is-horizontal {
display: none;
}
.agent-detail .agent-content {
min-height: 450px;
height: auto;
line-height: 1;
padding: 20px;
background: var(--sa-table-header-bg);
border-radius: 8px;
margin: 0 0 20px;
}
.agent-detail .user-content .refresh {
line-height: 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-font);
cursor: pointer;
}
.agent-detail .user-content .refresh .el-icon {
font-size: 16px;
margin-right: 4px;
}
.agent-detail .user-content .nickname {
line-height: 22px;
font-size: 16px;
font-weight: 500;
color: var(--sa-subtitle);
}
.agent-detail .user-content .status {
font-size: 12px;
font-weight: 400;
color: #999999;
cursor: pointer;
}
.agent-content .el-form-item--small {
margin-bottom: 8px;
}
.agent-detail .user-content .commission-item {
width: 30%;
line-height: 18px;
font-size: 14px;
font-weight: 500;
}
.agent-detail .user-content .commission-item .title {
height: 24px;
line-height: 24px;
font-size: 12px;
font-weight: 400;
margin-bottom: 4px;
}
.agent-detail .apply-content .sa-image {
width: 140px;
height: 90px;
}
.agent-detail .dashboard-content {
height: fit-content;
}
.agent-detail .dashboard-content .title {
height: 18px;
line-height: 18px;
font-size: 14px;
font-weight: 500;
color: var(--sa-title);
margin-bottom: 16px;
}
.agent-detail .dashboard-content>.el-col {
border-bottom: 1px dashed var(--sa-border);
margin-bottom: 16px;
padding-bottom: 8px;
}
.agent-detail .dashboard-content>.el-col:last-of-type {
border-bottom: none;
margin-bottom: 0;
padding-bottom: 0;
}
.agent-detail .dashboard-content .item {
margin-bottom: 16px;
}
.agent-detail .dashboard-content .left {
line-height: 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-subfont);
margin-bottom: 8px;
display: flex;
align-items: center;
}
.agent-detail .dashboard-content .item {
line-height: 22px;
font-size: 18px;
font-weight: 500;
color: var(--sa-font);
}
.agent-detail .dashboard-content .unit {
font-size: 12px;
font-weight: 400;
color: var(--sa-font);
margin-left: 4px;
}
.agent-detail .rewards-item {
margin-right: 8px;
}
.agent-detail .rewards-item:last-of-type {
margin-right: 0;
}
/* 运营官全景看板样式 */
.agent-detail .op-dashboard {
background: #fff;
border: 1px solid var(--sa-border);
border-radius: 8px;
padding: 18px 20px;
margin-bottom: 20px;
}
.agent-detail .op-section-title {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
font-weight: 600;
color: var(--sa-title);
margin: 16px 0 12px;
padding-bottom: 8px;
border-bottom: 1px dashed var(--sa-border);
}
.agent-detail .op-section-title:first-of-type {
margin-top: 4px;
}
.agent-detail .op-radar-card {
background: linear-gradient(135deg, #f8fafc 0%, #edf2f7 100%);
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 14px 18px;
margin-bottom: 18px;
}
.agent-detail .op-radar-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.agent-detail .op-radar-title {
font-size: 14px;
font-weight: 600;
color: #2d3748;
display: flex;
align-items: center;
gap: 8px;
}
.agent-detail .op-radar-body {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.agent-detail .op-radar-metric {
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 6px;
padding: 10px 14px;
flex: 1;
min-width: 180px;
box-shadow: 0 1px 3px rgba(0,0,0,0.02);
}
.agent-detail .op-radar-metric .m-label {
font-size: 12px;
color: #718096;
margin-bottom: 6px;
display: flex;
align-items: center;
justify-content: space-between;
}
.agent-detail .op-radar-metric .m-val {
font-size: 16px;
font-weight: 600;
color: #1a202c;
}
.agent-detail .op-grid-box {
background: #fbfcfe;
border: 1px solid #edf2f7;
border-radius: 6px;
padding: 12px 14px;
min-height: 120px;
box-sizing: border-box;
margin-bottom: 12px;
transition: all 0.2s ease;
}
.agent-detail .op-grid-box:hover {
border-color: #cbd5e0;
box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}
.agent-detail .op-grid-box .box-title {
font-size: 13px;
font-weight: 600;
color: #334155;
margin-bottom: 10px;
display: flex;
align-items: center;
justify-content: space-between;
}
.agent-detail .op-stat-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 13px;
line-height: 24px;
}
.agent-detail .op-stat-row .stat-label {
color: #64748b;
font-size: 12px;
}
.agent-detail .op-stat-row .stat-val {
font-weight: 600;
color: #1e293b;
}
.agent-detail .op-stat-row .stat-val.primary { color: #3b82f6; }
.agent-detail .op-stat-row .stat-val.success { color: #10b981; }
.agent-detail .op-stat-row .stat-val.warning { color: #f59e0b; }
.agent-detail .op-stat-row .stat-val.danger { color: #ef4444; }
.agent-detail .op-stat-row .stat-val.purple { color: #8b5cf6; }
.agent-detail .op-stat-row .stat-val.cyan { color: #06b6d4; }
</style>
<div id="detail" class="agent-detail panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-main>
<el-scrollbar class="agent-detail-scrollbar" height="100%">
<div class="detail-header-bar sa-flex sa-row-between">
<div class="sa-flex">
<el-button icon="Back" size="small" @click="onBack">返回</el-button>
<span class="detail-title-text">
分销商详情
<template v-if="state.data.user">
- {{ state.data.user.nickname || state.data.user_id }}
</template>
<template v-else-if="state.id">
#{{ state.id }}
</template>
</span>
</div>
<div class="sa-flex">
<el-button icon="RefreshRight" size="small" circle @click="getDetail" title="刷新"></el-button>
</div>
</div>
<el-row :gutter="20">
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<div class="user-content agent-content">
<div class="title sa-flex sa-row-between">
<span>分销商信息</span>
<span class="refresh sa-flex" @click="getDetail">
<el-icon>
<refresh-right />
</el-icon>
刷新
</span>
</div>
<div v-if="state.data.user" class="sa-flex sa-row-center">
<sa-image :url="state.data.user.avatar" size="80" radius="40">
</sa-image>
</div>
<div class="nickname sa-flex sa-row-center mt-1">
{{
state.data.user
? state.data.user.nickname
: state.data.user_id
}}
</div>
<el-form size="small" label-position="right" label-width="116px" style="margin-top: 12px;">
<div style="font-weight: 600; font-size: 13px; color: var(--sa-title); margin: 8px 0 12px; padding-bottom: 4px; border-bottom: 1px solid var(--sa-border);">
基础分销信息
</div>
<el-form-item label="分销商状态:">
<el-dropdown popper-class="agent-popover" trigger="click" @command="onChangeStatus">
<span class="status" :style="{
color: statusStyle[state.data.status]?.color,
}">
{{ state.data.status_text }}
<el-icon>
<arrow-down />
</el-icon>
</span>
<template #dropdown>
{if $auth->check('shopro/commission/agent/edit')}
<el-dropdown-menu>
<el-dropdown-item class="status" :style="{
color: value.color,
}" v-for="(value, key) in statusStyle" :key="key" :command="key">{{ value.label }}
</el-dropdown-item>
</el-dropdown-menu>
{/if}
</template>
</el-dropdown>
</el-form-item>
<el-form-item label="分销等级:">
<template v-if="state.data.level_info">
<div>{{ state.data.level_info.name }}</div>
<div class="ml-1" style="color: var(--sa-subfont);">(等级{{ state.data.level_info.level }})</div>
</template>
<template v-if="!state.data.level_info">
{{ state.data.level }}
</template>
{if $auth->check('shopro/commission/agent/edit')}
<el-button class="ml-2" type="primary" link @click="onChangeLevel">更换</el-button>
{/if}
</el-form-item>
<el-form-item v-if="state.data.level_status > 0" label="待升级等级:">
<div v-if="state.data.level_status_info">
{{ state.data.level_status_info.name }}
</div>
<div>(等级{{ state.data.level_status || '-' }})</div>
{if $auth->check('shopro/commission/agent/edit')}
<el-button class="ml-2" type="primary" link
@click="onEdit({level_status: state.data.level_status})">同意</el-button>
<el-button type="danger" link @click="onEdit({level_status: 0})">拒绝</el-button>
{/if}
</el-form-item>
<el-form-item label="上级分销商:">
<sa-user-profile type="agent" :user="state.data.user?.parent_user"
:id="state.data.user?.parent_user_id" :isavatar="false"></sa-user-profile>
<el-button class="ml-2" type="primary" link @click="onChangeParentUser">更换
</el-button>
</el-form-item>
<el-form-item v-if="state.data.partner_mode" label="佣金规则:">
<div class="tip" style="color: var(--sa-subfont); line-height: 1.4;">
已切换为收益中心固定金额规则,旧百分比不再生效。
</div>
</el-form-item>
<el-form-item v-else label="佣金比例:">
<div class="commission-item">
<div class="title">一级(自购)</div>
<div>
{{
state.data.level_info
? state.data.level_info.commission_rules.commission_1
: '0.00'
}}%
</div>
</div>
<div class="commission-item">
<div class="title">二级</div>
<div>
{{
state.data.level_info
? state.data.level_info.commission_rules.commission_2
: '0.00'
}}%
</div>
</div>
<div class="commission-item">
<div class="title">三级</div>
<div>
{{
state.data.level_info
? state.data.level_info.commission_rules.commission_3
: '0.00'
}}%
</div>
</div>
</el-form-item>
<el-form-item label="允许自动升级:">
{if $auth->check('shopro/commission/agent/edit')}
<el-switch v-model="state.data.upgrade_lock" :active-value="0" :inactive-value="1"
@change="state.data.user_id?onEdit({upgrade_lock: state.data.upgrade_lock}): ''">
</el-switch>
{/if}
</el-form-item>
<el-form-item label="直推奖(推三返一):">
<div>第 {{ state.data.direct_order_seq || 0 }} 单,{{ state.data.next_push3_text || '' }}</div>
</el-form-item>
<el-form-item label="累计推荐提成:">
<div>{{ state.data.push3_cash_income || '0.00' }} 元</div>
</el-form-item>
<div style="font-weight: 600; font-size: 13px; color: var(--sa-title); margin: 16px 0 10px; padding-bottom: 4px; border-bottom: 1px solid var(--sa-border);" class="sa-flex sa-row-between">
<span>角色身份与进阶权益</span>
{if $auth->check('shopro/commission/agent/edit')}
<el-button type="primary" size="small" link @click="onOpenIdentity">开通 / 调整身份</el-button>
{/if}
</div>
<template v-if="state.data.is_advanced">
<el-form-item label="身份标签:">
<el-tag type="warning" effect="dark" size="small">{{ state.data.identity_text }}</el-tag>
</el-form-item>
<el-form-item :label="(state.data.custom_role_names?.maker || '创客') + '等级:'">
<el-tag size="small" :type="Number(state.data.level) >= 2 ? 'primary' : 'info'">
{{ Number(state.data.level) >= 2 ? (state.data.maker_level_name || (state.data.custom_role_names?.maker || '创客') + 'V' + (Number(state.data.level) - 1)) : '未升级' + (state.data.custom_role_names?.maker || '创客') }}
</el-tag>
</el-form-item>
<el-form-item :label="(state.data.custom_role_names?.venue || '酒道馆') + ':'">
<el-tag size="small" :type="state.data.is_venue ? 'success' : 'info'">
{{ state.data.is_venue ? '已开通' : '未开通' }}
</el-tag>
</el-form-item>
<el-form-item :label="(state.data.custom_role_names?.county || '区县代理') + ':'">
<el-tag size="small" :type="state.data.is_county ? 'warning' : 'info'">
{{ state.data.is_county ? '已开通' + (state.data.county_code ? ' (' + state.data.county_code + ')' : '') : '未开通' }}
</el-tag>
</el-form-item>
<el-form-item :label="(state.data.custom_role_names?.partner || '合伙人') + ':'">
<el-tag size="small" :type="state.data.is_partner ? 'danger' : 'info'">
{{ state.data.is_partner ? '已授予' + (state.data.custom_role_names?.partner || '合伙人') : '未开通' }}
</el-tag>
</el-form-item>
<el-form-item label="30天自购考核:">
<span v-if="state.data.active_30d" style="color: #52c41a; font-weight: 500;">
🟢 正常领取
</span>
<span v-else style="color: #f56c6c; font-weight: 500;">
🔴 {{ state.data.active_status_text || '已超期暂停' }}
</span>
</el-form-item>
<el-form-item label="最近自购时间:">
{{ state.data.last_self_order_text || '从未下单' }}
</el-form-item>
<el-form-item label="进阶团队分润:">
<strong>{{ state.data.partner_exclusive_cash || '0.00' }}</strong> 元
</el-form-item>
<el-form-item label="每日获得dmepa:">
{{ state.data.madow || 0 }} 枚(约合 ¥{{ state.data.madow_value || '0.00' }})
</el-form-item>
<el-form-item label="消费补贴兑换券:">
总额 {{ state.data.voucher_total || 0 }} 个 / 已释放 {{ state.data.voucher_released || 0 }} 个 /
已使用 {{ state.data.voucher_used || 0 }} 个 / 可用 {{ state.data.voucher_available || 0 }} 个
</el-form-item>
</template>
<template v-else>
<el-form-item label="当前身份:">
<el-tag type="info" effect="plain" size="small">{{ state.data.identity_text || ('基础会员 · ' + (state.data.custom_role_names?.taster || '品酒师')) }}</el-tag>
</el-form-item>
<div style="font-size: 12px; color: var(--sa-subfont); line-height: 1.6; background: #f8fafc; border: 1px dashed var(--sa-border); border-radius: 4px; padding: 8px 12px; margin: 4px 0 10px;">
💡 <strong>进阶角色体系说明</strong>:系统拥有{{ state.data.custom_role_names?.maker || '创客' }}(V1~V6)、{{ state.data.custom_role_names?.venue || '酒道馆' }}、{{ state.data.custom_role_names?.county || '区县代理' }}、{{ state.data.custom_role_names?.partner || '合伙人' }}等独立进阶角色,享有团队分润与平台日结分红。当前会员为基础会员,享有推三返一,<strong>免自购考核</strong>。
</div>
<el-form-item label="自购考核要求:">
<el-tag size="small" type="info">免自购考核 (基础会员/{{ state.data.custom_role_names?.taster || '品酒师' }})</el-tag>
</el-form-item>
<el-form-item label="进阶权益:">
<span style="color: var(--sa-subfont);">升级{{ state.data.custom_role_names?.maker || '创客' }}或开通{{ (state.data.custom_role_names?.venue || '馆').substr(0, 1) }}/{{ (state.data.custom_role_names?.county || '县').substr(0, 1) }}/{{ (state.data.custom_role_names?.partner || '合伙').substr(0, 2) }}后即可享有团队奖、级差奖与dmepa分红</span>
</el-form-item>
</template>
<div style="font-weight: 600; font-size: 13px; color: var(--sa-title); margin: 16px 0 10px; padding-bottom: 4px; border-bottom: 1px solid var(--sa-border);">
收益中心资产汇总
</div>
<el-form-item label="收益中心累计现金:">
<span style="font-size: 16px; font-weight: 600; color: #f56c6c;">
{{ state.data.total_income || state.data.income_total_cash || '0.00' }}
</span>
<span class="ml-1" style="font-size: 12px; color: var(--sa-subfont);">元</span>
<el-tag size="small" type="success" style="margin-left: 8px;">直入钱包余额</el-tag>
</el-form-item>
<el-form-item>
<el-button type="primary" link
@click="Fast.api.open('shopro/partner/reward/index?user_id='+state.data.user_id, 'TA的收益流水')">
TA 的收益流水
</el-button>
{if $auth->check('shopro/partner/reward/reissue')}
<el-button type="primary" link
@click="Fast.api.open('shopro/partner/reward/index?user_id='+state.data.user_id+'&reissue=1', '手工补发')">
手工补发 / 扣回
</el-button>
{/if}
</el-form-item>
</el-form>
</div>
</el-col>
<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
<div class="apply-content agent-content">
<el-form size="small" label-position="right" label-width="76px">
<div class="title sa-flex sa-row-between mb-4">
<span>申请信息</span>
<div>
{if $auth->check('shopro/commission/agent/edit')}
<el-button v-if="!applyInfo.flag" type="primary" link
@click="applyInfo.flag = true">编辑</el-button>
<div v-if="applyInfo.flag" class="sa-flex">
<el-button type="danger" link @click="onCancelApplyInfo">
取消
</el-button>
<el-button type="primary" link @click="onSaveApplyInfo">保存
</el-button>
</div>
{/if}
</div>
</div>
<template v-for="(item, index) in applyInfo.data" :key="item">
<el-form-item :label="`${item.name}:`">
<div class="sa-flex sa-col-top">
<template v-if="item.type == 'text' || item.type == 'number'">
<el-input v-if="applyInfo.flag" class="sa-w-140" v-model="item.value">
</el-input>
<template v-if="!applyInfo.flag">
{{ item.value }}
</template>
</template>
<sa-image v-if="item.type == 'image'" :url="item.value"></sa-image>
<el-button v-if="applyInfo.flag" class="ml-2" type="danger" link
size="small" @click="onDeleteApplyInfo(index)">
删除
</el-button>
</div>
</el-form-item>
</template>
</el-form>
</div>
</el-col>
<el-col class="sa-col-24" :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<div class="dashboard-content agent-content op-dashboard" v-if="state.data && state.data.operational_stats">
<!-- 模块一:🎯 晋升考核与升级差距雷达 (Upgrade Radar) -->
<div class="op-radar-card" v-if="state.data.operational_stats.upgrade_radar">
<div class="op-radar-header">
<div class="op-radar-title">
<span style="font-size: 16px;">🎯</span>
<span>晋升考核与升级差距雷达</span>
<el-tag size="small" effect="plain" type="info">
当前:{{ state.data.operational_stats.upgrade_radar.current_level_name }}
</el-tag>
<el-tag size="small" type="primary" effect="dark" v-if="state.data.operational_stats.upgrade_radar.next_level > 0">
目标:{{ state.data.operational_stats.upgrade_radar.next_level_name }}
</el-tag>
<el-tag size="small" type="success" effect="dark" v-else>
已达顶级
</el-tag>
</div>
<div>
<el-tag v-if="state.data.operational_stats.upgrade_radar.upgrade_lock" type="danger" size="small">
已锁定升级
</el-tag>
<el-tag v-else-if="state.data.operational_stats.upgrade_radar.all_reached" type="success" size="small">
✓ 晋升条件全部达成
</el-tag>
<el-tag v-else-if="state.data.operational_stats.upgrade_radar.next_level > 0" type="warning" size="small">
考核晋升中
</el-tag>
</div>
</div>
<div class="op-radar-body" v-if="state.data.operational_stats.upgrade_radar.next_level > 0">
<!-- 直推实名/有效品酒师考核 -->
<div class="op-radar-metric" v-if="state.data.operational_stats.upgrade_radar.target_direct_agents > 0">
<div class="m-label">
<span>
直推有效品酒师
<el-popover placement="top" trigger="hover" content="需直推用户完成首单自购(child_order_count_0 ≥ 1)激活为有效品酒师">
<template #reference>
<span style="cursor: pointer; color: #94a3b8; font-size: 11px;">ℹ️ 说明</span>
</template>
</el-popover>
</span>
<el-tag size="small" :type="state.data.operational_stats.upgrade_radar.direct_agent_reached ? 'success' : 'danger'">
{{ state.data.operational_stats.upgrade_radar.direct_agent_reached ? '已达标' : '缺 ' + state.data.operational_stats.upgrade_radar.direct_agent_gap + ' 人' }}
</el-tag>
</div>
<div class="m-val">
{{ state.data.operational_stats.upgrade_radar.current_direct_agents }}
<span style="font-size: 12px; color: #94a3b8; font-weight: normal;"> / {{ state.data.operational_stats.upgrade_radar.target_direct_agents }} 人</span>
</div>
<el-progress :percentage="state.data.operational_stats.upgrade_radar.direct_agent_percent"
:status="state.data.operational_stats.upgrade_radar.direct_agent_reached ? 'success' : 'warning'"
:stroke-width="6" style="margin-top: 6px;"></el-progress>
</div>
<div class="op-radar-metric" v-else>
<div class="m-label">
<span>有效直推人数指标</span>
<el-tag size="small" :type="state.data.operational_stats.upgrade_radar.direct_user_reached ? 'success' : 'danger'">
{{ state.data.operational_stats.upgrade_radar.direct_user_reached ? '已达标' : '缺 ' + state.data.operational_stats.upgrade_radar.direct_user_gap + ' 人' }}
</el-tag>
</div>
<div class="m-val">
{{ state.data.operational_stats.upgrade_radar.current_direct_users }}
<span style="font-size: 12px; color: #94a3b8; font-weight: normal;"> / {{ state.data.operational_stats.upgrade_radar.target_direct_users }} 人</span>
</div>
<el-progress :percentage="state.data.operational_stats.upgrade_radar.direct_user_percent"
:status="state.data.operational_stats.upgrade_radar.direct_user_reached ? 'success' : 'warning'"
:stroke-width="6" style="margin-top: 6px;"></el-progress>
</div>
<!-- 团队有效订单考核 -->
<div class="op-radar-metric">
<div class="m-label">
<span>团队有效订单指标</span>
<el-tag size="small" :type="state.data.operational_stats.upgrade_radar.team_order_reached ? 'success' : 'danger'">
{{ state.data.operational_stats.upgrade_radar.team_order_reached ? '已达标' : '缺 ' + state.data.operational_stats.upgrade_radar.team_order_gap + ' 单' }}
</el-tag>
</div>
<div class="m-val">
{{ state.data.operational_stats.upgrade_radar.current_team_orders }}
<span style="font-size: 12px; color: #94a3b8; font-weight: normal;"> / {{ state.data.operational_stats.upgrade_radar.target_team_orders }} 单</span>
</div>
<el-progress :percentage="state.data.operational_stats.upgrade_radar.team_order_percent"
:status="state.data.operational_stats.upgrade_radar.team_order_reached ? 'success' : 'warning'"
:stroke-width="6" style="margin-top: 6px;"></el-progress>
</div>
<!-- 个人自购门槛 -->
<div class="op-radar-metric">
<div class="m-label">
<span>个人自购资格门槛</span>
<el-tag size="small" :type="state.data.operational_stats.upgrade_radar.self_paid_reached ? 'success' : 'danger'">
{{ state.data.operational_stats.upgrade_radar.self_paid_reached ? '已满足' : '未购买' }}
</el-tag>
</div>
<div class="m-val" style="font-size: 14px; margin-top: 4px;">
<span v-if="state.data.operational_stats.upgrade_radar.self_paid_reached" style="color: #10b981; font-weight: 600;">✓ 具备业务升级资格</span>
<span v-else style="color: #ef4444; font-weight: 600;">✕ 需完成首单自购(≥1398元)</span>
</div>
</div>
</div>
<div v-else style="padding: 10px 0; color: #10b981; font-weight: 500; font-size: 13px;">
★ 该账号已达到平台顶峰合伙人级别,尊享平台级加权均分红与管理奖励!
</div>
</div>
<!-- 模块二:👥 团队角色拓扑看板 (Roles & Team) -->
<div class="op-section-title">
<div class="sa-flex">
<span style="font-size: 16px; margin-right: 6px;">👥</span>
<span>团队角色与组织拓扑看板</span>
</div>
<div class="sa-flex">
{if $auth->check('shopro/commission/agent/team')}
<el-button type="primary" link @click="onTeam">查看层级拓扑树</el-button>
{/if}
</div>
</div>
<el-row :gutter="12">
<!-- 直推人员池 -->
<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<div class="op-grid-box">
<div class="box-title">
<span>直推成员池 (Direct)</span>
<el-tag size="small" type="primary">{{ state.data.operational_stats.roles.direct_total }} 人</el-tag>
</div>
<div class="op-stat-row">
<span class="stat-label">已首购有效用户:</span>
<span class="stat-val success">{{ state.data.operational_stats.roles.direct_paid }} 人</span>
</div>
<div class="op-stat-row">
<span class="stat-label">未购买注册粉丝:</span>
<span class="stat-val">{{ state.data.operational_stats.roles.direct_unpaid }} 人</span>
</div>
<div class="op-stat-row">
<span class="stat-label">直推创客领袖:</span>
<span class="stat-val primary">{{ state.data.operational_stats.roles.direct_maker }} 人</span>
</div>
</div>
</el-col>
<!-- 核心业务骨干 -->
<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<div class="op-grid-box">
<div class="box-title">
<span>核心业务骨干 (Backbone)</span>
<el-popover placement="top" trigger="hover" width="220">
<div style="font-size: 12px; line-height: 20px;">
<div style="font-weight: 600; margin-bottom: 4px;">创客各级分布:</div>
<div>V1创客: {{ state.data.operational_stats.roles.team_maker_distribution.v1 || 0 }} 人</div>
<div>V2创客: {{ state.data.operational_stats.roles.team_maker_distribution.v2 || 0 }} 人</div>
<div>V3创客: {{ state.data.operational_stats.roles.team_maker_distribution.v3 || 0 }} 人</div>
<div>V4创客: {{ state.data.operational_stats.roles.team_maker_distribution.v4 || 0 }} 人</div>
<div>V5创客: {{ state.data.operational_stats.roles.team_maker_distribution.v5 || 0 }} 人</div>
<div>V6创客: {{ state.data.operational_stats.roles.team_maker_distribution.v6 || 0 }} 人</div>
</div>
<template #reference>
<span style="cursor: pointer; color: #94a3b8; font-size: 13px;">ℹ️ 分布详情</span>
</template>
</el-popover>
</div>
<div class="op-stat-row">
<span class="stat-label">创客合伙人 (V1-V6):</span>
<span class="stat-val purple">{{ state.data.operational_stats.roles.team_maker }} 人</span>
</div>
<div class="op-stat-row">
<span class="stat-label">酒道馆签约馆长:</span>
<span class="stat-val warning">{{ state.data.operational_stats.roles.team_venue }} 个</span>
</div>
<div class="op-stat-row">
<span class="stat-label">区县代理办事处:</span>
<span class="stat-val danger">{{ state.data.operational_stats.roles.team_county }} 个</span>
</div>
</div>
</el-col>
<!-- 团队总网络规模 -->
<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<div class="op-grid-box">
<div class="box-title">
<span>全网团队规模 (Network)</span>
<el-tag size="small" type="success">{{ state.data.operational_stats.roles.team_total }} 人</el-tag>
</div>
<div class="op-stat-row">
<span class="stat-label">全网已出单活跃人数:</span>
<span class="stat-val success">{{ state.data.operational_stats.roles.team_paid }} 人</span>
</div>
<div class="op-stat-row">
<span class="stat-label">全网激活转化率:</span>
<span class="stat-val">{{ state.data.operational_stats.roles.team_conversion_rate }}%</span>
</div>
<div class="op-stat-row">
<span class="stat-label">二级直属团队人数:</span>
<span class="stat-val">{{ state.data.child_user_count_2 || 0 }} 人</span>
</div>
</div>
</el-col>
</el-row>
<!-- 模块三:📦 业务业绩与订单流向看板 (Orders & GMV) -->
<div class="op-section-title">
<div class="sa-flex">
<span style="font-size: 16px; margin-right: 6px;">📦</span>
<span>业务业绩与订单流向看板</span>
</div>
</div>
<el-row :gutter="12">
<!-- 自购订单 -->
<el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">个人自购业绩</div>
<div class="op-stat-row">
<span class="stat-label">自购成交额:</span>
<span class="stat-val success">¥{{ state.data.operational_stats.orders.self_money }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">自购订单数:</span>
<span class="stat-val">{{ state.data.operational_stats.orders.self_count }} 单</span>
</div>
</div>
</el-col>
<!-- 直推订单 (一级) -->
<el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">直推客户业绩 (一级)</div>
<div class="op-stat-row">
<span class="stat-label">直推成交额:</span>
<span class="stat-val primary">¥{{ state.data.operational_stats.orders.direct_money }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">直推订单数:</span>
<span class="stat-val">{{ state.data.operational_stats.orders.direct_count }} 单</span>
</div>
</div>
</el-col>
<!-- 间推订单 (二级) -->
<el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">次级裂变业绩 (二级)</div>
<div class="op-stat-row">
<span class="stat-label">间推成交额:</span>
<span class="stat-val cyan">¥{{ state.data.operational_stats.orders.indirect_money }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">间推订单数:</span>
<span class="stat-val">{{ state.data.operational_stats.orders.indirect_count }} 单</span>
</div>
</div>
</el-col>
<!-- 全团队业绩汇总 -->
<el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">全网团队总流水 (GMV)</div>
<div class="op-stat-row">
<span class="stat-label">全网成交总额:</span>
<span class="stat-val danger">¥{{ state.data.operational_stats.orders.team_money }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">全网出单总数:</span>
<span class="stat-val">{{ state.data.operational_stats.orders.team_count }} 单</span>
</div>
</div>
</el-col>
</el-row>
<!-- 模块四:💰 收益中心分成与资产闭环 (Rewards & Scheme B Balance) -->
<div class="op-section-title">
<div class="sa-flex">
<span style="font-size: 16px; margin-right: 6px;">💰</span>
<span>收益中心分成明细与资产闭环 (方案B一体化大余额)</span>
</div>
</div>
<el-row :gutter="12">
<!-- 方案B核心钱包可用余额 -->
<el-col :xs="24" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box" style="background: #f0fdf4; border: 1px solid #bbf7d0;">
<div class="box-title" style="color: #166534;">
<span>钱包可用余额 (money)</span>
<el-tag size="small" type="success" effect="dark">可提现</el-tag>
</div>
<div style="font-size: 22px; font-weight: 700; color: #15803d; margin: 8px 0;">
¥{{ state.data.operational_stats.assets.wallet_money || '0.00' }}
</div>
<div style="font-size: 11px; color: #16a34a; line-height: 18px;">
✓ 收益入账此钱包,提现扣除此余额
</div>
</div>
</el-col>
<!-- 专项业务奖励细项 -->
<el-col :xs="24" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">
<span>业务奖励构成细项</span>
<span style="font-size: 12px; color: #64748b;">累计: ¥{{ state.data.operational_stats.assets.total_income }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">推三返一收益:</span>
<span class="stat-val primary">¥{{ state.data.operational_stats.rewards.push3 }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">创客极差/平级/超越:</span>
<span class="stat-val purple">¥{{ state.data.operational_stats.rewards.maker_total }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">馆/县团队管理奖:</span>
<span class="stat-val warning">¥{{ state.data.operational_stats.rewards.team_split }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">平台日结均分池:</span>
<span class="stat-val success">¥{{ state.data.operational_stats.rewards.share_pool }}</span>
</div>
</div>
</el-col>
<!-- DMEPA数字资产 -->
<el-col :xs="24" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">
<span>DMEPA 专属数字资产</span>
<el-tag size="small" type="warning">生态资产</el-tag>
</div>
<div class="op-stat-row">
<span class="stat-label">DMEPA 持仓数量:</span>
<span class="stat-val purple">{{ state.data.operational_stats.assets.dmepa_madow }} 枚</span>
</div>
<div class="op-stat-row">
<span class="stat-label">实时市值折算:</span>
<span class="stat-val">¥{{ state.data.operational_stats.assets.dmepa_value }}</span>
</div>
<div class="op-stat-row">
<span class="stat-label">历史未转佣金:</span>
<span class="stat-val warning">¥{{ state.data.operational_stats.assets.untransfer_commission }}</span>
</div>
</div>
</el-col>
<!-- 365天消费补贴券 -->
<el-col :xs="24" :sm="6" :md="6" :lg="6" :xl="6">
<div class="op-grid-box">
<div class="box-title">
<span>365天消费补贴券</span>
<el-tag size="small" type="info">逐日释放</el-tag>
</div>
<div class="op-stat-row">
<span class="stat-label">当前可用补贴券:</span>
<span class="stat-val success">{{ state.data.operational_stats.assets.voucher_available }} 个</span>
</div>
<div class="op-stat-row">
<span class="stat-label">累计释放补贴券:</span>
<span class="stat-val">{{ state.data.operational_stats.assets.voucher_released }} 个</span>
</div>
<div class="op-stat-row">
<span class="stat-label">补贴券总额度:</span>
<span class="stat-val">{{ state.data.operational_stats.assets.voucher_total }} 个</span>
</div>
</div>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
<el-tabs class="sa-tabs" v-model="log.tabActive" @tab-change="onChangeTab">
<el-tab-pane label="分销动态" name="log"></el-tab-pane>
<el-tab-pane label="分销订单" name="order"></el-tab-pane>
<el-tab-pane label="历史分销佣金" name="reward"></el-tab-pane>
</el-tabs>
<el-table v-if="log.tabActive=='log'" class="sa-table" :data="log.data" stripe>
<el-table-column prop="id" label="ID" min-width="90"></el-table-column>
<el-table-column label="分销商" min-width="160">
<template #default="scope">
<sa-user-profile :user="scope.row.agent" :id="scope.row.agent_id"></sa-user-profile>
</template>
</el-table-column>
<el-table-column prop="remark" label="内容" min-width="300"></el-table-column>
<el-table-column label="操作人" min-width="160">
<template #default="scope">
<sa-user-profile type="oper" :user="scope.row.oper" :id="scope.row.oper_id">
</sa-user-profile>
</template>
</el-table-column>
<el-table-column prop="createtime" label="动态时间" width="172"></el-table-column>
</el-table>
<el-table v-if="log.tabActive=='order'" class="sa-table" :data="log.data" stripe>
<el-table-column prop="id" label="ID" min-width="90"></el-table-column>
<el-table-column label="订单号" min-width="260">
<template #default="scope">
{{ scope.row.order?.order_sn || scope.row.order_id }}
</template>
</el-table-column>
<el-table-column label="下单用户" min-width="160">
<template #default="scope">
<sa-user-profile :user="scope.row.buyer" :id="scope.row.buyer_id"></sa-user-profile>
</template>
</el-table-column>
<el-table-column label="分佣状态" min-width="100">
<template #default="scope">
<span :class="`sa-color--${log.status[scope.row.commission_reward_status]}`">
{{ scope.row.commission_reward_status_text }}
</span>
</template>
</el-table-column>
<el-table-column label="商品结算金额" min-width="160">
<template #default="scope"> {{ scope.row.amount }}元 </template>
</el-table-column>
<el-table-column label="分销总金额/到账金额" min-width="160">
<template #default="scope">
{{ countCommission(scope.row.rewards) }}
</template>
</el-table-column>
<el-table-column label="佣金详情" min-width="200" align="center">
<template #default="scope">
<div class="sa-flex sa-row-center">
<div class="rewards-item sa-flex sa-flex-col" v-for="rewards in scope.row.rewards"
:key="rewards">
<template v-if="rewards.agent">
<sa-image :url="rewards.agent.avatar" size="32" radius="16"></sa-image>
</template>
<template v-if="!rewards.agent">
{{ rewards.agent_id }}
</template>
<div class="commission sa-m-t-6">{{ rewards.commission }}元</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="commission_time" label="加入时间" width="172"></el-table-column>
</el-table>
<el-table v-if="log.tabActive=='reward'" class="sa-table" :data="log.data" stripe>
<el-table-column prop="id" label="ID" min-width="90"></el-table-column>
<el-table-column label="订单号" min-width="260">
<template #default="scope">
{{ scope.row.order?.order_sn || scope.row.order_id }}
</template>
</el-table-column>
<el-table-column label="下单用户" min-width="160">
<template #default="scope">
<sa-user-profile :user="scope.row.buyer" :id="scope.row.buyer_id"></sa-user-profile>
</template>
</el-table-column>
<el-table-column label="分销用户" min-width="160">
<template #default="scope">
<sa-user-profile :user="scope.row.agent" :id="scope.row.agent_id"></sa-user-profile>
</template>
</el-table-column>
<el-table-column label="分销金额" min-width="160">
<template #default="scope"> {{ scope.row.commission }}元 </template>
</el-table-column>
<el-table-column label="入账状态" min-width="80">
<template #default="scope">
<span :class="`sa-color--${log.status[scope.row.status]}`">
{{ scope.row.status_text }}
</span>
</template>
</el-table-column>
<el-table-column prop="type_text" label="入账方式" min-width="80"></el-table-column>
<el-table-column prop="commission_time" label="分佣时间" width="172"></el-table-column>
</el-table>
<el-footer class="sa-footer sa-flex sa-row-right">
<sa-pagination v-model="pagination" @pagination-change="getLog"></sa-pagination>
</el-footer>
</el-scrollbar>
</el-main>
</el-container>
<el-dialog v-model="identity.visible" title="开通 / 调整身份" width="520px" destroy-on-close>
<el-form label-width="100px">
<el-form-item label="用户">{{ identity.form.nickname || state.data.user_id }}</el-form-item>
<el-form-item label="当前身份">{{ identity.form.before_text || '-' }}</el-form-item>
<el-form-item label="创客等级" required>
<el-select v-model="identity.form.level" style="width:100%">
<el-option v-for="item in identity.levels" :key="item.level" :label="item.name"
:value="item.level"></el-option>
</el-select>
</el-form-item>
<el-form-item label="酒道馆">
<el-switch v-model="identity.form.is_venue" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item label="区县代理">
<el-switch v-model="identity.form.is_county" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item v-if="identity.form.is_county" label="区县" required>
<el-cascader v-model="identity.form.area_arr" :options="identity.areaSelect" :props="{
value: 'id', label: 'name', children: 'children', checkStrictly: true, emitPath: true
}" clearable filterable style="width:100%" @change="onIdentityAreaChange"></el-cascader>
</el-form-item>
<el-form-item label="升级锁定">
<el-switch v-model="identity.form.upgrade_lock" :active-value="1" :inactive-value="0"></el-switch>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="identity.form.remark" type="textarea"></el-input>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="identity.visible=false">取消</el-button>
<el-button type="primary" :loading="identity.loading" @click="onSubmitIdentity">确定</el-button>
</template>
</el-dialog>
</div>