Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7317cb066d | ||
|
|
94b4821d4c |
@@ -1335,38 +1335,13 @@ const handleSubmit = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mode.value === 'add') {
|
if (mode.value === 'add') {
|
||||||
const result = await tcmDiagnosisAdd(submitData)
|
await tcmDiagnosisAdd(submitData)
|
||||||
|
emit('success')
|
||||||
// 如果是新增,保存成功后切换到编辑模式,这样可以添加血糖血压记录
|
handleClose()
|
||||||
if (result && result.id) {
|
return
|
||||||
mode.value = 'edit'
|
|
||||||
phoneRevealUnlocked.value = false
|
|
||||||
idCardRevealUnlocked.value = false
|
|
||||||
formData.value.id = result.id
|
|
||||||
|
|
||||||
// 重新获取详情,确保patient_id等字段正确
|
|
||||||
try {
|
|
||||||
const detail = await tcmDiagnosisDetail({ id: result.id })
|
|
||||||
formData.value.patient_id = detail.patient_id
|
|
||||||
|
|
||||||
// 更新原始数据
|
|
||||||
originalPhone.value = detail.phone || ''
|
|
||||||
originalIdCard.value = detail.id_card || ''
|
|
||||||
|
|
||||||
formData.value.phone = hasPhonePlainPermission.value
|
|
||||||
? detail.phone || ''
|
|
||||||
: maskPhone(detail.phone || '')
|
|
||||||
formData.value.id_card = hasPhonePlainPermission.value
|
|
||||||
? detail.id_card || ''
|
|
||||||
: maskIdCard(detail.id_card || '')
|
|
||||||
} catch (error) {
|
|
||||||
console.error('获取详情失败:', error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
await tcmDiagnosisEdit(submitData)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await tcmDiagnosisEdit(submitData)
|
||||||
emit('success')
|
emit('success')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('提交失败:', error)
|
console.error('提交失败:', error)
|
||||||
|
|||||||
@@ -94,6 +94,18 @@ class DiagnosisValidate extends BaseValidate
|
|||||||
|
|
||||||
public function sceneAdd()
|
public function sceneAdd()
|
||||||
{
|
{
|
||||||
|
<<<<<<< HEAD
|
||||||
|
// 与 sceneEdit 一样用 only() 白名单,避免全局规则里的 AI 助手 / 跟踪备注字段泄漏到新增诊单
|
||||||
|
return $this->only([
|
||||||
|
'patient_name', 'id_card', 'phone', 'gender', 'age', 'diagnosis_date', 'diagnosis_type',
|
||||||
|
'syndrome_type', 'marital_status', 'height', 'weight', 'region', 'systolic_pressure',
|
||||||
|
'diastolic_pressure', 'fasting_blood_sugar', 'diabetes_discovery_year',
|
||||||
|
'local_hospital_diagnosis', 'local_hospital_name', 'past_history', 'symptoms',
|
||||||
|
'tongue_coating', 'pulse', 'treatment_principle', 'prescription', 'doctor_advice',
|
||||||
|
'remark', 'current_medications', 'status', 'show_card', 'create_source',
|
||||||
|
'tongue_images', 'report_files',
|
||||||
|
]);
|
||||||
|
=======
|
||||||
// 全局规则里混有跟踪备注、AI 助手字段;新增诊单只去掉这些无关校验。
|
// 全局规则里混有跟踪备注、AI 助手字段;新增诊单只去掉这些无关校验。
|
||||||
// 不要改成 only([...]):add 还会写入现病史等多选字段,only 会把它们从请求里丢掉。
|
// 不要改成 only([...]):add 还会写入现病史等多选字段,only 会把它们从请求里丢掉。
|
||||||
return $this->remove('id', true)
|
return $this->remove('id', true)
|
||||||
@@ -104,6 +116,7 @@ class DiagnosisValidate extends BaseValidate
|
|||||||
->remove('model', true)
|
->remove('model', true)
|
||||||
->remove('report_id', true)
|
->remove('report_id', true)
|
||||||
->remove('content', true);
|
->remove('content', true);
|
||||||
|
>>>>>>> master
|
||||||
}
|
}
|
||||||
|
|
||||||
public function sceneEdit()
|
public function sceneEdit()
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
use app\adminapi\validate\tcm\DiagnosisValidate;
|
||||||
|
|
||||||
|
function diagnosisSceneExpect(bool $condition, string $message): void
|
||||||
|
{
|
||||||
|
if (!$condition) {
|
||||||
|
fwrite(STDERR, "FAIL: {$message}\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sceneOnlyFields(DiagnosisValidate $validator): array
|
||||||
|
{
|
||||||
|
$property = (new ReflectionClass($validator))->getProperty('only');
|
||||||
|
$property->setAccessible(true);
|
||||||
|
$fields = $property->getValue($validator);
|
||||||
|
return is_array($fields) ? $fields : [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$addPayload = [
|
||||||
|
'patient_name' => '张三',
|
||||||
|
'phone' => '13812345678',
|
||||||
|
'gender' => 1,
|
||||||
|
'age' => 42,
|
||||||
|
'diagnosis_type' => '复诊',
|
||||||
|
'local_hospital_name' => '某医院',
|
||||||
|
'status' => 1,
|
||||||
|
'create_source' => 'admin',
|
||||||
|
];
|
||||||
|
|
||||||
|
$addOnly = sceneOnlyFields((new DiagnosisValidate())->sceneAdd());
|
||||||
|
foreach (['task', 'prompt', 'model', 'report_id', 'content', 'diagnosis_id', 'tracking_content', 'id'] as $leaked) {
|
||||||
|
diagnosisSceneExpect(
|
||||||
|
!in_array($leaked, $addOnly, true),
|
||||||
|
"新增诊单场景不得校验 {$leaked}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
foreach (['patient_name', 'phone', 'gender', 'age', 'diagnosis_type', 'local_hospital_name'] as $required) {
|
||||||
|
diagnosisSceneExpect(
|
||||||
|
in_array($required, $addOnly, true),
|
||||||
|
"新增诊单场景仍应校验 {$required}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$addScene = (new DiagnosisValidate())->scene('add');
|
||||||
|
$addOk = $addScene->check($addPayload) === true;
|
||||||
|
$addError = $addOk ? '' : json_encode($addScene->getError(), JSON_UNESCAPED_UNICODE);
|
||||||
|
diagnosisSceneExpect($addOk, '新增诊单不带 task 应通过校验' . ($addError !== '' ? ": {$addError}" : ''));
|
||||||
|
|
||||||
|
$editScene = (new DiagnosisValidate())->sceneEdit();
|
||||||
|
diagnosisSceneExpect(
|
||||||
|
!in_array('task', sceneOnlyFields($editScene), true),
|
||||||
|
'编辑诊单场景不得校验 AI 助手任务'
|
||||||
|
);
|
||||||
|
|
||||||
|
$assistantScene = (new DiagnosisValidate())->sceneAiAssistant();
|
||||||
|
diagnosisSceneExpect(
|
||||||
|
in_array('task', sceneOnlyFields($assistantScene), true),
|
||||||
|
'AI 助手场景仍应校验 task'
|
||||||
|
);
|
||||||
|
|
||||||
|
echo "DiagnosisValidateSceneTest passed\n";
|
||||||
Reference in New Issue
Block a user