766 行
47 KiB
HTML
766 行
47 KiB
HTML
{include file="/shopro/common/script" /}
|
||
|
||
<style>
|
||
.user-detail {
|
||
background: #fff;
|
||
height: 100vh;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.user-detail .panel-block {
|
||
height: 100%;
|
||
}
|
||
|
||
.user-detail .detail-header-bar {
|
||
padding: 12px 16px;
|
||
margin-bottom: 12px;
|
||
background: #fff;
|
||
border-radius: 6px;
|
||
border: 1px solid var(--sa-border);
|
||
}
|
||
|
||
.user-detail .detail-title-text {
|
||
font-size: 16px;
|
||
font-weight: 600;
|
||
margin-left: 12px;
|
||
color: var(--sa-title);
|
||
}
|
||
|
||
.user-detail .user-detail-scrollbar>.el-scrollbar__wrap {
|
||
overflow-x: hidden;
|
||
}
|
||
|
||
.user-detail .user-detail-scrollbar>.el-scrollbar__bar.is-horizontal {
|
||
display: none;
|
||
}
|
||
|
||
.user-detail .card-title {
|
||
height: 32px;
|
||
line-height: 32px;
|
||
font-size: 15px;
|
||
font-weight: 600;
|
||
color: var(--sa-subtitle);
|
||
margin-bottom: 8px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
.user-detail .card-section {
|
||
padding: 16px;
|
||
background: var(--sa-table-header-bg);
|
||
border-radius: 8px;
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.user-detail .left {
|
||
height: 14px;
|
||
line-height: 14px;
|
||
font-size: 12px;
|
||
font-weight: 500;
|
||
color: var(--sa-subfont);
|
||
margin-bottom: 6px;
|
||
}
|
||
|
||
.user-detail .right {
|
||
line-height: 28px;
|
||
font-size: 14px;
|
||
font-weight: 400;
|
||
color: var(--sa-subtitle);
|
||
}
|
||
|
||
.user-detail .info {
|
||
padding: 16px 16px 4px;
|
||
background: var(--sa-background-assist);
|
||
border-radius: 6px;
|
||
}
|
||
|
||
.user-detail .info .el-col {
|
||
margin-bottom: 14px;
|
||
}
|
||
|
||
.user-detail .asset-card-box {
|
||
background: #fff;
|
||
border: 1px solid var(--sa-border);
|
||
border-radius: 6px;
|
||
padding: 12px 14px;
|
||
margin-bottom: 12px;
|
||
}
|
||
|
||
.user-detail .asset-card-num {
|
||
font-size: 18px;
|
||
font-weight: 600;
|
||
color: var(--sa-title);
|
||
margin-top: 4px;
|
||
}
|
||
|
||
.user-detail .asset-card-label {
|
||
font-size: 12px;
|
||
color: var(--sa-subfont);
|
||
}
|
||
|
||
.user-detail .asset-card-desc {
|
||
font-size: 11px;
|
||
color: var(--sa-subfont);
|
||
margin-top: 3px;
|
||
}
|
||
|
||
.user-detail .active-dot {
|
||
display: inline-block;
|
||
width: 8px;
|
||
height: 8px;
|
||
border-radius: 50%;
|
||
margin-right: 6px;
|
||
}
|
||
.user-detail .active-dot.is-on {
|
||
background: #52c41a;
|
||
}
|
||
.user-detail .active-dot.is-off {
|
||
background: #c0c4cc;
|
||
}
|
||
|
||
.user-detail .log .card-section {
|
||
padding: 0;
|
||
background: var(--sa-background-assist);
|
||
}
|
||
|
||
.user-detail .el-tabs__nav-wrap::after {
|
||
height: 0;
|
||
}
|
||
|
||
.user-detail .third-oauth .provider-platform {
|
||
flex-shrink: 0;
|
||
width: 32px;
|
||
height: 32px;
|
||
}
|
||
|
||
.user-detail .third-oauth .provider-item {
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.user-detail .third-oauth .provider-item:last-of-type {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.user-detail .formula-box {
|
||
background: #f8fafc;
|
||
border: 1px solid var(--sa-border);
|
||
border-radius: 6px;
|
||
padding: 12px;
|
||
font-family: monospace;
|
||
font-size: 12px;
|
||
line-height: 1.6;
|
||
white-space: pre-wrap;
|
||
word-break: break-all;
|
||
}
|
||
</style>
|
||
|
||
<div id="detail" class="user-detail" v-cloak>
|
||
<el-container class="panel-block">
|
||
<el-main style="padding: 12px 16px;">
|
||
<!-- 顶部导航条(用于选项卡或全屏页面操作) -->
|
||
<div class="detail-header-bar sa-flex sa-row-between">
|
||
<div class="sa-flex sa-col-center">
|
||
<el-button icon="Back" @click="onBack">返回</el-button>
|
||
<span class="detail-title-text">
|
||
会员详情 - {{ state.detail.nickname || state.detail.username || '会员' }} (#{{ state.detail.id }})
|
||
</span>
|
||
<el-tag :type="state.detail.status == 'normal' ? 'success' : 'danger'" size="small" class="ml-2">
|
||
{{ state.detail.status == 'normal' ? '正常' : '已禁用' }}
|
||
</el-tag>
|
||
<el-tag v-if="state.detail.identity_text" type="primary" size="small" class="ml-2">
|
||
{{ state.detail.identity_text }}
|
||
</el-tag>
|
||
</div>
|
||
<div class="sa-flex">
|
||
<el-button v-if="state.detail.has_agent" type="success" @click="onOpenAgentDetail(state.detail.id)">
|
||
收益中心分销商档案
|
||
</el-button>
|
||
{if $auth->check('shopro/user/user/recharge')}
|
||
<el-dropdown trigger="click" @command="onRecharge">
|
||
<el-button type="warning">
|
||
账户充值 <el-icon class="el-icon--right"><arrow-down /></el-icon>
|
||
</el-button>
|
||
<template #dropdown>
|
||
<el-dropdown-menu>
|
||
<el-dropdown-item command="money">充值余额 (元)</el-dropdown-item>
|
||
<el-dropdown-item command="madow">充值dmepa (枚)</el-dropdown-item>
|
||
<el-dropdown-item command="score">充值积分 (分)</el-dropdown-item>
|
||
<el-dropdown-item command="voucher">充值兑换券 (个)</el-dropdown-item>
|
||
</el-dropdown-menu>
|
||
</template>
|
||
</el-dropdown>
|
||
{/if}
|
||
<el-button class="sa-button-refresh ml-2" icon="RefreshRight" @click="getDetail"></el-button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 可滚动核心区域 -->
|
||
<el-scrollbar class="user-detail-scrollbar" style="height: calc(100vh - 76px);">
|
||
<el-row :gutter="16">
|
||
<!-- 左列:基本信息与账号安全 -->
|
||
<el-col class="sa-col-24" :xs="24" :sm="24" :md="7" :lg="7" :xl="7">
|
||
<div class="card-title">基本信息</div>
|
||
<div class="card-section">
|
||
<div class="sa-flex sa-row-between mb-3">
|
||
<div class="sa-flex sa-flex-1">
|
||
<sa-image :url="state.detail.avatar" size="60" radius="30"></sa-image>
|
||
<div class="ml-3 sa-flex-1">
|
||
<div class="nickname mb-1 sa-table-line-1" style="font-weight: 600;">
|
||
{{ state.detail.nickname }}
|
||
</div>
|
||
<div class="id" style="color: var(--sa-subfont); font-size: 12px;">#{{ state.detail.id }}</div>
|
||
</div>
|
||
</div>
|
||
{if $auth->check('shopro/user/user/edit')}
|
||
<el-button type="primary" link @click="onSelectAvatar">更换头像</el-button>
|
||
{/if}
|
||
</div>
|
||
<div class="info">
|
||
<el-row :gutter="16">
|
||
<el-col :span="24">
|
||
<div class="left">昵称</div>
|
||
<div class="right">
|
||
<el-input v-model="state.detail.nickname" />
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="left">性别</div>
|
||
<div class="right">
|
||
<el-radio-group v-model="state.detail.gender">
|
||
<el-radio :label="0">女</el-radio>
|
||
<el-radio :label="1">男</el-radio>
|
||
</el-radio-group>
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="left">用户名</div>
|
||
<div class="right">
|
||
<el-input v-model="state.detail.username" placeholder="首位需为字母且不少五位">
|
||
<template #suffix>
|
||
<span v-html="statusStyle('username')"></span>
|
||
</template>
|
||
</el-input>
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="left">密码</div>
|
||
<div class="right">
|
||
<el-input v-model="state.detail.password" placeholder="不修改则留空">
|
||
<template #suffix>
|
||
<span v-html="statusStyle('password')"></span>
|
||
</template>
|
||
</el-input>
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="left">手机号</div>
|
||
<div class="right">
|
||
<el-input v-model="state.detail.mobile" type="number">
|
||
<template #suffix>
|
||
<span v-html="statusStyle('mobile')"></span>
|
||
</template>
|
||
</el-input>
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="left">电子邮箱</div>
|
||
<div class="right">
|
||
<el-input v-model="state.detail.email">
|
||
<template #suffix>
|
||
<span v-html="statusStyle('email')"></span>
|
||
</template>
|
||
</el-input>
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="left">状态</div>
|
||
<div class="right">
|
||
<el-radio-group v-model="state.detail.status">
|
||
<el-radio label="normal">正常</el-radio>
|
||
<el-radio label="disabled">禁用</el-radio>
|
||
</el-radio-group>
|
||
</div>
|
||
</el-col>
|
||
<el-col :span="24">
|
||
<div class="right sa-flex sa-row-right">
|
||
<el-button @click="getDetail">重置</el-button>
|
||
{if $auth->check('shopro/user/user/edit')}
|
||
<el-button type="primary" @click="onSave">保存修改</el-button>
|
||
{/if}
|
||
</div>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 第三方账号绑定 -->
|
||
<div v-if="state.detail.third_oauth?.length > 0">
|
||
<div class="card-title">第三方账号绑定</div>
|
||
<div class="card-section third-oauth">
|
||
<div class="info">
|
||
<div class="provider-item sa-flex sa-row-between"
|
||
v-for="item in state.detail.third_oauth" :key="item.id">
|
||
<div class="sa-flex">
|
||
<img class="provider-platform"
|
||
:src="`/assets/addons/shopro/img/user/${item.provider}/${item.platform}.png`" />
|
||
<span class="ml-2">
|
||
{{ platform[item.provider]?.[item.platform] || item.platform }}
|
||
</span>
|
||
</div>
|
||
<el-popover popper-class="sa-popper" placement="top-start" trigger="hover">
|
||
<div>
|
||
<div>登录次数:{{ item.login_num }}</div>
|
||
<div>Openid:{{ item.openid }}</div>
|
||
<div v-if="item.unionid">Unionid:{{ item.unionid }}</div>
|
||
<div>更新时间:{{ item.updatetime }}</div>
|
||
</div>
|
||
<template #reference>
|
||
<div class="sa-flex">
|
||
<sa-image :url="item.avatar" size="28"></sa-image>
|
||
<span class="name ml-2">{{ item.nickname }}</span>
|
||
</div>
|
||
</template>
|
||
</el-popover>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</el-col>
|
||
|
||
<!-- 右列:二开身份权益、四大资产看板、全能动态流水 -->
|
||
<el-col class="sa-col-24" :xs="24" :sm="24" :md="17" :lg="17" :xl="17">
|
||
<!-- 看板 1:业务身份与二开权益体系 -->
|
||
<div class="card-title">
|
||
<span>业务身份与二开权益体系</span>
|
||
<span v-if="state.detail.has_agent" style="font-size: 12px; font-weight: normal; color: var(--sa-subfont);">
|
||
直推有效单数: {{ state.detail.direct_order_seq || 0 }} 单
|
||
</span>
|
||
</div>
|
||
<div class="card-section">
|
||
<div class="info">
|
||
<el-row :gutter="16">
|
||
<el-col :xs="24" :sm="12" :md="12">
|
||
<div class="left">推荐人 / 直属上级</div>
|
||
<div class="right sa-flex">
|
||
<sa-user-profile type="agent" :user="state.detail.parent_user"
|
||
:id="state.detail.parent_user_id"></sa-user-profile>
|
||
<el-button v-if="state.detail.parent_user_id" class="ml-2" type="primary" link
|
||
@click="onOpenUserDetail(state.detail.parent_user_id)">
|
||
查看上级
|
||
</el-button>
|
||
{if $is_pro}
|
||
<el-button class="ml-2" type="warning" link @click="onChangeParentUser">
|
||
更换
|
||
</el-button>
|
||
{/if}
|
||
</div>
|
||
</el-col>
|
||
|
||
<el-col :xs="24" :sm="12" :md="12">
|
||
<div class="left">主业务身份</div>
|
||
<div class="right">
|
||
<b style="font-size: 15px;">{{ state.detail.identity_text || '普通注册会员' }}</b>
|
||
</div>
|
||
</el-col>
|
||
|
||
<el-col :xs="24" :sm="12" :md="12">
|
||
<div class="left">30天自购活跃窗口(风控硬性门槛)</div>
|
||
<div class="right sa-flex sa-col-center">
|
||
<i class="active-dot" :class="state.detail.active_30d ? 'is-on' : 'is-off'"></i>
|
||
<span>{{ state.detail.active_status_text }}</span>
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
最近自购: {{ state.detail.last_self_order_text }}
|
||
</div>
|
||
</el-col>
|
||
|
||
<el-col :xs="24" :sm="12" :md="12">
|
||
<div class="left">直推「推三返一」循环进度</div>
|
||
<div class="right">
|
||
<span style="color: #e6a23c; font-weight: 600;">
|
||
第 {{ state.detail.push3_cycle_index || 1 }} 档 (398/400/600循环)
|
||
</span>
|
||
<span class="ml-2" style="font-size: 12px; color: var(--sa-subfont);">
|
||
{{ state.detail.next_push3_text }}
|
||
</span>
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
累计获得推三返一: ¥{{ state.detail.push3_cash_income || '0.00' }}
|
||
</div>
|
||
</el-col>
|
||
|
||
<el-col :span="24">
|
||
<div class="left">身份权益徽章清单</div>
|
||
<div class="right sa-flex sa-flex-wrap" style="gap: 8px;">
|
||
<el-tag v-if="state.detail.level == 1" type="info">
|
||
品酒师 (基础会员·享推三返一/GMV分红/1.5倍券)
|
||
</el-tag>
|
||
<el-tag v-if="state.detail.level >= 2" type="primary">
|
||
创客 V{{ state.detail.level - 1 }} (合伙骨干·享极差/平级10%/超越5%)
|
||
</el-tag>
|
||
<el-tag v-if="state.detail.is_venue" type="success">
|
||
酒道馆 (线下实体枢纽·享50元/单团队奖+100元均分池)
|
||
</el-tag>
|
||
<el-tag v-if="state.detail.is_county" type="warning">
|
||
区县代理 (区域领头人·享团队拆分奖+50元均分池)
|
||
</el-tag>
|
||
<el-tag v-if="state.detail.is_partner" type="danger">
|
||
合伙股东 (独立高阶合伙身份·享顶层红利)
|
||
</el-tag>
|
||
</div>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 看板 2:二开收益中心四大资产核心中枢 -->
|
||
<div class="card-title">二开核心资产中枢</div>
|
||
<div class="card-section">
|
||
<el-row :gutter="12">
|
||
<!-- 资产 1: 收益中心 -->
|
||
<el-col :xs="24" :sm="12" :md="6">
|
||
<div class="asset-card-box">
|
||
<div class="asset-card-label">收益中心累计收益 (元)</div>
|
||
<div class="asset-card-num" style="color: #409eff;">
|
||
¥{{ state.detail.total_income || state.detail.income_total_cash || '0.00' }}
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
当前商城余额: ¥{{ state.detail.money || '0.00' }}
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
历史未转佣金: ¥{{ state.detail.commission || '0.00' }}
|
||
</div>
|
||
</div>
|
||
</el-col>
|
||
|
||
<!-- 资产 2: 分红dmepa -->
|
||
<el-col :xs="24" :sm="12" :md="6">
|
||
<div class="asset-card-box">
|
||
<div class="asset-card-label sa-flex sa-row-between" style="display: flex; justify-content: space-between; align-items: center;">
|
||
<span>分红dmepa</span>
|
||
{if $auth->check('shopro/user/user/recharge')}
|
||
<el-button type="success" link size="small" @click="onRecharge('madow')">充值/扣除</el-button>
|
||
{/if}
|
||
</div>
|
||
<div class="asset-card-num" style="color: #67c23a;">
|
||
{{ state.detail.madow || 0 }} <span style="font-size: 13px;">枚</span>
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
当前估值: ¥{{ state.detail.madow_value || '0.00' }}
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
实时汇率: {{ state.detail.madow_rate || '0.00000075' }}
|
||
</div>
|
||
</div>
|
||
</el-col>
|
||
|
||
<!-- 资产 3: 商城兑换券 -->
|
||
<el-col :xs="24" :sm="12" :md="6">
|
||
<div class="asset-card-box">
|
||
<div class="asset-card-label sa-flex sa-row-between" style="display: flex; justify-content: space-between; align-items: center;">
|
||
<span>商城可用兑换券</span>
|
||
{if $auth->check('shopro/user/user/recharge')}
|
||
<el-button type="warning" link size="small" @click="onRecharge('voucher')">充值/扣除</el-button>
|
||
{/if}
|
||
</div>
|
||
<div class="asset-card-num" style="color: #e6a23c;">
|
||
{{ state.detail.voucher_available || '0.00' }} 个
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
计划总额: {{ state.detail.voucher_total || '0.00' }} 个
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
已释放: {{ state.detail.voucher_released || '0.00' }} 个 / 已用: {{ state.detail.voucher_used || '0.00' }} 个
|
||
</div>
|
||
</div>
|
||
</el-col>
|
||
|
||
<!-- 资产 4: 基础钱包与消费 -->
|
||
<el-col :xs="24" :sm="12" :md="6">
|
||
<div class="asset-card-box">
|
||
<div class="asset-card-label sa-flex sa-row-between" style="display: flex; justify-content: space-between; align-items: center;">
|
||
<span>商城余额 / 积分</span>
|
||
{if $auth->check('shopro/user/user/recharge')}
|
||
<div>
|
||
<el-button type="primary" link size="small" @click="onRecharge('money')">充余额</el-button>
|
||
<el-button type="primary" link size="small" @click="onRecharge('score')">充积分</el-button>
|
||
</div>
|
||
{/if}
|
||
</div>
|
||
<div class="asset-card-num" style="color: #303133;">
|
||
¥{{ state.detail.money || '0.00' }}
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
商城积分: {{ state.detail.score || 0 }}
|
||
</div>
|
||
<div class="asset-card-desc">
|
||
累计消费: ¥{{ state.detail.total_consume || '0.00' }}
|
||
</div>
|
||
</div>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
|
||
<!-- 看板 3:全能用户动态与流水明细 -->
|
||
<div class="card-title sa-flex sa-row-between">
|
||
<span>全能动态与业务流水</span>
|
||
<div v-if="log.tabActive == 'partner_reward'" class="sa-flex sa-col-center">
|
||
<el-checkbox v-model="log.showSkip" @change="onChangeTab">
|
||
显示未发放/跳过原因记录
|
||
</el-checkbox>
|
||
</div>
|
||
</div>
|
||
<div class="card-section log">
|
||
<div class="bottom">
|
||
<el-tabs v-model="log.tabActive" @tab-change="onChangeTab">
|
||
<el-tab-pane label="收益中心流水" name="partner_reward"></el-tab-pane>
|
||
<el-tab-pane label="兑换券释放计划" name="voucher_plan"></el-tab-pane>
|
||
<el-tab-pane label="直推团队成员" name="team"></el-tab-pane>
|
||
<el-tab-pane label="佣金与收益流水" name="commission"></el-tab-pane>
|
||
<el-tab-pane label="余额记录" name="money"></el-tab-pane>
|
||
<el-tab-pane label="积分记录" name="score"></el-tab-pane>
|
||
<el-tab-pane label="商城订单" name="order"></el-tab-pane>
|
||
<el-tab-pane label="分享记录" name="share"></el-tab-pane>
|
||
<el-tab-pane label="优惠券明细" name="coupon"></el-tab-pane>
|
||
</el-tabs>
|
||
|
||
<!-- Tab 1: 收益中心流水 (二开核心) -->
|
||
<el-table v-if="log.tabActive == 'partner_reward'" height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column prop="createtime" label="入账时间" width="165"></el-table-column>
|
||
<el-table-column prop="reward_type_text" label="奖项类型" min-width="120">
|
||
<template #default="scope">
|
||
<el-tag size="small">{{ scope.row.reward_type_text || scope.row.reward_type }}</el-tag>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="role_text" label="受益角色" min-width="100"></el-table-column>
|
||
<el-table-column prop="amount" label="结算金额" min-width="100">
|
||
<template #default="scope">
|
||
<b :style="{ color: scope.row.amount > 0 ? '#67c23a' : '#909399' }">
|
||
¥{{ scope.row.amount }}
|
||
</b>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="入账账户" min-width="110">
|
||
<template #default="scope">
|
||
<el-tag size="small" :type="scope.row.wallet_type === 'money' ? 'success' : (scope.row.wallet_type === 'madow' ? 'primary' : (scope.row.wallet_type === 'commission' ? 'warning' : 'info'))">
|
||
{{ scope.row.wallet_type_text || (Number(scope.row.amount) > 0 ? '商城余额' : (Number(scope.row.madow) > 0 ? '分红dmepa' : '消费补贴')) }}
|
||
</el-tag>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="madow" label="结算dmepa" min-width="90"></el-table-column>
|
||
<el-table-column label="买家" min-width="140">
|
||
<template #default="scope">
|
||
<sa-user-profile v-if="scope.row.buyer" :user="scope.row.buyer" :id="scope.row.buyer_id"></sa-user-profile>
|
||
<span v-else>-</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="关联订单" min-width="150">
|
||
<template #default="scope">
|
||
<span>{{ scope.row.order?.order_sn || scope.row.order_id || '-' }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="status_text" label="状态" min-width="90">
|
||
<template #default="scope">
|
||
<el-tag size="small" :type="scope.row.status == 1 ? 'success' : (scope.row.status == -1 ? 'info' : 'danger')">
|
||
{{ scope.row.status_text || (scope.row.status == 1 ? '已入账' : (scope.row.status == -1 ? '未发放' : '其他')) }}
|
||
</el-tag>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="测算摘要 / 跳过原因" min-width="180" show-overflow-tooltip>
|
||
<template #default="scope">
|
||
<span>{{ scope.row.formula || scope.row.ext?.formula || scope.row.ext?.skip_reason || '-' }}</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="操作" width="80" fixed="right">
|
||
<template #default="scope">
|
||
<el-button type="primary" link @click="onShowFormula(scope.row)">明细</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
|
||
<!-- Tab 2: 兑换券释放计划 (二开核心) -->
|
||
<el-table v-if="log.tabActive == 'voucher_plan'" height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column prop="id" label="计划ID" width="80"></el-table-column>
|
||
<el-table-column label="订单号" min-width="170">
|
||
<template #default="scope">
|
||
{{ scope.row.order?.order_sn || scope.row.order_id || '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="total_fee" label="计划总额" min-width="110">
|
||
<template #default="scope">
|
||
<b>{{ scope.row.total_fee }} 个</b>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="day_amount" label="每日释放" min-width="100">
|
||
<template #default="scope">
|
||
{{ scope.row.day_amount }} 个
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="释放进度" min-width="140">
|
||
<template #default="scope">
|
||
<el-progress :percentage="Math.min(100, Math.round(((scope.row.days_released || 0) / (scope.row.total_days || 365)) * 100))"></el-progress>
|
||
<div style="font-size: 11px; color: var(--sa-subfont); margin-top: 2px;">
|
||
第 {{ scope.row.days_released || 0 }} / {{ scope.row.total_days || 365 }} 天
|
||
</div>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="已释放" min-width="110">
|
||
<template #default="scope">
|
||
{{ scope.row.released_amount }} 个
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="voucher_available" label="当前可用" min-width="110">
|
||
<template #default="scope">
|
||
<span style="color: #67c23a; font-weight: 600;">{{ scope.row.voucher_available }} 个</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="start_date" label="开始日期" width="120"></el-table-column>
|
||
<el-table-column prop="status_text" label="状态" width="100">
|
||
<template #default="scope">
|
||
<el-tag size="small" :type="scope.row.status == 'running' ? 'success' : (scope.row.status == 'finished' ? 'info' : 'danger')">
|
||
{{ scope.row.status_text || scope.row.status }}
|
||
</el-tag>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
|
||
<!-- Tab 3: 直推团队成员 (二开核心) -->
|
||
<el-table v-if="log.tabActive == 'team'" height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column prop="id" label="ID" width="80"></el-table-column>
|
||
<el-table-column label="下级成员" min-width="160">
|
||
<template #default="scope">
|
||
<sa-user-profile :user="scope.row" :id="scope.row.id"></sa-user-profile>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="mobile" label="手机号" min-width="120"></el-table-column>
|
||
<el-table-column label="业务身份" min-width="160">
|
||
<template #default="scope">
|
||
<div>{{ scope.row.identity_text || '普通会员' }}</div>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="total_consume" label="累计消费" min-width="110">
|
||
<template #default="scope">
|
||
¥{{ scope.row.total_consume }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="createtime" label="注册时间" width="165"></el-table-column>
|
||
<el-table-column label="操作" width="100" fixed="right">
|
||
<template #default="scope">
|
||
<el-button type="primary" link @click="onOpenUserDetail(scope.row.id)">
|
||
查看详情
|
||
</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
|
||
<!-- 原生 Tab 4/5/6: 佣金/余额/积分 -->
|
||
<el-table
|
||
v-if="log.tabActive=='money' || log.tabActive=='score' || log.tabActive=='commission'"
|
||
height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column prop="createtime" label="交易时间" width="172"></el-table-column>
|
||
<el-table-column prop="amount" label="变动金额/积分" min-width="120"></el-table-column>
|
||
<el-table-column prop="before" label="变动前" min-width="120"></el-table-column>
|
||
<el-table-column prop="after" label="变动后" min-width="120"></el-table-column>
|
||
<el-table-column label="钱包类别" min-width="110" v-if="log.tabActive=='commission'">
|
||
<template #default="scope">
|
||
<el-tag size="small" :type="scope.row.type == 'money' ? 'success' : 'warning'">
|
||
{{ scope.row.type == 'money' ? '商城余额' : '佣金钱包' }}
|
||
</el-tag>
|
||
</template>
|
||
</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 label="备注" min-width="160">
|
||
<template #default="scope">
|
||
{{ scope.row.event_text }}{{ scope.row.memo ? ':' + scope.row.memo : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
|
||
<!-- 原生 Tab 7: 商城订单 -->
|
||
<el-table v-if="log.tabActive=='order'" height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column prop="createtime" label="下单时间" min-width="165"></el-table-column>
|
||
<el-table-column prop="order_sn" label="订单号" min-width="200"></el-table-column>
|
||
<el-table-column prop="platform_text" label="订单来源" min-width="100"></el-table-column>
|
||
<el-table-column prop="type_text" label="订单类型" min-width="100"></el-table-column>
|
||
<el-table-column prop="order_amount" label="总金额" min-width="110"></el-table-column>
|
||
<el-table-column prop="total_discount_fee" label="优惠" min-width="90"></el-table-column>
|
||
<el-table-column prop="pay_fee" label="实付金额" min-width="110">
|
||
<template #default="scope">
|
||
<b style="color: #67c23a;">¥{{ scope.row.pay_fee }}</b>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="status_text" label="订单状态" min-width="100"></el-table-column>
|
||
</el-table>
|
||
|
||
<!-- 原生 Tab 8: 分享记录 -->
|
||
<el-table v-if="log.tabActive=='share'" height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column prop="createtime" label="分享时间" width="165"></el-table-column>
|
||
<el-table-column label="被分享用户" min-width="160">
|
||
<template #default="scope">
|
||
<sa-user-profile :user="scope.row.user" :id="scope.row.user_id"></sa-user-profile>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="from_text" label="分享类型" min-width="120"></el-table-column>
|
||
<el-table-column prop="platform_text" label="平台" min-width="110"></el-table-column>
|
||
</el-table>
|
||
|
||
<!-- 原生 Tab 9: 优惠券明细 -->
|
||
<el-table v-if="log.tabActive=='coupon'" height="460" class="sa-table" :data="log.data" stripe>
|
||
<el-table-column label="优惠券名称" min-width="160">
|
||
<template #default="scope">
|
||
<div class="sa-line-1">{{ scope.row.coupon?.name || '-' }}</div>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="面额" min-width="100">
|
||
<template #default="scope">
|
||
<div>¥{{ scope.row.coupon?.amount || '-' }}</div>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="status_text" label="状态" min-width="100"></el-table-column>
|
||
<el-table-column prop="createtime" label="领取时间" width="165"></el-table-column>
|
||
<el-table-column prop="use_time" label="使用时间" width="165"></el-table-column>
|
||
</el-table>
|
||
|
||
<el-footer class="sa-flex sa-row-right mt-2">
|
||
<sa-pagination v-model="pagination" @pagination-change="getLog"></sa-pagination>
|
||
</el-footer>
|
||
</div>
|
||
</div>
|
||
</el-col>
|
||
</el-row>
|
||
</el-scrollbar>
|
||
</el-main>
|
||
</el-container>
|
||
|
||
<!-- 奖励测算公式与跳过原因详情弹窗 -->
|
||
<el-dialog v-model="formulaDialog.visible" title="奖励测算公式与跳过记录详情" width="550px">
|
||
<div v-if="formulaDialog.row">
|
||
<div class="mb-3">
|
||
<span style="font-weight: 600;">奖项类型:</span>
|
||
<el-tag size="small">{{ formulaDialog.row.reward_type_text || formulaDialog.row.reward_type }}</el-tag>
|
||
</div>
|
||
<div class="mb-3">
|
||
<span style="font-weight: 600;">结算金额/dmepa:</span>
|
||
<b>¥{{ formulaDialog.row.amount }}</b>
|
||
<span v-if="formulaDialog.row.madow > 0" class="ml-2">({{ formulaDialog.row.madow }} 枚)</span>
|
||
</div>
|
||
<div class="mb-3" v-if="formulaDialog.row.ext?.skip_reason">
|
||
<span style="font-weight: 600; color: #e6a23c;">跳过/未发放原因:</span>
|
||
<el-tag type="warning" size="small">{{ formulaDialog.row.ext.skip_reason }}</el-tag>
|
||
</div>
|
||
<div class="mb-2" style="font-weight: 600;">公式摘要与上下文(ext):</div>
|
||
<div class="formula-box">
|
||
{{ JSON.stringify(formulaDialog.row.ext || formulaDialog.row.formula || {}, null, 2) }}
|
||
</div>
|
||
</div>
|
||
<template #footer>
|
||
<el-button type="primary" @click="formulaDialog.visible = false">关闭</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
</div> |