'DAY'.($i+1), 'column' => 'day'.($i+1) ]; $daysHeader[] = $title; } $header = array_merge($commonHeader, $daysHeader); # 查询数据 if(isset($params['account_id']) && $params['account_id']) { list($list, $count) = AdqAccountTrendData::getActiveFansTrend($params, $sortField, $sortType, $page, $pageSize); } else { # 获取企业下的adq账号 $accountList = OfficialWebUserActionSetId::select('account_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->distinct()->pluck('account_id'); if(empty($accountList)) return [[], 0, $header]; list($list, $count) = AdqAccountTrendData::getActiveFansSummaryData( $params, $accountList, $sortField, $sortType, $page, $pageSize ); } if(empty($list)) return [[], 0, $header]; # 获取短剧信息 $playletIds = $list->pluck('playlet_id')->unique(); $playletData = DramaSeries::select('id', 'name')->whereIn('id', $playletIds) ->where('sys_group_id', $params['sys_group_id']) ->get(); foreach ($list as $item) { # 短剧信息处理 $playletInfo = $playletData->where('id', $item->playlet_id)->first(); $item->playlet_name = $playletInfo->name ?? '-'; # 消耗金额单位处理 $item->paid = $item->paid / 100; # 企微关注成本 $item->follow_cost = round($item->follow_cost / 100, 1); # 首日roi $item->first_roi = $item->first_roi * 100 . '%'; # 用户累计充值金额 $item->pay_money_total = $item->pay_money_total / 100; # 首日下单成本 $item->first_charge_user_cost = round($item->first_charge_user_cost / 100, 2); # 首日新增用户充值金额 $item->pay_money = $item->pay_money / 100; # 当天新增用户arpu $item->day_paid_user_arpu = round($item->day_paid_user_arpu / 100, 2); # 总回本率 $item->cost_cover_rate = $item->cost_cover_rate * 100 . '%'; # 累计付费用户arpu $item->paid_user_arpu = round($item->paid_user_arpu / 100, 2); # 企微关注人数 $item->scan_follow_count = intval($item->scan_follow_count); # 累计激活下单成本 $item->pay_user_cost = round($item->pay_user_cost / 100, 2); # 查询150天数据 $dayInfo = []; if(isset($params['account_id']) && $params['account_id']) { $dayData = AdqAccountTrendData::where('enable', 1) ->where(function($query) use ($params) { if(isset($params['plat_order_type']) && is_numeric($params['plat_order_type'])) $query->where('plat_order_type', $params['plat_order_type']); }) ->where('account_id', $params['account_id']) ->where(function($query) use($params) { if($params['playlet_id']) $query->where('playlet_id', $params['playlet_id']); }) ->where('expense_date', $item->expense_date) ->where('ref_date', '<=', date('Y-m-d', strtotime($item->expense_date.' +149 day'))) ->selectRaw("sum(active_fans) as active_fans,sum(pay_money) as pay_money, sum(pay_money_total) as pay_money_total, ref_date") ->groupBy(['days_type']) ->get(); if(!empty($dayData)){ foreach($dayData as $val){ $nd = (strtotime($val['ref_date']) - strtotime($item->expense_date)) / 86400; $new_roi = $item->paid ? round($val['pay_money'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $total_roi = $item->paid ? round($val['pay_money_total'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $income_times = $item->pay_money ? round($val['pay_money_total'] / 100 / $item->pay_money, 2) : '0%'; $dayInfo[$nd] = [ 'days' => 'day' . ($nd + 1), 'pay_money' => round($val['pay_money']/100, 2), 'new_roi' => $new_roi, 'total_roi' => $total_roi, 'income_times' => $income_times, 'charge_user' => $val['active_fans'] ]; } } } else { $dayData = AdqAccountTrendData::where('enable', 1) ->where(function($query) use ($params) { if(isset($params['plat_order_type']) && is_numeric($params['plat_order_type'])) $query->where('plat_order_type', $params['plat_order_type']); }) ->where('account_id', $item->account_id) ->where('playlet_id', $item->playlet_id) ->where('expense_date', '>=', $item->expense_date) ->where('expense_date', '<=', $item->expense_date_end) ->where('ref_date', '<=', strtotime($item->expense_date_end.' +149 day')) ->selectRaw("sum(active_fans) as active_fans,sum(pay_money) as pay_money, sum(pay_money_total) as pay_money_total, ref_date, expense_date, plat_order_type") ->groupBy(['days_type']) ->get(); $paidDataMid = []; $payMoneyTotal = 0; if(!empty($dayData)){ foreach($dayData as $val){ $nd = (strtotime($val['ref_date']) - strtotime($val['expense_date'])) / 86400; $payMoneyTotal += $val['pay_money']; if(isset($paidDataMid[$nd])) { $paidDataMid[$nd]['active_fans'] += $val['active_fans']; $paidDataMid[$nd]['pay_money'] += $val['pay_money']; $paidDataMid[$nd]['pay_money_total'] += $payMoneyTotal; } else { $paidDataMid[$nd]['active_fans'] = $val['active_fans']; $paidDataMid[$nd]['pay_money'] = $val['pay_money']; $paidDataMid[$nd]['pay_money_total'] = $payMoneyTotal; } } foreach ($paidDataMid as $i=>$v) { $new_roi = $item->paid ? round($v['pay_money'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $total_roi = $item->paid ? round($v['pay_money_total'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $income_times = $item->pay_money ? round($v['pay_money_total'] / 100 / $item->pay_money, 2) : '0%'; $dayInfo[$i] = [ 'days' => 'day' . ($i+1), 'pay_money' => round($v['pay_money']/100, 2), 'new_roi' => $new_roi, 'total_roi' => $total_roi, 'income_times' => $income_times, 'charge_user' => $v['active_fans'] ]; } } } $item->day_info = $dayInfo; } return [$list, $count, $header]; } /** * 从ES获取粉丝激活趋势 * */ public static function getActiveFansTrend($params, $sortField, $sortType, $page, $pageSize) { # 表头处理 $commonHeader = config('activeFans.basic'); # 获取day1至day150表头 $daysHeader = []; for($i = 0;$i < AdqAccountTrendData::ADQ_ACTIVE_FANS_DAYS;$i++) { $title = [ 'name' => 'DAY'.($i+1), 'column' => 'day'.($i+1) ]; $daysHeader[] = $title; } $header = array_merge($commonHeader, $daysHeader); try { # 获取当前登录账号可见的账号范围 if($params['ad_type'] == 1) { // adq账号 $authAccountList = PitcherService::adqAccountListForUser( $params['admin_id'], $params['sys_group_id'], $params['is_system_admin'] ); } elseif ($params['ad_type'] == 2) { // mp账号 $authAccountList = OfficialAccount::getAccountMpAppIdList( $params['admin_id'], $params['sys_group_id'], $params['is_system_admin'] ); } else { $authAccountList = []; } if(empty($authAccountList)) return [[], 0, $header]; # 数据项处理 if(isset($params['account_id']) && $params['account_id']) { $params['account_id'] = explode(',', $params['account_id']); foreach ($params['account_id'] as $index=>$accountId) { if(!in_array($accountId, $authAccountList)) unset($params['account_id'][$index]); } if(empty($params['account_id'])) return [[], 0, $header]; list($list, $count) = AccountDataTrend::getActiveFansTrend($params, $sortField, $sortType, $page, $pageSize); } else { # 获取企业下的adq账号 $adqAccountList = OfficialWebUserActionSetId::select('account_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->whereIn('account_id', $authAccountList) ->distinct()->pluck('account_id')->toArray(); # 获取企业下的mp账号 $mpAccountList = OfficialAccountRelation::selectRaw('app_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->whereIn('app_id', $authAccountList) ->distinct()->pluck('app_id')->toArray(); $accountList = array_merge($adqAccountList, $mpAccountList); if(empty($accountList)) return [[], 0, $header]; list($list, $count) = AccountDataTrend::getActiveFansSummaryData($params, $accountList, $sortField, $sortType, $page, $pageSize); } if(empty($list)) return [[], 0, $header]; # 获取短剧信息 $playletIds = array_unique(array_column($list, 'playlet_id')); $playletData = DramaSeries::select('id', 'name')->whereIn('id', $playletIds) ->where('sys_group_id', $params['sys_group_id']) ->get(); # 获取对应的mp账号信息 $mpAccountData = TencentAdAuth::selectRaw('wechat_account_id, account_name') ->where('enable', 1) ->where('wechat_account_id', '>', '') ->get(); foreach ($list as &$item) { # 账号名称处理 if(is_array($item['account_id'])) { $accountCount = count($item['account_id']); if($accountCount == 1) { $item['account_id'] = $item['account_id'][0]; $mpAccountInfo = $mpAccountData->where('wechat_account_id', $item['account_id'])->first(); $item['account_name'] = $mpAccountInfo->account_name ?? $item['account_id']; } else { $accountNameStr = ''; foreach ($item['account_id'] as $v) { $mpAccountInfo = $mpAccountData->where('wechat_account_id', $v)->first(); $accountNameStr .= $mpAccountInfo->account_name ?? $v; $accountNameStr .= ','; } $item['account_name'] = trim($accountNameStr, ','); } } else { $mpAccountInfo = $mpAccountData->where('wechat_account_id', $item['account_id'])->first(); $item['account_name'] = $mpAccountInfo->account_name ?? $item['account_id']; } # 短剧信息处理 $playletInfo = $playletData->where('id', $item['playlet_id'])->first(); $item['playlet_name'] = $playletInfo['name'] ?? '-'; # 消耗金额单位处理 $item['paid'] = $item['paid'] / 100; # 企微关注成本 $item['follow_cost'] = round($item['follow_cost'] / 100, 1); # 首日roi $item['first_roi'] = round($item['first_roi'] * 100, 2) . '%'; # 用户累计充值金额 $item['pay_money_total'] = $item['pay_money_total'] / 100; # 首日下单成本 $item['first_charge_user_cost'] = round($item['first_charge_user_cost'] / 100, 2); # 首日新增用户充值金额 $item['pay_money'] = $item['pay_money'] / 100; # 当天新增用户arpu $item['day_paid_user_arpu'] = round($item['day_paid_user_arpu'] / 100, 2); # 总回本率 $item['cost_cover_rate'] = round($item['cost_cover_rate'] * 100, 2) . '%'; # 累计付费用户arpu $item['paid_user_arpu'] = round($item['paid_user_arpu'] / 100, 2); # 企微关注人数 $item['scan_follow_count'] = intval($item['scan_follow_count']); # 累计激活下单成本 $item['pay_user_cost'] = round($item['pay_user_cost'] / 100, 2); # 查询150天数据 $dayInfo = []; if(isset($params['account_id']) && $params['account_id']) { # 查询该投放日期的后150天数据 $dayData = AccountDataTrend::getDataAfterExpense($params, $item['expense_date']); if(!empty($dayData)){ foreach($dayData as $val){ $nd = (strtotime($val['ref_date']) - strtotime($item['expense_date'])) / 86400; $new_roi = $item['paid'] ? round($val['pay_money'] / 100 / $item['paid'], 4) * 100 . '%' : '0%'; $total_roi = $item['paid'] ? round($val['pay_money_total'] / 100 / $item['paid'], 4) * 100 . '%' : '0%'; $income_times = $item['pay_money'] ? round($val['pay_money_total'] / 100 / $item['pay_money'], 2) : 0; $dayInfo[$nd] = [ 'days' => 'day' . ($nd+1), 'pay_money' => round($val['pay_money']/100, 2), 'new_roi' => $new_roi, 'total_roi' => $total_roi, 'income_times' => $income_times, 'charge_user' => $val['active_fans'] ]; } } } else { # 获取账号在指定时间范围内的投放效果数据趋势 $dayData = AccountDataTrend::getDataAfterExpense( $params, $item['expense_date'], $item['expense_date_end'], $item['account_id'] ); $paidDataMid = []; $payMoneyTotal = 0; if(!empty($dayData)){ foreach($dayData as $val){ $nd = (strtotime($val['ref_date']) - strtotime($val['expense_date'])) / 86400; $payMoneyTotal += $val['pay_money']; if(isset($paidDataMid[$nd])) { $paidDataMid[$nd]['active_fans'] += $val['active_fans']; $paidDataMid[$nd]['pay_money'] += $val['pay_money']; $paidDataMid[$nd]['pay_money_total'] += $payMoneyTotal; } else { $paidDataMid[$nd]['active_fans'] = $val['active_fans']; $paidDataMid[$nd]['pay_money'] = $val['pay_money']; $paidDataMid[$nd]['pay_money_total'] = $payMoneyTotal; } } foreach ($paidDataMid as $i=>$v) { $new_roi = $item['paid'] ? round($v['pay_money'] / 100 / $item['paid'], 4) * 100 . '%' : '0%'; $total_roi = $item['paid'] ? round($v['pay_money_total'] / 100 / $item['paid'], 4) * 100 . '%' : '0%'; $income_times = $item['pay_money'] ? round($v['pay_money_total'] / 100 / $item['pay_money'], 2) : '0'; $dayInfo[$i] = [ 'days' => 'day' . ($i+1), 'pay_money' => round($v['pay_money']/100, 2), 'new_roi' => $new_roi, 'total_roi' => $total_roi, 'income_times' => $income_times, 'charge_user' => $v['active_fans'] ]; } } } $item['day_info'] = $dayInfo; } } catch (\Exception $e) { EmailQueue::rPush('粉丝激活趋势列表接口异常', $e->getTraceAsString(), ['xiaohua.hou@kuxuan-inc.com'], '粉丝激活趋势列表接口异常'); Log::logError('粉丝激活趋势列表接口异常', [ 'params' => $params, 'sort_field' => $sortField, 'sort_type' => $sortType, 'line' => $e->getLine(), 'msg' => $e->getMessage() ], 'GetActiveFansTrend'); return [[], 0, $header]; } return [$list, $count, $header]; } /** * 获取粉丝激活趋势 * */ public static function getMpActiveFansTrend($params, $sortField, $sortType, $page, $pageSize) { # 表头处理 $commonHeader = config('activeFans.mp_basic'); # 获取day1至day150表头 $daysHeader = []; for($i = 0;$i < MpAccountTrendData::MP_ACTIVE_FANS_DAYS;$i++) { $title = [ 'name' => 'DAY'.($i+1), 'column' => 'day'.($i+1) ]; $daysHeader[] = $title; } $header = array_merge($commonHeader, $daysHeader); # 查询数据 if(isset($params['app_id']) && $params['app_id']) { list($list, $count) = MpAccountTrendData::getActiveFansTrend($params, $sortField, $sortType, $page, $pageSize); } else { # 获取企业下的mp账号 $accountList = OfficialAccountRelation::selectRaw('app_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->distinct()->pluck('app_id'); if(empty($accountList)) return [[], 0, $header]; list($list, $count) = MpAccountTrendData::getActiveFansSummaryData( $params, $accountList, $sortField, $sortType, $page, $pageSize ); } if(empty($list)) return [[], 0, $header]; # 获取短剧信息 $playletIds = $list->pluck('playlet_id')->unique(); $playletData = DramaSeries::select('id', 'name')->whereIn('id', $playletIds) ->where('sys_group_id', $params['sys_group_id']) ->get(); # 获取列表中的公众号appId信息 $appIds = $list->pluck('app_id')->unique(); $accountData = OfficialAccount::select('mp_app_id', 'mp_name')->whereIn('mp_app_id', $appIds)->get(); foreach ($list as $item) { # 短剧信息处理 $playletInfo = $playletData->where('id', $item->playlet_id)->first(); $item->playlet_name = $playletInfo->name ?? '-'; # 消耗金额单位处理 $item->paid = $item->paid / 100; # 企微关注成本 $item->follow_cost = round($item->follow_cost / 100, 1); # 首日roi $item->first_roi = $item->first_roi * 100 . '%'; # 用户累计充值金额 $item->pay_money_total = $item->pay_money_total / 100; # 首日下单成本 $item->first_charge_user_cost = round($item->first_charge_user_cost / 100, 2); # 首日新增用户充值金额 $item->pay_money = $item->pay_money / 100; # 当天新增用户arpu $item->day_paid_user_arpu = round($item->day_paid_user_arpu / 100, 2); # 总回本率 $item->cost_cover_rate = $item->cost_cover_rate * 100 . '%'; # 累计付费用户arpu $item->paid_user_arpu = round($item->paid_user_arpu / 100, 2); # 企微关注人数 $item->scan_follow_count = intval($item->scan_follow_count); # 累计激活下单成本 $item->pay_user_cost = round($item->pay_user_cost / 100, 2); # 公众号名称 $accountInfo = $accountData->where('mp_app_id', $item->app_id)->first(); $item->app_name = $accountInfo->mp_name ?? '-'; # 查询150天数据 $dayInfo = []; if(isset($params['app_id']) && $params['app_id']) { $dayData = MpAccountTrendData::where('enable', 1) ->where(function($query) use ($params) { if(isset($params['plat_order_type']) && is_numeric($params['plat_order_type'])) $query->where('plat_order_type', $params['plat_order_type']); if($params['playlet_id']) $query->where('playlet_id', $params['playlet_id']); }) ->where('app_id', $params['app_id']) ->where('expense_date', $item->expense_date) ->where('ref_date', '<=', date('Y-m-d', strtotime($item->expense_date.' +149 day'))) ->selectRaw("sum(active_fans) as active_fans,sum(pay_money) as pay_money, sum(pay_money_total) as pay_money_total, ref_date") ->groupBy(['days_type']) ->get(); if(!empty($dayData)){ foreach($dayData as $val){ $nd = (strtotime($val['ref_date']) - strtotime($item->expense_date)) / 86400; $new_roi = $item->paid ? round($val['pay_money'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $total_roi = $item->paid ? round($val['pay_money_total'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $income_times = $item->pay_money ? round($val['pay_money_total'] / 100 / $item->pay_money, 2) : '0%'; $dayInfo[$nd] = [ 'days' => 'day' . ($nd + 1), 'pay_money' => round($val['pay_money']/100, 2), 'new_roi' => $new_roi, 'total_roi' => $total_roi, 'income_times' => $income_times, 'charge_user' => $val['active_fans'] ]; } } } else { $dayData = MpAccountTrendData::where('enable', 1) ->where(function($query) use ($params) { if(isset($params['plat_order_type']) && is_numeric($params['plat_order_type'])) $query->where('plat_order_type', $params['plat_order_type']); }) ->where('app_id', $item->app_id) ->where('playlet_id', $item->playlet_id) ->where('expense_date', '>=', $item->expense_date) ->where('expense_date', '<=', $item->expense_date_end) ->where('ref_date', '<=', strtotime($item->expense_date_end.' +149 day')) ->selectRaw("sum(active_fans) as active_fans,sum(pay_money) as pay_money, sum(pay_money_total) as pay_money_total, ref_date, expense_date, plat_order_type") ->groupBy(['days_type']) ->get(); $paidDataMid = []; $payMoneyTotal = 0; if(!empty($dayData)){ foreach($dayData as $val){ $nd = (strtotime($val['ref_date']) - strtotime($val['expense_date'])) / 86400; $payMoneyTotal += $val['pay_money']; if(isset($paidDataMid[$nd])) { $paidDataMid[$nd]['active_fans'] += $val['active_fans']; $paidDataMid[$nd]['pay_money'] += $val['pay_money']; $paidDataMid[$nd]['pay_money_total'] += $payMoneyTotal; } else { $paidDataMid[$nd]['active_fans'] = $val['active_fans']; $paidDataMid[$nd]['pay_money'] = $val['pay_money']; $paidDataMid[$nd]['pay_money_total'] = $payMoneyTotal; } } foreach ($paidDataMid as $i=>$v) { $new_roi = $item->paid ? round($v['pay_money'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $total_roi = $item->paid ? round($v['pay_money_total'] / 100 / $item->paid, 4) * 100 . '%' : '0%'; $income_times = $item->pay_money ? round($v['pay_money_total'] / 100 / $item->pay_money, 2) : '0%'; $dayInfo[$i] = [ 'days' => 'day' . ($i+1), 'pay_money' => round($v['pay_money']/100, 2), 'new_roi' => $new_roi, 'total_roi' => $total_roi, 'income_times' => $income_times, 'charge_user' => $v['active_fans'] ]; } } } $item->day_info = $dayInfo; } return [$list, $count, $header]; } /** * ADQ投放粉丝激活趋势汇总 * */ public static function getAdqFansActiveSummary($params) { # 表头处理 $header = config('activeFans.summary'); # 数据处理 if(isset($params['account_id']) && $params['account_id']) { $accountList = [$params['account_id']]; } else { # 获取企业下的adq账号 $accountList = OfficialWebUserActionSetId::select('account_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->distinct()->pluck('account_id'); if(empty($accountList)) return [[], $header]; } $data = AdqAccountTrendData::activeFansDataCollect($params, $accountList); if(empty($data)) return [[], $header]; # 获取累计回收金额 $recycleData = AdqAccountTrendData::getCumulativeMoney($params, $accountList, true, [1, 3, 7, 15, 30]); # 3日消耗最早日期和最晚日期 $threeDaysBegin = $recycleData->where('days_type', 3)->min('expense_date'); $threeDaysEnd = $recycleData->where('days_type', 3)->max('expense_date'); # 首日新增用户累计充值金额 $threeDaysFirstPaid = $recycleData->where('expense_date', '>=', $threeDaysBegin)->where('expense_date', '<=', $threeDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 3天累计回收金额 $threeDaysMoney = $recycleData->where('days_type', 3)->sum('pay_money_total'); $data->three_days_rate = $threeDaysFirstPaid ? round($threeDaysMoney / $threeDaysFirstPaid, 2) : "0"; # 7日消耗最早日期和最晚日期 $sevenDaysBegin = $recycleData->where('days_type', 7)->min('expense_date'); $sevenDaysEnd = $recycleData->where('days_type', 7)->max('expense_date'); # 首日新增用户累计充值金额 $sevenDaysFirstPaid = $recycleData->where('expense_date', '>=', $sevenDaysBegin)->where('expense_date', '<=', $sevenDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 7天累计回收金额 $sevenDaysMoney = $recycleData->where('days_type', 7)->sum('pay_money_total'); $data->seven_days_rate = $sevenDaysFirstPaid ? round($sevenDaysMoney / $sevenDaysFirstPaid, 2) : "0"; # 15日消耗最早日期和最晚日期 $fifteenDaysBegin = $recycleData->where('days_type', 15)->min('expense_date'); $fifteenDaysEnd = $recycleData->where('days_type', 15)->max('expense_date'); # 首日新增用户累计充值金额 $fifteenDaysFirstPaid = $recycleData->where('expense_date', '>=', $fifteenDaysBegin)->where('expense_date', '<=', $fifteenDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 15天累计回收金额 $fifteenDaysMoney = $recycleData->where('days_type', 15)->sum('pay_money_total'); $data->fifteen_days_rate = $fifteenDaysFirstPaid ? round($fifteenDaysMoney / $fifteenDaysFirstPaid, 2) : "0"; # 30日消耗最早日期和最晚日期 $thirtyDaysBegin = $recycleData->where('days_type', 30)->min('expense_date'); $thirtyDaysEnd = $recycleData->where('days_type', 30)->max('expense_date'); # 首日新增用户累计充值金额 $thirtyDaysFirstPaid = $recycleData->where('expense_date', '>=', $thirtyDaysBegin)->where('expense_date', '<=', $thirtyDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 30天累计回收金额 $thirtyDaysMoney = $recycleData->where('days_type', 30)->sum('pay_money_total'); $data->thirty_days_rate = $thirtyDaysFirstPaid ? round($thirtyDaysMoney / $thirtyDaysFirstPaid, 2) : "0"; # 消耗金额单位处理 $data->paid = $data->paid / 100; # 企微关注成本 $data->follow_cost = round($data->follow_cost / 100, 1); # 首日roi $data->first_roi = $data->first_roi * 100 . '%'; # 总回本率 $data->cost_cover_rate = $data->cost_cover_rate * 100 . '%'; # 首日新增用户充值金额 $data->pay_money = $data->pay_money / 100; # 用户累计充值金额 $data->pay_money_total = $data->pay_money_total / 100; # 首日下单成本 $data->first_charge_user_cost = round($data->first_charge_user_cost / 100, 2); # 累计激活下单成本 $data->pay_user_cost = round($data->pay_user_cost / 100, 2); # 累计下单成本 $data->charge_user_cost = round($data->charge_user_cost / 100, 2); # 首日付费用户arpu $data->day_paid_user_arpu = round($data->day_paid_user_arpu / 100, 2); # 累计付费用户arpu $data->paid_user_arpu = round($data->paid_user_arpu / 100, 2); # 企微关注人数 $data->scan_follow_count = intval($data->scan_follow_count); return [$data, $header]; } /** * 获取投放粉丝激活趋势汇总(ADQ+MP) * */ public static function getFansActiveSummary($params) { # 表头处理 $header = config('activeFans.summary'); # 获取当前登录账号可见的账号范围 if($params['ad_type'] == 1) { // adq账号 $authAccountList = PitcherService::adqAccountListForUser( $params['admin_id'], $params['sys_group_id'], $params['is_system_admin'] ); } elseif ($params['ad_type'] == 1) { // mp账号 $authAccountList = OfficialAccount::getAccountMpAppIdList( $params['admin_id'], $params['sys_group_id'], $params['is_system_admin'] ); } else { // adq+mp $authAccountList = PitcherService::adAccountList('', $params['sys_group_id'], $params['admin_id'], $params['is_system_admin']); $authAccountList = array_column($authAccountList, 'account_id'); } if(empty($authAccountList)) return [[], $header]; # 数据处理 if(isset($params['account_id']) && $params['account_id']) { $accountList = explode(',', $params['account_id']); foreach ($accountList as $index=>$accountId) { if(!in_array($accountId, $authAccountList)) unset($accountList[$index]); } } else { # 获取企业下的adq账号 $adqAccountList = OfficialWebUserActionSetId::select('account_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->whereIn('account_id', $authAccountList) ->distinct()->pluck('account_id')->toArray(); # 获取企业下的mp账号 $mpAccountList = OfficialAccountRelation::selectRaw('app_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->whereIn('app_id', $authAccountList) ->distinct()->pluck('app_id')->toArray(); $accountList = array_merge($adqAccountList, $mpAccountList); } if(empty($accountList)) return [[], $header]; $data = AccountDataTrend::activeFansDataCollect($params, $accountList); if(empty($data)) return [[], $header]; # 获取累计回收金额 $recycleData = collect(AccountDataTrend::getCumulativeMoney($params, $accountList, [1, 3, 7, 15, 30])); # 3日消耗最早日期和最晚日期 $threeDaysBegin = $recycleData->where('days_type', 3)->min('expense_date'); $threeDaysEnd = $recycleData->where('days_type', 3)->max('expense_date'); # 首日新增用户累计充值金额 $threeDaysFirstPaid = $recycleData->where('expense_date', '>=', $threeDaysBegin)->where('expense_date', '<=', $threeDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 3天累计回收金额 $threeDaysMoney = $recycleData->where('days_type', 3)->sum('pay_money_total'); $data['three_days_rate'] = $threeDaysFirstPaid ? round($threeDaysMoney / $threeDaysFirstPaid, 2) : "0"; # 7日消耗最早日期和最晚日期 $sevenDaysBegin = $recycleData->where('days_type', 7)->min('expense_date'); $sevenDaysEnd = $recycleData->where('days_type', 7)->max('expense_date'); # 首日新增用户累计充值金额 $sevenDaysFirstPaid = $recycleData->where('expense_date', '>=', $sevenDaysBegin)->where('expense_date', '<=', $sevenDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 7天累计回收金额 $sevenDaysMoney = $recycleData->where('days_type', 7)->sum('pay_money_total'); $data['seven_days_rate'] = $sevenDaysFirstPaid ? round($sevenDaysMoney / $sevenDaysFirstPaid, 2) : "0"; # 15日消耗最早日期和最晚日期 $fifteenDaysBegin = $recycleData->where('days_type', 15)->min('expense_date'); $fifteenDaysEnd = $recycleData->where('days_type', 15)->max('expense_date'); # 首日新增用户累计充值金额 $fifteenDaysFirstPaid = $recycleData->where('expense_date', '>=', $fifteenDaysBegin)->where('expense_date', '<=', $fifteenDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 15天累计回收金额 $fifteenDaysMoney = $recycleData->where('days_type', 15)->sum('pay_money_total'); $data['fifteen_days_rate'] = $fifteenDaysFirstPaid ? round($fifteenDaysMoney / $fifteenDaysFirstPaid, 2) : "0"; # 30日消耗最早日期和最晚日期 $thirtyDaysBegin = $recycleData->where('days_type', 30)->min('expense_date'); $thirtyDaysEnd = $recycleData->where('days_type', 30)->max('expense_date'); # 首日新增用户累计充值金额 $thirtyDaysFirstPaid = $recycleData->where('expense_date', '>=', $thirtyDaysBegin)->where('expense_date', '<=', $thirtyDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 30天累计回收金额 $thirtyDaysMoney = $recycleData->where('days_type', 30)->sum('pay_money_total'); $data['thirty_days_rate'] = $thirtyDaysFirstPaid ? round($thirtyDaysMoney / $thirtyDaysFirstPaid, 2) : "0"; # 消耗金额单位处理 $data['paid'] = $data['paid'] / 100; # 企微关注成本 $data['follow_cost'] = round($data['follow_cost'] / 100, 1); # 首日roi $data['first_roi'] = round($data['first_roi'] * 100, 2) . '%'; # 总回本率 $data['cost_cover_rate'] = round($data['cost_cover_rate'] * 100, 2) . '%'; # 首日新增用户充值金额 $data['pay_money'] = $data['pay_money'] / 100; # 用户累计充值金额 $data['pay_money_total'] = $data['pay_money_total'] / 100; # 首日下单成本 $data['first_charge_user_cost'] = round($data['first_charge_user_cost'] / 100, 2); # 累计激活下单成本 $data['pay_user_cost'] = round($data['pay_user_cost'] / 100, 2); # 累计下单成本 $data['charge_user_cost'] = round($data['charge_user_cost'] / 100, 2); # 首日付费用户arpu $data['day_paid_user_arpu'] = round($data['day_paid_user_arpu'] / 100, 2); # 累计付费用户arpu $data['paid_user_arpu'] = round($data['paid_user_arpu'] / 100, 2); # 企微关注人数 $data['scan_follow_count'] = intval($data['scan_follow_count']); return [$data, $header]; } /** * MP投放粉丝激活趋势汇总 * */ public static function getMpFansActiveSummary($params) { # 表头处理 $header = config('activeFans.summary'); # 数据处理 if(isset($params['app_id']) && $params['app_id']) { $accountList = [$params['app_id']]; } else { # 获取企业下的adq账号 $accountList = OfficialAccountRelation::selectRaw('app_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->distinct()->pluck('app_id'); if(empty($accountList)) return [[], $header]; } $data = MpAccountTrendData::activeFansDataCollect($params, $accountList); if(empty($data)) return [[], $header]; # 获取累计回收金额 $recycleData = MpAccountTrendData::getCumulativeMoney($params, $accountList, true, [1, 3, 7, 15, 30]); # 3日消耗最早日期和最晚日期 $threeDaysBegin = $recycleData->where('days_type', 3)->min('expense_date'); $threeDaysEnd = $recycleData->where('days_type', 3)->max('expense_date'); # 首日新增用户累计充值金额 $threeDaysFirstPaid = $recycleData->where('expense_date', '>=', $threeDaysBegin)->where('expense_date', '<=', $threeDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 3天累计回收金额 $threeDaysMoney = $recycleData->where('days_type', 3)->sum('pay_money_total'); $data->three_days_rate = $threeDaysFirstPaid ? round($threeDaysMoney / $threeDaysFirstPaid, 2) : "0"; # 7日消耗最早日期和最晚日期 $sevenDaysBegin = $recycleData->where('days_type', 7)->min('expense_date'); $sevenDaysEnd = $recycleData->where('days_type', 7)->max('expense_date'); # 首日新增用户累计充值金额 $sevenDaysFirstPaid = $recycleData->where('expense_date', '>=', $sevenDaysBegin)->where('expense_date', '<=', $sevenDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 7天累计回收金额 $sevenDaysMoney = $recycleData->where('days_type', 7)->sum('pay_money_total'); $data->seven_days_rate = $sevenDaysFirstPaid ? round($sevenDaysMoney / $sevenDaysFirstPaid, 2) : "0"; # 15日消耗最早日期和最晚日期 $fifteenDaysBegin = $recycleData->where('days_type', 15)->min('expense_date'); $fifteenDaysEnd = $recycleData->where('days_type', 15)->max('expense_date'); # 首日新增用户累计充值金额 $fifteenDaysFirstPaid = $recycleData->where('expense_date', '>=', $fifteenDaysBegin)->where('expense_date', '<=', $fifteenDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 15天累计回收金额 $fifteenDaysMoney = $recycleData->where('days_type', 15)->sum('pay_money_total'); $data->fifteen_days_rate = $fifteenDaysFirstPaid ? round($fifteenDaysMoney / $fifteenDaysFirstPaid, 2) : "0"; # 30日消耗最早日期和最晚日期 $thirtyDaysBegin = $recycleData->where('days_type', 30)->min('expense_date'); $thirtyDaysEnd = $recycleData->where('days_type', 30)->max('expense_date'); # 首日新增用户累计充值金额 $thirtyDaysFirstPaid = $recycleData->where('expense_date', '>=', $thirtyDaysBegin)->where('expense_date', '<=', $thirtyDaysEnd) ->where('days_type', 1) ->sum('pay_money'); # 30天累计回收金额 $thirtyDaysMoney = $recycleData->where('days_type', 30)->sum('pay_money_total'); $data->thirty_days_rate = $thirtyDaysFirstPaid ? round($thirtyDaysMoney / $thirtyDaysFirstPaid, 2) : "0"; # 消耗金额单位处理 $data->paid = $data->paid / 100; # 企微关注成本 $data->follow_cost = round($data->follow_cost / 100, 1); # 首日roi $data->first_roi = $data->first_roi * 100 . '%'; # 总回本率 $data->cost_cover_rate = $data->cost_cover_rate * 100 . '%'; # 首日新增用户充值金额 $data->pay_money = $data->pay_money / 100; # 用户累计充值金额 $data->pay_money_total = $data->pay_money_total / 100; # 累计激活下单成本 $data->pay_user_cost = round($data->pay_user_cost / 100, 2); # 首日下单成本 $data->first_charge_user_cost = round($data->first_charge_user_cost / 100, 2); # 累计下单成本 $data->charge_user_cost = round($data->charge_user_cost / 100, 2); # 首日付费用户arpu $data->day_paid_user_arpu = round($data->day_paid_user_arpu / 100, 2); # 累计付费用户arpu $data->paid_user_arpu = round($data->paid_user_arpu / 100, 2); # 企微关注人数 $data->scan_follow_count = intval($data->scan_follow_count); return [$data, $header]; } /** * Adq账号粉丝激活趋势曲线 * */ public static function getAdqActiveFansCurve($params) { if(isset($params['account_id']) && $params['account_id']) { $accountList = [$params['account_id']]; } else { # 获取企业下的adq账号 $accountList = OfficialWebUserActionSetId::select('account_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->distinct()->pluck('account_id'); if(empty($accountList)) return []; } # Adq账号数据汇总曲线 $data = AdqAccountTrendData::getActiveFansCurve($params, $accountList); # 获取累计回收金额 $recycleData = AdqAccountTrendData::getCumulativeMoney($params, $accountList, true); if(empty($data)) return []; # 数据处理 foreach($data as $item) { # 消耗金额 $item->paid = $item->paid / 100; # 首日roi $item->first_roi = $item->first_roi * 100; # 3天累计回收金额 $threeDaysInfo = $recycleData->where('days_type', 3)->where('expense_date', $item->expense_date)->first(); $threeDaysMoney = $threeDaysInfo->pay_money_total ?? 0; $item->three_days_rate = $item->pay_money ? round($threeDaysMoney / $item->pay_money, 4) * 100 : 0; # 获取7天累计回收金额 $sevenDaysInfo = $recycleData->where('days_type', 7)->where('expense_date', $item->expense_date)->first(); $sevenDaysMoney = $sevenDaysInfo->pay_money_total ?? 0; $item->seven_days_rate = $item->pay_money ? round($sevenDaysMoney / $item->pay_money, 4) * 100 : 0; # 获取15天累计回收金额 $fifteenDaysInfo = $recycleData->where('days_type', 15)->where('expense_date', $item->expense_date)->first(); $fifteenDaysMoney = $fifteenDaysInfo->pay_money_total ?? 0; $item->fifteen_days_rate = $item->pay_money ? round($fifteenDaysMoney / $item->pay_money, 4) * 100 : 0; # 获取30天累计回收金额 $thirtyDaysInfo = $recycleData->where('days_type', 30)->where('expense_date', $item->expense_date)->first(); $thirtyDaysMoney = $thirtyDaysInfo->pay_money_total ?? 0; $item->thirty_days_rate = $item->pay_money ? round($thirtyDaysMoney / $item->pay_money, 4) * 100 : 0; # 首日新增用户充值金额 $item->pay_money = $item->pay_money / 100; } return $data; } /** * 账号粉丝激活趋势曲线(ADQ+MP) * */ public static function getActiveFansCurve($params) { # 获取当前登录账号可见的账号范围 if($params['ad_type'] == 1) { // adq账号 $authAccountList = PitcherService::adqAccountListForUser( $params['admin_id'], $params['sys_group_id'], $params['is_system_admin'] ); } elseif ($params['ad_type'] == 2) { // mp账号 $authAccountList = OfficialAccount::getAccountMpAppIdList( $params['admin_id'], $params['sys_group_id'], $params['is_system_admin'] ); } else { // adq+mp $authAccountList = PitcherService::adAccountList('', $params['sys_group_id'], $params['admin_id'], $params['is_system_admin']); $authAccountList = array_column($authAccountList, 'account_id'); } if(empty($authAccountList)) return []; if(isset($params['account_id']) && $params['account_id']) { $accountList = explode(',', $params['account_id']); foreach ($accountList as $index=>$accountId) { if(!in_array($accountId, $authAccountList)) unset($accountList[$index]); } } else { # 获取企业下的adq账号 $adqAccountList = OfficialWebUserActionSetId::select('account_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->whereIn('account_id', $authAccountList) ->distinct()->pluck('account_id')->toArray(); # 获取企业下的mp账号 $mpAccountList = OfficialAccountRelation::selectRaw('app_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->whereIn('app_id', $authAccountList) ->distinct()->pluck('app_id')->toArray(); $accountList = array_merge($adqAccountList, $mpAccountList); } if(empty($accountList)) return []; # 账号数据汇总曲线 $data = AccountDataTrend::getActiveFansCurve($params, $accountList); if(empty($data)) return []; # 获取累计回收金额 $recycleData = collect(AccountDataTrend::getCumulativeMoney($params, $accountList)); // $recycleData = AdqAccountTrendData::getCumulativeMoney($params, $accountList, true); # 数据处理 foreach($data as &$item) { # 消耗金额 $item['paid'] = $item['paid'] / 100; # 首日roi $item['first_roi'] = round($item['first_roi'] * 100, 4); # 3天累计回收金额 $threeDaysInfo = $recycleData->where('days_type', 3)->where('expense_date', $item['expense_date'])->first(); $threeDaysMoney = $threeDaysInfo['pay_money_total'] ?? 0; $item['three_days_rate'] = $item['pay_money'] ? round($threeDaysMoney / $item['pay_money'], 4) * 100 : 0; # 获取7天累计回收金额 $sevenDaysInfo = $recycleData->where('days_type', 7)->where('expense_date', $item['expense_date'])->first(); $sevenDaysMoney = $sevenDaysInfo['pay_money_total'] ?? 0; $item['seven_days_rate'] = $item['pay_money'] ? round($sevenDaysMoney / $item['pay_money'], 4) * 100 : 0; # 获取15天累计回收金额 $fifteenDaysInfo = $recycleData->where('days_type', 15)->where('expense_date', $item['expense_date'])->first(); $fifteenDaysMoney = $fifteenDaysInfo['pay_money_total'] ?? 0; $item['fifteen_days_rate'] = $item['pay_money'] ? round($fifteenDaysMoney / $item['pay_money'], 4) * 100 : 0; # 获取30天累计回收金额 $thirtyDaysInfo = $recycleData->where('days_type', 30)->where('expense_date', $item['expense_date'])->first(); $thirtyDaysMoney = $thirtyDaysInfo['pay_money_total'] ?? 0; $item['thirty_days_rate'] = $item['pay_money'] ? round($thirtyDaysMoney / $item['pay_money'], 4) * 100 : 0; # 首日新增用户充值金额 $item['pay_money'] = $item['pay_money'] / 100; } return $data; } /** * mp账号粉丝激活趋势曲线 * */ public static function getMpActiveFansCurve($params) { if(isset($params['app_id']) && $params['app_id']) { $accountList = [$params['app_id']]; } else { # 获取企业下的adq账号 $accountList = OfficialAccountRelation::selectRaw('app_id')->where('enable', 1) ->where('sys_group_id', $params['sys_group_id']) ->distinct()->pluck('app_id'); if(empty($accountList)) return []; } # mp账号数据汇总曲线 $data = MpAccountTrendData::getActiveFansCurve($params, $accountList); # 获取累计回收金额 $recycleData = MpAccountTrendData::getCumulativeMoney($params, $accountList, true); if(empty($data)) return []; # 数据处理 foreach($data as $item) { # 消耗金额 $item->paid = $item->paid / 100; # 首日roi $item->first_roi = $item->first_roi * 100; # 3天累计回收金额 $threeDaysInfo = $recycleData->where('days_type', 3)->where('expense_date', $item->expense_date)->first(); $threeDaysMoney = $threeDaysInfo->pay_money_total ?? 0; $item->three_days_rate = $item->pay_money ? round($threeDaysMoney / $item->pay_money, 4) * 100 : 0; # 获取7天累计回收金额 $sevenDaysInfo = $recycleData->where('days_type', 7)->where('expense_date', $item->expense_date)->first(); $sevenDaysMoney = $sevenDaysInfo->pay_money_total ?? 0; $item->seven_days_rate = $item->pay_money ? round($sevenDaysMoney / $item->pay_money, 4) * 100 : 0; # 获取15天累计回收金额 $fifteenDaysInfo = $recycleData->where('days_type', 15)->where('expense_date', $item->expense_date)->first(); $fifteenDaysMoney = $fifteenDaysInfo->pay_money_total ?? 0; $item->fifteen_days_rate = $item->pay_money ? round($fifteenDaysMoney / $item->pay_money, 4) * 100 : 0; # 获取30天累计回收金额 $thirtyDaysInfo = $recycleData->where('days_type', 30)->where('expense_date', $item->expense_date)->first(); $thirtyDaysMoney = $thirtyDaysInfo->pay_money_total ?? 0; $item->thirty_days_rate = $item->pay_money ? round($thirtyDaysMoney / $item->pay_money, 4) * 100 : 0; # 首日新增用户充值金额 $item->pay_money = $item->pay_money / 100; } return $data; } }