78 lines
2.7 KiB
PHP
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);
|
|
}
|
|
}
|