This commit is contained in:
Your Name
2026-04-22 12:14:39 +08:00
parent a1a0b74596
commit 4872e4d2e6
21 changed files with 1131 additions and 235 deletions
+140 -55
View File
@@ -16,6 +16,122 @@ use app\common\model\auth\AdminRole;
*/
class OrderLists extends BaseAdminDataLists implements ListsSearchInterface
{
/**
* 将列表「创建时间」参数规范为可解析的日期时间(datetimerange 已是 Y-m-d H:i:s,不能再去拼接 00:00:00,否则会变成非法字符串)
*/
private function normalizeListDateTimeString(string $raw, bool $isEnd): string
{
$raw = trim($raw);
if ($raw === '') {
return '';
}
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $raw) === 1) {
return $isEnd ? ($raw . ' 23:59:59') : ($raw . ' 00:00:00');
}
if (strlen($raw) === 19 && preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $raw) === 1) {
return $raw;
}
$ts = strtotime($raw);
if ($ts !== false) {
return date('Y-m-d H:i:s', $ts);
}
return '';
}
/**
* 患者关键词:在诊单表按姓名、手机号或诊单ID匹配(子查询里显式 whereOr,避免 | 在闭包/子查下兼容问题)
*
* @return \Closure|array{} 无匹配关键词时返回空数组表示不加条件
*/
private function patientKeywordSubWhere()
{
$kw = trim((string) ($this->params['patient_keyword'] ?? ''));
if ($kw === '') {
return [];
}
return function ($query) use ($kw) {
$query->table('zyt_tcm_diagnosis')
->whereNull('delete_time')
->where(function ($q) use ($kw) {
$q->where('patient_name', 'like', '%' . $kw . '%')
->whereOr('phone', 'like', '%' . $kw . '%');
if (preg_match('/^\d+$/', $kw) && (int) $kw > 0) {
$q->whereOr('id', '=', (int) $kw);
}
})
->field('id');
};
}
/**
* 创建时间:支持 int 时间戳 与 字符串 datetime 两种存法(用 OR 包裹,至少命中一类)
*/
private function appendCreateTimeWhere(array &$where): void
{
$s = !empty($this->params['create_time_start'])
? $this->normalizeListDateTimeString((string) $this->params['create_time_start'], false)
: '';
$e = !empty($this->params['create_time_end'])
? $this->normalizeListDateTimeString((string) $this->params['create_time_end'], true)
: '';
if ($s === '' && $e === '') {
return;
}
$i0 = $s !== '' ? (int) strtotime($s) : 0;
$i1 = $e !== '' ? (int) strtotime($e) : 0;
if ($i0 > 0 && $i1 > 0 && $i1 < $i0) {
$t = $i0;
$i0 = $i1;
$i1 = $t;
$ts = $s;
$s = $e;
$e = $ts;
}
$intOk = $i0 > 0 || $i1 > 0;
$strOk = $s !== '' || $e !== '';
if (!$intOk && !$strOk) {
return;
}
$where[] = function ($query) use ($s, $e, $i0, $i1, $intOk, $strOk) {
$query->where(function ($q) use ($s, $e, $i0, $i1, $intOk, $strOk) {
if ($intOk) {
$q->where(function ($qi) use ($i0, $i1) {
if ($i0 > 0) {
$qi->where('create_time', '>=', $i0);
}
if ($i1 > 0) {
$qi->where('create_time', '<=', $i1);
}
});
}
if ($strOk) {
if ($intOk) {
$q->whereOr(function ($qs) use ($s, $e) {
if ($s !== '') {
$qs->where('create_time', '>=', $s);
}
if ($e !== '') {
$qs->where('create_time', '<=', $e);
}
});
} else {
$q->where(function ($qs) use ($s, $e) {
if ($s !== '') {
$qs->where('create_time', '>=', $s);
}
if ($e !== '') {
$qs->where('create_time', '<=', $e);
}
});
}
}
});
};
}
/**
* @notes 设置搜索条件
* @return array
@@ -24,15 +140,23 @@ class OrderLists extends BaseAdminDataLists implements ListsSearchInterface
{
return [
'=' => ['order_type', 'status'],
'like' => ['order_no'],
// ListsSearchTrait 只识别 %like% / like% 等,「like」不会命中任何 case,订单号因此搜不到
'%like%' => ['order_no'],
];
}
/**
* @notes 权限过滤 - 普通员工只能看自己创建的订单
* @param array $where
* @return void
* 按医助筛选:与「创建人」一致(指派后创建人为该医助)
*/
private function appendAssistantFilter(array &$where): void
{
$assistantId = (int) ($this->params['assistant_id'] ?? 0);
if ($assistantId <= 0) {
return;
}
$where[] = ['creator_id', '=', $assistantId];
}
private function filterByPermission(array &$where): void
{
// 检查是否是超管(root字段为1)
@@ -78,35 +202,15 @@ class OrderLists extends BaseAdminDataLists implements ListsSearchInterface
}
// 处理患者关键词搜索(从诊单表搜索)
if (!empty($this->params['patient_keyword'])) {
$where[] = ['patient_id', 'in', function ($query) {
$query->table('zyt_tcm_diagnosis')
->whereNull('delete_time')
->where('patient_name|phone', 'like', '%' . $this->params['patient_keyword'] . '%')
->field('id');
}];
$pkw = $this->patientKeywordSubWhere();
if ($pkw !== []) {
$where[] = ['patient_id', 'in', $pkw];
}
// 按诊单医助筛选(订单 patient_id 存诊单 id
$assistantId = (int) ($this->params['assistant_id'] ?? 0);
if ($assistantId > 0) {
$where[] = ['patient_id', 'in', function ($query) use ($assistantId) {
$query->table('zyt_tcm_diagnosis')
->whereNull('delete_time')
->where('assistant_id', '=', $assistantId)
->field('id');
}];
}
$this->appendAssistantFilter($where);
$this->appendCreateTimeWhere($where);
// 处理创建时间范围
if (!empty($this->params['create_time_start'])) {
$where[] = ['create_time', '>=', $this->params['create_time_start'] . ' 00:00:00'];
}
if (!empty($this->params['create_time_end'])) {
$where[] = ['create_time', '<=', $this->params['create_time_end'] . ' 23:59:59'];
}
return Order::where($where)
->with(['patient', 'creator'])
->order(['create_time' => 'desc'])
@@ -135,34 +239,15 @@ class OrderLists extends BaseAdminDataLists implements ListsSearchInterface
}
// 处理患者关键词搜索(从诊单表搜索)
if (!empty($this->params['patient_keyword'])) {
$where[] = ['patient_id', 'in', function ($query) {
$query->table('zyt_tcm_diagnosis')
->whereNull('delete_time')
->where('patient_name|phone', 'like', '%' . $this->params['patient_keyword'] . '%')
->field('id');
}];
$pkw = $this->patientKeywordSubWhere();
if ($pkw !== []) {
$where[] = ['patient_id', 'in', $pkw];
}
$assistantIdCount = (int) ($this->params['assistant_id'] ?? 0);
if ($assistantIdCount > 0) {
$where[] = ['patient_id', 'in', function ($query) use ($assistantIdCount) {
$query->table('zyt_tcm_diagnosis')
->whereNull('delete_time')
->where('assistant_id', '=', $assistantIdCount)
->field('id');
}];
}
$this->appendAssistantFilter($where);
$this->appendCreateTimeWhere($where);
// 处理创建时间范围
if (!empty($this->params['create_time_start'])) {
$where[] = ['create_time', '>=', $this->params['create_time_start'] . ' 00:00:00'];
}
if (!empty($this->params['create_time_end'])) {
$where[] = ['create_time', '<=', $this->params['create_time_end'] . ' 23:59:59'];
}
return Order::where($where)->count();
}
}