Files
backend/app/Services/Commands/SendPeopleMessageStatsService.php

65 lines
2.1 KiB
PHP

<?php
namespace App\Services\Commands;
use Exception;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class SendPeopleMessageStatsService
{
private string $url;
private string $channelName;
private string $provinceId;
private string $provinceName;
public function __construct()
{
$this->url = config('ProvinceInfo.center_ip');
$this->channelName = 'send_people_message_stats_report';
$this->provinceId = config('ProvinceInfo.id');
$this->provinceName = config('ProvinceInfo.name');
}
/**
* @throws ConnectionException
* @throws RequestException
*/
public function execute(): void
{
try
{
$data = $this->prepare();
Http::post($this->url, $data)->throw();
Log::channel($this->channelName)->info(SendPeopleMessageStatsService::class, [$this->provinceName, array_sum($data), 'successful']);
}
catch (Exception $e)
{
Log::channel($this->channelName)->error(SendPeopleMessageStatsService::class, [$e->getMessage()]);
throw $e;
}
}
private function prepare(): array
{
$query = "SELECT
{$this->provinceId} AS province_id,
'{$this->provinceName}' AS province_name,
date,
COUNT(CASE WHEN action_id=1 THEN 1 END) AS action1,
COUNT(CASE WHEN action_id=2 THEN 1 END) AS action2,
COUNT(CASE WHEN action_id=3 THEN 1 END) AS action3,
COUNT(CASE WHEN action_id=4 THEN 1 END) AS action4,
COUNT(CASE WHEN action_id=5 THEN 1 END) AS action5,
COUNT(CASE WHEN is_listen=1 THEN 1 END) AS listens,
COUNT(CASE WHEN is_listen=0 THEN 1 END) AS not_listens,
COUNT(*) AS total,
AVG(review_duration) as review_average
FROM system_messages GROUP BY date ORDER BY date DESC LIMIT 3";
return DB::select($query);
}
}