feat: 增强管理员权限管理,添加 RBAC 支持,更新 AdminUser 模型以处理角色和权限,更新登录接口返回权限信息,扩展数据库填充器以同步角色权限
This commit is contained in:
84
app/Services/Admin/AdminReconcileJobService.php
Normal file
84
app/Services/Admin/AdminReconcileJobService.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Admin;
|
||||
|
||||
use App\Models\AdminUser;
|
||||
use App\Models\ReconcileItem;
|
||||
use App\Models\ReconcileJob;
|
||||
use App\Services\AuditLogger;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* 对账任务:落库 `reconcile_jobs` / `reconcile_items`(阶段 7;差异引擎可后续替换)。
|
||||
*/
|
||||
final class AdminReconcileJobService
|
||||
{
|
||||
/**
|
||||
* @param list<array{side_a_ref?: ?string, side_b_ref?: ?string, difference_amount?: int, status?: string}>|null $items
|
||||
*/
|
||||
public function createJob(
|
||||
AdminUser $admin,
|
||||
Request $request,
|
||||
string $reconcileType,
|
||||
?Carbon $periodStart,
|
||||
?Carbon $periodEnd,
|
||||
?array $items,
|
||||
): ReconcileJob {
|
||||
return DB::transaction(function () use ($admin, $request, $reconcileType, $periodStart, $periodEnd, $items): ReconcileJob {
|
||||
$jobNo = 'REC'.now()->format('YmdHis').strtoupper(Str::random(4));
|
||||
|
||||
$job = ReconcileJob::query()->create([
|
||||
'job_no' => $jobNo,
|
||||
'admin_user_id' => (int) $admin->getKey(),
|
||||
'reconcile_type' => $reconcileType,
|
||||
'status' => 'completed',
|
||||
'period_start' => $periodStart,
|
||||
'period_end' => $periodEnd,
|
||||
'summary_json' => null,
|
||||
'finished_at' => now(),
|
||||
]);
|
||||
|
||||
$mismatch = 0;
|
||||
foreach ($items ?? [] as $row) {
|
||||
ReconcileItem::query()->create([
|
||||
'reconcile_job_id' => (int) $job->getKey(),
|
||||
'side_a_ref' => $row['side_a_ref'] ?? null,
|
||||
'side_b_ref' => $row['side_b_ref'] ?? null,
|
||||
'difference_amount' => (int) ($row['difference_amount'] ?? 0),
|
||||
'status' => (string) ($row['status'] ?? 'mismatch'),
|
||||
'resolved_at' => null,
|
||||
]);
|
||||
if (($row['status'] ?? 'mismatch') === 'mismatch') {
|
||||
$mismatch++;
|
||||
}
|
||||
}
|
||||
|
||||
$job->forceFill([
|
||||
'summary_json' => [
|
||||
'item_count' => count($items ?? []),
|
||||
'mismatch_count' => $mismatch,
|
||||
],
|
||||
])->save();
|
||||
|
||||
AuditLogger::recordForAdmin(
|
||||
$admin,
|
||||
$request,
|
||||
'reconcile_jobs',
|
||||
'create',
|
||||
'reconcile_job',
|
||||
(string) $job->getKey(),
|
||||
null,
|
||||
[
|
||||
'job_no' => $jobNo,
|
||||
'reconcile_type' => $reconcileType,
|
||||
'item_count' => count($items ?? []),
|
||||
],
|
||||
);
|
||||
|
||||
return $job->fresh();
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user