Files
zyt/server/app/common/service/prescriptionai/PrescriptionAiAccess.php
T
2026-09-10 15:19:17 +08:00

78 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace app\common\service\prescriptionai;
use app\adminapi\logic\auth\AuthLogic;
use app\adminapi\logic\firstvisit\MyPatientLogic;
use app\adminapi\logic\tcm\PrescriptionLogic;
use app\common\model\auth\Admin;
use think\facade\Db;
final class PrescriptionAiAccess
{
public static function actor(int $adminId): ?array
{
$admin = Admin::where('id', $adminId)->whereNull('delete_time')->where('disable', 0)->find();
if (!$admin) {
return null;
}
// Do not put credentials or login material in task snapshots.
return ['admin_id' => $adminId, 'id' => $adminId, 'root' => (int) $admin->root,
'name' => (string) $admin->name, 'role_id' => (array) $admin->role_id,
'dept_id' => (array) $admin->dept_id];
}
public static function allowed(int $adminId, array $info, string $action): bool
{
if ($adminId <= 0) {
return false;
}
if ((int) ($info['root'] ?? 0) === 1) {
return true;
}
return in_array('tcm.prescriptionai/' . strtolower($action),
array_map('strtolower', AuthLogic::getAuthByAdminId($adminId)), true);
}
public static function canGenerate(int $adminId, array $info): bool
{
return self::allowed($adminId, $info, 'regenerate') && self::allowed($adminId, $info, 'detail');
}
public static function prescription(int $id, int $adminId, array $info): ?array
{
$row = Db::name('tcm_prescription')->where('id', $id)->whereNull('delete_time')->find();
if (!$row || !PrescriptionLogic::canViewPrescription($row, $adminId, $info)) {
return null;
}
$diagnosisId = (int) ($row['diagnosis_id'] ?? 0);
if ($diagnosisId > 0 && !self::diagnosis($diagnosisId, $adminId, $info)) {
return null;
}
return $row;
}
public static function diagnosis(int $id, int $adminId, array $info): bool
{
if ($id <= 0 || $adminId <= 0) {
return false;
}
$query = Db::name('tcm_diagnosis')->alias('d')->where('d.id', $id)->whereNull('d.delete_time');
MyPatientLogic::applyScope($query, $adminId, $info);
return $query->count() > 0;
}
public static function sourceIds(array $ids, int $adminId, array $info): bool
{
$ids = array_values(array_unique(array_filter(array_map('intval', $ids), static fn ($v): bool => $v > 0)));
if ($ids === []) {
return false;
}
$query = Db::name('tcm_diagnosis')->alias('d')->whereIn('d.id', $ids)->whereNull('d.delete_time');
MyPatientLogic::applyScope($query, $adminId, $info);
return (int) $query->count() === count($ids);
}
}