代码优化
This commit is contained in:
@@ -25,13 +25,18 @@ class StatsController extends Controller
|
||||
*/
|
||||
public function baseInfoStats()
|
||||
{
|
||||
$deviceNum = Db::name('device')->where(['companyId' => $this->request->userInfo['companyId'], 'deleteTime' => 0])->count();
|
||||
$wechatNum = Db::name('wechat_customer')->where(['companyId' => $this->request->userInfo['companyId']])->count();
|
||||
$aliveWechatNum = Db::name('wechat_customer')->alias('wc')
|
||||
->join('device_wechat_login dwl', 'wc.wechatId = dwl.wechatId')
|
||||
->where(['wc.companyId' => $this->request->userInfo['companyId'], 'dwl.alive' => 1])
|
||||
->group('wc.wechatId')
|
||||
->count();
|
||||
|
||||
$where = [
|
||||
['departmentId','=',$this->request->userInfo['companyId']]
|
||||
];
|
||||
if (!empty($this->request->userInfo['isAdmin'])){
|
||||
$where[] = ['id','=',$this->request->userInfo['s2_accountId']];
|
||||
}
|
||||
$accounts = Db::table('s2_company_account')->where($where)->column('id');
|
||||
|
||||
$deviceNum = Db::table('s2_device')->whereIn('currentAccountId',$accounts)->where(['isDeleted' => 0])->count();
|
||||
$wechatNum = Db::table('s2_wechat_account')->whereIn('deviceAccountId',$accounts)->count();
|
||||
$aliveWechatNum = Db::table('s2_wechat_account')->whereIn('deviceAccountId',$accounts)->where(['wechatAlive' => 1])->count();
|
||||
$data = [
|
||||
'deviceNum' => $deviceNum,
|
||||
'wechatNum' => $wechatNum,
|
||||
@@ -58,29 +63,50 @@ class StatsController extends Controller
|
||||
->page(1, $num)
|
||||
->select();
|
||||
|
||||
foreach ($planScene as &$v) {
|
||||
$allNum = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where(['ac.sceneId' => $v['id'], 'ac.companyId' => $this->request->userInfo['companyId'], 'ac.deleteTime' => 0])
|
||||
->count();
|
||||
|
||||
$addNum = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where(['ac.sceneId' => $v['id'], 'ac.companyId' => $this->request->userInfo['companyId'], 'ac.deleteTime' => 0])
|
||||
->whereIn('tc.status', [1, 2, 3, 4])
|
||||
->count();
|
||||
|
||||
$passNum = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where(['ac.sceneId' => $v['id'], 'ac.companyId' => $this->request->userInfo['companyId'], 'ac.deleteTime' => 0])
|
||||
->whereIn('tc.status', [4])
|
||||
->count();
|
||||
|
||||
$v['allNum'] = $allNum;
|
||||
$v['addNum'] = $addNum;
|
||||
$v['passNum'] = $passNum;
|
||||
if (empty($planScene)) {
|
||||
return successJson([], '获取成功');
|
||||
}
|
||||
unset($v);
|
||||
|
||||
$sceneIds = array_column($planScene, 'id');
|
||||
$companyId = $this->request->userInfo['companyId'];
|
||||
|
||||
$stats = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where([
|
||||
['ac.companyId', '=', $companyId],
|
||||
['ac.deleteTime', '=', 0],
|
||||
['ac.sceneId', 'in', $sceneIds],
|
||||
])
|
||||
->field([
|
||||
'ac.sceneId',
|
||||
Db::raw('COUNT(1) as allNum'),
|
||||
Db::raw("SUM(CASE WHEN tc.status IN (1,2,3,4) THEN 1 ELSE 0 END) as addNum"),
|
||||
Db::raw("SUM(CASE WHEN tc.status = 4 THEN 1 ELSE 0 END) as passNum"),
|
||||
])
|
||||
->group('ac.sceneId')
|
||||
->select();
|
||||
|
||||
$statsMap = [];
|
||||
foreach ($stats as $row) {
|
||||
$sceneId = is_array($row) ? ($row['sceneId'] ?? 0) : ($row->sceneId ?? 0);
|
||||
if (!$sceneId) {
|
||||
continue;
|
||||
}
|
||||
$statsMap[$sceneId] = [
|
||||
'allNum' => (int)(is_array($row) ? ($row['allNum'] ?? 0) : ($row->allNum ?? 0)),
|
||||
'addNum' => (int)(is_array($row) ? ($row['addNum'] ?? 0) : ($row->addNum ?? 0)),
|
||||
'passNum' => (int)(is_array($row) ? ($row['passNum'] ?? 0) : ($row->passNum ?? 0)),
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($planScene as &$item) {
|
||||
$sceneStats = $statsMap[$item['id']] ?? ['allNum' => 0, 'addNum' => 0, 'passNum' => 0];
|
||||
$item['allNum'] = $sceneStats['allNum'];
|
||||
$item['addNum'] = $sceneStats['addNum'];
|
||||
$item['passNum'] = $sceneStats['passNum'];
|
||||
}
|
||||
unset($item);
|
||||
|
||||
return successJson($planScene, '获取成功');
|
||||
}
|
||||
|
||||
@@ -150,44 +176,62 @@ class StatsController extends Controller
|
||||
$companyId = $this->request->userInfo['companyId'];
|
||||
$days = 7;
|
||||
|
||||
$dates = [];
|
||||
$endTime = strtotime(date('Y-m-d 23:59:59'));
|
||||
$startTime = strtotime(date('Y-m-d 00:00:00', strtotime('-' . ($days - 1) . ' day')));
|
||||
|
||||
$dateMap = [];
|
||||
$dateLabels = [];
|
||||
for ($i = 0; $i < $days; $i++) {
|
||||
$currentDate = date('Y-m-d', strtotime("-" . ($days - 1 - $i) . " day"));
|
||||
$weekIndex = date("w", strtotime($currentDate));
|
||||
$dateMap[$currentDate] = self::WEEK[$weekIndex];
|
||||
$dateLabels[] = self::WEEK[$weekIndex];
|
||||
}
|
||||
|
||||
$baseWhere = [
|
||||
['ac.companyId', '=', $companyId],
|
||||
['ac.deleteTime', '=', 0],
|
||||
];
|
||||
|
||||
$fetchCounts = function (string $timeField, array $status = []) use ($baseWhere, $startTime, $endTime) {
|
||||
$query = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where($baseWhere)
|
||||
->whereBetween('tc.' . $timeField, [$startTime, $endTime]);
|
||||
if (!empty($status)) {
|
||||
$query->whereIn('tc.status', $status);
|
||||
}
|
||||
$rows = $query->field([
|
||||
"FROM_UNIXTIME(tc.{$timeField}, '%Y-%m-%d')" => 'day',
|
||||
'COUNT(1)' => 'total'
|
||||
])->group('day')->select();
|
||||
|
||||
$result = [];
|
||||
foreach ($rows as $row) {
|
||||
$day = is_array($row) ? ($row['day'] ?? '') : ($row->day ?? '');
|
||||
$total = (int)(is_array($row) ? ($row['total'] ?? 0) : ($row->total ?? 0));
|
||||
if ($day) {
|
||||
$result[$day] = $total;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
};
|
||||
|
||||
$allNumDict = $fetchCounts('createTime');
|
||||
$addNumDict = $fetchCounts('updateTime', [1, 2, 3, 4]);
|
||||
$passNumDict = $fetchCounts('updateTime', [4]);
|
||||
|
||||
$allNum = [];
|
||||
$addNum = [];
|
||||
$passNum = [];
|
||||
|
||||
for ($i = $days - 1; $i >= 0; $i--) {
|
||||
$date = date('Y-m-d', strtotime("-$i day"));
|
||||
$start = strtotime($date . ' 00:00:00');
|
||||
$end = strtotime($date . ' 23:59:59');
|
||||
|
||||
// 获客总量
|
||||
$allNum[] = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where(['ac.companyId' => $companyId, 'ac.deleteTime' => 0])
|
||||
->where('tc.createTime', 'between', [$start, $end])
|
||||
->count();
|
||||
|
||||
// 添加量
|
||||
$addNum[] = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where(['ac.companyId' => $companyId, 'ac.deleteTime' => 0])
|
||||
->where('tc.updateTime', 'between', [$start, $end])
|
||||
->whereIn('tc.status', [1, 2, 3, 4])
|
||||
->count();
|
||||
|
||||
// 通过量
|
||||
$passNum[] = Db::name('customer_acquisition_task')->alias('ac')
|
||||
->join('task_customer tc', 'tc.task_id = ac.id')
|
||||
->where(['ac.companyId' => $companyId, 'ac.deleteTime' => 0])
|
||||
->where('tc.updateTime', 'between', [$start, $end])
|
||||
->whereIn('tc.status', [4])
|
||||
->count();
|
||||
|
||||
$week = date("w", strtotime($date));
|
||||
$dates[] = self::WEEK[$week];
|
||||
foreach (array_keys($dateMap) as $dateKey) {
|
||||
$allNum[] = $allNumDict[$dateKey] ?? 0;
|
||||
$addNum[] = $addNumDict[$dateKey] ?? 0;
|
||||
$passNum[] = $passNumDict[$dateKey] ?? 0;
|
||||
}
|
||||
|
||||
$data = [
|
||||
'date' => $dates,
|
||||
'date' => $dateLabels,
|
||||
'allNum' => $allNum,
|
||||
'addNum' => $addNum,
|
||||
'passNum' => $passNum,
|
||||
|
||||
@@ -38,17 +38,23 @@ class GetPlanSceneListV1Controller extends BaseController
|
||||
// 查询数据
|
||||
$query = PlansSceneModel::where($where);
|
||||
|
||||
// 获取总数
|
||||
$total = $query->count();
|
||||
|
||||
// 获取分页数据
|
||||
$list = $query->order('sort DESC')->select()->toArray();
|
||||
|
||||
if (empty($list)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$sceneIds = array_column($list, 'id');
|
||||
$companyId = $this->getUserInfo('companyId');
|
||||
$statsMap = $this->buildSceneStats($sceneIds, (int)$companyId);
|
||||
|
||||
// 处理数据
|
||||
foreach($list as &$val) {
|
||||
$val['scenarioTags'] = json_decode($val['scenarioTags'], true);
|
||||
$val['count'] = $this->getPlanCount($val['id']);
|
||||
$val['growth'] = $this->calculateGrowth($val['id']);
|
||||
$val['scenarioTags'] = json_decode($val['scenarioTags'], true) ?: [];
|
||||
$sceneStats = $statsMap[$val['id']] ?? ['count' => 0, 'growth' => '0%'];
|
||||
$val['count'] = $sceneStats['count'];
|
||||
$val['growth'] = $sceneStats['growth'];
|
||||
}
|
||||
unset($val);
|
||||
|
||||
@@ -97,7 +103,7 @@ class GetPlanSceneListV1Controller extends BaseController
|
||||
return ResponseHelper::error('场景不存在');
|
||||
}
|
||||
|
||||
$data['scenarioTags'] = json_decode($data['scenarioTags'], true);
|
||||
$data['scenarioTags'] = json_decode($data['scenarioTags'], true) ?: [];
|
||||
$data['count'] = $this->getPlanCount($id);
|
||||
$data['growth'] = $this->calculateGrowth($id);
|
||||
|
||||
@@ -130,27 +136,151 @@ class GetPlanSceneListV1Controller extends BaseController
|
||||
*/
|
||||
private function calculateGrowth(int $sceneId): string
|
||||
{
|
||||
// 获取本月和上月的计划数量
|
||||
$currentMonth = Db::name('customer_acquisition_task')
|
||||
->where('sceneId', $sceneId)
|
||||
->where('status', 1)
|
||||
->whereTime('createTime', '>=', strtotime(date('Y-m-01')))
|
||||
->count();
|
||||
|
||||
$lastMonth = Db::name('customer_acquisition_task')
|
||||
->where('sceneId', $sceneId)
|
||||
->where('status', 1)
|
||||
->whereTime('createTime', 'between', [
|
||||
strtotime(date('Y-m-01', strtotime('-1 month'))),
|
||||
strtotime(date('Y-m-01')) - 1
|
||||
])
|
||||
->count();
|
||||
|
||||
if ($lastMonth == 0) {
|
||||
return $currentMonth > 0 ? '100%' : '0%';
|
||||
$companyId = $this->getUserInfo('companyId');
|
||||
$currentStart = strtotime(date('Y-m-01 00:00:00'));
|
||||
$nextMonthStart = strtotime(date('Y-m-01 00:00:00', strtotime('+1 month')));
|
||||
$lastMonthStart = strtotime(date('Y-m-01 00:00:00', strtotime('-1 month')));
|
||||
|
||||
$currentMonth = $this->getSceneMonthlyCount($sceneId, $companyId, $currentStart, $nextMonthStart - 1);
|
||||
$lastMonth = $this->getSceneMonthlyCount($sceneId, $companyId, $lastMonthStart, $currentStart - 1);
|
||||
|
||||
return $this->formatGrowthPercentage($currentMonth, $lastMonth);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量构建场景统计数据
|
||||
* @param array $sceneIds
|
||||
* @param int $companyId
|
||||
* @return array
|
||||
*/
|
||||
private function buildSceneStats(array $sceneIds, int $companyId): array
|
||||
{
|
||||
if (empty($sceneIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$growth = round(($currentMonth - $lastMonth) / $lastMonth * 100, 2);
|
||||
|
||||
$totalCounts = $this->getSceneTaskCounts($sceneIds, $companyId);
|
||||
|
||||
$currentStart = strtotime(date('Y-m-01 00:00:00'));
|
||||
$nextMonthStart = strtotime(date('Y-m-01 00:00:00', strtotime('+1 month')));
|
||||
$lastMonthStart = strtotime(date('Y-m-01 00:00:00', strtotime('-1 month')));
|
||||
|
||||
$currentMonthCounts = $this->getSceneMonthlyCounts($sceneIds, $companyId, $currentStart, $nextMonthStart - 1);
|
||||
$lastMonthCounts = $this->getSceneMonthlyCounts($sceneIds, $companyId, $lastMonthStart, $currentStart - 1);
|
||||
|
||||
$stats = [];
|
||||
foreach ($sceneIds as $sceneId) {
|
||||
$current = $currentMonthCounts[$sceneId] ?? 0;
|
||||
$last = $lastMonthCounts[$sceneId] ?? 0;
|
||||
$stats[$sceneId] = [
|
||||
'count' => $totalCounts[$sceneId] ?? 0,
|
||||
'growth' => $this->formatGrowthPercentage($current, $last),
|
||||
];
|
||||
}
|
||||
|
||||
return $stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取场景计划总数
|
||||
* @param array $sceneIds
|
||||
* @param int $companyId
|
||||
* @return array
|
||||
*/
|
||||
private function getSceneTaskCounts(array $sceneIds, int $companyId): array
|
||||
{
|
||||
if (empty($sceneIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$rows = Db::name('customer_acquisition_task')
|
||||
->whereIn('sceneId', $sceneIds)
|
||||
->where('companyId', $companyId)
|
||||
->where('deleteTime', 0)
|
||||
->field('sceneId, COUNT(*) as total')
|
||||
->group('sceneId')
|
||||
->select();
|
||||
|
||||
$result = [];
|
||||
foreach ($rows as $row) {
|
||||
$sceneId = is_array($row) ? ($row['sceneId'] ?? 0) : ($row->sceneId ?? 0);
|
||||
if (!$sceneId) {
|
||||
continue;
|
||||
}
|
||||
$result[$sceneId] = (int)(is_array($row) ? ($row['total'] ?? 0) : ($row->total ?? 0));
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取场景月度数据
|
||||
* @param array $sceneIds
|
||||
* @param int $companyId
|
||||
* @param int $startTime
|
||||
* @param int $endTime
|
||||
* @return array
|
||||
*/
|
||||
private function getSceneMonthlyCounts(array $sceneIds, int $companyId, int $startTime, int $endTime): array
|
||||
{
|
||||
if (empty($sceneIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$rows = Db::name('customer_acquisition_task')
|
||||
->whereIn('sceneId', $sceneIds)
|
||||
->where('companyId', $companyId)
|
||||
->where('status', 1)
|
||||
->where('deleteTime', 0)
|
||||
->whereBetween('createTime', [$startTime, $endTime])
|
||||
->field('sceneId, COUNT(*) as total')
|
||||
->group('sceneId')
|
||||
->select();
|
||||
|
||||
$result = [];
|
||||
foreach ($rows as $row) {
|
||||
$sceneId = is_array($row) ? ($row['sceneId'] ?? 0) : ($row->sceneId ?? 0);
|
||||
if (!$sceneId) {
|
||||
continue;
|
||||
}
|
||||
$result[$sceneId] = (int)(is_array($row) ? ($row['total'] ?? 0) : ($row->total ?? 0));
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个场景的月度数据
|
||||
* @param int $sceneId
|
||||
* @param int $companyId
|
||||
* @param int $startTime
|
||||
* @param int $endTime
|
||||
* @return int
|
||||
*/
|
||||
private function getSceneMonthlyCount(int $sceneId, int $companyId, int $startTime, int $endTime): int
|
||||
{
|
||||
return Db::name('customer_acquisition_task')
|
||||
->where('sceneId', $sceneId)
|
||||
->where('companyId', $companyId)
|
||||
->where('status', 1)
|
||||
->where('deleteTime', 0)
|
||||
->whereBetween('createTime', [$startTime, $endTime])
|
||||
->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算增长百分比
|
||||
* @param int $current
|
||||
* @param int $last
|
||||
* @return string
|
||||
*/
|
||||
private function formatGrowthPercentage(int $current, int $last): string
|
||||
{
|
||||
if ($last == 0) {
|
||||
return $current > 0 ? '100%' : '0%';
|
||||
}
|
||||
|
||||
$growth = round(($current - $last) / $last * 100, 2);
|
||||
return $growth . '%';
|
||||
}
|
||||
}
|
||||
@@ -50,29 +50,35 @@ class PlanSceneV1Controller extends BaseController
|
||||
->page($page, $limit)
|
||||
->select();
|
||||
|
||||
if (!empty($list)) {
|
||||
$taskIds = array_column($list, 'id');
|
||||
$statsMap = $this->buildTaskStats($taskIds);
|
||||
|
||||
foreach($list as &$val){
|
||||
$val['createTime'] = date('Y-m-d H:i:s', $val['createTime']);
|
||||
$val['updateTime'] = date('Y-m-d H:i:s', $val['updateTime']);
|
||||
$val['sceneConf'] = json_decode($val['sceneConf'],true);
|
||||
$val['reqConf'] = json_decode($val['reqConf'],true);
|
||||
$val['msgConf'] = json_decode($val['msgConf'],true);
|
||||
$val['tagConf'] = json_decode($val['tagConf'],true);
|
||||
|
||||
$val['acquiredCount'] = Db::name('task_customer')->where('task_id',$val['id'])->count();
|
||||
$val['addedCount'] = Db::name('task_customer')->where('task_id',$val['id'])->whereIn('status',[1,2,3,4])->count();
|
||||
$val['passCount'] = Db::name('task_customer')->where('task_id',$val['id'])->where('status',4)->count();
|
||||
$val['passRate'] = 0;
|
||||
if(!empty($val['passCount']) && !empty($val['addedCount'])){
|
||||
$passRate = ($val['passCount'] / $val['addedCount']) * 100;
|
||||
$val['passRate'] = number_format($passRate,2);
|
||||
}
|
||||
|
||||
$lastTime = Db::name('task_customer')->where(['task_id'=>$val['id']])->max('updateTime');
|
||||
$val['lastUpdated'] = !empty($lastTime) ? date('Y-m-d H:i', $lastTime) : '--';
|
||||
$val['createTime'] = !empty($val['createTime']) ? date('Y-m-d H:i:s', $val['createTime']) : '';
|
||||
$val['updateTime'] = !empty($val['updateTime']) ? date('Y-m-d H:i:s', $val['updateTime']) : '';
|
||||
$val['sceneConf'] = json_decode($val['sceneConf'],true) ?: [];
|
||||
$val['reqConf'] = json_decode($val['reqConf'],true) ?: [];
|
||||
$val['msgConf'] = json_decode($val['msgConf'],true) ?: [];
|
||||
$val['tagConf'] = json_decode($val['tagConf'],true) ?: [];
|
||||
|
||||
$stats = $statsMap[$val['id']] ?? [
|
||||
'acquiredCount' => 0,
|
||||
'addedCount' => 0,
|
||||
'passCount' => 0,
|
||||
'lastUpdated' => 0
|
||||
];
|
||||
|
||||
$val['acquiredCount'] = $stats['acquiredCount'];
|
||||
$val['addedCount'] = $stats['addedCount'];
|
||||
$val['passCount'] = $stats['passCount'];
|
||||
$val['passRate'] = ($stats['addedCount'] > 0 && $stats['passCount'] > 0)
|
||||
? number_format(($stats['passCount'] / $stats['addedCount']) * 100, 2)
|
||||
: 0;
|
||||
$val['lastUpdated'] = !empty($stats['lastUpdated']) ? date('Y-m-d H:i', $stats['lastUpdated']) : '--';
|
||||
}
|
||||
unset($val);
|
||||
}
|
||||
return ResponseHelper::success([
|
||||
'total' => $total,
|
||||
'list' => $list
|
||||
@@ -383,6 +389,46 @@ class PlanSceneV1Controller extends BaseController
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建任务统计
|
||||
* @param array $taskIds
|
||||
* @return array
|
||||
*/
|
||||
private function buildTaskStats(array $taskIds): array
|
||||
{
|
||||
if (empty($taskIds)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$rows = Db::name('task_customer')
|
||||
->whereIn('task_id', $taskIds)
|
||||
->field([
|
||||
'task_id as taskId',
|
||||
'COUNT(1) as acquiredCount',
|
||||
"SUM(CASE WHEN status IN (1,2,3,4) THEN 1 ELSE 0 END) as addedCount",
|
||||
"SUM(CASE WHEN status = 4 THEN 1 ELSE 0 END) as passCount",
|
||||
'MAX(updateTime) as lastUpdated'
|
||||
])
|
||||
->group('task_id')
|
||||
->select();
|
||||
|
||||
$stats = [];
|
||||
foreach ($rows as $row) {
|
||||
$taskId = is_array($row) ? ($row['taskId'] ?? 0) : ($row->taskId ?? 0);
|
||||
if (!$taskId) {
|
||||
continue;
|
||||
}
|
||||
$stats[$taskId] = [
|
||||
'acquiredCount' => (int)(is_array($row) ? ($row['acquiredCount'] ?? 0) : ($row->acquiredCount ?? 0)),
|
||||
'addedCount' => (int)(is_array($row) ? ($row['addedCount'] ?? 0) : ($row->addedCount ?? 0)),
|
||||
'passCount' => (int)(is_array($row) ? ($row['passCount'] ?? 0) : ($row->passCount ?? 0)),
|
||||
'lastUpdated' => (int)(is_array($row) ? ($row['lastUpdated'] ?? 0) : ($row->lastUpdated ?? 0)),
|
||||
];
|
||||
}
|
||||
|
||||
return $stats;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取微信小程序码
|
||||
|
||||
@@ -19,92 +19,6 @@ use think\Db;
|
||||
*/
|
||||
class GetWechatsOnDevicesV1Controller extends BaseController
|
||||
{
|
||||
/**
|
||||
* 计算今日可添加好友数量
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getCanAddFriendCount(string $wechatId): int
|
||||
{
|
||||
$weight = (string)WechatCustomerModel::where(
|
||||
[
|
||||
'wechatId' => $wechatId,
|
||||
'companyId' => $this->getUserInfo('companyId')
|
||||
]
|
||||
)
|
||||
->value('weight');
|
||||
|
||||
return json_decode($weight)->addLimit ?? 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算今日新增好友数量
|
||||
*
|
||||
* @param string $ownerWechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getTodayNewFriendCount(string $ownerWechatId): int
|
||||
{
|
||||
return WechatFriendShipModel::where(compact('ownerWechatId'))
|
||||
->whereBetween('createTime',
|
||||
[
|
||||
strtotime(date('Y-m-d 00:00:00')),
|
||||
strtotime(date('Y-m-d 23:59:59'))
|
||||
]
|
||||
)
|
||||
->count('*');
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 获取微信加友状态
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getWechatAddFriendStatus(string $wechatId): int
|
||||
{
|
||||
return Db::name('device_wechat_login')->where(['wechatId' => $wechatId])->order('id DESC')->value('alive');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信好友数量
|
||||
*
|
||||
* @param string $ownerWechatId
|
||||
* @return int
|
||||
*/
|
||||
protected function getFriendsCount(string $ownerWechatId): int
|
||||
{
|
||||
return WechatFriendShipModel::where(
|
||||
[
|
||||
'ownerWechatId' => $ownerWechatId,
|
||||
//'companyId' => $this->getUserInfo('companyId'),
|
||||
]
|
||||
)
|
||||
->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取微信所属设备
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return string
|
||||
*/
|
||||
protected function getWhereOnDevice(string $wechatId): string
|
||||
{
|
||||
return (string)DeviceModel::alias('d')
|
||||
->where(
|
||||
[
|
||||
'l.wechatId' => $wechatId,
|
||||
'l.alive' => DeviceWechatLoginModel::ALIVE_WECHAT_ACTIVE,
|
||||
'l.companyId' => $this->getUserInfo('companyId')
|
||||
]
|
||||
)
|
||||
->join('device_wechat_login l', 'd.id = l.deviceId AND l.companyId = '. $this->getUserInfo('companyId'))
|
||||
->order('l.id desc')
|
||||
->value('d.memo');
|
||||
}
|
||||
|
||||
/**
|
||||
* 主操盘手获取项目下所有设备的id
|
||||
*
|
||||
@@ -172,22 +86,6 @@ class GetWechatsOnDevicesV1Controller extends BaseController
|
||||
->column('wechatId');
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO 获取设备最新活跃时间
|
||||
*
|
||||
* @param string $wechatId
|
||||
* @return string
|
||||
*/
|
||||
protected function getLatestActiveTime(string $wechatId): string
|
||||
{
|
||||
$wechatAccountId = Db::table('s2_wechat_account')->where(['wechatId' => $wechatId])->value('id');
|
||||
if (empty($wechatAccountId)){
|
||||
return '-';
|
||||
}
|
||||
$time = Db::table('s2_wechat_message')->where('wechatAccountId',$wechatAccountId)->order('id DESC')->value('wechatTime');
|
||||
return !empty($time) ? date('Y-m-d H:i:s', $time) : '-';
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建查询条件
|
||||
*
|
||||
@@ -256,15 +154,26 @@ class GetWechatsOnDevicesV1Controller extends BaseController
|
||||
protected function makeResultedSet(\think\Paginator $result): array
|
||||
{
|
||||
$resultSets = [];
|
||||
$items = $result->items();
|
||||
|
||||
foreach ($result->items() as $item) {
|
||||
if (empty($items)) {
|
||||
return $resultSets;
|
||||
}
|
||||
|
||||
$wechatIds = array_values(array_unique(array_map(function ($item) {
|
||||
return $item->wechatId ?? ($item['wechatId'] ?? '');
|
||||
}, $items)));
|
||||
|
||||
$metrics = $this->collectWechatMetrics($wechatIds);
|
||||
|
||||
foreach ($items as $item) {
|
||||
$sections = $item->toArray() + [
|
||||
'times' => $this->getCanAddFriendCount($item->wechatId),
|
||||
'addedCount' => $this->getTodayNewFriendCount($item->wechatId),
|
||||
'wechatStatus' => $this->getWechatAddFriendStatus($item->wechatId),
|
||||
'totalFriend' => $this->getFriendsCount($item->wechatId),
|
||||
'deviceMemo' => $this->getWhereOnDevice($item->wechatId),
|
||||
'activeTime' => $this->getLatestActiveTime($item->wechatId),
|
||||
'times' => $metrics['addLimit'][$item->wechatId] ?? 0,
|
||||
'addedCount' => $metrics['todayAdded'][$item->wechatId] ?? 0,
|
||||
'wechatStatus' => $metrics['wechatStatus'][$item->wechatId] ?? 0,
|
||||
'totalFriend' => $metrics['totalFriend'][$item->wechatId] ?? 0,
|
||||
'deviceMemo' => $metrics['deviceMemo'][$item->wechatId] ?? '',
|
||||
'activeTime' => $metrics['activeTime'][$item->wechatId] ?? '-',
|
||||
];
|
||||
|
||||
array_push($resultSets, $sections);
|
||||
@@ -273,6 +182,109 @@ class GetWechatsOnDevicesV1Controller extends BaseController
|
||||
return $resultSets;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量收集微信账号的统计信息
|
||||
* @param array $wechatIds
|
||||
* @return array
|
||||
*/
|
||||
protected function collectWechatMetrics(array $wechatIds): array
|
||||
{
|
||||
$metrics = [
|
||||
'addLimit' => [],
|
||||
'todayAdded' => [],
|
||||
'totalFriend' => [],
|
||||
'wechatStatus' => [],
|
||||
'deviceMemo' => [],
|
||||
'activeTime' => [],
|
||||
];
|
||||
|
||||
if (empty($wechatIds)) {
|
||||
return $metrics;
|
||||
}
|
||||
|
||||
$companyId = $this->getUserInfo('companyId');
|
||||
|
||||
// 可添加好友额度
|
||||
$weightRows = WechatCustomerModel::where('companyId', $companyId)
|
||||
->whereIn('wechatId', $wechatIds)
|
||||
->column('weight', 'wechatId');
|
||||
foreach ($weightRows as $wechatId => $weight) {
|
||||
$decoded = json_decode($weight, true);
|
||||
$metrics['addLimit'][$wechatId] = $decoded['addLimit'] ?? 0;
|
||||
}
|
||||
|
||||
// 今日新增好友
|
||||
$start = strtotime(date('Y-m-d 00:00:00'));
|
||||
$end = strtotime(date('Y-m-d 23:59:59'));
|
||||
$todayRows = WechatFriendShipModel::whereIn('ownerWechatId', $wechatIds)
|
||||
->whereBetween('createTime', [$start, $end])
|
||||
->field('ownerWechatId, COUNT(*) as total')
|
||||
->group('ownerWechatId')
|
||||
->select();
|
||||
foreach ($todayRows as $row) {
|
||||
$wechatId = is_array($row) ? ($row['ownerWechatId'] ?? '') : ($row->ownerWechatId ?? '');
|
||||
if ($wechatId) {
|
||||
$metrics['todayAdded'][$wechatId] = (int)(is_array($row) ? ($row['total'] ?? 0) : ($row->total ?? 0));
|
||||
}
|
||||
}
|
||||
|
||||
// 总好友
|
||||
$friendRows = WechatFriendShipModel::whereIn('ownerWechatId', $wechatIds)
|
||||
->field('ownerWechatId, COUNT(*) as total')
|
||||
->group('ownerWechatId')
|
||||
->select();
|
||||
foreach ($friendRows as $row) {
|
||||
$wechatId = is_array($row) ? ($row['ownerWechatId'] ?? '') : ($row->ownerWechatId ?? '');
|
||||
if ($wechatId) {
|
||||
$metrics['totalFriend'][$wechatId] = (int)(is_array($row) ? ($row['total'] ?? 0) : ($row->total ?? 0));
|
||||
}
|
||||
}
|
||||
|
||||
// 设备状态与备注
|
||||
$loginRows = Db::name('device_wechat_login')
|
||||
->alias('l')
|
||||
->leftJoin('device d', 'd.id = l.deviceId')
|
||||
->field('l.wechatId,l.alive,d.memo')
|
||||
->where('l.companyId', $companyId)
|
||||
->whereIn('l.wechatId', $wechatIds)
|
||||
->order('l.id', 'desc')
|
||||
->select();
|
||||
foreach ($loginRows as $row) {
|
||||
$wechatId = is_array($row) ? ($row['wechatId'] ?? '') : ($row->wechatId ?? '');
|
||||
if (empty($wechatId) || isset($metrics['wechatStatus'][$wechatId])) {
|
||||
continue;
|
||||
}
|
||||
$metrics['wechatStatus'][$wechatId] = (int)(is_array($row) ? ($row['alive'] ?? 0) : ($row->alive ?? 0));
|
||||
$metrics['deviceMemo'][$wechatId] = is_array($row) ? ($row['memo'] ?? '') : ($row->memo ?? '');
|
||||
}
|
||||
|
||||
// 活跃时间
|
||||
$accountMap = Db::table('s2_wechat_account')
|
||||
->whereIn('wechatId', $wechatIds)
|
||||
->column('id', 'wechatId');
|
||||
if (!empty($accountMap)) {
|
||||
$accountRows = Db::table('s2_wechat_message')
|
||||
->whereIn('wechatAccountId', array_values($accountMap))
|
||||
->field('wechatAccountId, MAX(wechatTime) as lastTime')
|
||||
->group('wechatAccountId')
|
||||
->select();
|
||||
$accountLastTime = [];
|
||||
foreach ($accountRows as $row) {
|
||||
$accountId = is_array($row) ? ($row['wechatAccountId'] ?? 0) : ($row->wechatAccountId ?? 0);
|
||||
if ($accountId) {
|
||||
$accountLastTime[$accountId] = (int)(is_array($row) ? ($row['lastTime'] ?? 0) : ($row->lastTime ?? 0));
|
||||
}
|
||||
}
|
||||
foreach ($accountMap as $wechatId => $accountId) {
|
||||
if (isset($accountLastTime[$accountId]) && $accountLastTime[$accountId] > 0) {
|
||||
$metrics['activeTime'][$wechatId] = date('Y-m-d H:i:s', $accountLastTime[$accountId]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $metrics;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取在线微信账号列表
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user