Merge branch '20260518-long'
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user