giftcon_dev/app/Repositories/Admin/Sms/AdminSmsBatchRepository.php

153 lines
5.6 KiB
PHP

<?php
namespace App\Repositories\Admin\Sms;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
final class AdminSmsBatchRepository
{
public function insertBatch(array $data): int
{
$now = now();
return (int) DB::table('admin_sms_batches')->insertGetId([
'admin_user_id' => (int)($data['admin_user_id'] ?? 0),
'from_number' => (string)($data['from_number'] ?? ''),
'send_mode' => (string)($data['send_mode'] ?? 'one'),
'schedule_type' => (string)($data['schedule_type'] ?? 'now'),
'scheduled_at' => $data['scheduled_at'] ?? null,
'message_raw' => (string)($data['message_raw'] ?? ''),
'byte_len' => (int)($data['byte_len'] ?? 0),
'sms_type_hint' => (string)($data['sms_type_hint'] ?? 'auto'),
'total_count' => (int)($data['total_count'] ?? 0),
'valid_count' => (int)($data['valid_count'] ?? 0),
'duplicate_count' => (int)($data['duplicate_count'] ?? 0),
'invalid_count' => (int)($data['invalid_count'] ?? 0),
'status' => (string)($data['status'] ?? 'queued'),
'request_ip' => $data['request_ip'] ?? null,
'user_agent' => $data['user_agent'] ?? null,
'error_message' => $data['error_message'] ?? null,
'created_at' => $now,
'updated_at' => $now,
]);
}
/**
* items: [['seq'=>1,'to_number'=>'010...','message_final'=>'...','sms_type'=>'sms','status'=>'queued', ...], ...]
*/
public function insertItemsChunked(int $batchId, array $items, int $chunkSize = 1000): void
{
$now = now();
$buf = [];
foreach ($items as $it) {
$buf[] = [
'batch_id' => $batchId,
'seq' => (int)($it['seq'] ?? 0),
'to_number' => (string)($it['to_number'] ?? ''),
'message_final' => (string)($it['message_final'] ?? ''),
'sms_type' => (string)($it['sms_type'] ?? 'sms'),
'status' => (string)($it['status'] ?? 'queued'),
'provider' => (string)($it['provider'] ?? 'lguplus'),
'provider_msg_id' => $it['provider_msg_id'] ?? null,
'provider_code' => $it['provider_code'] ?? null,
'provider_message' => $it['provider_message'] ?? null,
'submitted_at' => $it['submitted_at'] ?? null,
'created_at' => $now,
'updated_at' => $now,
];
if (count($buf) >= $chunkSize) {
DB::table('admin_sms_batch_items')->insert($buf);
$buf = [];
}
}
if (!empty($buf)) {
DB::table('admin_sms_batch_items')->insert($buf);
}
}
public function updateBatch(int $batchId, array $data): int
{
$data['updated_at'] = now();
return (int) DB::table('admin_sms_batches')->where('id', $batchId)->update($data);
}
public function updateItemBySeq(int $batchId, int $seq, array $data): int
{
$data['updated_at'] = now();
return (int) DB::table('admin_sms_batch_items')
->where('batch_id', $batchId)
->where('seq', $seq)
->update($data);
}
public function findBatch(int $batchId): ?object
{
return DB::table('admin_sms_batches')->where('id', $batchId)->first();
}
public function paginateBatches(array $filters, int $perPage = 30): LengthAwarePaginator
{
$q = DB::table('admin_sms_batches as b')
->leftJoin('admin_users as au', 'au.id', '=', 'b.admin_user_id')
->select([
'b.*',
DB::raw('COALESCE(au.nickname, au.name, au.email) as admin_name'),
DB::raw('au.email as admin_email'),
])
->orderByDesc('b.id');
if (!empty($filters['status'])) {
$q->where('b.status', (string)$filters['status']);
}
if (!empty($filters['send_mode'])) {
$q->where('b.send_mode', (string)$filters['send_mode']);
}
if (!empty($filters['q'])) {
$kw = '%' . (string)$filters['q'] . '%';
$q->where(function ($w) use ($kw) {
$w->where('b.message_raw', 'like', $kw)
->orWhere('b.from_number', 'like', $kw)
->orWhere('b.request_ip', 'like', $kw);
});
}
if (!empty($filters['date_from'])) {
$q->where('b.created_at', '>=', $filters['date_from'] . ' 00:00:00');
}
if (!empty($filters['date_to'])) {
$q->where('b.created_at', '<=', $filters['date_to'] . ' 23:59:59');
}
return $q->paginate($perPage)->withQueryString();
}
public function paginateItems(int $batchId, array $filters, int $perPage = 50): LengthAwarePaginator
{
$q = DB::table('admin_sms_batch_items')
->where('batch_id', $batchId)
->orderBy('seq');
if (!empty($filters['status'])) {
$q->where('status', (string)$filters['status']);
}
if (!empty($filters['to'])) {
$to = preg_replace('/\D+/', '', (string)$filters['to']);
if ($to !== '') $q->where('to_number', 'like', '%' . $to . '%');
}
if (!empty($filters['q'])) {
$kw = '%' . (string)$filters['q'] . '%';
$q->where('message_final', 'like', $kw);
}
return $q->paginate($perPage)->withQueryString();
}
}