This commit is contained in:
gr
2026-10-15 11:03:54 +08:00
parent 70ddc1a70a
commit bb28d93cec
64 changed files with 12747 additions and 420 deletions
@@ -0,0 +1,126 @@
<?php
declare(strict_types=1);
namespace app\adminapi\controller\tcm;
use app\adminapi\controller\BaseAdminController;
use app\adminapi\lists\tcm\RevisitDueLists;
use app\adminapi\logic\tcm\RevisitDueLogic;
use app\adminapi\validate\tcm\RevisitDueValidate;
/**
* 复诊到期弹窗控制器(需求 4:到期未面诊弹窗 + 延迟处理;P2 主管团队视图 lists / logs)
*
* URL 自动映射 /adminapi/tcm.revisitDue/<action>,权限串 tcm.revisitDue/<action>,
* 弹窗六个 action 在菜单登记于 server/sql/1.9.20261012/05_add_revisit_due_menu.sql,
* 主管视图 lists(C 类页面 /stats/revisit_due)/ logs(A 类)登记于 08_add_revisit_due_team_menu.sql,
* 否则 AuthMiddleware 对未登记接口放行。归属校验在 RevisitDueLogic 内完成,lists 的数据范围由 RevisitDueLists 处理。
*
* @package app\adminapi\controller\tcm
*/
class RevisitDueController extends BaseAdminController
{
/**
* @notes 主管团队视图:到期跟进列表(分页 / 筛选 / 导出 export=1|2),数据范围按角色 data_scope
*/
public function lists()
{
return $this->dataLists(new RevisitDueLists());
}
/**
* @notes 主管团队视图:某条提醒的事件流水(需在当前账号数据范围内)
*/
public function logs()
{
$params = (new RevisitDueValidate())->get()->goCheck('logs');
$result = RevisitDueLogic::logs((int) $params['due_id'], $this->adminId, $this->adminInfo);
if ($result === false) {
return $this->fail(RevisitDueLogic::getError() ?: '流水读取失败');
}
return $this->data($result);
}
/**
* @notes 弹窗待办(轮询):本人到期未挂号 / 过号且已到提醒时刻的项 + 汇总计数
*/
public function pending()
{
return $this->data(RevisitDueLogic::pending($this->adminId, $this->adminInfo));
}
/**
* @notes 仅计数(不更新弹出时间)
*/
public function summary()
{
return $this->data(RevisitDueLogic::summary($this->adminId, $this->adminInfo));
}
/**
* @notes 延迟一次(幂等:affected=0 也返回当前行)
*/
public function snooze()
{
$params = (new RevisitDueValidate())->post()->goCheck('snooze');
$result = RevisitDueLogic::snooze((int) $params['id'], $this->adminId, $this->adminInfo);
if ($result === false) {
return $this->fail(RevisitDueLogic::getError() ?: '延迟失败');
}
return $this->success($result['message'], $result['item'], 1, 1);
}
/**
* @notes 批量延迟(仅 escalation_level<=1 的项)
*/
public function snoozeAll()
{
$params = (new RevisitDueValidate())->post()->goCheck('snoozeAll');
$result = RevisitDueLogic::snoozeAll((array) $params['ids'], $this->adminId, $this->adminInfo);
return $this->success($result['message'], $result, 1, 1);
}
/**
* @notes 已联系:记录患者承诺复诊日
*/
public function contact()
{
$params = (new RevisitDueValidate())->post()->goCheck('contact');
$result = RevisitDueLogic::contact(
(int) $params['id'],
(string) $params['promised_date'],
(string) ($params['remark'] ?? ''),
$this->adminId,
$this->adminInfo
);
if ($result === false) {
return $this->fail(RevisitDueLogic::getError() ?: '记录失败');
}
return $this->success($result['message'], $result['item'], 1, 1);
}
/**
* @notes 人工关闭(原因 lost|other + 说明必填)
*/
public function close()
{
$params = (new RevisitDueValidate())->post()->goCheck('close');
$result = RevisitDueLogic::close(
(int) $params['id'],
(string) $params['reason'],
(string) ($params['remark'] ?? ''),
$this->adminId,
$this->adminInfo
);
if ($result === false) {
return $this->fail(RevisitDueLogic::getError() ?: '关闭失败');
}
return $this->success($result['message'], $result['item'], 1, 1);
}
}