,权限串 tcm.revisitDue/, * 弹窗六个 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); } }