| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- <?php
- namespace App\Module\UrsPromotion\Services;
- use App\Module\UrsPromotion\Enums\UrsTalentLevel;
- use App\Module\UrsPromotion\Logics\UrsPartnerDividendLogic;
- use App\Module\UrsPromotion\Models\UrsPartnerDividendRecord;
- use App\Module\UrsPromotion\Models\UrsPartnerDividendDetail;
- use App\Module\UrsPromotion\Models\UrsUserTalent;
- use Illuminate\Support\Facades\Log;
- use Carbon\Carbon;
- /**
- * URS合伙人分红服务
- *
- * 对外提供URS合伙人分红相关服务接口
- */
- class UrsPartnerDividendService
- {
- /**
- * 执行每日合伙人分红
- *
- * @param string|null $date 分红日期,默认为今天
- * @return array 分红结果
- */
- public static function executeDailyDividend(?string $date = null): array
- {
- try {
- $logic = new UrsPartnerDividendLogic();
- return $logic->executeDailyDividend($date);
- } catch (\Exception $e) {
- Log::error('合伙人分红执行失败', [
- 'date' => $date ?? 'today',
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return [
- 'success' => false,
- 'message' => '分红执行失败: ' . $e->getMessage()
- ];
- }
- }
- /**
- * 获取合伙人列表
- *
- * @return array 合伙人列表
- */
- public static function getPartnerList(): array
- {
- try {
- // 获取所有顶级达人(合伙人)
- $talents = UrsUserTalent::where('talent_level', UrsTalentLevel::MASTER->value)
- ->get();
- $partners = [];
- foreach ($talents as $talent) {
- // UrsUserTalent表中的user_id就是农场用户ID
- $userId = $talent->user_id;
- // 获取对应的URS用户ID
- $ursUserId = UrsUserMappingService::getMappingUrsUserId($userId);
- if ($ursUserId) {
- $user = \App\Module\User\Models\User::find($userId);
- if ($user) {
- $partners[] = [
- 'user_id' => $userId,
- 'urs_user_id' => $ursUserId,
- 'username' => $user->username,
- 'talent_level' => $talent->talent_level,
- 'talent_level_name' => '合伙人',
- 'created_at' => $talent->created_at->format('Y-m-d H:i:s')
- ];
- }
- }
- }
- return [
- 'success' => true,
- 'data' => $partners,
- 'total' => count($partners)
- ];
- } catch (\Exception $e) {
- Log::error('获取合伙人列表失败', [
- 'error' => $e->getMessage()
- ]);
- return [
- 'success' => false,
- 'message' => '获取合伙人列表失败: ' . $e->getMessage(),
- 'data' => [],
- 'total' => 0
- ];
- }
- }
- /**
- * 获取分红历史记录
- *
- * @param string|null $startDate 开始日期
- * @param string|null $endDate 结束日期
- * @param int $limit 限制数量
- * @return array 分红历史
- */
- public static function getDividendHistory(?string $startDate = null, ?string $endDate = null, int $limit = 50): array
- {
- try {
- $query = UrsPartnerDividendRecord::with(['transferApp']);
- if ($startDate) {
- $query->where('dividend_date', '>=', $startDate);
- }
- if ($endDate) {
- $query->where('dividend_date', '<=', $endDate);
- }
- $records = $query->orderBy('dividend_date', 'desc')
- ->limit($limit)
- ->get();
- $history = [];
- foreach ($records as $record) {
- $history[] = [
- 'id' => $record->id,
- 'dividend_date' => $record->dividend_date->format('Y-m-d'),
- 'total_fee_amount' => $record->total_fee_amount,
- 'dividend_amount' => $record->dividend_amount,
- 'partner_count' => $record->partner_count,
- 'per_partner_amount' => $record->per_partner_amount,
- 'status' => $record->status,
- 'status_name' => $record->status_name,
- 'error_message' => $record->error_message,
- 'transfer_app_title' => $record->transferApp->title ?? '',
- 'created_at' => $record->created_at->format('Y-m-d H:i:s')
- ];
- }
- return [
- 'success' => true,
- 'data' => $history,
- 'total' => count($history)
- ];
- } catch (\Exception $e) {
- Log::error('获取分红历史失败', [
- 'start_date' => $startDate,
- 'end_date' => $endDate,
- 'error' => $e->getMessage()
- ]);
- return [
- 'success' => false,
- 'message' => '获取分红历史失败: ' . $e->getMessage(),
- 'data' => [],
- 'total' => 0
- ];
- }
- }
- /**
- * 获取分红详情
- *
- * @param int $dividendRecordId 分红记录ID
- * @return array 分红详情
- */
- public static function getDividendDetails(int $dividendRecordId): array
- {
- try {
- $record = UrsPartnerDividendRecord::with(['transferApp'])->find($dividendRecordId);
- if (!$record) {
- return [
- 'success' => false,
- 'message' => '分红记录不存在'
- ];
- }
- $details = UrsPartnerDividendDetail::getByDividendRecordId($dividendRecordId);
- $detailList = [];
- foreach ($details as $detail) {
- $detailList[] = [
- 'id' => $detail->id,
- 'user_id' => $detail->user_id,
- 'urs_user_id' => $detail->urs_user_id,
- 'username' => $detail->user->username ?? '',
- 'talent_level' => $detail->talent_level,
- 'talent_level_name' => $detail->talent_level_name,
- 'dividend_amount' => $detail->dividend_amount,
- 'status' => $detail->status,
- 'status_name' => $detail->status_name,
- 'error_message' => $detail->error_message,
- 'transfer_order_id' => $detail->transfer_order_id,
- 'created_at' => $detail->created_at->format('Y-m-d H:i:s')
- ];
- }
- return [
- 'success' => true,
- 'data' => [
- 'record' => [
- 'id' => $record->id,
- 'dividend_date' => $record->dividend_date->format('Y-m-d'),
- 'total_fee_amount' => $record->total_fee_amount,
- 'dividend_amount' => $record->dividend_amount,
- 'partner_count' => $record->partner_count,
- 'per_partner_amount' => $record->per_partner_amount,
- 'status' => $record->status,
- 'status_name' => $record->status_name,
- 'error_message' => $record->error_message,
- 'transfer_app_title' => $record->transferApp->title ?? '',
- 'created_at' => $record->created_at->format('Y-m-d H:i:s')
- ],
- 'details' => $detailList
- ]
- ];
- } catch (\Exception $e) {
- Log::error('获取分红详情失败', [
- 'dividend_record_id' => $dividendRecordId,
- 'error' => $e->getMessage()
- ]);
- return [
- 'success' => false,
- 'message' => '获取分红详情失败: ' . $e->getMessage()
- ];
- }
- }
- /**
- * 获取用户分红历史
- *
- * @param int $userId 用户ID
- * @return array 用户分红历史
- */
- public static function getUserDividendHistory(int $userId): array
- {
- try {
- $details = UrsPartnerDividendDetail::getUserDividendHistory($userId);
- $history = [];
- foreach ($details as $detail) {
- $history[] = [
- 'id' => $detail->id,
- 'dividend_date' => $detail->dividendRecord->dividend_date->format('Y-m-d'),
- 'dividend_amount' => $detail->dividend_amount,
- 'status' => $detail->status,
- 'status_name' => $detail->status_name,
- 'error_message' => $detail->error_message,
- 'transfer_order_id' => $detail->transfer_order_id,
- 'created_at' => $detail->created_at->format('Y-m-d H:i:s')
- ];
- }
- return [
- 'success' => true,
- 'data' => $history,
- 'total' => count($history)
- ];
- } catch (\Exception $e) {
- Log::error('获取用户分红历史失败', [
- 'user_id' => $userId,
- 'error' => $e->getMessage()
- ]);
- return [
- 'success' => false,
- 'message' => '获取用户分红历史失败: ' . $e->getMessage(),
- 'data' => [],
- 'total' => 0
- ];
- }
- }
- /**
- * 获取分红统计信息
- *
- * @return array 统计信息
- */
- public static function getDividendStatistics(): array
- {
- try {
- $totalRecords = UrsPartnerDividendRecord::count();
- $completedRecords = UrsPartnerDividendRecord::getCompletedCount();
- $totalDividendAmount = UrsPartnerDividendRecord::getTotalDividendAmount();
- $currentPartnerCount = UrsUserTalent::where('talent_level', 5)->count();
- return [
- 'success' => true,
- 'data' => [
- 'total_records' => $totalRecords,
- 'completed_records' => $completedRecords,
- 'total_dividend_amount' => $totalDividendAmount,
- 'current_partner_count' => $currentPartnerCount,
- 'success_rate' => $totalRecords > 0 ? round($completedRecords / $totalRecords * 100, 2) : 0
- ]
- ];
- } catch (\Exception $e) {
- Log::error('获取分红统计信息失败', [
- 'error' => $e->getMessage()
- ]);
- return [
- 'success' => false,
- 'message' => '获取分红统计信息失败: ' . $e->getMessage()
- ];
- }
- }
- /**
- * 重试失败的分红
- *
- * @param string $date 分红日期
- * @return array 重试结果
- */
- public static function retryFailedDividend(string $date): array
- {
- try {
- $logic = new UrsPartnerDividendLogic();
- return $logic->retryFailedDividend($date);
- } catch (\Exception $e) {
- Log::error('重试失败分红失败', [
- 'date' => $date,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return [
- 'success' => false,
- 'message' => '重试失败分红失败: ' . $e->getMessage()
- ];
- }
- }
- /**
- * 检查分红状态和进度
- *
- * @param string $date 分红日期
- * @return array 状态信息
- */
- public static function checkDividendStatus(string $date): array
- {
- try {
- $record = UrsPartnerDividendRecord::getByDate($date);
- if (!$record) {
- return [
- 'success' => false,
- 'message' => '分红记录不存在'
- ];
- }
- // 获取分红详情统计
- $details = UrsPartnerDividendDetail::where('dividend_record_id', $record->id)->get();
- $statusCounts = $details->groupBy('status')->map->count();
- return [
- 'success' => true,
- 'data' => [
- 'record_id' => $record->id,
- 'date' => $record->dividend_date->format('Y-m-d'),
- 'status' => $record->status,
- 'status_name' => $record->status_name,
- 'total_fee_amount' => $record->total_fee_amount,
- 'dividend_amount' => $record->dividend_amount,
- 'partner_count' => $record->partner_count,
- 'per_partner_amount' => $record->per_partner_amount,
- 'error_message' => $record->error_message,
- 'details_status' => [
- 'pending' => $statusCounts['pending'] ?? 0,
- 'completed' => $statusCounts['completed'] ?? 0,
- 'failed' => $statusCounts['failed'] ?? 0,
- 'total' => $details->count()
- ],
- 'progress' => [
- 'completed_rate' => $details->count() > 0 ?
- round(($statusCounts['completed'] ?? 0) / $details->count() * 100, 2) : 0,
- 'failed_rate' => $details->count() > 0 ?
- round(($statusCounts['failed'] ?? 0) / $details->count() * 100, 2) : 0
- ],
- 'created_at' => $record->created_at->format('Y-m-d H:i:s'),
- 'updated_at' => $record->updated_at->format('Y-m-d H:i:s')
- ]
- ];
- } catch (\Exception $e) {
- Log::error('检查分红状态失败', [
- 'date' => $date,
- 'error' => $e->getMessage()
- ]);
- return [
- 'success' => false,
- 'message' => '检查分红状态失败: ' . $e->getMessage()
- ];
- }
- }
- }
|