Files
zyt/server/app/mcp/catalog/review/tcm.php
T
2026-09-24 09:45:44 +08:00

217 lines
25 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* AI 数据目录人工审核:中医诊单与处方(tcm.*)的全部非写、非 POST 接口(51 个)。
*
* 约定:
* - 按诊单/患者/记录ID取数的接口一律按「详情」调用(kind=detail):zyt_get 会把 ID 固定为单个值,
* 避免数组参数与逐条校验不一致;
* - 诊单级逐条校验复用 DiagnosisLogic::canViewReadonlyDiagnosis(logic/tcm/DiagnosisLogic.php:4301),
* 与诊单列表同口径:医助角色仅本人诊单,其余按数据范围(诊单医助 ∈ 可见账号);
* - 'builtin' 表示接口自身已有逐条校验,函数写在各条目上方注释里。
*/
use app\adminapi\logic\tcm\DiagnosisLogic;
use app\adminapi\validate\tcm\DiagnosisValidate;
return [
// ───────────── 血糖血压 / 饮食 / 运动记录 ─────────────
'tcm.bloodRecord/detail' => ['status' => 'pending', 'name' => '血糖血压记录详情',
'reason' => '按记录ID读取任意患者的血糖血压记录,无逐条权限校验(BloodRecordLogic::detail),现有校验函数只接受诊单ID;可改用 tcm.diagnosis/trackingWindow 按诊单查询'],
'tcm.bloodRecord/getBloodSugarTrend' => ['status' => 'open', 'kind' => 'detail', 'name' => '血糖趋势(按诊单)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => ['days' => '最近天数,默认 7'],
'note' => 'id 为诊单ID;按天返回空腹/餐后2小时/其他血糖(每天取第一条有效值)'],
'tcm.bloodRecord/getRecordsByPatient' => ['status' => 'open', 'kind' => 'detail', 'name' => '血糖血压记录(按诊单)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => [], 'note' => 'id 为诊单ID;返回该诊单全部血糖血压记录(按日期倒序)'],
'tcm.dietRecord/detail' => ['status' => 'pending', 'name' => '饮食记录详情',
'reason' => '按记录ID读取任意患者的饮食记录,无逐条权限校验(DietRecordLogic::detail);可改用 tcm.diagnosis/trackingWindow 按诊单查询'],
'tcm.dietRecord/getRecordsByPatient' => ['status' => 'open', 'kind' => 'detail', 'name' => '饮食记录(按诊单)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => [], 'note' => 'id 为诊单ID'],
'tcm.exerciseRecord/detail' => ['status' => 'pending', 'name' => '运动记录详情',
'reason' => '按记录ID读取任意患者的运动记录,无逐条权限校验(ExerciseRecordLogic::detail);可改用 tcm.diagnosis/trackingWindow 按诊单查询'],
'tcm.exerciseRecord/getExerciseTrend' => ['status' => 'open', 'kind' => 'detail', 'name' => '运动时长趋势(按诊单)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => ['start_date' => '开始日期 YYYY-MM-DD(与 end_date 同时传)', 'end_date' => '结束日期 YYYY-MM-DD', 'days' => '不传日期时取最近天数,默认 7'],
'note' => 'id 为诊单ID'],
'tcm.exerciseRecord/getRecordsByPatient' => ['status' => 'open', 'kind' => 'detail', 'name' => '运动记录(按诊单)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => [], 'note' => 'id 为诊单ID'],
// ───────────── 诊单 ─────────────
'tcm.diagnosis/lists' => ['status' => 'open', 'kind' => 'list',
'params_allow' => [
'keyword' => '患者姓名或手机号(模糊)', 'patient_name' => '患者姓名(模糊)', 'patient_id' => '患者ID(诊单 patient_id)',
'gender' => '性别 1男 0女', 'diagnosis_type' => '诊断类型(字典值)', 'syndrome_type' => '证型(字典值)',
'status' => '诊单状态 1启用 0禁用', 'assistant_id' => '医助(后台账号)ID', 'assistant_dept_id' => '医助所属部门ID(含下级部门)',
'start_time' => '诊断日期起(须与 end_time 同时传)', 'end_time' => '诊断日期止',
'diagnosis_confirmed' => '是否已确认诊单 1是 0否', 'appointment_date' => '挂号日期 YYYY-MM-DD',
'has_appointment' => '是否有有效挂号 1是 0否', 'completed_appointment' => '传 1 只看有已完成挂号的诊单',
'only_has_prescription' => '传 1 只看已开方的诊单',
'latest_appointment_start_date' => '最近一次挂号日期起 YYYY-MM-DD', 'latest_appointment_end_date' => '最近一次挂号日期止 YYYY-MM-DD',
'latest_appointment_channel_source' => '最近一次挂号的渠道来源(字典值)',
'latest_assign_start_date' => '最近一次指派医助日期起 YYYY-MM-DD', 'latest_assign_end_date' => '最近一次指派医助日期止 YYYY-MM-DD',
'sort_unserved_days' => '按未服务天数排序 asc/desc',
],
// pending_assign=1(全局禁用)会跳过医助本人过滤和数据范围,配合关键词可按姓名/手机/身份证全库检索(DiagnosisLists:76-98、929-1014)
'forbid' => ['pending_assign', 'pending_assign_keyword', 'pending_assign_order_month'],
'note' => '医助角色只看本人诊单,其余按数据范围(诊单医助 ∈ 可见账号);不含「待分配医助」视图'],
// 编辑页详情:控制器会顺手 markAssignRead 写库,改为直接调 DiagnosisLogic::detail(只读),并用列表同口径校验逐条可见
'tcm.diagnosis/detail' => ['status' => 'open', 'kind' => 'detail', 'name' => '诊单详情',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'args' => ['id', 'admin_id', 'admin_info']],
'handler' => ['logic' => [DiagnosisLogic::class, 'detail'], 'args' => ['params', 'admin_info'],
'validate' => [DiagnosisValidate::class, 'id'], 'error' => [DiagnosisLogic::class, 'getError']],
'params_allow' => [], 'note' => '后台原接口无逐条校验,这里补上与诊单列表一致的可见性校验'],
// builtin:DiagnosisLogic::readonlyDetail(DiagnosisLogic.php:4241)先调 canViewReadonlyDiagnosis(:4251/:4301);
// 控制器会顺手 markAssignRead 写库,故改为直接调 Logic
'tcm.diagnosis/readonlyDetail' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin',
'handler' => ['logic' => [DiagnosisLogic::class, 'readonlyDetail'], 'args' => ['params', 'admin_id', 'admin_info'],
'validate' => [DiagnosisValidate::class, 'readonlyDetail'], 'error' => [DiagnosisLogic::class, 'getError']],
'params_allow' => [], 'note' => '返回最近挂号、诊单病例、医生备注、跟踪备注、未服务天数'],
// builtin:DiagnosisController::trackingWindow(controller/tcm/DiagnosisController.php:175)先调 canViewReadonlyDiagnosis;
// 权限点沿用控制器注释写明的 tcm.diagnosis/readonlyDetail(trackingWindow 本身未在菜单登记)
'tcm.diagnosis/trackingWindow' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin',
'perm' => 'tcm.diagnosis/readonlyDetail', 'name' => '诊单跟踪记录(血糖血压/饮食/运动)',
'params_allow' => ['start_date' => '开始日期 YYYY-MM-DD', 'end_date' => '结束日期 YYYY-MM-DD'],
'note' => 'id 为诊单ID;不传日期返回全部记录,建议按日期区间查询'],
'tcm.diagnosis/trackingNotes' => ['status' => 'open', 'kind' => 'detail',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => [], 'note' => 'id 为诊单ID;最近 60 条跟踪备注(按天合并,每天一条)'],
'tcm.diagnosis/guahaoLogList' => ['status' => 'open', 'kind' => 'detail',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => [], 'note' => 'id 为诊单ID;挂号/取消挂号操作日志(最多 200 条)'],
'tcm.diagnosis/getCallRecords' => ['status' => 'open', 'kind' => 'detail', 'name' => '诊单通话记录(含录音与转写)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => [], 'note' => 'id 为诊单ID;录音/录像地址按附件处理,transcript_text 为通话转写全文'],
// builtin:DiagnosisController::getImChatMessages(DiagnosisController.php:453)先调 canViewReadonlyDiagnosis,诊单ID已转 int;
// only_archived=1 只读本地归档,不调用腾讯 IM、不写库。不设为 detail:zyt_file 走详情分支时不带 force
'tcm.diagnosis/getImChatMessages' => ['status' => 'open', 'kind' => 'report', 'guard' => 'builtin', 'name' => '诊单 IM 聊天记录(已归档)',
'params_allow' => ['diagnosis_id' => '诊单ID(必填)'], 'force' => ['only_archived' => 1],
'note' => '只返回已归档到本地的患者与医生/医助 IM 消息(同一患者的历次诊单合并)'],
'tcm.diagnosis/getWechatChatRecords' => ['status' => 'open', 'kind' => 'detail', 'name' => '企业微信聊天记录(按诊单)',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => ['page_no' => '页码,每页 20 条'], 'forbid' => ['patient_id', 'page_size'],
'note' => 'id 为诊单ID;按聊天时间倒序'],
'tcm.diagnosis/aiPatientOptions' => ['status' => 'open', 'kind' => 'list',
// builtin:DiagnosisAiLogic::patientOptions(logic/tcm/DiagnosisAiLogic.php:150)校验 tcm.diagnosis/aiAssistant 权限并按 MyPatientLogic::applyScope 收窄
'params_allow' => ['keyword' => '患者姓名、手机号或诊单ID/患者ID'],
'note' => '「我的患者」范围内的启用诊单;还需要 tcm.diagnosis/aiAssistant 权限;手机号已脱敏,每页最多 50 条'],
// builtin:DiagnosisAiLogic::getSavedReports(DiagnosisAiLogic.php:275)→ loadAuthorizedDiagnosis(:1151)校验 tcm.diagnosis/aiReports 权限 + MyPatientLogic::canAccessDiagnosis
'tcm.diagnosis/aiReports' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin', 'name' => '诊单 AI 报告(已保存)',
'params_allow' => [], 'note' => 'id 为诊单ID;只读已保存的报告,不触发模型调用;case_summary 为患者纵向资料摘要,内容较长'],
// builtin:PatientAiReportLogic::reports(logic/tcm/PatientAiReportLogic.php:130)→ loadAuthorizedDiagnoses(:349)校验权限 + MyPatientLogic::applyScope
'tcm.diagnosis/patientAiReports' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin', 'id_param' => 'patient_id',
'params_allow' => [], 'note' => 'id 为患者ID(诊单 patient_id);只读历史报告快照,不触发模型调用'],
'tcm.diagnosis/assistantDiagnosisStats' => ['status' => 'open', 'kind' => 'report', 'name' => '医助诊单统计(按部门/按人)',
'params_allow' => ['days' => '最近天数(1-90,默认 7;0 表示今天)', 'start_time' => '开始时间 YYYY-MM-DD HH:mm:ss', 'end_time' => '结束时间 YYYY-MM-DD HH:mm:ss'],
'note' => '按诊单创建时间统计各医助新建诊单数,只含当前账号数据范围内的医助'],
'tcm.diagnosis/getAssistants' => ['status' => 'open', 'kind' => 'report', 'name' => '医助名单', 'params_allow' => [],
'note' => '按当前账号数据范围返回在职医助(ID、姓名、登录账号、部门),可用于把姓名换成 assistant_id'],
'tcm.diagnosis/getDoctors' => ['status' => 'open', 'kind' => 'report', 'name' => '医生名单', 'params_allow' => [],
'note' => '后台本身不按数据范围过滤:拥有该权限的账号可看到全部(在职医生 ID、姓名、登录账号)'],
'tcm.diagnosis/searchPatient' => ['status' => 'pending', 'name' => '全库搜索患者',
'reason' => '按姓名/手机号/身份证号在全部诊单中模糊搜索并返回手机号、身份证号,不按数据范围过滤,且未登记权限点(DiagnosisController::searchPatient);需改为按数据范围检索,可用 tcm.diagnosis/lists 的 keyword 替代'],
'tcm.diagnosis/getWechatExternalContact' => ['status' => 'pending', 'name' => '患者企微外部联系人',
'reason' => '调用企业微信会话存档接口(外部调用),且按 patient_id 可取任意患者姓名、手机号、external_userid,无逐条权限校验(DiagnosisLogic::getWechatExternalContact)'],
'tcm.diagnosis/getMsgAuditPermitUsers' => ['status' => 'excluded', 'name' => '企微会话存档成员',
'reason' => '企业微信会话存档配置信息(开启存档的成员),需调用企业微信接口,不属于业务数据'],
'tcm.diagnosis/diagnosisDetail' => ['status' => 'excluded', 'name' => '诊单详情(患者端)',
'reason' => '患者端接口:只比对请求里的 user_id 与诊单 patient_id,不是后台账号的数据权限校验;后台请用 tcm.diagnosis/readonlyDetail'],
'tcm.diagnosis/getDoctorSignature' => ['status' => 'excluded', 'name' => '医助通话签名',
'reason' => '为任意 doctor_{ID} 生成 TRTC/IM UserSig(凭据)并调用腾讯 IM,不对 AI 开放'],
'tcm.diagnosis/getPatientSignature' => ['status' => 'excluded', 'name' => '患者通话签名',
'reason' => '为任意患者生成 TRTC/IM UserSig(凭据)并调用腾讯 IM,不对 AI 开放'],
'tcm.diagnosis/watchCall' => ['status' => 'excluded',
'reason' => '返回旁观视频通话的 TRTC 进房参数与 UserSig(凭据),并调用腾讯 IM,不对 AI 开放'],
'tcm.diagnosis/test' => ['status' => 'excluded', 'name' => '诊单测试接口', 'reason' => '测试接口'],
// ───────────── 诊单待办 ─────────────
'tcm.diagnosisTodo/lists' => ['status' => 'open', 'kind' => 'list',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => ['diagnosis_id' => '诊单ID(必填)', 'status' => '状态 0待执行 1已发送 2已取消 3发送失败', 'creator_id' => '创建人ID'],
'note' => '后台列表只按诊单ID过滤、不校验诊单归属,这里补上诊单可见性校验'],
'tcm.diagnosisTodo/detail' => ['status' => 'pending', 'name' => '诊单待办详情',
'reason' => '按待办ID读取任意诊单的待办,无逐条权限校验(DiagnosisTodoLogic::detail);可改用 tcm.diagnosisTodo/lists(按诊单ID,已校验诊单可见)'],
// ───────────── 处方 ─────────────
'tcm.prescription/lists' => ['status' => 'open', 'kind' => 'list',
'params_allow' => ['patient_name' => '患者姓名(模糊)', 'sn' => '处方编号(模糊)',
'start_time' => '创建时间起(须与 end_time 同时传)', 'end_time' => '创建时间止',
'creator_ids' => '开方医生ID,多个用逗号分隔', 'audit_filter' => '审核:passed 已通过 / not_passed 未通过 / pending 待审 / rejected 驳回',
'source_filter' => '来源:system 系统代开 / manual 手工开方'],
'note' => '非全量角色只看共享、本人开具、本人为医助或指定给本人角色的处方,并叠加数据范围(开方人/医助)'],
'tcm.prescription/detail' => ['status' => 'pending',
'reason' => 'PrescriptionLogic::canViewPrescription(:83-139)对 order_edit_all_roles 角色及任何拥有 tcm.prescriptionOrder/detail 权限的账号放行全部处方,不受数据范围限制,比处方列表宽;可改用 tcm.prescription/listByDiagnosis'],
'tcm.prescription/getByAppointment' => ['status' => 'pending', 'name' => '按挂号取处方',
'reason' => '按挂号ID取处方只做 canViewPrescription 校验(同 tcm.prescription/detail,全量角色和业务订单详情权限可看任意处方);可改用 tcm.prescription/listByDiagnosis'],
// builtin:PrescriptionLogic::listByDiagnosis(logic/tcm/PrescriptionLogic.php:1046)先调 canViewReadonlyDiagnosis(:1049),再逐条 canViewPrescription 过滤(:1061)
'tcm.prescription/listByDiagnosis' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin', 'id_param' => 'diagnosis_id',
'name' => '诊单处方列表', 'params_allow' => [], 'note' => 'id 为诊单ID;返回该诊单下当前账号可见的全部处方(含作废)'],
// ───────────── 处方 AI 分析(控制器拒绝未知参数,并按 PrescriptionAiAccess 重新校验账号与数据范围) ─────────────
// builtin:PrescriptionAiLogic::detail(logic/tcm/PrescriptionAiLogic.php:105)→ loadBatch/visibleBatch(:345/:354):处方可见 + 诊单“我的患者”范围 + 来源快照授权
'tcm.prescriptionAi/detail' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin', 'id_param' => 'batch_id',
'params_allow' => [], 'note' => 'id 为分析批次 batch_id(来自处方AI历史/状态);含各模型报告正文与复核意见'],
// builtin:PrescriptionAiLogic::reports(:60)按 Access::prescription / Access::diagnosis 校验,并逐条 visibleBatch 过滤后再分页
'tcm.prescriptionAi/reports' => ['status' => 'open', 'kind' => 'report',
'params_allow' => ['prescription_id' => '处方ID(与 diagnosis_id 二选一)', 'diagnosis_id' => '诊单ID(与 prescription_id 二选一)',
'page_no' => '页码', 'page_size' => '每页条数,最多 50'],
'note' => '历次处方 AI 分析批次(摘要,不含报告正文;正文用 tcm.prescriptionAi/detail)'],
// builtin:PrescriptionAiLogic::statuses(:20)逐个 Access::prescription + visibleBatch
'tcm.prescriptionAi/statuses' => ['status' => 'open', 'kind' => 'report',
'params_allow' => ['ids' => '处方ID数组(或逗号分隔),最多 100 个'], 'note' => '无权查看的处方不会出现在结果中'],
// builtin:PrescriptionAiLogic::statistics(:204)逐批 visibleBatch 过滤
'tcm.prescriptionAi/statistics' => ['status' => 'open', 'kind' => 'report',
'params_allow' => ['date_from' => '开始日期 YYYY-MM-DD(默认 30 天前)', 'date_to' => '结束日期 YYYY-MM-DD(跨度不超过一年)', 'doctor_id' => '医生ID'],
'note' => '按医生统计处方 AI 药味与剂量一致度(不代表临床准确率),只计当前账号可见的批次'],
// ───────────── 处方库(协定方模板,非患者数据) ─────────────
'tcm.prescriptionLibrary/lists' => ['status' => 'open', 'kind' => 'list', 'name' => '处方库列表',
'params_allow' => ['prescription_name' => '处方名称(模糊)', 'is_public' => '是否公开 1是 0否', 'creator_id' => '创建人ID', 'formula_type' => '主方 / 辅方'],
// prescribing_creator_id:开方页导入专用,可读取指定医生的非公开处方(PrescriptionLibraryLists:37-44)
'forbid' => ['prescribing_creator_id'],
'note' => '管理角色看全部;其余账号看本人创建和公开的处方'],
// builtin:PrescriptionLibraryLogic::detail(logic/tcm/PrescriptionLibraryLogic.php:192,校验在 :200):本人创建、公开或管理角色
'tcm.prescriptionLibrary/detail' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin', 'name' => '处方库详情', 'params_allow' => []],
// builtin:PrescriptionLibraryAiLogic::getSavedReports(logic/tcm/PrescriptionLibraryAiLogic.php:60)→ loadAuthorizedPrescription(:371)校验权限 + PrescriptionLibraryLogic::detail
'tcm.prescriptionLibrary/aiReports' => ['status' => 'open', 'kind' => 'detail', 'guard' => 'builtin', 'name' => '处方库 AI 解释',
'params_allow' => [], 'note' => 'id 为处方库ID;只读已保存的解释,不触发模型调用'],
// builtin:PrescriptionLibraryAiLogic::getMissingReports(:83)校验权限,并按本人/公开/管理角色收窄(:103-108)
'tcm.prescriptionLibrary/missingAiReports' => ['status' => 'open', 'kind' => 'report', 'name' => '处方库待生成 AI 解释清单',
'params_allow' => ['limit' => '返回条数 1-500,默认 500']],
// ───────────── 处方业务订单 ─────────────
'tcm.prescriptionOrder/lists' => ['status' => 'open', 'kind' => 'list',
'params_allow' => [
'order_no' => '业务订单号(模糊)', 'prescription_id' => '处方ID', 'diagnosis_id' => '诊单ID', 'patient_id' => '患者ID(诊单 patient_id,跨诊单)',
'patient_keyword' => '患者姓名或手机号(模糊)',
'fulfillment_status' => '履约状态 1待双审通过 2待发货 3已完成 4已取消 5已发货 6已签收 7进行中 8暂不制药 9拒收 10退款 11保留药方 12制药缓发',
'prescription_audit_status' => '处方审核 0待审核 1通过 2驳回', 'payment_slip_audit_status' => '支付单审核 0待审核 1通过 2驳回',
'start_time' => '创建时间起 YYYY-MM-DD HH:mm:ss(也是 extend 金额统计区间,不传为今天)', 'end_time' => '创建时间止 YYYY-MM-DD HH:mm:ss',
'doctor_id' => '开方医生ID', 'assistant_id' => '订单创建人(医助)ID,仅数据范围内有效', 'assistant_dept_id' => '订单创建人所属部门ID(含下级部门)',
'audit_admin_id' => '审核人(下单角色)ID', 'audit_admin_keyword' => '审核人姓名(模糊)',
'express_company' => '快递公司 sf 顺丰 / jd 京东', 'express_keyword' => '快递单号或快递公司(模糊)',
'service_channel' => '服务渠道(0 表示未指派)', 'supply_mode' => '供货方式 gancao 甘草 / direct 洛阳直发 / self 自营',
'has_aux_formula' => '是否含辅方 1是 0否', 'exclude_fulfillment_cancelled' => '传 1 剔除已取消/拒收/退款订单',
],
// scene=diagnosis_edit(全局禁用)+ patient_id + context_diagnosis_id 会跳过创建人可见性和数据范围(PrescriptionOrderLists:121-127、464-482);
// yeji_* 业绩看板侧栏参数会跳过「仅本人订单」(:487-526、1326-1359)
'forbid' => ['scene', 'context_diagnosis_id', 'yeji_order_drawer', 'yeji_drawer_match_table_performance', 'yeji_er_center_revisit_only',
'yeji_er_center_revisit_slot', 'yeji_table_row_dept_ids', 'dept_ids', 'channel_code', 'create_time'],
'note' => '非全量角色默认只看本人创建的订单(有「查看本人开方订单」权限时含本人开方的订单),再叠加数据范围;extend.stats_* 为列表顶部金额统计(口径见 stats_scope);内部成本仅财务角色可见'],
'tcm.prescriptionOrder/detail' => ['status' => 'pending',
'reason' => 'PrescriptionOrderLogic::canAccessOrder(:377-398)对拥有任一 tcm.prescriptionOrder/* 权限的账号直接放行(hasPrescriptionOrderMenuAccess),全量角色也不受数据范围限制,可读取列表范围外的任意订单;需补充与列表一致的逐条校验'],
'tcm.prescriptionOrder/logs' => ['status' => 'pending',
'reason' => '逐条校验同 canAccessOrder:拥有任一业务订单权限即可读取任意订单的操作日志;需补充与列表一致的逐条校验'],
'tcm.prescriptionOrder/logisticsTrace' => ['status' => 'pending',
'reason' => '本地无轨迹时调用快递100接口(外部调用,无参数可限定只读本地缓存),且逐条校验同 canAccessOrder(任一业务订单权限即放行)'],
'tcm.prescriptionOrder/export' => ['status' => 'excluded', 'reason' => '导出文件接口;查询请用 tcm.prescriptionOrder/lists'],
// builtin 归属规则:OrderLogic::listPaidOrdersForDiagnosis(logic/order/OrderLogic.php:1303,:1317-1322)非全量角色且非该诊单医助时只返回本人创建的收款单;
// 后台原接口不校验诊单归属,这里补上诊单可见性校验
'tcm.prescriptionOrder/paidPayOrders' => ['status' => 'open', 'kind' => 'detail',
'guard' => ['callable' => [DiagnosisLogic::class, 'canViewReadonlyDiagnosis'], 'param' => 'diagnosis_id', 'args' => ['id', 'admin_id', 'admin_info']],
'params_allow' => ['prescription_order_id' => '编辑中的业务订单ID(其已关联的收款单也列出)'],
'note' => 'id 为诊单ID;该诊单下已支付、尚未被其他业务订单占用的收款单(2026-04-20 之后创建)'],
];