145 lines
4.6 KiB
PHP
145 lines
4.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace app\adminapi\lists\tcm;
|
||
|
||
use app\adminapi\lists\BaseAdminDataLists;
|
||
use app\common\lists\ListsSearchInterface;
|
||
use app\adminapi\logic\tcm\PrescriptionLogic;
|
||
use app\common\model\tcm\Prescription;
|
||
|
||
/**
|
||
* 处方列表
|
||
*/
|
||
class PrescriptionLists extends BaseAdminDataLists implements ListsSearchInterface
|
||
{
|
||
/**
|
||
* @notes 搜索条件
|
||
*/
|
||
public function setSearch(): array
|
||
{
|
||
return [
|
||
'%like%' => ['patient_name', 'sn'],
|
||
'between_time' => 'create_time',
|
||
];
|
||
}
|
||
|
||
/** 创建人(医师账号)多选,参数 creator_ids:数组或逗号分隔 ID */
|
||
private function applyCreatorIdsFilter($query): void
|
||
{
|
||
$raw = $this->params['creator_ids'] ?? null;
|
||
if ($raw === null || $raw === '') {
|
||
return;
|
||
}
|
||
$ids = \is_array($raw) ? $raw : explode(',', (string) $raw);
|
||
$ids = array_values(array_filter(array_map('intval', $ids), static function (int $id): bool {
|
||
return $id > 0;
|
||
}));
|
||
if ($ids === []) {
|
||
return;
|
||
}
|
||
$query->whereIn('creator_id', $ids);
|
||
}
|
||
|
||
/**
|
||
* audit_filter:passed=已通过,not_passed=未通过(待审+驳回),pending,rejected
|
||
*/
|
||
private function applyAuditFilter($query): void
|
||
{
|
||
$af = (string) ($this->params['audit_filter'] ?? '');
|
||
if ($af === '' || $af === 'all') {
|
||
return;
|
||
}
|
||
switch ($af) {
|
||
case 'passed':
|
||
$query->where('audit_status', '=', 1);
|
||
break;
|
||
case 'not_passed':
|
||
$query->whereIn('audit_status', [0, 2]);
|
||
break;
|
||
case 'pending':
|
||
$query->where('audit_status', '=', 0);
|
||
break;
|
||
case 'rejected':
|
||
$query->where('audit_status', '=', 2);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
private function applyVisibilityScope($query): void
|
||
{
|
||
$query->where(function ($query) {
|
||
if (!empty($this->adminInfo['root']) && (int) $this->adminInfo['root'] === 1) {
|
||
return;
|
||
}
|
||
$adminId = $this->adminId;
|
||
$roleIds = array_values(array_unique(array_map('intval', $this->adminInfo['role_id'] ?? [])));
|
||
$query->where(function ($q) use ($adminId, $roleIds) {
|
||
$q->whereOr('is_shared', '=', 1);
|
||
$q->whereOr('creator_id', '=', $adminId);
|
||
foreach ($roleIds as $rid) {
|
||
if ($rid > 0) {
|
||
$q->whereOrRaw('FIND_IN_SET(?, `visible_role_ids`)', [(string) $rid]);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* @notes 获取列表
|
||
*/
|
||
public function lists(): array
|
||
{
|
||
$query = Prescription::where($this->searchWhere);
|
||
$this->applyAuditFilter($query);
|
||
$this->applyVisibilityScope($query);
|
||
$this->applyCreatorIdsFilter($query);
|
||
|
||
$lists = $query
|
||
->whereNull('delete_time')
|
||
->order('id', 'desc')
|
||
->limit($this->limitOffset, $this->limitLength)
|
||
->select()
|
||
->toArray();
|
||
|
||
// 处理字段格式
|
||
foreach ($lists as &$item) {
|
||
// 设置默认值
|
||
$item['usage_time'] = $item['usage_time'] ?? '饭前';
|
||
$item['usage_way'] = $item['usage_way'] ?? '温水送服';
|
||
$item['usage_notes'] = $item['usage_notes'] ?? '';
|
||
$item['usage_days'] = $item['usage_days'] ?? 7;
|
||
$item['is_shared'] = $item['is_shared'] ?? 0;
|
||
$item['audit_status'] = (int) ($item['audit_status'] ?? 1);
|
||
$item['void_status'] = (int) ($item['void_status'] ?? 0);
|
||
$item['visible_role_ids'] = PrescriptionLogic::visibleRoleIdsToArray((string) ($item['visible_role_ids'] ?? ''));
|
||
|
||
// 将 dietary_taboo 从逗号分隔的字符串转换为数组(前端需要数组格式)
|
||
if (!empty($item['dietary_taboo']) && is_string($item['dietary_taboo'])) {
|
||
$item['dietary_taboo'] = array_filter(explode(',', $item['dietary_taboo']));
|
||
} else {
|
||
$item['dietary_taboo'] = [];
|
||
}
|
||
}
|
||
|
||
return $lists;
|
||
}
|
||
|
||
/**
|
||
* @notes 获取数量
|
||
*/
|
||
public function count(): int
|
||
{
|
||
$query = Prescription::where($this->searchWhere);
|
||
$this->applyAuditFilter($query);
|
||
$this->applyVisibilityScope($query);
|
||
$this->applyCreatorIdsFilter($query);
|
||
|
||
return $query->whereNull('delete_time')->count();
|
||
}
|
||
}
|