This commit is contained in:
Your Name
2026-05-18 18:02:15 +08:00
5816 changed files with 32 additions and 14 deletions
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
View File
+22 -5
View File
@@ -18,6 +18,8 @@ use app\adminapi\lists\BaseAdminDataLists;
use app\adminapi\logic\dept\DeptLogic;
use app\common\model\tcm\Diagnosis;
use app\common\model\tcm\BloodRecord;
use app\common\model\tcm\DietRecord;
use app\common\model\tcm\ExerciseRecord;
use app\common\model\DiagnosisViewRecord;
use app\common\model\Order;
use app\common\model\doctor\Appointment;
@@ -387,19 +389,34 @@ class DiagnosisLists extends BaseAdminDataLists implements ListsSearchInterface
}
unset($item);
// 未服务天数:血糖记录最近一条 record_date 为锚点(口径见 prd T3
// 单次 GROUP BY 聚合,不会成 N+1;走 idx_diagnosis_id 索引。
// 未服务天数:血糖 / 饮食 / 运动任一记录最近一条 record_date 为锚点
$diagIdsForUnserved = array_values(array_filter(array_unique(array_column($lists, 'id'))));
$maxBloodByDiag = [];
$maxRecordByDiag = [];
if (!empty($diagIdsForUnserved)) {
$maxBloodByDiag = BloodRecord::whereIn('diagnosis_id', $diagIdsForUnserved)
$maxBlood = BloodRecord::whereIn('diagnosis_id', $diagIdsForUnserved)
->whereNull('delete_time')
->group('diagnosis_id')
->column('MAX(record_date)', 'diagnosis_id');
$maxDiet = DietRecord::whereIn('diagnosis_id', $diagIdsForUnserved)
->whereNull('delete_time')
->group('diagnosis_id')
->column('MAX(record_date)', 'diagnosis_id');
$maxExercise = ExerciseRecord::whereIn('diagnosis_id', $diagIdsForUnserved)
->whereNull('delete_time')
->group('diagnosis_id')
->column('MAX(record_date)', 'diagnosis_id');
foreach ($diagIdsForUnserved as $did) {
$candidates = [
(int) ($maxBlood[$did] ?? 0),
(int) ($maxDiet[$did] ?? 0),
(int) ($maxExercise[$did] ?? 0),
];
$maxRecordByDiag[$did] = max($candidates);
}
}
$nowTs = time();
foreach ($lists as &$item) {
$last = (int) ($maxBloodByDiag[(int) $item['id']] ?? 0);
$last = (int) ($maxRecordByDiag[(int) $item['id']] ?? 0);
$item['last_blood_record_at'] = $last > 0 ? date('Y-m-d', $last) : null;
$item['unserved_days'] = $last > 0 ? max(0, (int) floor(($nowTs - $last) / 86400)) : null;
}
View File
View File
View File
View File
View File
View File
View File