- 框架初始化
 - 安装插件
 - 修复PHP8.4报错
This commit is contained in:
2025-04-19 17:21:20 +08:00
commit c6a4e1f5f6
5306 changed files with 967782 additions and 0 deletions

View File

@@ -0,0 +1,601 @@
{include file="/shopro/common/script" /}
<style>
.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 {
height: 450px;
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;
}
</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%">
<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="76px">
<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>(等级{{ 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 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>
</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">
<el-row class="dashboard-content agent-content">
<el-col :span="24">
<div class="title sa-flex">
<span>团队统计</span>
{if $auth->check('shopro/commission/agent/team')}
<el-button class="ml-2" type="primary" link @click="onTeam">查看团队</el-button>
{/if}
</div>
<el-row>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">团队人数:</div>
<div class="right">
{{ state.data.child_user_count_all }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">一级团队人数:</div>
<div class="right">
{{ state.data.child_user_count_1 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">二级团队人数:</div>
<div class="right">
{{ state.data.child_user_count_2 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">
团队分销商人数:
<el-popover placement="top" trigger="hover">
<div v-for="(value, key) in state.data.child_agent_level_all"
:key="key">
等级{{ key }}{{ value }}人
</div>
<template #reference>
<div class="sa-flex">
<el-icon v-if="state.data.child_agent_count_all"
class="warning">
<Warning />
</el-icon>
</div>
</template>
</el-popover>
</div>
<div class="right">
{{ state.data.child_agent_count_all }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">
一级分销商人数:
<el-popover placement="top" trigger="hover">
<div v-for="(value, key) in state.data.child_agent_level_1" :key="key">
等级{{ key }}{{ value }}人
</div>
<template #reference>
<div class="sa-flex">
<el-icon v-if="state.data.child_agent_count_1" class="warning">
<Warning />
</el-icon>
</div>
</template>
</el-popover>
</div>
<div class="right">
{{ state.data.child_agent_count_1 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">二级分销商人数:</div>
<div class="right">
{{ state.data.child_agent_count_2 }}
<span class="unit"></span>
</div>
</el-col>
</el-row>
</el-col>
<el-col :span="24">
<div class="title sa-flex">
<span>业绩统计</span>
</div>
<el-row>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">团队分销总金额:</div>
<div class="right">
{{ state.data.child_order_money_all }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">一级分销总金额:</div>
<div class="right">
{{ state.data.child_order_money_1 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">二级分销总金额:</div>
<div class="right">
{{ state.data.child_order_money_2 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">
自购分销总金额:
<el-popover popper-class="sa-popper" placement="top" trigger="hover"
content="分销商自购分销商品金额统计">
<template #reference>
<div class="sa-flex">
<el-icon class="warning">
<Warning />
</el-icon>
</div>
</template>
</el-popover>
</div>
<div class="right">
{{ state.data.child_order_money_0 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">团队分销订单:</div>
<div class="right">
{{ state.data.child_order_count_all }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">一级分销订单:</div>
<div class="right">
{{ state.data.child_order_count_1 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">二级分销订单:</div>
<div class="right">
{{ state.data.child_order_count_2 }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="6" :md="6" :lg="6" :xl="6">
<div class="left">
自购分销订单:
<el-popover popper-class="sa-popper" placement="top" trigger="hover"
content="分销商自购分销订单数量统计">
<template #reference>
<div class="sa-flex">
<el-icon class="warning">
<Warning />
</el-icon>
</div>
</template>
</el-popover>
</div>
<div class="right">
{{ state.data.child_order_count_0 }}
<span class="unit"></span>
</div>
</el-col>
</el-row>
</el-col>
<el-col :span="24">
<div class="title sa-flex">
<span>资产信息</span>
</div>
<el-row>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">累计佣金:</div>
<div class="right">
{{ state.data.total_income }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">待入账佣金:</div>
<div class="right">
{{ state.data.pending_reward }}
<span class="unit"></span>
</div>
</el-col>
<el-col class="item" :xs="12" :sm="8" :md="8" :lg="8" :xl="8">
<div class="left">消费金额:</div>
<div class="right">
{{ state.data.user?.total_consume || 0 }}
<span class="unit"></span>
</div>
</el-col>
</el-row>
</el-col>
</el-row>
</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-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>
</div>

View File

@@ -0,0 +1,204 @@
{include file="/shopro/common/script" /}
<style>
.agent-index .status-text {
margin-right: 12px;
}
</style>
<div id="index" class="agent-index panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<el-tabs class="sa-tabs" v-model="state.filter.data.tabActive" @tab-change="onChangeTab">
<el-tab-pane v-for="item in type.data.status" :key="item" :label="item.name" :name="item.type">
</el-tab-pane>
</el-tabs>
<div class="sa-title sa-flex sa-row-between">
<div class="sa-title-left">
<div class="left-name">分销商</div>
<sa-filter-condition v-model="state.filter" @filter-delete="onChangeFilter">
</sa-filter-condition>
</div>
<div class="sa-title-right">
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
<el-button class="sa-button-refresh" icon="Search" @click="onOpenFilter"></el-button>
</div>
</div>
</el-header>
<el-main class="sa-main">
<el-table v-if="state.filter.data.tabActive=='all'" height="100%" class="sa-table" :data="state.data"
stripe>
<el-table-column prop="user_id" label="ID" min-width="90">
</el-table-column>
<el-table-column label="分销商信息" min-width="150">
<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 label="等级" min-width="120">
<template #default="scope">
<template v-if="scope.row.level_info">
<div>{{ scope.row.level_info.name }}</div>
<div>(等级{{ scope.row.level_info.level }})</div>
</template>
<template v-else>{{ scope.row.level }}</template>
</template>
</el-table-column>
<el-table-column label="累计佣金" min-width="120">
<template #default="scope"> {{ scope.row.total_income }}元 </template>
</el-table-column>
<el-table-column label="消费金额" min-width="120">
<template #default="scope"> {{ scope.row.user?.total_consume || 0 }}元 </template>
</el-table-column>
<el-table-column label="自购分销业绩" min-width="120">
<template #default="scope">
<div>{{ scope.row.child_order_count_0 }}单</div>
<div>{{ scope.row.child_order_money_0 }}元</div>
</template>
</el-table-column>
<el-table-column label="上级分销商" min-width="120" align="center">
<template #default="scope">
<sa-user-profile type="agent" :user="scope.row.user?.parent_user"
:id="scope.row.user?.parent_user_id" mode="col"></sa-user-profile>
</template>
</el-table-column>
<el-table-column label="一级用户人数" min-width="120">
<template #default="scope"> {{ scope.row.child_user_count_1 }}人 </template>
</el-table-column>
<el-table-column label="一级分销商人数" min-width="160">
<template #default="scope">
<div>{{ scope.row.child_agent_count_1 }}人</div>
</template>
</el-table-column>
<el-table-column prop="createtime" label="创建时间" width="172"></el-table-column>
<el-table-column label="操作" min-width="140" fixed="right">
<template #default="scope">
<div class="sa-flex">
<span class="mr-2" :style="{
color: statusStyle[scope.row.status]?.color,
}">
{{ scope.row.status_text }}
</span>
{if $auth->check('shopro/commission/agent/detail')}
<el-button type="primary" link @click="onDetail(scope.row.user_id)">查看</el-button>
{/if}
</div>
</template>
</el-table-column>
</el-table>
<el-table v-if="state.filter.data.tabActive=='pending'" height="100%" class="sa-table" :data="state.data"
stripe>
<el-table-column prop="user_id" label="ID" min-width="90">
</el-table-column>
<el-table-column label="分销商信息" min-width="150">
<template #default="scope">
<sa-user-profile :user="scope.row.user" :id="scope.row.user_id" />
</template>
</el-table-column>
<el-table-column label="等级" min-width="120">
<template #default="scope">
<template v-if="scope.row.level_info">
<div>{{ scope.row.level_info.name }}</div>
<div>(等级{{ scope.row.level_info.level }})</div>
</template>
<template v-else>{{ scope.row.level }}</template>
</template>
</el-table-column>
<el-table-column label="上级分销商" min-width="120" align="center">
<template #default="scope">
<sa-user-profile type="agent" :user="scope.row.user?.parent_user"
:id="scope.row.user?.parent_user_id" mode="col" />
</template>
</el-table-column>
<el-table-column label="消费金额" min-width="120">
<template #default="scope"> {{ scope.row.user?.total_consume || 0 }}元 </template>
</el-table-column>
<el-table-column label="推广人数" min-width="120">
<template #default="scope"> {{ scope.row.child_user_count_1 }}人 </template>
</el-table-column>
<el-table-column label="提交次数" min-width="120">
<template #default="scope"> {{ scope.row.apply_num }}次</template>
</el-table-column>
<el-table-column prop="createtime" label="创建时间" min-width="172"></el-table-column>
<el-table-column label="操作" min-width="160" fixed="right">
<template #default="scope">
<div class="sa-flex">
{if $auth->check('shopro/commission/agent/edit')}
<el-button type="success" link @click="onEdit(scope.row.user_id, {status:'normal'})">
同意
</el-button>
{/if}
{if $auth->check('shopro/commission/agent/edit')}
<el-button type="warning" link @click="onEdit(scope.row.user_id,{status:'reject'} )">
驳回
</el-button>
{/if}
{if $auth->check('shopro/commission/agent/detail')}
<el-button type="primary" link @click="onDetail(scope.row.user_id)">查看</el-button>
{/if}
</div>
</template>
</el-table-column>
</el-table>
<el-table v-if="state.filter.data.tabActive==0" height="100%" class="sa-table" :data="state.data" stripe>
<el-table-column prop="user_id" label="ID" min-width="90"></el-table-column>
<el-table-column label="分销商信息" min-width="150">
<template #default="scope">
<sa-user-profile :user="scope.row.user" :id="scope.row.user_id" />
</template>
</el-table-column>
<el-table-column label="等级" min-width="120">
<template #default="scope">
<template v-if="scope.row.level_info">
<div>{{ scope.row.level_info.name }}</div>
<div>(等级{{ scope.row.level_info.level }})</div>
</template>
<template v-else>{{ scope.row.level }}</template>
</template>
</el-table-column>
<el-table-column label="消费金额" min-width="120">
<template #default="scope"> {{ scope.row.user?.total_consume || 0 }}元 </template>
</el-table-column>
<el-table-column label="推广人数" min-width="120">
<template #default="scope"> {{ scope.row.child_user_count_1 }}人 </template>
</el-table-column>
<el-table-column label="升级之后的等级" min-width="200">
<template #default="scope">
<div v-if="scope.row.level_status_info">
{{ scope.row.level_status_info.name }}
</div>
<div>等级{{ scope.row.level_status }}</div>
</template>
</el-table-column>
<el-table-column prop="createtime" label="创建时间" min-width="172"></el-table-column>
<el-table-column label="操作" min-width="200" fixed="right">
<template #default="scope">
<div class="sa-flex">
<span class="sa-color--info mr-2" v-if="!scope.row.level_status_info">
未找到等级
</span>
<template v-if="scope.row.level_status_info">
{if $auth->check('shopro/commission/agent/edit')}
<el-button type="success" link
@click=" onEdit(scope.row.user_id, {level_status: scope.row.level_status})">
同意
</el-button>
<el-button type="danger" link @click="onEdit(scope.row.user_id, { level_status: 0 })">
拒绝
</el-button>
{/if}
</template>
{if $auth->check('shopro/commission/agent/detail')}
<el-button type="primary" link @click="onDetail(scope.row.user_id)">查看</el-button>
{/if}
</div>
</template>
</el-table-column>
</el-table>
</el-main>
<el-footer class="sa-footer sa-flex sa-row-right">
<sa-pagination v-model="pagination" @pagination-change="getData"></sa-pagination>
</el-footer>
</el-container>
<sa-filter v-model="state.filter" @filter-change="onChangeFilter"></sa-filter>
</div>

View File

@@ -0,0 +1,81 @@
{include file="/shopro/common/script" /}
<style>
.agent-select .filter-item {
width: 330px;
}
.agent-select .filter-item .el-select {
width: 110px;
}
</style>
<div id="select" class="agent-select" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<el-alert class="mt-4">
<template #title>
温馨提示:更换上级推荐人之后,该用户之后的所有团队和业绩将移至新的推荐人名下
</template>
</el-alert>
<div class="sa-flex sa-flex-wrap sa-row-between mt-4">
<div class="sa-flex">
当前推荐人:
<sa-user-profile type="agent" :user="state.userDetail.parent_user"
:id="state.userDetail?.parent_user_id" :isHover="false"></sa-user-profile>
</div>
<el-input class="filter-item" v-model="state.filter.data.user.value" placeholder="请输入查询内容">
<template #prepend>
<el-select v-model="state.filter.data.user.field">
<el-option label="分销商ID" value="user_id"></el-option>
<el-option label="分销商昵称" value="user.nickname"></el-option>
<el-option label="分销商手机号" value="user.mobile"></el-option>
</el-select>
</template>
<template #append>
<button @click="getData">搜索</button>
</template>
</el-input>
</div>
</el-header>
<el-main>
<el-table height="100%" class="sa-table" :data="state.data" stripe>
<el-table-column prop="user_id" label="ID" min-width="90"></el-table-column>
<el-table-column label="分销商信息" min-width="150">
<template #default="scope">
<sa-user-profile :user="scope.row.user" :id="scope.row.user_id" :isHover="false" />
</template>
</el-table-column>
<el-table-column label="等级" min-width="150" align="center">
<template #default="scope">
<template v-if="scope.row.level_info">
{{ scope.row.level_info.name }}
(等级{{ scope.row.level_info.level }})
</template>
<template v-else>{{ scope.row.level }}</template>
</template>
</el-table-column>
<el-table-column label="手机号" min-width="120" align="center">
<template #default="scope">
{{ scope.row.user ? scope.row.user.mobile : '-' }}
</template>
</el-table-column>
<el-table-column label="操作" min-width="80" fixed="right">
<template #default="scope">
<span v-if="scope.row.user_id == state.parent_user_id" class="status"> 已选择 </span>
<el-button v-else class="is-link" type="primary" @click="onSelect(scope.row)">选择</el-button>
</template>
</el-table-column>
</el-table>
</el-main>
<el-footer class="sa-flex sa-row-between">
<el-checkbox v-model="state.parent_user_id" :true-label="0" :false-label="-1">设为平台直推</el-checkbox>
<sa-pagination class="is-ellipsis" v-model="pagination" @pagination-change="getData"></sa-pagination>
</el-footer>
<el-footer class="sa-footer--submit sa-flex sa-row-right">
<!-- {if $auth->check('shopro/commission/agent/changeParentUser')} -->
<el-button type="primary" @click="onConfirm">确定</el-button>
<!-- {/if} -->
</el-footer>
</el-container>
</div>

View File

@@ -0,0 +1,159 @@
{include file="/shopro/common/script" /}
<div id="team" class="agent-team" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header sa-flex sa-flex-wrap mt-4">
<template v-if="state.data.user?.parent_user">
推荐人:
<sa-user-profile class="cursor-pointer" type="agent" :user="state.data.user?.parent_user" :id="state.data.user?.parent_user_id"
:isHover="false" @click="getTeam(state.data.user.parent_user_id)"></sa-user-profile>
</template>
</el-header>
<el-main>
<el-table class="sa-table mb-4" :data="[state.data]">
<el-table-column prop="user_id" label="ID" min-width="90"></el-table-column>
<el-table-column label="当前用户" min-width="150">
<template #default="scope">
<sa-user-profile :user="scope.row.user" :id="scope.row.user_id" :isHover="false">
</sa-user-profile>
</template>
</el-table-column>
<el-table-column label="等级" min-width="150">
<template #default="scope">
<div v-if="scope.row.level_info" class="sa-flex">
<sa-image :url="scope.row.level_info.image" size="32"></sa-image>
<span class="ml-2">{{ scope.row.level_info.name }}</span>
</div>
<template v-else>{{ scope.row.level }}</template>
</template>
</el-table-column>
<el-table-column label="状态" min-width="120" align="center">
<template #default="scope">
<span :style="{ color: statusStyle[scope.row.status]?.color }">
{{ scope.row.status_text }}
</span>
</template>
</el-table-column>
<el-table-column label="团队人数/分销商人数" min-width="160" align="center">
<template #default="scope">
{{ scope.row.child_user_count_all }}人/ {{ scope.row.child_agent_count_all }}人
</template>
</el-table-column>
<el-table-column label="一级团队人数/一级分销商人数" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_user_count_1 }}人/ {{ scope.row.child_agent_count_1 }}人
</template>
</el-table-column>
<el-table-column label="二级团队人数/二级分销商人数" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_user_count_2 }}人/ {{ scope.row.child_agent_count_2 }}人
</template>
</el-table-column>
<el-table-column label="团队分销总额/团队分销订单" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_all }}元/ {{ scope.row.child_order_count_all }}单
</template>
</el-table-column>
<el-table-column label="一级分销总额/一级分销订单" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_1 }}元/ {{ scope.row.child_order_count_1 }}单
</template>
</el-table-column>
<el-table-column label="二级分销总额/二级分销订单" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_2 }}元/ {{ scope.row.child_order_count_2 }}单
</template>
</el-table-column>
<el-table-column label="自购分销总金额/订单数" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_0 }}元/ {{ scope.row.child_order_count_0 }}单
</template>
</el-table-column>
<el-table-column label="累计佣金" min-width="160" align="center">
<template #default="scope"> {{ scope.row.total_income }}元 </template>
</el-table-column>
<el-table-column label="消费金额" min-width="160" align="center">
<template #default="scope"> {{ scope.row.user?.total_consume || 0 }}元 </template>
</el-table-column>
<el-table-column label="待入账佣金" min-width="160" align="center">
<template #default="scope"> {{ scope.row.pending_reward }}元 </template>
</el-table-column>
<el-table-column label="加入时间" min-width="172" align="center">
<template #default="scope"> {{ scope.row.createtime }} </template>
</el-table-column>
</el-table>
<el-table class="sa-table" :data="state.data.agent_team">
<el-table-column prop="user_id" label="ID" min-width="90"></el-table-column>
<el-table-column label="团队用户" min-width="150">
<template #default="scope">
<sa-user-profile class="cursor-pointer" :user="scope.row.user" :id="scope.row.user_id" :isHover="false" @click="getTeam(scope.row.user_id)">
</sa-user-profile>
</template>
</el-table-column>
<el-table-column label="等级" min-width="150">
<template #default="scope">
<div v-if="scope.row.level_info" class="sa-flex">
<sa-image :url="scope.row.level_info.image" size="32"></sa-image>
<span class="ml-2">{{ scope.row.level_info.name }}</span>
</div>
<template v-else>{{ scope.row.level }}</template>
</template>
</el-table-column>
<el-table-column label="状态" min-width="120" align="center">
<template #default="scope">
<span :style="{ color: statusStyle[scope.row.status]?.color }">
{{ scope.row.status_text }}
</span>
</template>
</el-table-column>
<el-table-column label="团队人数/分销商人数" min-width="160" align="center">
<template #default="scope">
{{ scope.row.child_user_count_all }}人/ {{ scope.row.child_agent_count_all }}人
</template>
</el-table-column>
<el-table-column label="一级团队人数/一级分销商人数" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_user_count_1 }}人/ {{ scope.row.child_agent_count_1 }}人
</template>
</el-table-column>
<el-table-column label="二级团队人数/二级分销商人数" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_user_count_2 }}人/ {{ scope.row.child_agent_count_2 }}人
</template>
</el-table-column>
<el-table-column label="团队分销总额/团队分销订单" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_all }}元/ {{ scope.row.child_order_count_all }}单
</template>
</el-table-column>
<el-table-column label="一级分销总额/一级分销订单" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_1 }}元/ {{ scope.row.child_order_count_1 }}单
</template>
</el-table-column>
<el-table-column label="二级分销总额/二级分销订单" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_2 }}元/ {{ scope.row.child_order_count_2 }}单
</template>
</el-table-column>
<el-table-column label="自购分销总金额/订单数" min-width="220" align="center">
<template #default="scope">
{{ scope.row.child_order_money_0 }}元/ {{ scope.row.child_order_count_0 }}单
</template>
</el-table-column>
<el-table-column label="累计佣金" min-width="160" align="center">
<template #default="scope"> {{ scope.row.total_income }}元 </template>
</el-table-column>
<el-table-column label="消费金额" min-width="160" align="center">
<template #default="scope"> {{ scope.row.user?.total_consume || 0 }}元 </template>
</el-table-column>
<el-table-column label="待入账佣金" min-width="160" align="center">
<template #default="scope"> {{ scope.row.pending_reward }}元 </template>
</el-table-column>
<el-table-column label="加入时间" min-width="172" align="center">
<template #default="scope"> {{ scope.row.createtime }} </template>
</el-table-column>
</el-table>
</el-main>
</el-container>
</div>

View File

@@ -0,0 +1,353 @@
{include file="/shopro/common/script" /}
<style>
.goods-form .sa-title.is-line {
margin-bottom: 16px;
}
.goods-form .goods-item {
margin-bottom: 16px;
}
.goods-form .goods-item .goods-title {
height: 16px;
line-height: 16px;
font-size: 14px;
font-weight: 500;
color: var(--sa-font);
margin-bottom: 8px;
}
.goods-form .goods-item .goods-sku {
width: fit-content;
height: 18px;
line-height: 18px;
background: var(--el-color-primary);
border-radius: 10px;
padding: 0 8px;
font-size: 12px;
color: var(--sa-background-assist);
}
.goods-form .commission-table {
overflow: hidden;
overflow-x: auto;
}
.goods-form .commission-table .commission-header {
border-left: 1px solid var(--sa-border);
}
.goods-form .commission-table .commission-header .col-item {
padding: 0 12px;
height: 40px;
line-height: 40px;
background: var(--sa-table-header-bg);
border-top: 1px solid var(--sa-border);
}
.goods-form .commission-table .commission-content {
border-left: 1px solid var(--sa-border);
}
.goods-form .commission-table .col-item {
width: 150px;
min-width: 150px;
padding: 0 12px;
height: 48px;
line-height: 48px;
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid var(--sa-border);
border-bottom: 1px solid var(--sa-border);
}
.goods-form .commission-table .col-item .el-input {
margin-right: 12px;
}
.goods-form .commission-table .col-item .el-input:last-of-type {
margin-right: 0;
}
.goods-form .commission-table .col-item.commission-item {
width: 240px;
min-width: 240px;
}
.goods-form .batch-edit {
color: var(--el-color-primary);
margin-left: 8px;
}
.commission-popover .commission-item {
margin-bottom: 12px;
}
.commission-popover .commission-item .el-input {
margin-right: 12px;
}
.commission-popover .commission-item .el-input:last-of-type {
margin-right: 0;
}
</style>
<div id="addEdit" class="goods-form" v-cloak>
<el-container class="panel-block">
<el-main>
<el-scrollbar height="100%">
<div class="sa-title is-line">商品信息</div>
<div v-for="goods in state.data?.goods" :key="goods">
<div class="goods-item sa-flex sa-col-top">
<sa-image class="mr-2" :url="goods.image" size="48"></sa-image>
<div>
<div class="goods-title sa-table-line-1">
{{ goods.title }}
</div>
<div v-if="goods.is_sku" class="goods-sku">
{{ goods.is_sku ? '多规格' : '' }}
</div>
</div>
</div>
</div>
<div class="sa-title is-line">佣金设置</div>
<el-form label-width="120px">
<el-form-item label="是否参与">
<el-radio-group v-model="state.commission_goods.status">
<el-radio :label="0">不参与</el-radio>
<el-radio :label="1">参与</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分销商业绩">
<el-radio-group v-model="state.commission_goods.commission_order_status">
<el-radio :label="0">不计入</el-radio>
<el-radio :label="1">
<span class="sa-flex">
计入
<el-popover placement="top" :width="310" content="关闭则只分佣,不计入分销订单金额和订单数">
<template #reference>
<el-icon class="warning sa-m-l-8">
<warning />
</el-icon>
</template>
</el-popover>
</span>
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="佣金规则">
<el-radio-group v-model="state.commission_goods.self_rules" @change="onChangeSelfRules">
<el-radio :label="0">默认规则</el-radio>
<el-radio :label="1" v-if="state.rulesType != 'batch'">独立规则</el-radio>
<el-radio :label="2">批量规则</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="state.commission_goods.self_rules == 1 || state.commission_goods.self_rules == 2"
label="分销设置">
<el-switch v-model="state.commission_config_temp.status"
@change="onChangeCommissionConfigStatus" :active-value="1" :inactive-value="0" />
<span class="sa-m-l-8">
{{ state.commission_config_temp.status ? '自定义' : '默认' }}
</span>
</el-form-item>
<el-form-item label="分销层级">
<el-radio-group v-model="state.commission_config_temp.level"
:disabled="state.commission_config_temp.status == 0">
<el-radio :label="1">一级</el-radio>
<el-radio :label="2">二级</el-radio>
<el-radio :label="3">三级</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分销自购">
<div>
<el-radio-group v-model="state.commission_config_temp.self_buy"
:disabled="state.commission_config_temp.status == 0">
<el-radio :label="0">关闭</el-radio>
<el-radio :label="1">开启</el-radio>
</el-radio-group>
<div class="tip"> 分销自购开启后,分销商自己购买时,下单可以给自己返佣 </div>
</div>
</el-form-item>
<el-form-item label="商品结算方式">
<div>
<el-radio-group v-model="state.commission_config_temp.reward_type"
:disabled="state.commission_config_temp.status == 0">
<el-radio label="goods_price">商品价</el-radio>
<el-radio label="pay_price">实际支付价</el-radio>
</el-radio-group>
<div class="tip">
商品价: 商品实际售价/规格价,实际支付价:实际支付的费用(不含运费)
</div>
</div>
</el-form-item>
<el-form-item label="佣金结算方式">
<el-radio-group v-model="state.commission_config_temp.reward_event"
:disabled="state.commission_config_temp.status == 0">
<el-radio label="paid">支付后结算</el-radio>
<el-radio label="confirm">确认收货结算</el-radio>
<el-radio label="finish">订单完成结算</el-radio>
<el-radio label="admin">手动打款</el-radio>
</el-radio-group>
</el-form-item>
<div class="commission-table">
<template v-if="state.commission_goods.self_rules == 0">
<div class="commission-header sa-flex">
<div class="col-item">分销等级名称</div>
<template v-for="commission in state.commission_config_temp.level" :key="commission">
<div v-if="commission == 1" class="col-item commission-item">
一级(自购)佣金比例
</div>
<div v-if="commission == 2" class="col-item commission-item"> 二级佣金比例 </div>
<div v-if="commission == 3" class="col-item commission-item"> 三级佣金比例 </div>
</template>
</div>
<div class="commission-content sa-flex" v-for="level in state.levelData" :key="level">
<div class="col-item">{{ level.name }}</div>
<template v-for="commission in state.commission_config_temp.level" :key="commission">
<div class="col-item commission-item">
{{ level.commission_rules[`commission_${commission}`] }}%
</div>
</template>
</div>
</template>
<template v-if="state.commission_goods.self_rules == 1">
<div class="commission-header sa-flex">
<div class="col-item">商品规格</div>
<div class="col-item">价格</div>
<div class="col-item">分销等级名称</div>
<template v-for="commission in state.commission_config_temp.level" :key="commission">
<div class="col-item commission-item">
<template v-if="commission == 1">一级(自购)佣金比例</template>
<template v-if="commission == 2">二级佣金比例</template>
<template v-if="commission == 3">三级佣金比例</template>
<el-popover popper-class="commission-popover"
v-model:visible="commissionPopover.flag[commission]" placement="top"
:width="220" trigger="click">
<div class="commission-item sa-flex">
<el-input v-model="commissionPopover.form.rate" type="number"
:disabled="commissionPopover.form.money != ''">
<template #append>%</template>
</el-input>
<el-input v-model="commissionPopover.form.money" type="number"
:disabled="commissionPopover.form.rate != ''">
<template #append></template>
</el-input>
</div>
<div class="sa-flex sa-row-right">
<el-button class="is-link" type="primary" size="small"
@click="onCancelCommissionPopover(commission)">取消</el-button>
<el-button type="primary" size="small"
@click="onConfirmCommissionPopover(commission)">确定</el-button>
</div>
<template #reference>
<el-icon class="batch-edit">
<edit />
</el-icon>
</template>
</el-popover>
</div>
</template>
</div>
<div class="commission-content sa-flex">
<div class="sa-flex sa-flex-col">
<div class="sa-flex" v-for="sku in state.detailData.sku_prices" :key="sku">
<div class="col-item" :style="{ height: 48 * state.levelData.length + 'px' }">
{{ state.detailData?.is_sku ? sku.goods_sku_text.join(',') : '默认规格' }}
</div>
<div class="col-item" :style="{ height: 48 * state.levelData.length + 'px' }">
{{ sku.price }}
</div>
<div>
<div class="col-item" v-for="level in state.levelData" :key="level">
{{ level.name }}
</div>
</div>
</div>
</div>
<div>
<div v-for="sku in state.commission_goods.commission_rules" :key="sku">
<div class="sa-flex" v-for="level in sku" :key="level">
<template v-for="commission in state.commission_config_temp.level"
:key="commission">
<div v-if="level[commission]" class="col-item commission-item">
<el-input v-model="level[commission].rate" type="number"
:disabled="level[commission].money != ''">
<template #append>%</template>
</el-input>
<el-input v-model="level[commission].money" type="number"
:disabled="level[commission].rate != ''">
<template #append></template>
</el-input>
</div>
</template>
</div>
</div>
</div>
</div>
</template>
<template v-if="state.commission_goods.self_rules == 2">
<div class="commission-header sa-flex">
<div class="col-item">商品规格</div>
<template v-for="commission in state.commission_config_temp.level" :key="commission">
<div class="col-item commission-item">
<template v-if="commission == 1">一级(自购)佣金比例</template>
<template v-if="commission == 2">二级佣金比例</template>
<template v-if="commission == 3">三级佣金比例</template>
<el-popover popper-class="commission-popover"
v-model:visible="commissionPopover.flag[commission]" placement="top"
:width="220" trigger="click">
<div class="commission-item sa-flex">
<el-input v-model="commissionPopover.form.rate" type="number"
:disabled="commissionPopover.form.money != ''">
<template #append>%</template>
</el-input>
</div>
<div class="sa-flex sa-row-right">
<el-button class="is-link" type="primary" size="small"
@click="onCancelCommissionPopover(commission)">取消</el-button>
<el-button size="small" type="primary"
@click="onConfirmCommissionPopover(commission)">确定</el-button>
</div>
<template #reference>
<el-icon class="batch-edit">
<edit />
</el-icon>
</template>
</el-popover>
</div>
</template>
</div>
<div class="commission-content sa-flex">
<div>
<div class="col-item" v-for="level in state.levelData" :key="level">
{{ level.name }}
</div>
</div>
<div>
<div class="sa-flex" v-for="level in state.commission_goods.commission_rules"
:key="level">
<template v-for="commission in state.commission_config_temp.level"
:key="commission">
<div v-if="level[commission]" class="col-item commission-item">
<el-input v-model="level[commission].rate" type="number"
:disabled="level[commission].money != ''">
<template #append>%</template>
</el-input>
</div>
</template>
</div>
</div>
</div>
</template>
</div>
</el-form>
</el-scrollbar>
</el-main>
<el-footer class="sa-footer--submit sa-flex sa-row-right">
<el-button type="primary" @click="onConfirm">确定</el-button>
</el-footer>
</el-container>
</div>

View File

@@ -0,0 +1,116 @@
{include file="/shopro/common/script" /}
<style>
.goods-index .goods-item .goods-title {
height: 20px;
line-height: 20px;
font-size: 14px;
font-weight: 500;
color: var(--sa-font);
}
.goods-index .goods-item .goods-subtitle {
height: 16px;
line-height: 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-subfont);
margin-bottom: 6px;
}
.goods-index .goods-item .goods-sku {
width: fit-content;
height: 18px;
line-height: 18px;
background: var(--el-color-primary);
border-radius: 10px;
padding: 0 8px;
font-size: 12px;
color: var(--sa-background-assist);
}
</style>
<div id="index" class="goods-index panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<div class="sa-title sa-flex sa-row-between">
<div class="sa-title-left">
<div class="left-name">分销商品</div>
<sa-filter-condition v-model="state.filter" @filter-delete="onChangeFilter">
</sa-filter-condition>
</div>
<div class="sa-title-right">
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
<el-button class="sa-button-refresh" icon="Search" @click="onOpenFilter"></el-button>
</div>
</div>
</el-header>
<el-main class="sa-main">
<el-table height="100%" class="sa-table" :data="state.data" stripe @selection-change="onChangeSelection">
<el-table-column type="selection" width="48"></el-table-column>
<el-table-column prop="id" label="ID" min-width="90"></el-table-column>
<el-table-column label="商品信息" min-width="300">
<template #default="scope">
<div class="goods-item sa-flex sa-col-top">
<sa-image class="mr-2" :url="scope.row.image" size="64"></sa-image>
<div>
<div class="goods-title sa-table-line-1">{{scope.row.title}}</div>
<div class="goods-subtitle sa-table-line-1">{{scope.row.subtitle}}</div>
<div v-if="scope.row.is_sku==1" class="goods-sku">多规格</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="价格" min-width="150">
<template #default="scope">
<div>{{ scope.row.price?.join('~') || 0 }}</div>
</template>
</el-table-column>
<el-table-column label="分销规则" width="100">
<template #default="scope">
<template v-if="scope.row.commission_goods && scope.row.commission_goods.status == 1">
<template v-if="scope.row.commission_goods.self_rules == 0">默认规则</template>
<template v-if="scope.row.commission_goods.self_rules == 1">独立规则</template>
<template v-if="scope.row.commission_goods.self_rules == 2">批量规则</template>
</template>
<template v-else>-</template>
</template>
</el-table-column>
<el-table-column label="商品状态" width="100">
<template #default="scope">
<span :class="`sa-color--${state.statusStyle[scope.row.status]}`">
{{ scope.row.status_text }}
</span>
</template>
</el-table-column>
<el-table-column label="操作" min-width="140" fixed="right">
<template #default="scope">
<div class="sa-flex">
<span class="mr-2"
:class="`sa-color--${state.goodsStatusStyle[scope.row.commission_goods?.status] || 'info'}`">
{{ scope.row.commission_goods?.status_text || '未参与' }}
</span>
{if $auth->check('shopro/commission/goods/edit')}
<el-button type="primary" link @click="onEdit(scope.row.id)">设置佣金</el-button>
{/if}
</div>
</template>
</el-table-column>
</el-table>
</el-main>
<el-footer class="sa-footer sa-flex sa-row-between sa-flex-wrap">
<div class="sa-batch sa-flex">
<div class="tip">
已选择 <span>{{batchHandle.data.length}}</span></div>
<div class="sa-flex">
{if $auth->check('shopro/commission/goods/edit')}
<el-button type="primary" :disabled="!batchHandle.data.length" @click="onBatchHandle('edit')">设置佣金
</el-button>
{/if}
</div>
</div>
<sa-pagination v-model="pagination" @pagination-change="getData"></sa-pagination>
</el-footer>
</el-container>
<sa-filter v-model="state.filter" @filter-change="onChangeFilter"></sa-filter>
</div>

View File

@@ -0,0 +1,187 @@
{include file="/shopro/common/script" /}
<style>
.level-form .title {
height: 32px;
line-height: 32px;
background: var(--sa-background-hex-hover);
padding: 0 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-subtitle);
border-radius: 4px;
margin-bottom: 16px;
}
.level-form .sa-title.is-line {
margin-bottom: 20px;
}
.level-form .w-120 {
width: 120px;
}
.level-form .item {
height: 32px;
padding: 0 16px;
font-size: 14px;
border: 1px solid var(--sa-border);
border-radius: 4px;
margin: 0 16px 16px 0;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.level-form .item:last-of-type {
margin: 0 0 16px 0;
}
.level-form .item.is-disabled {
background: var(--sa-background-hex-active);
color: #fff;
border: 1px solid var(--sa-background-hex-active);
cursor: not-allowed;
}
.level-form .item.is-active {
background: var(--el-color-primary);
color: #fff;
border: 1px solid var(--el-color-primary);
}
.level-form .item.is-active.is-none {
display: flex;
}
.level-form .item.is-none {
display: none;
}
.level-form .condition-group .condition-item {
padding: 0 12px;
}
</style>
<div id="addEdit" class="level-form" v-cloak>
<el-container class="panel-block">
<el-main>
<el-scrollbar height="100%">
<el-alert class="mb-4" type="warning">
<template #title>
新增或编辑等级后,请及时在分销商品中完善对应的佣金规则
</template>
</el-alert>
<el-form :model="form.model" :rules="form.rules" ref="formRef" label-width="150px">
<div class="sa-title is-line">等级佣金比例</div>
<el-form-item label="等级权重" prop="level">
<div :class="[
'item',
item.level == form.model.level ? 'is-active' : '',
level.existLevel.includes(item.level) ? 'is-disabled' : '',
form.model.level == 1 ? 'is-none' : '',
]" v-for="item in level.data" :key="item" @click="onSelectLevel(item.level)">
{{ item.name }}
</div>
</el-form-item>
<el-form-item label="等级名称" prop="name">
<el-input class="sa-w-360" v-model="form.model.name" placeholder="请输入等级名称"></el-input>
</el-form-item>
<el-form-item label="等级徽章" prop="image">
<sa-uploader v-model="form.model.image"></sa-uploader>
</el-form-item>
<el-form-item label="一级(自购)佣金比例" prop="commission_rules.commission_1"
:rules="form.rules.commission_rules.commission">
<el-input class="sa-w-360" v-model="form.model.commission_rules.commission_1" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<el-form-item label="二级佣金比例" prop="commission_rules.commission_2"
:rules="form.rules.commission_rules.commission">
<el-input class="sa-w-360" v-model="form.model.commission_rules.commission_2" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<el-form-item label="三级佣金比例" prop="commission_rules.commission_3"
:rules="form.rules.commission_rules.commission">
<el-input class="sa-w-360" v-model="form.model.commission_rules.commission_3" type="number">
<template #append>%</template>
</el-input>
</el-form-item>
<template v-if="form.model.level != 1">
<div class="sa-title is-line">添加升级条件</div>
<el-form-item label="升级方式" prop="upgrade_rules">
<div>
<el-radio-group class="mb-2" v-model="form.model.upgrade_type">
<el-radio :label="0">满足以下任意条件</el-radio>
<el-radio :label="1">满足以下全部条件</el-radio>
</el-radio-group>
<div>
<div class="sa-flex sa-flex-wrap condition-group" v-for="group in upgradeCondition"
:key="group">
<div :class="[
'item',
'condition-item',
Object.keys(form.model.upgrade_rules).includes(key) ? 'is-active' : '',
]" v-for="(item, key) in group" :key="item"
@click="onSelectUpgradeCondition(key)">
{{ item.name }}
</div>
</div>
</div>
</div>
</el-form-item>
<template v-for="(group, gkey) in upgradeCondition" :key="group">
<template v-for="(item, key) in group" :key="item">
<el-form-item :label="item.name"
v-if="Object.keys(form.model.upgrade_rules).includes(key)"
:prop="`upgrade_rules.${key}`" :rules="form.rules.upgrade_rules_inner.rules">
<template v-if="gkey != 'agent_level'">
<el-input class="w-120" v-model="form.model.upgrade_rules[key]" type="number">
<template #append> {{ initUnit(key) }}</template>
</el-input>
<el-button class="delete" type="danger" link @click="onDeleteRules(key)">
删除
</el-button>
</template>
<div v-if="gkey == 'agent_level'">
<div class="sa-flex sa-flex-wrap mb-4"
v-for="(al, index) in form.model.upgrade_rules[key]" :key="al">
<el-form-item :prop="`upgrade_rules.${key}.${index}.level`"
:rules="form.rules.upgrade_rules_inner.level">
<el-select class="w-120" v-model="al.level" placeholder="请选择分销商等级">
<template v-for="item in level.select" :key="item">
<el-option v-if="item.level < form.model.level"
:label="item.name" :value="item.level+''"></el-option>
</template>
</el-select>
<span class="ml-2 mr-2"></span>
</el-form-item>
<el-form-item :prop="`upgrade_rules.${key}.${index}.count`"
:rules="form.rules.upgrade_rules_inner.rules">
<el-input class="w-120" v-model="al.count" type="number">
<template #append></template>
</el-input>
<el-button class="delete" type="danger" link
@click="onDeleteRules(key, index)">
删除
</el-button>
</el-form-item>
</div>
<el-button type="primary" link size="small" @click="onAddUpgradeRules(key)">
+ 添加</el-button>
</div>
</el-form-item>
</template>
</template>
</template>
</el-form>
</el-scrollbar>
</el-main>
<el-footer class="sa-footer--submit sa-flex sa-row-right">
<el-button type="primary" @click="onConfirm">确定</el-button>
</el-footer>
</el-container>
</div>

View File

@@ -0,0 +1,60 @@
{include file="/shopro/common/script" /}
<div id="index" class="level-index panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<div class="sa-title sa-flex sa-row-between">
<div class="sa-title-left">
<div class="left-name">分销商等级</div>
</div>
<div class="sa-title-right">
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
{if $auth->check('shopro/commission/level/add')}
<el-button icon="Plus" type="primary" @click="onAdd">添加</el-button>
{/if}
</div>
</div>
</el-header>
<el-main class="sa-main">
<el-table height="100%" class="sa-table" :data="state.data" stripe>
<el-table-column label="等级" min-width="90">
<template #default="scope"> 等级{{ scope.row.level }} </template>
</el-table-column>
<el-table-column label="等级名称" min-width="150">
<template #default="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="等级徽章" min-width="120">
<template #default="scope">
<sa-image :url="scope.row.image" size="24"></sa-image>
</template>
</el-table-column>
<el-table-column label="一级(自购)佣金比例" min-width="160">
<template #default="scope"> {{ scope.row.commission_rules?.commission_1 }}% </template>
</el-table-column>
<el-table-column label="二级佣金比例" min-width="120">
<template #default="scope"> {{ scope.row.commission_rules?.commission_2 }}% </template>
</el-table-column>
<el-table-column label="三级佣金比例" min-width="120">
<template #default="scope"> {{ scope.row.commission_rules?.commission_3 }}% </template>
</el-table-column>
<el-table-column label="操作" min-width="120" fixed="right">
<template #default="scope">
{if $auth->check('shopro/commission/level/edit')}
<el-button type="primary" link @click="onEdit(scope.row.level)">编辑</el-button>
{/if}
<el-popconfirm v-if="scope.row.level != 1" width="fit-content" confirm-button-text="确认"
cancel-button-text="取消" title="确认删除这条记录?" @confirm="onDelete(scope.row.level)">
<template #reference>
{if $auth->check('shopro/commission/level/delete')}
<el-button type="danger" link>删除</el-button>
{/if}
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</el-main>
</el-container>
</div>

View File

@@ -0,0 +1,29 @@
{include file="/shopro/common/script" /}
<div id="select" class="level-select" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<el-alert class="mt-4">
<template #title>温馨提示:更换等级后,该用户不会降级</template>
</el-alert>
</el-header>
<el-main>
<el-table height="100%" class="sa-table" :data="state.data" stripe>
<el-table-column prop="name" label="等级信息" min-width="150"></el-table-column>
<el-table-column label="等级权重" min-width="90">
<template #default="scope"> 等级{{ scope.row.level }} </template>
</el-table-column>
<el-table-column label="操作" min-width="80" fixed="right">
<template #default="scope">
<span v-if="scope.row.level == state.level" class="sa-color--info"> 已选择 </span>
<el-button v-else class="is-link" type="primary" @click="onSelect(scope.row.level)">选择
</el-button>
</template>
</el-table-column>
</el-table>
</el-main>
<el-footer class="sa-footer--submit sa-flex sa-row-right">
<el-button type="primary" @click="onConfirm">确定</el-button>
</el-footer>
</el-container>
</div>

View File

@@ -0,0 +1,56 @@
{include file="/shopro/common/script" /}
<div id="index" class="log-index panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<div class="sa-title sa-flex sa-row-between">
<div class="sa-title-left">
<div class="left-name">分销动态</div>
<div class="really-status sa-flex ml-4">
实时动态
<el-switch class="ml-2" v-model="really.reallyStatus" :active-value="1" :inactive-value="0"
@change="onChangeReallyStatus"></el-switch>
<span class="ml-1" :class="really.reallyStatus == 1?'sa-color--primary':''">
{{ really.reallyStatus == 1 ? '开启' : '关闭' }}
</span>
<el-popover popper-class="sa-popper" trigger="hover" content="开启后,该页面将实时刷新">
<template #reference>
<el-icon class="sa-color--warning ml-1">
<Warning />
</el-icon>
</template>
</el-popover>
</div>
<sa-filter-condition v-model="state.filter" @filter-delete="onChangeFilter">
</sa-filter-condition>
</div>
<div class="sa-title-right">
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
<el-button class="sa-button-refresh" icon="Search" @click="onOpenFilter"></el-button>
</div>
</div>
</el-header>
<el-main class="sa-main">
<el-table height="100%" class="sa-table" :data="state.data" stripe>
<el-table-column prop="id" label="ID" min-width="90"></el-table-column>
<el-table-column prop="event_text" label="动态筛选" min-width="120"></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-main>
<el-footer class="sa-footer sa-flex sa-row-right">
<sa-pagination v-model="pagination" @pagination-change="getData"></sa-pagination>
</el-footer>
</el-container>
<sa-filter v-model="state.filter" @filter-change="onChangeFilter"></sa-filter>
</div>

View File

@@ -0,0 +1,513 @@
{include file="/shopro/common/script" /}
<style>
.order-index .dashboard-content {
padding: 20px 20px 0;
background: var(--sa-table-header-bg);
border-radius: 8px;
margin-bottom: 20px;
}
.order-index .dashboard-content .dashboard-item {
text-align: center;
margin-bottom: 20px;
}
.order-index .dashboard-content .dashboard-item .top {
line-height: 24px;
font-size: 20px;
font-weight: 400;
color: var(--sa-subtitle);
}
.order-index .dashboard-content .dashboard-item .top .unit {
font-size: 12px;
margin-left: 4px;
}
.order-index .dashboard-content .dashboard-item .bottom {
line-height: 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-font);
}
.order-index .order-content {
font-size: 12px;
font-weight: 400;
color: var(--sa-subtitle);
}
.order-index .goods-item .goods-title {
height: 14px;
line-height: 14px;
font-size: 12px;
font-weight: 500;
margin-bottom: 4px;
}
.order-index .goods-item .goods-title .goods-id {
color: var(--el-color-primary);
cursor: pointer;
}
.order-index .goods-item .goods-sku-text {
height: 14px;
line-height: 14px;
margin-bottom: 10px;
}
.order-index .sa-table-wrap {
height: 100%;
margin-left: -48px;
overflow: hidden;
}
.order-index .sa-table-wrap .sa-table .el-table__header-wrapper {
margin-bottom: 4px;
}
.order-index .sa-table-wrap .sa-table .el-table__row {
background: var(--sa-background-hex-hover);
}
.order-index .sa-table-wrap .sa-table .el-table__expanded-cell {
padding: 0;
}
.order-index .sa-table-wrap .sa-expand-table .el-table__header-wrapper {
margin-bottom: 0;
display: none;
}
.order-index .sa-table-wrap .sa-expand-table .el-table__row {
background: var(--el-table-tr-bg-color);
}
.order-index .rewards-item {
margin-right: 8px;
}
.order-index .rewards-item:last-of-type {
margin-right: 0;
}
.order-index .rewards-item .rewards-agent-id {
line-height: 32px;
}
.rewards-popover {
line-height: 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-font);
margin-bottom: 4px;
}
.rewards-popover .nickname {
height: 20px;
line-height: 20px;
}
.rewards-popover .id {
line-height: 16px;
font-size: 12px;
font-weight: 400;
color: var(--sa-subfont);
}
.rewards-popover .rewards-status {
height: 16px;
overflow: hidden;
}
.rewards-popover .rewards-commission {
width: 80px;
}
</style>
<div id="index" class="order-index panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<div class="sa-title sa-flex sa-row-between">
<div class="sa-title-left">
<div class="left-name">分销订单</div>
<sa-filter-condition v-model="state.filter" @filter-delete="onChangeFilter">
</sa-filter-condition>
</div>
<div class="sa-title-right">
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
<el-button class="sa-button-refresh" icon="Search" @click="onOpenFilter"></el-button>
{if $auth->check('shopro/commission/order/export')}
<el-button :loading="exportLoading" :disabled="exportLoading" @click="onExport('export')">订单导出
</el-button>
{/if}
</div>
</div>
<el-row class="dashboard-content">
<el-col class="dashboard-item" :xs="8" :sm="8" :md="6" :lg="6" :xl="6">
<div class="top"> {{ state.count.total }}<span class="unit"></span> </div>
<div class="bottom">商品总订单数</div>
</el-col>
<el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
<div class="top">
{{ state.count.total_amount?.toFixed(2) }}<span class="unit"></span>
</div>
<div class="bottom">商品结算总金额</div>
</el-col>
<el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
<div class="top">
{{ state.count.total_commission?.toFixed(2) }}<span class="unit"></span>
</div>
<div class="bottom">分佣总金额</div>
</el-col>
<el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
<div class="top">
{{ state.count.total_commission_cancel?.toFixed(2) }}<span class="unit"></span>
</div>
<div class="bottom">已取消佣金</div>
</el-col>
<el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
<div class="top">
{{ state.count.total_commission_back?.toFixed(2) }}<span class="unit"></span>
</div>
<div class="bottom">已退回佣金</div>
</el-col>
<el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
<div class="top">
{{ state.count.total_commission_pending?.toFixed(2) }}<span class="unit"></span>
</div>
<div class="bottom">未结算佣金</div>
</el-col>
<el-col class="dashboard-item" :xs="8" :sm="8" :md="3" :lg="3" :xl="3">
<div class="top">
{{ state.count.total_commission_accounted?.toFixed(2) }}<span class="unit"></span>
</div>
<div class="bottom">已结算佣金</div>
</el-col>
</el-row>
</el-header>
<el-main class="sa-main">
<div class="sa-table-wrap">
<el-table height="100%" class="sa-table" :data="state.data" :span-method="arraySpanMethod"
default-expand-all>
<el-table-column type="expand">
<template #default="props">
<el-table class="sa-table sa-expand-table" :data="[props.row]">
<el-table-column width="48"></el-table-column>
<el-table-column min-width="300">
<template #default>
<div v-if="props.row.order_item" class="goods-item sa-flex">
<sa-image class="mr-2" :url="props.row.order_item.goods_image" size="58">
</sa-image>
<div>
<div class="goods-title sa-table-line-1">
<span class="goods-id mr-1"
@click="onOpenGoodsDetail(props.row.order_item.goods_id)">
#{{props.row.order_item.goods_id }}
</span>
{{ props.row.order_item.goods_title }}
</div>
<div class="goods-sku-text sa-table-line-1">
<span v-if="props.row.order_item.goods_sku_text">{{
props.row.order_item.goods_sku_text
}}</span>
</div>
<div class="sa-flex">
<span class="goods-price mr-2">¥{{
props.row.order_item.goods_price }}</span>
<span class="goods-num">x{{
props.row.order_item.goods_num }}</span>
</div>
</div>
</div>
<div v-else>{{ props.row.order_item }}</div>
</template>
</el-table-column>
<el-table-column min-width="100">
<template #default>
<!-- 0=未退款|1=申请退款|2=退款完成 -->
<span
:class="props.row.order_item?.refund_status==0?'sa-color--info':'sa-color--success'">
{{ props.row.order_item?.refund_status_text || '-' }}
</span>
</template>
</el-table-column>
<el-table-column min-width="100" align="center">
<template #default>
<sa-user-profile :user="props.row.buyer" :id="props.row.buyer_id" mode="col">
</sa-user-profile>
</template>
</el-table-column>
<el-table-column min-width="100" align="center">
<template #default>
<sa-user-profile :user="props.row.agent" :id="props.row.agent_id" mode="col">
</sa-user-profile>
</template>
</el-table-column>
<el-table-column min-width="200" align="center">
<template #default>
<el-scrollbar>
<div class="sa-flex sa-row-center">
<template v-for="(rewards, index) in props.row.rewards" :key="rewards">
<el-popover placement="top-start" :width="240" trigger="click">
<div class="rewards-popover">
<div class="mb-2">
<div v-if="rewards.agent" class="sa-flex">
<sa-image :url="rewards.agent.avatar" size="32"
radius="16"></sa-image>
<div class="ml-2">
<div class="nickname sa-table-line-1">
{{ rewards.agent.nickname }}
</div>
<div class="id">#{{ rewards.agent.id }}</div>
</div>
</div>
<div v-else>#{{ rewards.agent_id }}</div>
</div>
<div>用户等级:等级{{ rewards.agent_level }}</div>
<div> 用户层级:{{ rewards.commission_level }}级分销 </div>
<div>
比例/佣金:
<template v-if="rewards.commission_rules">
<template v-if="rewards.commission_rules.rate">
{{ rewards.commission_rules.rate }}%
</template>
<template v-if="rewards.commission_rules.money">
{{ rewards.commission_rules.money }}元
</template>
</template>
</div>
<div class="rewards-status sa-flex">
佣金状态:
<span class="mr-1">{{rewards.status_text}}</span>
<template v-if="rewards.status == 0">
{if $auth->check('shopro/commission/order/confirm')}
<el-button type="primary" link size="small"
@click="onConfirm({commission_reward_id: rewards.id})">
手动结算</el-button>
{/if}
{if $auth->check('shopro/commission/order/cancel')}
<el-button class="ml-1" type="info" link
size="small"
@click="onCancel({commission_reward_id: rewards.id})">
取消
</el-button>
{/if}
</template>
<el-popconfirm v-if="rewards.status == 1"
width="fit-content" confirm-button-text="确认"
cancel-button-text="取消" title="确认?"
@confirm="onBack({commission_reward_id: rewards.id})">
<template #reference>
{if
$auth->check('shopro/commission/order/back')}
<el-button type="danger" link size="small">
手动退回
</el-button>
{/if}
</template>
</el-popconfirm>
</div>
<div>入账方式:{{ rewards.type_text }}</div>
<div class="sa-flex sa-col-top">
<span class="sa-flex-0">佣金金额:</span>
<div class="sa-flex sa-flex-wrap">
<template v-if="!rewardsPopover.flag[index]">
<span>{{ rewards.commission }}元</span>
{if
$auth->check('shopro/commission/order/edit')}
<el-button v-if="rewards.status == 0"
class="ml-1" type="primary" link
size="small"
@click="rewardsPopover.flag[index] = true">
修改
</el-button>
{/if}
</template>
<template v-if="rewardsPopover.flag[index]">
<el-input class="rewards-commission"
v-model="rewardsPopover.commission"
size="small">
<template #append></template>
</el-input>
<el-button class="ml-1" type="info" link
size="small"
@click="onCancelRewardsPopover(index)">取消
</el-button>
<el-button class="ml-1" type="primary" link
size="small"
@click="onConfirmRewardsPopover(index,rewards.id)">
确定</el-button>
</template>
<s v-if="rewards.original_commission != rewards.commission"
class="ml-1">
{{rewards.original_commission}}
</s>
</div>
</div>
</div>
<template #reference>
<div class="rewards-item sa-flex sa-flex-col sa-row-center">
<template v-if="rewards.agent">
<sa-image :url="rewards.agent.avatar" size="32"
radius="16" :ispreview="false"></sa-image>
</template>
<div v-if="!rewards.agent" class="rewards-agent-id">
{{ rewards.agent_id }}
</div>
<div class="commission mt-1"> {{ rewards.commission }}元
</div>
</div>
</template>
</el-popover>
</template>
</div>
</el-scrollbar>
</template>
</el-table-column>
<el-table-column min-width="80">
<template #default>
<!-- commission_reward_status -2=已退回|-1=已取消|0=未结算|1=已结算 -->
<span
:class="`sa-color--${state.statusStyle[props.row.commission_reward_status]}`">
{{ props.row.commission_reward_status_text }}
</span>
</template>
</el-table-column>
<el-table-column min-width="172">
<template #default>
<div>{{ props.row.reward_event_text }}</div>
{{ props.row.commission_time }}
</template>
</el-table-column>
<el-table-column min-width="110">
<template #default>
<div>{{ props.row.reward_type_text }}</div>
{{ props.row.amount }}元
</template>
</el-table-column>
<el-table-column min-width="100">
<template #default>
<!-- commission_order_status -2=已扣除|-1=已取消|0=不计入|1=已计入 -->
<span
:class="`sa-color--${state.statusStyle[props.row.commission_order_status]}`">
{{ props.row.commission_order_status_text }}
</span>
</template>
</el-table-column>
<el-table-column min-width="160">
<template #default>
{{ countRewards(props.row.rewards) }}
</template>
</el-table-column>
<el-table-column min-width="160">
<template #default>
<el-popover v-model:visible="commissionPopover.flag[props.$index]"
placement="top-start" :width="312" trigger="click">
<div class="commission-popover">
<div class="title sa-flex">
<el-icon class="sa-color--warning mr-1">
<question-filled />
</el-icon>
<template v-if="props.row.commission_reward_status == 0">
<template v-if="commissionPopover.type == 'confirm'">
手动提前结算,佣金将不再按结算方式自动执行。
</template>
<template v-if="commissionPopover.type == 'cancel'">
取消结算,佣金将不再结算。
</template>
</template>
<template v-if="props.row.commission_reward_status == 1">
您确定要手动退回佣金?
</template>
</div>
<div class="sa-flex sa-row-between">
<div>
<el-checkbox
v-if="commissionPopover.type == 'back' || commissionPopover.type == 'cancel'"
v-model="commissionPopover.isDelete" true-label="1"
false-label="0">扣除推广分销商业绩
</el-checkbox>
</div>
<div>
<el-button type="info" link size="small"
@click="onCancelCommissionPopover(props.$index)">
取消</el-button>
<el-button size="small" type="primary"
@click="onConfirmCommissionPopover(props.$index,props.row.id)">
确定</el-button>
</div>
</div>
</div>
<template #reference>
<div class="sa-flex">
<template v-if="props.row.commission_reward_status == 0">
{if $auth->check('shopro/commission/order/confirm')}
<el-button type="primary" link
@click="commissionPopover.type = 'confirm'">手动结算</el-button>
{/if}
{if $auth->check('shopro/commission/order/cancel')}
<el-button type="info" link
@click="commissionPopover.type = 'cancel'">
取消结算
</el-button>
{/if}
</template>
{if $auth->check('shopro/commission/order/back')}
<el-button v-if="props.row.commission_reward_status == 1"
type="danger" link @click="commissionPopover.type = 'back'">
手动退回
</el-button>
{/if}
</div>
</template>
</el-popover>
<template v-if="props.row.commission_reward_status < 0">-</template>
</template>
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column label="商品信息" min-width="300">
<template #default="scope">
<div class="order-content sa-flex">
<div class="id mr-4">ID{{ scope.row.id }}</div>
<template v-if="scope.row.order">
<div class="order-sn sa-flex mr-4">
订单号:{{ scope.row.order.order_sn }}
<el-icon class="copy-document" @click="onClipboard(scope.row.order.order_sn)">
<copy-document />
</el-icon>
</div>
<div class="mr-4">下单时间:{{ scope.row.order.createtime }}</div>
<div class="mr-4">订单状态:{{ scope.row.order.status_text }}</div>
</template>
</div>
</template>
</el-table-column>
<el-table-column label="退款状态" min-width="100"></el-table-column>
<el-table-column label="下单用户" min-width="100" align="center"></el-table-column>
<el-table-column label="推广分销商" min-width="100" align="center"></el-table-column>
<el-table-column label="佣金详情" min-width="200" align="center"></el-table-column>
<el-table-column label="佣金状态" min-width="80"></el-table-column>
<el-table-column label="结算方式/结算时间" min-width="172"></el-table-column>
<el-table-column label="商品结算金额" min-width="110"> </el-table-column>
<el-table-column label="分销商业绩" min-width="100"> </el-table-column>
<el-table-column label="分销总金额/到账金额" min-width="160">
</el-table-column>
<el-table-column label="操作" min-width="160">
<template #default="scope">
<el-button type="primary" link @click="onOpenOrderDetail(scope.row.order_id)">订单详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-main>
<el-footer class="sa-footer sa-flex sa-row-right">
<sa-pagination v-model="pagination" @pagination-change="getData"></sa-pagination>
</el-footer>
</el-container>
<sa-filter v-model="state.filter" @filter-change="onChangeFilter"></sa-filter>
</div>

View File

@@ -0,0 +1,59 @@
{include file="/shopro/common/script" /}
<div id="index" class="reward-index panel panel-default panel-intro" v-cloak>
<el-container class="panel-block">
<el-header class="sa-header">
<div class="sa-title sa-flex sa-row-between">
<div class="sa-title-left">
<div class="left-name">佣金明细</div>
<sa-filter-condition v-model="state.filter" @filter-delete="onChangeFilter">
</sa-filter-condition>
</div>
<div class="sa-title-right">
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData"></el-button>
<el-button class="sa-button-refresh" icon="Search" @click="onOpenFilter"></el-button>
{if $auth->check('shopro/commission/reward/export')}
<el-button :loading="exportLoading" :disabled="exportLoading" @click="onExport('export')">导出
</el-button>
{/if}
</div>
</div>
</el-header>
<el-main class="sa-main">
<el-table height="100%" class="sa-table" :data="state.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--${state.statusStyle[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-main>
<el-footer class="sa-footer sa-flex sa-row-right">
<sa-pagination v-model="pagination" @pagination-change="getData"></sa-pagination>
</el-footer>
</el-container>
<sa-filter v-model="state.filter" @filter-change="onChangeFilter"></sa-filter>
</div>