更新
This commit is contained in:
@@ -21,6 +21,7 @@ use app\api\logic\tcm\DailyFamilyLikeLogic;
|
||||
use app\api\logic\tcm\DailyShareLogic;
|
||||
use app\api\logic\tcm\DailyPhoneLogic;
|
||||
use app\api\logic\tcm\DailyDietAiLogic;
|
||||
use app\api\logic\tcm\DailyBloodCareAiLogic;
|
||||
use app\adminapi\logic\ConfigLogic;
|
||||
use app\common\model\tcm\Diagnosis;
|
||||
use app\common\model\tcm\BloodRecord;
|
||||
@@ -929,6 +930,47 @@ class TcmController extends BaseApiController
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 日常记录-AI 血糖照护建议(累计 7 天有记录)
|
||||
*
|
||||
* 路由:GET /api/tcm/dailyBloodCareAiRecommend?diagnosis_id=:id&refresh=0|1
|
||||
*/
|
||||
public function dailyBloodCareAiRecommend()
|
||||
{
|
||||
$diagnosisId = (int) $this->request->get('diagnosis_id', 0);
|
||||
$check = $this->ensurePatientOwnsDiagnosis($diagnosisId);
|
||||
if (!$check['ok']) {
|
||||
return $this->fail($check['error']);
|
||||
}
|
||||
|
||||
$refresh = (int) $this->request->get('refresh', 0) === 1;
|
||||
$result = DailyBloodCareAiLogic::getDailyCarePlan($diagnosisId, $refresh);
|
||||
if (empty($result['ok'])) {
|
||||
return $this->fail($result['error'] ?? '获取照护建议失败');
|
||||
}
|
||||
|
||||
return $this->data($result['data']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @notes 日常记录-AI 血糖照护建议(SSE 流式)
|
||||
*
|
||||
* 路由:GET /api/tcm/dailyBloodCareAiRecommendStream?diagnosis_id=:id&refresh=0|1
|
||||
*/
|
||||
public function dailyBloodCareAiRecommendStream()
|
||||
{
|
||||
$diagnosisId = (int) $this->request->get('diagnosis_id', 0);
|
||||
$check = $this->ensurePatientOwnsDiagnosis($diagnosisId);
|
||||
if (!$check['ok']) {
|
||||
return $this->fail($check['error']);
|
||||
}
|
||||
|
||||
$refresh = (int) $this->request->get('refresh', 0) === 1;
|
||||
$this->runDailyDietSse(static function (callable $emit) use ($diagnosisId, $refresh): void {
|
||||
DailyBloodCareAiLogic::streamDailyCarePlan($diagnosisId, $refresh, $emit);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param callable(callable(string, array<string, mixed>):void):void $runner
|
||||
*/
|
||||
|
||||
@@ -273,6 +273,16 @@ class DailyDietAiLogic
|
||||
return $idx;
|
||||
}
|
||||
|
||||
/**
|
||||
* 供血糖照护 AI 等模块复用:患者档案 + 近 7/30 天血糖统计
|
||||
*
|
||||
* @return array{ok:bool,error?:string,data?:array}
|
||||
*/
|
||||
public static function getPatientContext(int $diagnosisId): array
|
||||
{
|
||||
return self::buildPatientContext($diagnosisId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{ok:bool,error?:string,data?:array}
|
||||
*/
|
||||
|
||||
@@ -320,4 +320,68 @@ class GiKnowledge
|
||||
$q = trim($q);
|
||||
return $q !== '' ? $q : $question;
|
||||
}
|
||||
|
||||
/**
|
||||
* 血糖照护 AI 关闭时的规则化方案(监测 + 中医调理方向)
|
||||
*
|
||||
* @param array<string,mixed> $stats7
|
||||
* @param array<string,mixed> $stats30
|
||||
* @param array<string,mixed> $extra syndrome_type, symptoms 等
|
||||
* @return array<string,mixed>
|
||||
*/
|
||||
public static function fallbackBloodCarePlan(array $stats7 = [], array $stats30 = [], array $extra = []): array
|
||||
{
|
||||
$exercise = self::exercisePlan($stats7, $stats30);
|
||||
$level = (string) ($exercise['level'] ?? 'unknown');
|
||||
$compliance = (int) (($stats30['record_days'] ?? 0) > 0 ? ($stats30['compliance'] ?? 0) : ($stats7['compliance'] ?? 0));
|
||||
$syndrome = trim((string) ($extra['syndrome_type'] ?? ''));
|
||||
$symptoms = trim((string) ($extra['symptoms'] ?? ''));
|
||||
|
||||
$summary = match ($level) {
|
||||
'high' => '近阶段血糖偏高天数偏多,要把监测、饮食和运动一起抓紧,别只靠感觉。',
|
||||
'medium' => '血糖大体可控,但还有波动,坚持记录和餐后活动,能更稳。',
|
||||
'good' => '近期血糖控制不错,保持现在的节奏,定期复查别松懈。',
|
||||
default => '先坚持记血糖、看趋势,再按下面几条慢慢调整生活方式。',
|
||||
};
|
||||
|
||||
$bloodAdvice = match ($level) {
|
||||
'high' => '空腹、餐后都测,偏高那天记下吃了啥、动了没。主食换杂粮、每餐先吃菜和蛋白,甜饮糕点先停。三餐后按上面运动建议动起来,头晕心慌马上停、吃点糖。',
|
||||
'medium' => '每周至少 4 天空腹+餐后配对记录。主食定量、晚餐别过饱,少喝粥配咸菜。餐后散步 20 分钟,睡眠规律,情绪紧张也会抬糖。',
|
||||
'good' => '保持每周 3–4 次监测即可,注意节假日和串门聚餐别放松。继续低 GI 家常饭,运动别停,体重稳一点更好。',
|
||||
default => '先把血糖记满 7 天再看趋势。吃饭定时定量,多喝白开水,少甜少油,饭后多走动。',
|
||||
};
|
||||
|
||||
$tcmBase = '消渴病多与肺脾肾气虚、阴虚燥热或痰湿瘀血相关,需结合面诊脉象。';
|
||||
if ($syndrome !== '') {
|
||||
$tcmBase = '就诊辨证倾向「' . $syndrome . '」。';
|
||||
} elseif ($symptoms !== '') {
|
||||
$tcmBase = '结合您登记的症状(' . mb_substr($symptoms, 0, 40) . '…),宜辨证论治。';
|
||||
}
|
||||
|
||||
$tcmPlan = match ($level) {
|
||||
'high' => $tcmBase . '调理思路:益气养阴、清热生津为主,可配合健脾化湿;食疗如山药、麦冬、桑叶代茶饮方向;艾灸可选足三里、胰俞等穴(需医师指导)。勿自行加大西药或乱用偏方,务必复诊调方。',
|
||||
'medium' => $tcmBase . '调理思路:健脾益气、滋阴润燥,少食肥甘,宜清淡易消化;可配合八段锦、太极拳;中药汤剂需医师面诊后开具,此处不给具体方名剂量。',
|
||||
'good' => $tcmBase . '调理思路:顾护脾胃、养阴防燥,季节更替注意保暖;维持规律作息与情志舒畅,按医嘱定期复诊即可。',
|
||||
default => $tcmBase . '建议到中医科面诊,明确证型后再定汤药、针灸方案;平时可饮食清淡、作息规律,配合记录血糖供医师参考。',
|
||||
};
|
||||
|
||||
$watchPoints = match ($level) {
|
||||
'high' => ['空腹≥7 或餐后明显升高要联系村医', '脚麻脚痛、视力模糊及时就诊', '用药时间饭点别乱改'],
|
||||
'medium' => ['外出走亲也别忘了测糖', '感冒发烧会让血糖乱,多监测', '睡前别加餐太多'],
|
||||
'good' => ['每 3–6 个月复查糖化血红蛋白', '血压血脂一并管', '家人提醒别擅自停药'],
|
||||
default => ['坚持每日或隔日记录', '记录与饮食运动一起给大夫看', '不适及时线下就诊'],
|
||||
};
|
||||
|
||||
return [
|
||||
'summary' => $summary,
|
||||
'blood_advice' => $bloodAdvice,
|
||||
'tcm_plan' => $tcmPlan,
|
||||
'watch_points' => $watchPoints,
|
||||
'next_steps' => '下周继续记血糖;饮食可参考本页「AI 饮食建议」;若连续 3 天偏高或出现胸闷脚肿,请尽快线下就诊或视频问诊。',
|
||||
'control_level' => $level,
|
||||
'control_label' => (string) ($exercise['level_label'] ?? ''),
|
||||
'disclaimer' => '本建议供日常参考,不能替代医师面诊、开方与调药。',
|
||||
'source' => 'rule',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user