更新
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user