148 lines
4.9 KiB
PHP
148 lines
4.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace app\adminapi\lists\stats;
|
|
|
|
use app\adminapi\lists\BaseAdminDataLists;
|
|
use app\common\lists\ListsSearchInterface;
|
|
use think\facade\Db;
|
|
|
|
/**
|
|
* 待分配诊单自动指派日志列表
|
|
*
|
|
* 数据来源:tcm_diagnosis_auto_assign_log(定时命令 tcm:auto-assign-pending 写入)
|
|
* 筛选:run_date / create_time 区间 / action / keyword / rollback 状态
|
|
*/
|
|
class AutoAssignLogLists extends BaseAdminDataLists implements ListsSearchInterface
|
|
{
|
|
private const TIER_LABELS = [
|
|
'gt70' => '>70%',
|
|
'60_70' => '60%~70%',
|
|
'50_60' => '50%~60%',
|
|
];
|
|
|
|
/**
|
|
* @notes 设置搜索条件
|
|
*/
|
|
public function setSearch(): array
|
|
{
|
|
return [
|
|
'=' => ['run_date', 'action', 'assistant_id', 'batch_no', 'stat_month'],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @notes 获取列表
|
|
*/
|
|
public function lists(): array
|
|
{
|
|
$rows = $this->buildQuery()
|
|
->order(['id' => 'desc'])
|
|
->limit($this->limitOffset, $this->limitLength)
|
|
->select()
|
|
->toArray();
|
|
|
|
foreach ($rows as &$row) {
|
|
$ct = (int) ($row['create_time'] ?? 0);
|
|
$row['create_time_text'] = $ct > 0 ? date('Y-m-d H:i:s', $ct) : '';
|
|
$row['action_text'] = (int) ($row['action'] ?? 0) === 1 ? '已分配' : '未分配';
|
|
$row['tier_text'] = self::TIER_LABELS[(string) ($row['tier'] ?? '')] ?? '';
|
|
$row['visit2_rate'] = $row['visit2_rate'] !== null ? (float) $row['visit2_rate'] : null;
|
|
|
|
$rbTs = (int) ($row['rollback_time'] ?? 0);
|
|
$row['rollback_time_text'] = $rbTs > 0 ? date('Y-m-d H:i:s', $rbTs) : '';
|
|
$row['is_rollback'] = $rbTs > 0 ? 1 : 0;
|
|
$row['can_rollback'] = ((int) ($row['action'] ?? 0) === 1 && $rbTs === 0) ? 1 : 0;
|
|
if ($rbTs > 0) {
|
|
$row['rollback_status_text'] = '已回退'
|
|
. (($row['rollback_admin_name'] ?? '') !== '' ? (' · ' . $row['rollback_admin_name']) : '');
|
|
} else {
|
|
$row['rollback_status_text'] = ((int) ($row['action'] ?? 0) === 1) ? '可回退' : '—';
|
|
}
|
|
}
|
|
unset($row);
|
|
|
|
return $rows;
|
|
}
|
|
|
|
/**
|
|
* @notes 获取数量
|
|
*/
|
|
public function count(): int
|
|
{
|
|
return $this->buildQuery()->count();
|
|
}
|
|
|
|
/**
|
|
* @return \think\db\Query
|
|
*/
|
|
private function buildQuery()
|
|
{
|
|
$query = Db::name('tcm_diagnosis_auto_assign_log')->where($this->searchWhere);
|
|
|
|
$keyword = trim((string) ($this->params['keyword'] ?? ''));
|
|
if ($keyword !== '') {
|
|
$query->where(function ($q) use ($keyword) {
|
|
$q->whereLike('patient_name', '%' . $keyword . '%')
|
|
->whereOr('patient_phone', 'like', '%' . $keyword . '%')
|
|
->whereOr('assistant_name', 'like', '%' . $keyword . '%');
|
|
if (preg_match('/^\d+$/', $keyword) === 1 && (int) $keyword > 0) {
|
|
$q->whereOr('diagnosis_id', '=', (int) $keyword);
|
|
}
|
|
});
|
|
}
|
|
|
|
$startDate = trim((string) ($this->params['start_date'] ?? ''));
|
|
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $startDate) === 1) {
|
|
$query->where('run_date', '>=', $startDate);
|
|
}
|
|
$endDate = trim((string) ($this->params['end_date'] ?? ''));
|
|
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $endDate) === 1) {
|
|
$query->where('run_date', '<=', $endDate);
|
|
}
|
|
|
|
// 记录时间(create_time)区间:支持 Y-m-d 或 Y-m-d H:i:s
|
|
$startTs = $this->parseTimeParam((string) ($this->params['start_time'] ?? ''), false);
|
|
if ($startTs > 0) {
|
|
$query->where('create_time', '>=', $startTs);
|
|
}
|
|
$endTs = $this->parseTimeParam((string) ($this->params['end_time'] ?? ''), true);
|
|
if ($endTs > 0) {
|
|
$query->where('create_time', '<=', $endTs);
|
|
}
|
|
|
|
$rollback = trim((string) ($this->params['is_rollback'] ?? ''));
|
|
if ($rollback === '1') {
|
|
$query->where('rollback_time', '>', 0);
|
|
} elseif ($rollback === '0') {
|
|
$query->where('rollback_time', '=', 0);
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* @param bool $endOfDay 仅日期时是否取当天结束
|
|
*/
|
|
private function parseTimeParam(string $raw, bool $endOfDay): int
|
|
{
|
|
$raw = trim($raw);
|
|
if ($raw === '') {
|
|
return 0;
|
|
}
|
|
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $raw) === 1) {
|
|
return (int) strtotime($raw . ($endOfDay ? ' 23:59:59' : ' 00:00:00'));
|
|
}
|
|
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}(:\d{2})?$/', $raw) === 1) {
|
|
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $raw) === 1) {
|
|
$raw .= $endOfDay ? ':59' : ':00';
|
|
}
|
|
|
|
return (int) strtotime($raw);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|