流量池添加及场景获客统计数据
This commit is contained in:
@@ -51,7 +51,6 @@ class StatsController extends Controller
|
||||
{
|
||||
|
||||
$num = $this->request->param('num', 4);
|
||||
|
||||
$planScene = Db::name('plan_scene')
|
||||
->field('id,name,image')
|
||||
->where(['status' => 1])
|
||||
@@ -196,4 +195,157 @@ class StatsController extends Controller
|
||||
|
||||
return successJson($data, '获取成功');
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function getFriendRequestTaskStats()
|
||||
{
|
||||
$companyId = $this->request->userInfo['companyId'];
|
||||
$taskId = $this->request->param('taskId', '');
|
||||
if(empty($taskId)){
|
||||
return errorJson('任务id不能为空');
|
||||
}
|
||||
|
||||
$task = Db::name('customer_acquisition_task')->where(['id' => $taskId, 'companyId' => $companyId,'deleteTime' => 0])->find();
|
||||
if(empty($task)){
|
||||
return errorJson('任务不存在或已删除');
|
||||
}
|
||||
|
||||
|
||||
// 1. 获取startTime和endTime,格式是日期
|
||||
$startTime = $this->request->param('startTime', '');
|
||||
$endTime = $this->request->param('endTime', '');
|
||||
|
||||
// 如果获取不到则默认为7天的跨度
|
||||
if (empty($startTime)) {
|
||||
$startTime = date('Y-m-d', time() - 86400 * 6);
|
||||
}
|
||||
if (empty($endTime)) {
|
||||
$endTime = date('Y-m-d', time());
|
||||
}
|
||||
|
||||
// 转换成时间戳格式
|
||||
$startTimestamp = strtotime($startTime . ' 00:00:00');
|
||||
$endTimestamp = strtotime($endTime . ' 23:59:59');
|
||||
|
||||
// 同时生成日期数组和时间戳二维数组
|
||||
$dateArray = [];
|
||||
$timestampArray = [];
|
||||
$currentTimestamp = $startTimestamp;
|
||||
|
||||
while ($currentTimestamp <= $endTimestamp) {
|
||||
// 生成日期格式数组
|
||||
$dateArray[] = date('m-d', $currentTimestamp);
|
||||
|
||||
// 生成时间戳二维数组
|
||||
$dayStart = $currentTimestamp;
|
||||
$dayEnd = strtotime('+1 day', $currentTimestamp) - 1; // 23:59:59
|
||||
$timestampArray[] = [$dayStart, $dayEnd];
|
||||
|
||||
$currentTimestamp = strtotime('+1 day', $currentTimestamp);
|
||||
}
|
||||
|
||||
|
||||
// 使用分组聚合统计,减少 SQL 次数
|
||||
$allRows = Db::name('task_customer')
|
||||
->field("FROM_UNIXTIME(createTime, '%m-%d') AS d, COUNT(*) AS c")
|
||||
->where(['task_id' => $taskId])
|
||||
->where('createTime', 'between', [$startTimestamp, $endTimestamp])
|
||||
->group('d')
|
||||
->select();
|
||||
|
||||
$successRows = Db::name('task_customer')
|
||||
->field("FROM_UNIXTIME(addTime, '%m-%d') AS d, COUNT(*) AS c")
|
||||
->where(['task_id' => $taskId])
|
||||
->where('addTime', 'between', [$startTimestamp, $endTimestamp])
|
||||
->whereIn('status', [1, 2, 4])
|
||||
->group('d')
|
||||
->select();
|
||||
|
||||
$passRows = Db::name('task_customer')
|
||||
->field("FROM_UNIXTIME(passTime, '%m-%d') AS d, COUNT(*) AS c")
|
||||
->where(['task_id' => $taskId])
|
||||
->where('passTime', 'between', [$startTimestamp, $endTimestamp])
|
||||
->group('d')
|
||||
->select();
|
||||
|
||||
$errorRows = Db::name('task_customer')
|
||||
->field("FROM_UNIXTIME(updateTime, '%m-%d') AS d, COUNT(*) AS c")
|
||||
->where(['task_id' => $taskId, 'status' => 3])
|
||||
->where('updateTime', 'between', [$startTimestamp, $endTimestamp])
|
||||
->group('d')
|
||||
->select();
|
||||
|
||||
// 将分组结果映射到连续日期数组
|
||||
$mapToSeries = function(array $rows) use ($dateArray) {
|
||||
$dict = [];
|
||||
foreach ($rows as $row) {
|
||||
// 兼容对象/数组两种返回
|
||||
$d = is_array($row) ? ($row['d'] ?? '') : ($row->d ?? '');
|
||||
$c = (int)(is_array($row) ? ($row['c'] ?? 0) : ($row->c ?? 0));
|
||||
if ($d !== '') {
|
||||
$dict[$d] = $c;
|
||||
}
|
||||
}
|
||||
$series = [];
|
||||
foreach ($dateArray as $d) {
|
||||
$series[] = $dict[$d] ?? 0;
|
||||
}
|
||||
return $series;
|
||||
};
|
||||
|
||||
$allNumArray = $mapToSeries($allRows);
|
||||
$successNumArray = $mapToSeries($successRows);
|
||||
$passNumArray = $mapToSeries($passRows);
|
||||
$errorNumArray = $mapToSeries($errorRows);
|
||||
|
||||
// 计算通过率和成功率
|
||||
$passRateArray = [];
|
||||
$successRateArray = [];
|
||||
|
||||
for ($i = 0; $i < count($dateArray); $i++) {
|
||||
// 通过率 = 通过数 / 总数
|
||||
$passRate = ($allNumArray[$i] > 0) ? round(($passNumArray[$i] / $allNumArray[$i]) * 100, 2) : 0;
|
||||
$passRateArray[] = $passRate;
|
||||
|
||||
// 成功率 = 成功数 / 总数
|
||||
$successRate = ($allNumArray[$i] > 0) ? round(($successNumArray[$i] / $allNumArray[$i]) * 100, 2) : 0;
|
||||
$successRateArray[] = $successRate;
|
||||
}
|
||||
|
||||
// 计算总体统计
|
||||
$totalAll = array_sum($allNumArray);
|
||||
$totalSuccess = array_sum($successNumArray);
|
||||
$totalPass = array_sum($passNumArray);
|
||||
$totalError = array_sum($errorNumArray);
|
||||
|
||||
$totalPassRate = ($totalAll > 0) ? round(($totalPass / $totalAll) * 100, 2) : 0;
|
||||
$totalSuccessRate = ($totalAll > 0) ? round(($totalSuccess / $totalAll) * 100, 2) : 0;
|
||||
|
||||
// 返回结果
|
||||
$result = [
|
||||
'startTime' => $startTime,
|
||||
'endTime' => $endTime,
|
||||
'dateArray' => $dateArray,
|
||||
'allNumArray' => $allNumArray,
|
||||
'successNumArray' => $successNumArray,
|
||||
'passNumArray' => $passNumArray,
|
||||
'errorNumArray' => $errorNumArray,
|
||||
'passRateArray' => $passRateArray,
|
||||
'successRateArray' => $successRateArray,
|
||||
'totalStats' => [
|
||||
'totalAll' => $totalAll,
|
||||
'totalSuccess' => $totalSuccess,
|
||||
'totalPass' => $totalPass,
|
||||
'totalError' => $totalError,
|
||||
'totalPassRate' => $totalPassRate,
|
||||
'totalSuccessRate' => $totalSuccessRate
|
||||
]
|
||||
];
|
||||
|
||||
return successJson($result, '获取成功');
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user