Autosave: 20260304-174206
This commit is contained in:
parent
d3172b6c89
commit
c6904a9a5e
42
api/ai_report.php
Normal file
42
api/ai_report.php
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
require_once __DIR__ . '/../ai/LocalAIApi.php';
|
||||||
|
|
||||||
|
// Get JSON input
|
||||||
|
$input = json_decode(file_get_contents('php://input'), true);
|
||||||
|
|
||||||
|
$symptoms = $input['symptoms'] ?? '';
|
||||||
|
$diagnosis = $input['diagnosis'] ?? '';
|
||||||
|
|
||||||
|
if (empty($symptoms) && empty($diagnosis)) {
|
||||||
|
echo json_encode(['success' => false, 'error' => 'No symptoms or diagnosis provided.']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$prompt = "You are a professional medical assistant. Based on the following symptoms and diagnosis, please generate a concise treatment plan and medical report for the patient.\n\n";
|
||||||
|
if (!empty($symptoms)) {
|
||||||
|
$prompt .= "Symptoms:\n" . strip_tags($symptoms) . "\n\n";
|
||||||
|
}
|
||||||
|
if (!empty($diagnosis)) {
|
||||||
|
$prompt .= "Diagnosis:\n" . strip_tags($diagnosis) . "\n\n";
|
||||||
|
}
|
||||||
|
$prompt .= "Please provide the report in a clear, professional format using HTML tags (like <ul>, <li>, <strong>, etc.) for better readability.";
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = LocalAIApi::createResponse([
|
||||||
|
'input' => [
|
||||||
|
['role' => 'system', 'content' => 'You are a helpful medical assistant.'],
|
||||||
|
['role' => 'user', 'content' => $prompt],
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!empty($response['success'])) {
|
||||||
|
$text = LocalAIApi::extractText($response);
|
||||||
|
echo json_encode(['success' => true, 'report' => $text]);
|
||||||
|
} else {
|
||||||
|
echo json_encode(['success' => false, 'error' => $response['error'] ?? 'AI generation failed.']);
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
|
||||||
|
}
|
||||||
|
|
||||||
47
assets/js/ai_helper.js
Normal file
47
assets/js/ai_helper.js
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
async function generateAIReport(button) {
|
||||||
|
const modal = button.closest(".modal");
|
||||||
|
const symptomsEditor = $(modal.querySelector('textarea[name="symptoms"]'));
|
||||||
|
const diagnosisEditor = $(modal.querySelector('textarea[name="diagnosis"]'));
|
||||||
|
const treatmentPlanEditor = $(modal.querySelector('textarea[name="treatment_plan"]'));
|
||||||
|
|
||||||
|
const symptomsText = symptomsEditor.length && symptomsEditor.summernote ? symptomsEditor.summernote('code') : (modal.querySelector('textarea[name="symptoms"]') ? modal.querySelector('textarea[name="symptoms"]').value : '');
|
||||||
|
const diagnosisText = diagnosisEditor.length && diagnosisEditor.summernote ? diagnosisEditor.summernote('code') : (modal.querySelector('textarea[name="diagnosis"]') ? modal.querySelector('textarea[name="diagnosis"]').value : '');
|
||||||
|
|
||||||
|
// Check if actually empty beyond HTML tags
|
||||||
|
const cleanSymptoms = symptomsText.replace(/<[^>]*>/g, "").trim();
|
||||||
|
const cleanDiagnosis = diagnosisText.replace(/<[^>]*>/g, "").trim();
|
||||||
|
|
||||||
|
if (!cleanSymptoms && !cleanDiagnosis) {
|
||||||
|
alert("Please enter symptoms or diagnosis first.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalHTML = button.innerHTML;
|
||||||
|
button.disabled = true;
|
||||||
|
button.innerHTML = '<span class="spinner-border spinner-border-sm me-1"></span> AI generating...';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch("api/ai_report.php", {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ symptoms: symptomsText, diagnosis: diagnosisText })
|
||||||
|
});
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
if (treatmentPlanEditor.length && treatmentPlanEditor.summernote) {
|
||||||
|
treatmentPlanEditor.summernote('code', data.report);
|
||||||
|
} else {
|
||||||
|
modal.querySelector('textarea[name="treatment_plan"]').value = data.report;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
alert("AI Error: " + (data.error || "Unknown error"));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("AI Report generation failed:", error);
|
||||||
|
alert("Failed to generate AI suggestion.");
|
||||||
|
} finally {
|
||||||
|
button.disabled = false;
|
||||||
|
button.innerHTML = originalHTML;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1277,7 +1277,12 @@
|
|||||||
<textarea name="diagnosis" class="form-control rich-editor" rows="2"></textarea>
|
<textarea name="diagnosis" class="form-control rich-editor" rows="2"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label"><?php echo __('treatment_plan'); ?></label>
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
|
<label class="form-label mb-0"><?php echo __("treatment_plan"); ?></label>
|
||||||
|
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAIReport(this)">
|
||||||
|
<i class="bi bi-stars"></i> AI Suggestion
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<textarea name="treatment_plan" class="form-control rich-editor" rows="2"></textarea>
|
<textarea name="treatment_plan" class="form-control rich-editor" rows="2"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -1352,7 +1357,12 @@
|
|||||||
<textarea name="diagnosis" id="edit_visit_diagnosis" class="form-control rich-editor" rows="2"></textarea>
|
<textarea name="diagnosis" id="edit_visit_diagnosis" class="form-control rich-editor" rows="2"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label"><?php echo __('treatment_plan'); ?></label>
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
|
<label class="form-label mb-0"><?php echo __("treatment_plan"); ?></label>
|
||||||
|
<button type="button" class="btn btn-sm btn-outline-info" onclick="generateAIReport(this)">
|
||||||
|
<i class="bi bi-stars"></i> AI Suggestion
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<textarea name="treatment_plan" id="edit_visit_treatment_plan" class="form-control rich-editor" rows="2"></textarea>
|
<textarea name="treatment_plan" id="edit_visit_treatment_plan" class="form-control rich-editor" rows="2"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -2622,5 +2632,6 @@
|
|||||||
bootstrap.Modal.getOrCreateInstance(document.getElementById("visitResultsModal")).show();
|
bootstrap.Modal.getOrCreateInstance(document.getElementById("visitResultsModal")).show();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
<script src="assets/js/ai_helper.js?v=1772645929"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
Loading…
x
Reference in New Issue
Block a user