Files
coolcoth.com/app/Controllers/PSI/RemindersController.php
T
2026-08-08 15:53:53 +08:00

112 lines
3.9 KiB
PHP

<?php
namespace App\Controllers\PSI;
use Core\Controller;
use Core\Notify;
use App\Models\PSI\Event;
/**
* PSI 紧急事件 / 提醒中心
* - 列出所有“紧急事件”(站内提醒,所有 PSI 人员可见)
* - 支持单条标记已读 / 全部已读
* - 支持手动发起一条紧急提醒(通知负责人)
* 通过 PSI 仪表盘统一分发:PSI/reminders[/动作[/id]]
*/
class RemindersController extends Controller
{
/** 统一入口,由 DashboardController 分发 */
public function handle(array $args = []): void
{
$action = $args[0] ?? 'index';
$id = (int) ($args[1] ?? 0);
if ($action === 'create') {
$this->create();
return;
}
if ($action === 'mark' && $id > 0) {
$this->markRead($id);
return;
}
if ($action === 'markAll') {
$this->markAll();
return;
}
$this->index();
}
public function index(): void
{
if (!subsys_user('psi')) { http_response_code(403); echo '无权限'; return; }
$events = (new Event())->all();
$events = array_reverse($events); // 最新在前
$uid = (int) ($_SESSION['admin_uid'] ?? 0);
$unread = 0;
foreach ($events as &$ev) {
$read = json_decode($ev['read_by'] ?? '[]', true) ?: [];
$ev['_read'] = in_array($uid, $read, true);
if (!$ev['_read']) $unread++;
}
$this->renderSubsys('psi', 'psi/reminders', [
'events' => $events,
'unread' => $unread,
], \psi_nav(), 'reminders');
}
public function markRead(int $id): void
{
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { $this->redirect('PSI/reminders'); }
if (!subsys_user('psi')) { http_response_code(403); return; }
$uid = (int) ($_SESSION['admin_uid'] ?? 0);
$ev = (new Event())->find($id);
if ($ev) {
$read = json_decode($ev['read_by'] ?? '[]', true) ?: [];
if (!in_array($uid, $read, true)) {
$read[] = $uid;
(new Event())->update($id, ['read_by' => json_encode($read, JSON_UNESCAPED_UNICODE)]);
}
}
$this->redirect('PSI/reminders');
}
public function markAll(): void
{
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { $this->redirect('PSI/reminders'); }
if (!subsys_user('psi')) { http_response_code(403); return; }
$uid = (int) ($_SESSION['admin_uid'] ?? 0);
$events = (new Event())->all();
foreach ($events as $ev) {
$read = json_decode($ev['read_by'] ?? '[]', true) ?: [];
if (!in_array($uid, $read, true)) {
$read[] = $uid;
(new Event())->update($ev['id'], ['read_by' => json_encode($read, JSON_UNESCAPED_UNICODE)]);
}
}
$this->redirect('PSI/reminders');
}
/** 手动发起一条紧急提醒(通知负责人) */
public function create(): void
{
if (!subsys_user('psi')) { http_response_code(403); echo '无权限'; return; }
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!csrf_check()) { $this->flash('表单已过期,请重试', 'err'); $this->redirect('PSI/reminders'); }
$title = trim($this->post('title', ''));
$body = trim($this->post('body', ''));
if ($title === '') { $this->flash('请填写提醒标题', 'err'); $this->redirect('PSI/reminders'); }
Notify::fire('manual', $title, $body ?: $title, [
'level' => 'urgent', 'url' => 'PSI/reminders',
]);
$this->flash('已发起紧急提醒,并已通知相关负责人', 'ok');
$this->redirect('PSI/reminders');
}
$this->renderSubsys('psi', 'psi/reminder_form', [
'title' => '', 'body' => '',
], \psi_nav(), 'reminders');
}
}