# Conflicts: # server/public/admin/assets/.pnpm-Cy9nIqIg.js # server/public/admin/assets/403-DZv43rg8.js # server/public/admin/assets/404-BdEnY8Op.js # server/public/admin/assets/@tencentcloud/call-engine-js-DC0nMlpX.js # server/public/admin/assets/@tencentcloud/chat-BgZr4keH.js # server/public/admin/assets/@tencentcloud/chat-uikit-engine-D2vNRuTA.js # server/public/admin/assets/AppointmentRecordPanel-BLiYiAbY.js # server/public/admin/assets/AssignLogPanel-B37Pa478.js # server/public/admin/assets/AssistantWatchCallDialog-CwSHnJSG.js # server/public/admin/assets/BloodRecordList-Drn0jNIG.js # server/public/admin/assets/CaseRecordList-DOWsaiL5.js # server/public/admin/assets/ConsultationTranscriptPanel-fqClePUL.js # server/public/admin/assets/DailyMatrix-B_BuE6Wk.js # server/public/admin/assets/DiagnosisTodoList-BvKuWevJ.js # server/public/admin/assets/DietRecordList-CNcxCdHz.js # server/public/admin/assets/ExerciseRecordList-DcrDxj4-.js # server/public/admin/assets/FollowupAudioField-DwFRovp6.js # server/public/admin/assets/FollowupAudioPanel-161TbfEd.js # server/public/admin/assets/FollowupAudioReview-DUx7pf7f.js # server/public/admin/assets/GancaoSubmissionReconcileButton.vue_vue_type_script_setup_true_lang-8OIk4lHB.js # server/public/admin/assets/ImChatRecordPanel-DHff4nFV.js # server/public/admin/assets/MediaSourceSelect-DAiidBXd.js # server/public/admin/assets/MediaSourceSelect.vue_vue_type_script_setup_true_lang-BnUzDRdh.js # server/public/admin/assets/MessageBubble-bYTr-oyb.js # server/public/admin/assets/NoteTimeline-jPsAfPnk.js # server/public/admin/assets/OrderActionHost-CM9FpHNh.js # server/public/admin/assets/OrderPanel-Co_XYZDR.js # server/public/admin/assets/PatientCaseCard-CDC9oDgL.js # server/public/admin/assets/PatientInfoCard-wIayMpdX.js # server/public/admin/assets/PatientOrderList-C0nBgRYQ.js # server/public/admin/assets/PrescriptionAiBatchGenerateDialog--28G2reg.js # server/public/admin/assets/PrescriptionAiReportDialog-BElqcJhz.js # server/public/admin/assets/PrescriptionOrderDetailDrawer-C1YLaoua.js # server/public/admin/assets/PrescriptionOrderTimeDialog.vue_vue_type_script_setup_true_lang-zSycYEpH.js # server/public/admin/assets/ProgressPanel-DuOaWdPj.js # server/public/admin/assets/PromotionAutomationForm-CEi-wURu.js # server/public/admin/assets/RecordingPlaybackBlock-B1YEgQib.js # server/public/admin/assets/RecordingVideoPlayer-CzGfJLYq.js # server/public/admin/assets/SendPanel-C81B60j9.js # server/public/admin/assets/TrackingMatrix-Dvlry4c2.js # server/public/admin/assets/TrackingNoteTimeline-CcOnnAQR.js # server/public/admin/assets/WecomFloatingWidgetBuilder-BZ1rtSPX.js # server/public/admin/assets/WelcomeMessageEditor-FXBSgF_s.js # server/public/admin/assets/account-adjust.vue_vue_type_script_setup_true_lang-BDg3Vt-5.js # server/public/admin/assets/account_cost-1Kig3__5.js # server/public/admin/assets/add-CnMHBvcC.js # server/public/admin/assets/admin-mWKPRS5Z.js # server/public/admin/assets/ai_mcp-BdB18eax.js # server/public/admin/assets/appointment-BABD2Tar.js # server/public/admin/assets/article-B2IS97ge.js # server/public/admin/assets/asset-fny0UJmY.js # server/public/admin/assets/attr-BO203wr6.js # server/public/admin/assets/attr-CYxX_t_S.js # server/public/admin/assets/attr-setting.vue_vue_type_script_setup_true_lang-BK3AJqkU.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-C1vfB9ju.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-CA3Eqz_I.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-CISdFe5h.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-CfyBAgmS.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-LP4IWWFR.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-R-6FX7Mu.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-bgUhDqjK.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-hGjVuUay.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-hudO2m34.js # server/public/admin/assets/attr.vue_vue_type_script_setup_true_lang-i4BbFcAt.js # server/public/admin/assets/auth.vue_vue_type_script_setup_true_lang-BoZeVoZP.js # server/public/admin/assets/balance_details-DOLi1Dm0.js # server/public/admin/assets/bind-work-wechat-DFHKss6n.js # server/public/admin/assets/cache-nfUb4Iya.js # server/public/admin/assets/change-password-CeOlId8o.js # server/public/admin/assets/code-B18aVPXd.js # server/public/admin/assets/code-preview.vue_vue_type_script_setup_true_lang-DGCCjmlM.js # server/public/admin/assets/commission-settlement-CdEu_C9J.js # server/public/admin/assets/commission-settlement-CdlIY0iL.css # server/public/admin/assets/config-J5lzqSHX.js # server/public/admin/assets/consumer-BpKM0EGl.js # server/public/admin/assets/content-69Fk_4pj.js # server/public/admin/assets/content-BKD0OzuH.js # server/public/admin/assets/content-CBy84fnS.js # server/public/admin/assets/content.vue_vue_type_script_setup_true_lang-AQZfsEkF.js # server/public/admin/assets/content.vue_vue_type_script_setup_true_lang-BlBOVIVr.js # server/public/admin/assets/content.vue_vue_type_script_setup_true_lang-ByXjA9a8.js # server/public/admin/assets/content.vue_vue_type_script_setup_true_lang-DBQ1TxzP.js # server/public/admin/assets/content.vue_vue_type_script_setup_true_lang-DSdHmkxS.js # server/public/admin/assets/cost-edit.vue_vue_type_script_setup_true_lang-CFW87alA.js # server/public/admin/assets/data-table.vue_vue_type_script_setup_true_lang-DLwRo6Tk.js # server/public/admin/assets/dayjs-LzqDqVlD.js # server/public/admin/assets/decoration-DiTN-PkH.js # server/public/admin/assets/decoration-img-BHQwkVvP.js # server/public/admin/assets/default_reply-D8zCYW7U.js # server/public/admin/assets/department-DWsa1OjT.js # server/public/admin/assets/dept-tongji-eyhTfbdn.js # server/public/admin/assets/desktop_workstation-DjyYOet-.js # server/public/admin/assets/detail-BZAR9ddi.js # server/public/admin/assets/detail-CFyC8ImZ.js # server/public/admin/assets/dict-K5jXOVeu.js # server/public/admin/assets/doctor-67HUqvH6.js # server/public/admin/assets/edit-BVGUIRWC.js # server/public/admin/assets/edit-BYRC6YDz.css # server/public/admin/assets/edit-CiIgrwSx.js # server/public/admin/assets/edit-CtQmrXFk.js # server/public/admin/assets/edit-DFAdp19K.js # server/public/admin/assets/edit-DNccqn8z.js # server/public/admin/assets/edit-DjWNlPnW.js # server/public/admin/assets/edit-Qrv_aqRa.js # server/public/admin/assets/edit-vVRINxRB.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-B_oC0AEU.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-C7-_pAL8.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-CTFgk6QV.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-CX_KUDU8.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-DyP0DJmF.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-DyqPlqpu.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-KBdoyuFG.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-NbrHRZf2.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_lang-z-MjcUR0.js # server/public/admin/assets/edit.vue_vue_type_script_setup_true_name_articleColumnEdit_lang-DKmZkTfn.js # server/public/admin/assets/environment-CypnLxrG.js # server/public/admin/assets/error-qleaM0eA.js # server/public/admin/assets/fans-BEy6y9dV.js # server/public/admin/assets/file-BbPuzGA_.js # server/public/admin/assets/file-CYwMKS77.js # server/public/admin/assets/filing-CD0AWXGl.js # server/public/admin/assets/finance-D_CR5ikx.js # server/public/admin/assets/first_visit-D4R0U3AW.js # server/public/admin/assets/follow_reply-c3sC_GVa.js # server/public/admin/assets/footer.vue_vue_type_script_setup_true_lang-g2gc-rGu.js # server/public/admin/assets/guahao-Dx7MIOXD.js # server/public/admin/assets/h5-DEYp6ziA.js # server/public/admin/assets/icon-CXrybs-g.js # server/public/admin/assets/im-business-message-parse-D_ibrMLq.js # server/public/admin/assets/index-01yWb2WC.js # server/public/admin/assets/index-6D3QYnU-.js # server/public/admin/assets/index-B1iWGyoA.js # server/public/admin/assets/index-B4AHD13Q.js # server/public/admin/assets/index-BBfgtFWE.js # server/public/admin/assets/index-BBw5kvK3.js # server/public/admin/assets/index-BDAWyLAZ.js # server/public/admin/assets/index-BJGIfP1w.js # server/public/admin/assets/index-BQUdwcn-.js # server/public/admin/assets/index-BSMBP3_x.js # server/public/admin/assets/index-BdkP3TxP.js # server/public/admin/assets/index-BgMeTKOG.js # server/public/admin/assets/index-Bmrtumah.js # server/public/admin/assets/index-Brsj06xV.js # server/public/admin/assets/index-Burmlw_C.js # server/public/admin/assets/index-C06c4h92.js # server/public/admin/assets/index-C1h5WVyC.js # server/public/admin/assets/index-C2Gny0kk.js # server/public/admin/assets/index-C5O-FG0j.js # server/public/admin/assets/index-C8BoF1ue.js # server/public/admin/assets/index-CJuWPVul.js # server/public/admin/assets/index-CV08lFR0.js # server/public/admin/assets/index-C_WKJDWz.js # server/public/admin/assets/index-Cew5Amf6.js # server/public/admin/assets/index-CkXW7n_b.js # server/public/admin/assets/index-CprgR4Ho.js # server/public/admin/assets/index-Csf0cSVI.js # server/public/admin/assets/index-Cux23s8_.js # server/public/admin/assets/index-D0fXvBxu.js # server/public/admin/assets/index-D8yz_vWn.js # server/public/admin/assets/index-DBKQxzkM.js # server/public/admin/assets/index-DIjSXq4q.js # server/public/admin/assets/index-DIqVZCk0.js # server/public/admin/assets/index-DNsVxejj.js # server/public/admin/assets/index-DPWF9bqo.js # server/public/admin/assets/index-DQ51fSAo.js # server/public/admin/assets/index-DQ9Uu3LT.js # server/public/admin/assets/index-DWRHbuqT.js # server/public/admin/assets/index-Db2Y9m7h.js # server/public/admin/assets/index-DcHdMI2B.js # server/public/admin/assets/index-DgPgE-Vl.js # server/public/admin/assets/index-Dr8oROcK.js # server/public/admin/assets/index-Ds_Mrym4.js # server/public/admin/assets/index-DtSyPsbW.js # server/public/admin/assets/index-GT7BM7PS.js # server/public/admin/assets/index-JZkFc8I0.js # server/public/admin/assets/index-hNEe3rMW.js # server/public/admin/assets/index-kMiV0948.js # server/public/admin/assets/index-qwjw9zcC.js # server/public/admin/assets/index.vue_vue_type_script_setup_true_lang-BClfSqof.js # server/public/admin/assets/index.vue_vue_type_script_setup_true_lang-BtlhchBa.js # server/public/admin/assets/index.vue_vue_type_script_setup_true_lang-C6aeOkz-.js # server/public/admin/assets/index.vue_vue_type_script_setup_true_lang-Cxgoepog.js # server/public/admin/assets/index.vue_vue_type_script_setup_true_lang-Dx6SeCGU.js # server/public/admin/assets/index.vue_vue_type_style_index_0_lang-DFOUY-wL.js # server/public/admin/assets/information-D4VXaoVX.js # server/public/admin/assets/keyword_reply-CtUT2T_C.js # server/public/admin/assets/link-DAAa4-8h.js # server/public/admin/assets/list-B31OC0dY.js # server/public/admin/assets/login-D-CTVkUr.js # server/public/admin/assets/login_register-BiM6Wf25.js # server/public/admin/assets/medicine-BGJ8mZD8.js # server/public/admin/assets/medicine-CNGccw4f.js # server/public/admin/assets/menu-BhV_PotF.js # server/public/admin/assets/menu-CixPRDpt.js # server/public/admin/assets/menu-set.vue_vue_type_script_setup_true_lang-B0ghs-Pc.js # server/public/admin/assets/message-DWVo1Jk8.js # server/public/admin/assets/mobile-style.vue_vue_type_script_setup_true_lang-B9BK24HQ.js # server/public/admin/assets/mubiao-A1xD0JzP.js # server/public/admin/assets/mubiao-dept-card-DDiegAnr.js # server/public/admin/assets/mubiao-dept-node-Cmw8YiIy.js # server/public/admin/assets/oa-attr-DZLm3ufW.js # server/public/admin/assets/oa-menu-form-edit.vue_vue_type_script_setup_true_lang-CXz4UbLJ.js # server/public/admin/assets/oa-menu-form.vue_vue_type_script_setup_true_lang-BPJDNffP.js # server/public/admin/assets/open_setting-YVf3y2zz.js # server/public/admin/assets/order-Bc7o9SOH.js # server/public/admin/assets/overflow-DhSFQzu9.js # server/public/admin/assets/paiban-BY9Nnrmr.js # server/public/admin/assets/patient-DxJlPLVv.js # server/public/admin/assets/patient-call-q2qMhhFV.js # server/public/admin/assets/pay-DWoC89w_.js # server/public/admin/assets/pc-CDHcPjgN.js # server/public/admin/assets/perm-DaS8_T_U.js # server/public/admin/assets/picker-ruBeJVAv.js # server/public/admin/assets/picker.vue_vue_type_script_setup_true_lang-DsjIkNAZ.js # server/public/admin/assets/popover_input-CrckcagQ.js # server/public/admin/assets/post-DGDTwH-Z.js # server/public/admin/assets/prescription-drawer-DN1NpnaF.js # server/public/admin/assets/preview-BbXyDhjZ.js # server/public/admin/assets/preview-pc-DIFp8DvX.js # server/public/admin/assets/progress-BUj9Y2lB.js # server/public/admin/assets/protocol-Clsp_lEu.js # server/public/admin/assets/qywx-CxG05a7f.js # server/public/admin/assets/recharge_record-CymZKQ4E.js # server/public/admin/assets/refund-log.vue_vue_type_script_setup_true_lang-Choelpx6.js # server/public/admin/assets/refund_record-BLbeOAEj.js # server/public/admin/assets/relations-add.vue_vue_type_script_setup_true_lang-BRi9G5mf.js # server/public/admin/assets/role-Czcmecam.js # server/public/admin/assets/roster-Bh9PjuXi.js # server/public/admin/assets/rtc-detect-BFElJVVn.js # server/public/admin/assets/self_input_stats-P0WLo9tC.js # server/public/admin/assets/setting-CCd8WCbC.js # server/public/admin/assets/setup-HuwOPKIm.js # server/public/admin/assets/statistics-Cj3WlBni.js # server/public/admin/assets/stats-E_9WKdl6.js # server/public/admin/assets/style-DoPXLvzO.js # server/public/admin/assets/tabbar-DD2RRhme.js # server/public/admin/assets/tcm-E9u-W8Oy.js # server/public/admin/assets/theme-picker-NdSgC88S.js # server/public/admin/assets/tim-profanity-filter-plugin-BvbMOVpi.js # server/public/admin/assets/tim-upload-plugin-D7nWSdhF.js # server/public/admin/assets/tongji-yCfKN-LL.js # server/public/admin/assets/upload-CjtahvI1.js # server/public/admin/assets/useDictOptions-LZFsDBEH.js # server/public/admin/assets/useListTimeFilter-CUZgt-II.js # server/public/admin/assets/useLockFn-C2guENRT.js # server/public/admin/assets/useMediaSourceOptions-wCazM6uJ.js # server/public/admin/assets/useMenuOa-92GS9rAv.js # server/public/admin/assets/usePaging-DzgVFG9b.js # server/public/admin/assets/user-DHg9QKqg.js # server/public/admin/assets/weapp-C5C4Oypv.js # server/public/admin/assets/weapp-CgFixEn4.js # server/public/admin/assets/website-Dk_rtWyw.js # server/public/admin/assets/wx_oa-BR5bK2fX.js # server/public/admin/assets/yeji-BlMBwtyi.js # server/public/admin/assets/yeji-edit.vue_vue_type_script_setup_true_lang-AeltfJWh.js # server/public/admin/index.html
167 lines
6.6 KiB
PHP
Executable File
167 lines
6.6 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace app\adminapi\logic\firstvisit;
|
|
|
|
use app\common\model\auth\AdminRole;
|
|
use app\common\model\doctor\Appointment;
|
|
use app\common\model\tcm\Diagnosis;
|
|
use app\common\service\DataScope\DataScopeService;
|
|
use think\db\Query;
|
|
use think\facade\Db;
|
|
|
|
/**
|
|
* “我的患者”统一数据范围。
|
|
*
|
|
* 角色语义:医生只看本人接诊患者,医助只看本人归属患者;经理、
|
|
* 诊室组长和管理员按系统 DataScope 查看团队患者;root 查看全部。
|
|
* 多角色取并集:兼有团队角色(DataScopeService::hasTeamRole)时按团队范围,不再收窄到本人。
|
|
*/
|
|
class MyPatientLogic
|
|
{
|
|
private const DOCTOR_ROLE_ID = 1;
|
|
private const ASSISTANT_ROLE_ID = 2;
|
|
private const EFFECTIVE_APPOINTMENT_STATUSES = [1, 3, 4];
|
|
|
|
/**
|
|
* @param Query $query 以 d 作为 zyt_tcm_diagnosis 别名的查询
|
|
* @param int[]|null $currentRoleIds 可选:调用方已从 DB 当前读核验的有效角色;禁止使用请求参数
|
|
*/
|
|
public static function applyScope(Query $query, int $adminId, array $adminInfo, ?array $currentRoleIds = null): void
|
|
{
|
|
if ($adminId <= 0) {
|
|
$query->whereRaw('0 = 1');
|
|
|
|
return;
|
|
}
|
|
|
|
if ((int) ($adminInfo['root'] ?? 0) === 1) {
|
|
return;
|
|
}
|
|
|
|
$roleIds = $currentRoleIds === null ? self::roleIds($adminId) : self::normalizeIds($currentRoleIds);
|
|
// 团队判断和具体数据范围必须使用同一组角色,不能混入登录缓存中的旧授权。
|
|
$adminInfo['role_id'] = $roleIds;
|
|
$appointmentTable = (new Appointment())->getTable();
|
|
$statusList = implode(',', self::EFFECTIVE_APPOINTMENT_STATUSES);
|
|
// 新授权入口已显式要求当前读时,预约子查询也必须使用当前读。
|
|
// 仅外层 FOR UPDATE 不会把 EXISTS 内部从 MySQL RR 旧快照切换出来。
|
|
$appointmentLock = $currentRoleIds !== null && $query->getConfig('type') === 'mysql' ? ' FOR UPDATE' : '';
|
|
|
|
// 管理角色按系统的数据范围查看“范围内医助归属或医生接诊”的患者。
|
|
if (DataScopeService::hasTeamRole($adminId, $adminInfo, $currentRoleIds === null ? null : $roleIds)) {
|
|
$visibleAdminIds = DataScopeService::getVisibleAdminIds($adminId, $adminInfo);
|
|
if ($visibleAdminIds === null) {
|
|
return;
|
|
}
|
|
$visibleAdminIds = self::normalizeIds($visibleAdminIds);
|
|
if ($visibleAdminIds === []) {
|
|
$query->whereRaw('0 = 1');
|
|
|
|
return;
|
|
}
|
|
$ids = implode(',', $visibleAdminIds);
|
|
$query->whereRaw(
|
|
"(CAST(d.assistant_id AS UNSIGNED) IN ({$ids})"
|
|
. " OR EXISTS (SELECT 1 FROM {$appointmentTable} scope_apt"
|
|
. ' WHERE scope_apt.patient_id = d.id'
|
|
. " AND scope_apt.status IN ({$statusList})"
|
|
. " AND scope_apt.doctor_id IN ({$ids}){$appointmentLock}))"
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
// 一线角色始终只取“本人关系”,不受数据库中医生角色 ALL 配置影响。
|
|
$conditions = [];
|
|
if (in_array(self::ASSISTANT_ROLE_ID, $roleIds, true)) {
|
|
$conditions[] = 'CAST(d.assistant_id AS UNSIGNED) = ' . $adminId;
|
|
}
|
|
if (in_array(self::DOCTOR_ROLE_ID, $roleIds, true)) {
|
|
$conditions[] = "EXISTS (SELECT 1 FROM {$appointmentTable} scope_apt"
|
|
. ' WHERE scope_apt.patient_id = d.id'
|
|
. " AND scope_apt.status IN ({$statusList})"
|
|
. " AND scope_apt.doctor_id = {$adminId}{$appointmentLock})";
|
|
}
|
|
|
|
// 未知/异常角色按本人医助或本人医生关系收窄,拒绝意外放大全库。
|
|
if ($conditions === []) {
|
|
$conditions[] = 'CAST(d.assistant_id AS UNSIGNED) = ' . $adminId;
|
|
$conditions[] = "EXISTS (SELECT 1 FROM {$appointmentTable} scope_apt"
|
|
. ' WHERE scope_apt.patient_id = d.id'
|
|
. " AND scope_apt.status IN ({$statusList})"
|
|
. " AND scope_apt.doctor_id = {$adminId}{$appointmentLock})";
|
|
}
|
|
|
|
$query->whereRaw('(' . implode(' OR ', $conditions) . ')');
|
|
}
|
|
|
|
public static function canAccessDiagnosis(int $diagnosisId, int $adminId, array $adminInfo): bool
|
|
{
|
|
if ($diagnosisId <= 0 || $adminId <= 0) {
|
|
return false;
|
|
}
|
|
|
|
$diagnosisTable = (new Diagnosis())->getTable();
|
|
$query = Db::table($diagnosisTable)
|
|
->alias('d')
|
|
->where('d.id', $diagnosisId)
|
|
->whereNull('d.delete_time')
|
|
->where('d.status', 1);
|
|
self::applyScope($query, $adminId, $adminInfo);
|
|
|
|
return (int) $query->count() > 0;
|
|
}
|
|
|
|
/** @return array{mode:string,label:string} */
|
|
public static function scopeMeta(int $adminId, array $adminInfo): array
|
|
{
|
|
if ((int) ($adminInfo['root'] ?? 0) === 1) {
|
|
return ['mode' => 'all', 'label' => '全部数据'];
|
|
}
|
|
|
|
$roleIds = self::roleIds($adminId);
|
|
$adminInfo['role_id'] = $roleIds;
|
|
if (DataScopeService::hasTeamRole($adminId, $adminInfo)) {
|
|
$scope = DataScopeService::getEffectiveScope($adminInfo);
|
|
$labels = [
|
|
DataScopeService::SCOPE_ALL => '全部数据',
|
|
DataScopeService::SCOPE_DEPT_AND_CHILD => '本部门及下级',
|
|
DataScopeService::SCOPE_DEPT => '本部门',
|
|
DataScopeService::SCOPE_SELF => '仅本人',
|
|
];
|
|
|
|
return [
|
|
'mode' => $scope === DataScopeService::SCOPE_ALL ? 'all' : 'team',
|
|
'label' => $labels[$scope] ?? '仅本人',
|
|
];
|
|
}
|
|
|
|
$isDoctor = in_array(self::DOCTOR_ROLE_ID, $roleIds, true);
|
|
$isAssistant = in_array(self::ASSISTANT_ROLE_ID, $roleIds, true);
|
|
if ($isDoctor && $isAssistant) {
|
|
return ['mode' => 'self', 'label' => '本人归属及接诊'];
|
|
}
|
|
if ($isDoctor) {
|
|
return ['mode' => 'self', 'label' => '本人接诊'];
|
|
}
|
|
|
|
return ['mode' => 'self', 'label' => '本人归属'];
|
|
}
|
|
|
|
/** @return int[] */
|
|
private static function roleIds(int $adminId): array
|
|
{
|
|
return self::normalizeIds(AdminRole::where('admin_id', $adminId)->column('role_id'));
|
|
}
|
|
|
|
/** @param array<int|string, mixed> $ids @return int[] */
|
|
private static function normalizeIds(array $ids): array
|
|
{
|
|
return array_values(array_unique(array_filter(array_map('intval', $ids), static function (int $id): bool {
|
|
return $id > 0;
|
|
})));
|
|
}
|
|
}
|