feat: 支持角色身份自定义名称全链路配置与动态展示
这个提交包含在:
@@ -199,6 +199,8 @@ class Config extends Common
|
||||
'partner_maker_overtaken_rate', 'partner_team_total', 'partner_venue_split',
|
||||
'partner_county_full', 'partner_venue_share_per_order', 'partner_county_share_per_order',
|
||||
'partner_venue_peer_rate', 'partner_county_peer_rate',
|
||||
'partner_role_name_taster', 'partner_role_name_maker', 'partner_role_name_venue',
|
||||
'partner_role_name_county', 'partner_role_name_partner',
|
||||
];
|
||||
if ('GET' === $this->request->method()) {
|
||||
$all = ShoproConfig::getConfigs('shop.commission', false) ?: [];
|
||||
@@ -228,6 +230,11 @@ class Config extends Common
|
||||
'partner_county_share_per_order' => 50,
|
||||
'partner_venue_peer_rate' => 0.10,
|
||||
'partner_county_peer_rate' => 0.10,
|
||||
'partner_role_name_taster' => '品酒师',
|
||||
'partner_role_name_maker' => '创客',
|
||||
'partner_role_name_venue' => '酒道馆',
|
||||
'partner_role_name_county' => '区县代理',
|
||||
'partner_role_name_partner' => '合伙股东',
|
||||
];
|
||||
foreach ($defaults as $key => $value) {
|
||||
if ($configs[$key] === null || $configs[$key] === '') {
|
||||
@@ -243,6 +250,11 @@ class Config extends Common
|
||||
$save[$key] = $params[$key];
|
||||
}
|
||||
}
|
||||
foreach (['partner_role_name_taster', 'partner_role_name_maker', 'partner_role_name_venue', 'partner_role_name_county', 'partner_role_name_partner'] as $roleKey) {
|
||||
if (isset($save[$roleKey])) {
|
||||
$save[$roleKey] = trim((string) $save[$roleKey]);
|
||||
}
|
||||
}
|
||||
if (isset($save['partner_active_days']) && intval($save['partner_active_days']) < 1) {
|
||||
$this->error('领取窗口天数须 ≥ 1');
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ class Dashboard extends Common
|
||||
'available_voucher' => number_format($availableVoucher, 2, '.', ''),
|
||||
];
|
||||
|
||||
// 7. 合伙股东网络与全角色身份矩阵 (收益按角色专属类型归集,杜绝重复统计)
|
||||
// 7. 收益中心网络与全角色身份矩阵 (收益按角色专属类型归集,杜绝重复统计)
|
||||
$totalRegisteredUsers = (int) User::count();
|
||||
$totalAgents = (int) Agent::count();
|
||||
$normalUserCount = max(0, $totalRegisteredUsers - $totalAgents);
|
||||
@@ -194,7 +194,7 @@ class Dashboard extends Common
|
||||
$activeUserIds = $activeService->activeUserIds($activeWindowStart, $now);
|
||||
$activeUserMap = array_flip($activeUserIds);
|
||||
|
||||
// 全量合伙股东基础信息
|
||||
// 全量成员档案基础信息
|
||||
$allAgents = Agent::field('user_id, level, is_venue, is_county, madow, last_self_order_time')->select();
|
||||
|
||||
// 收益明细按 (user_id + reward_type) 聚合,精确归集各角色产出收益
|
||||
@@ -284,18 +284,25 @@ class Dashboard extends Common
|
||||
];
|
||||
};
|
||||
|
||||
$roleNames = PartnerConfig::roleNames();
|
||||
$tasterTitle = $roleNames['taster'];
|
||||
$makerTitle = $roleNames['maker'];
|
||||
$venueTitle = $roleNames['venue'];
|
||||
$countyTitle = $roleNames['county'];
|
||||
$partnerTitle = $roleNames['partner'];
|
||||
|
||||
// 统计各角色身份详细指标
|
||||
$roleList = [
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 1; }, 'taster', '品酒师', '基础身份', '人', '品', '#806af6', 1, '', $roleRewardTypeFilter['taster']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 2; }, 'maker_v1', '创客V1', '创客梯队', '人', 'V1', '#13c2c2', 2, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 3; }, 'maker_v2', '创客V2', '创客梯队', '人', 'V2', '#13c2c2', 3, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 4; }, 'maker_v3', '创客V3', '创客梯队', '人', 'V3', '#13c2c2', 4, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 5; }, 'maker_v4', '创客V4', '创客梯队', '人', 'V4', '#13c2c2', 5, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 6; }, 'maker_v5', '创客V5', '创客梯队', '人', 'V5', '#13c2c2', 6, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 7; }, 'maker_v6', '创客V6', '创客梯队', '人', 'V6', '#13c2c2', 7, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level >= 2; }, 'maker_total', '创客队伍小计', '创客梯队', '人', '创', '#13c2c2', 'maker', '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->is_venue == 1; }, 'venue', '实体酒道馆', '渠道授权', '家', '馆', '#fa8c16', '', 'venue', $roleRewardTypeFilter['venue']),
|
||||
$calcRoleStats(function($a) { return (int)$a->is_county == 1; }, 'county', '区县代理', '渠道授权', '个', '县', '#722ed1', '', 'county', $roleRewardTypeFilter['county']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 1; }, 'taster', $tasterTitle, '基础身份', '人', mb_substr($tasterTitle, 0, 1), '#806af6', 1, '', $roleRewardTypeFilter['taster']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 2; }, 'maker_v1', $makerTitle . 'V1', $makerTitle . '梯队', '人', 'V1', '#13c2c2', 2, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 3; }, 'maker_v2', $makerTitle . 'V2', $makerTitle . '梯队', '人', 'V2', '#13c2c2', 3, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 4; }, 'maker_v3', $makerTitle . 'V3', $makerTitle . '梯队', '人', 'V3', '#13c2c2', 4, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 5; }, 'maker_v4', $makerTitle . 'V4', $makerTitle . '梯队', '人', 'V4', '#13c2c2', 5, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 6; }, 'maker_v5', $makerTitle . 'V5', $makerTitle . '梯队', '人', 'V5', '#13c2c2', 6, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level == 7; }, 'maker_v6', $makerTitle . 'V6', $makerTitle . '梯队', '人', 'V6', '#13c2c2', 7, '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->level >= 2; }, 'maker_total', $makerTitle . '队伍小计', $makerTitle . '梯队', '人', mb_substr($makerTitle, 0, 1), '#13c2c2', 'maker', '', $roleRewardTypeFilter['maker']),
|
||||
$calcRoleStats(function($a) { return (int)$a->is_venue == 1; }, 'venue', $venueTitle, '渠道授权', '家', mb_substr($venueTitle, 0, 1), '#fa8c16', '', 'venue', $roleRewardTypeFilter['venue']),
|
||||
$calcRoleStats(function($a) { return (int)$a->is_county == 1; }, 'county', $countyTitle, '渠道授权', '个', mb_substr($countyTitle, 0, 1), '#722ed1', '', 'county', $roleRewardTypeFilter['county']),
|
||||
];
|
||||
|
||||
// 增加普通注册会员行 (明确标明无需自购考核)
|
||||
@@ -365,6 +372,8 @@ class Dashboard extends Common
|
||||
'active_rate' => $activeRate,
|
||||
'role_list' => $roleList,
|
||||
'role_stats' => $roleStats,
|
||||
'role_names' => $roleNames,
|
||||
'custom_role_names' => $roleNames,
|
||||
];
|
||||
|
||||
// 8. CFO 视角:平台资金池结余、刚性法币流动负债与提现风控
|
||||
@@ -408,7 +417,7 @@ class Dashboard extends Common
|
||||
'pending_voucher_quota' => number_format($pendingVoucher, 2, '.', ''),
|
||||
];
|
||||
|
||||
// 9. COO 视角:转化复购漏斗、合伙股东自购续期雷达、供应链库存与实时待办看板
|
||||
// 9. COO 视角:转化复购漏斗、进阶成员自购续期雷达、供应链库存与实时待办看板
|
||||
$paidOrderUsers = Order::whereIn('status', [Order::STATUS_PAID, Order::STATUS_COMPLETED])
|
||||
->group('user_id')
|
||||
->field('user_id, count(*) as buy_count')
|
||||
@@ -428,7 +437,7 @@ class Dashboard extends Common
|
||||
$repeatPurchaseRate = $paidUsersCount > 0 ? round(($repeatBuyCount / $paidUsersCount) * 100, 1) : 0.0;
|
||||
$arpu = $paidUsersCount > 0 ? round($netGmv / $paidUsersCount, 2) : 0.0;
|
||||
|
||||
// 9.2 合伙股东 30 天自购续期雷达 (仅统计具备合伙股东身份的会员,避免恐慌误判)
|
||||
// 9.2 进阶成员 30 天自购续期雷达 (仅统计具备进阶角色的会员,避免恐慌误判)
|
||||
$activePartnersCount = 0;
|
||||
$warningPartnersCount = 0;
|
||||
$pendingRenewCount = 0;
|
||||
@@ -506,7 +515,7 @@ class Dashboard extends Common
|
||||
}
|
||||
}
|
||||
|
||||
// 股东专属自购达标率(分子为在保合格股东,分母为合伙股东总人数)
|
||||
// 进阶成员自购达标率(分子为在保合格进阶成员,分母为进阶角色总人数)
|
||||
$partnerActiveRate = $partnerShareholderCount > 0
|
||||
? round((($activePartnersCount + $warningPartnersCount) / $partnerShareholderCount) * 100, 1)
|
||||
: 0.0;
|
||||
@@ -634,6 +643,8 @@ class Dashboard extends Common
|
||||
'partner_network' => $partnerNetwork,
|
||||
'finance_overview' => $financeOverview,
|
||||
'operation_overview' => $operationOverview,
|
||||
'custom_role_names' => $roleNames,
|
||||
'role_names' => $roleNames,
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -887,7 +898,7 @@ class Dashboard extends Common
|
||||
$searchHistory = new SearchHistory();
|
||||
$hotSearch = $searchHistory->hotSearch();
|
||||
|
||||
// 3. 合伙股东收益排行 TOP 5
|
||||
// 3. 收益中心收益排行 TOP 5
|
||||
$partnerRanking = [];
|
||||
$rankingRows = Reward::field('user_id, sum(amount) as total_income, count(*) as reward_count')
|
||||
->where('status', 1)
|
||||
|
||||
@@ -61,14 +61,16 @@ class Agent extends Common
|
||||
|
||||
$identityInfo = \addons\shopro\service\partner\IdentityService::build($detail);
|
||||
$isPartner = !empty($identityInfo['is_partner']);
|
||||
$isAdvanced = !empty($identityInfo['is_advanced']);
|
||||
$detail->is_partner = $isPartner ? 1 : 0;
|
||||
$detail->is_advanced = $isAdvanced ? 1 : 0;
|
||||
|
||||
$detail->next_push3_amount = number_format((float) $next, 2, '.', '');
|
||||
$detail->next_push3_text = '第 ' . ($seq + 1) . ' 单将返 ' . $detail->next_push3_amount;
|
||||
$detail->last_self_order_text = $last ? date('Y-m-d H:i:s', $last) : '从未下单';
|
||||
|
||||
// 业务核心规范:合伙股东仅是会员专属进阶身份,普通会员与品酒师免自购考核
|
||||
if (!$isPartner) {
|
||||
// 业务核心规范:进阶角色(创客V1~V6、酒道馆、区县代理、合伙股东)需自购考核;基础会员及品酒师免自购考核
|
||||
if (!$isAdvanced) {
|
||||
$detail->active_status_text = '免自购考核 (基础会员/品酒师)';
|
||||
} else {
|
||||
$detail->active_status_text = !empty($detail->active_30d)
|
||||
@@ -98,6 +100,8 @@ class Agent extends Common
|
||||
$detail->partner_mode = \addons\shopro\service\partner\PartnerConfig::isPartnerMode() ? 1 : 0;
|
||||
$rate = (new \addons\shopro\service\partner\RateService())->currentRate();
|
||||
$detail->madow_value = \addons\shopro\service\partner\IdentityService::formatMoney((float) ($detail->madow ?? 0) * (float) $rate);
|
||||
$detail->custom_role_names = \addons\shopro\service\partner\PartnerConfig::roleNames();
|
||||
$detail->role_names = $detail->custom_role_names;
|
||||
|
||||
$this->success('分销商详情', null, $detail);
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ class Reward extends Common
|
||||
'buyer_nickname' => '买家',
|
||||
'order_id' => '订单',
|
||||
'reward_type_text' => '奖励类型',
|
||||
'role_text' => '合伙身份',
|
||||
'role_text' => '受益身份',
|
||||
'amount' => '结算金额',
|
||||
'madow' => '马豆',
|
||||
'base_amount' => '基数',
|
||||
@@ -61,7 +61,7 @@ class Reward extends Common
|
||||
}
|
||||
$export = new \addons\shopro\library\Export();
|
||||
$params = [
|
||||
'file_name' => '合伙人服务收益结算台账',
|
||||
'file_name' => '收益中心结算台账',
|
||||
'cell_titles' => $cellTitles,
|
||||
'total' => $total,
|
||||
'is_sub_cell' => false,
|
||||
|
||||
在新工单中引用
屏蔽一个用户