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() ]; } } }