fix(mp): 修复小程序角色路由 + 前后端字段对齐 + E2E 测试报告

- 修复 stores/auth.ts 三种登录方式从错误路径提取 roles(resp.roles → resp.user.roles)
- 首页添加医护人员自动跳转医生端(useDidShow + isMedicalStaff)
- services/auth.ts credentialLogin 返回类型补全 roles 字段
- Web 前端 healthData.ts 字段对齐后端 DTO(indicators→items, content→overall_assessment)
- Web 前端 medicationReminders.ts 字段对齐(time_slots→reminder_times)
- 小程序 report.ts / reports 页面字段对齐后端(indicators→items, doctor_interpretation→doctor_notes)
- 小程序 patient.ts / followup.ts / alert.ts 补全缺失字段
- 后端 stats_handler.rs 权限码修正(health.patient.list→health.dashboard.manage)
- 新增 V1 E2E 测试报告和五专家组评审报告
This commit is contained in:
iven
2026-05-17 01:51:02 +08:00
parent aa27c5174c
commit c38967a36e
17 changed files with 898 additions and 67 deletions

View File

@@ -40,10 +40,10 @@ export interface LabReport {
patient_id: string;
report_date: string;
report_type: string;
indicators?: Record<string, unknown>;
items?: unknown;
image_urls?: string[];
doctor_notes?: string;
doctor_interpretation?: string;
source?: string;
status: string;
reviewed_by?: string;
reviewed_at?: string;
@@ -55,9 +55,9 @@ export interface LabReport {
export interface CreateLabReportReq {
report_date: string;
report_type: string;
indicators?: Record<string, unknown>;
items?: unknown;
image_urls?: string[];
doctor_interpretation?: string;
doctor_notes?: string;
}
export interface HealthRecord {
@@ -65,8 +65,10 @@ export interface HealthRecord {
patient_id: string;
record_type: string;
record_date: string;
content?: string;
attachment_urls?: string[];
overall_assessment?: string;
report_file_url?: string;
source?: string;
notes?: string;
created_at: string;
updated_at: string;
version: number;
@@ -75,8 +77,8 @@ export interface HealthRecord {
export interface CreateHealthRecordReq {
record_type: string;
record_date: string;
content?: string;
attachment_urls?: string[];
overall_assessment?: string;
report_file_url?: string;
}
export interface DailyMonitoring {

View File

@@ -9,7 +9,7 @@ export interface MedicationReminder {
medication_name: string;
dosage?: string;
frequency: string;
time_slots: string[];
reminder_times: unknown;
start_date?: string;
end_date?: string;
is_active: boolean;
@@ -24,7 +24,7 @@ export interface CreateMedicationReminderReq {
medication_name: string;
dosage?: string;
frequency?: string;
time_slots?: string[];
reminder_times?: unknown;
start_date?: string;
end_date?: string;
is_active?: boolean;
@@ -35,7 +35,7 @@ export interface UpdateMedicationReminderReq {
medication_name?: string;
dosage?: string;
frequency?: string;
time_slots?: string[];
reminder_times?: unknown;
start_date?: string;
end_date?: string;
is_active?: boolean;

View File

@@ -53,7 +53,7 @@ export function HealthRecordsTab({ patientId }: Props) {
form.setFieldsValue({
record_type: record.record_type,
record_date: dayjs(record.record_date),
content: record.content,
overall_assessment: record.overall_assessment,
});
setModalOpen(true);
};
@@ -61,7 +61,7 @@ export function HealthRecordsTab({ patientId }: Props) {
const handleSubmit = async (values: {
record_type: 'checkup' | 'outpatient' | 'inpatient';
record_date: Dayjs;
content?: string;
overall_assessment?: string;
}) => {
setSubmitting(true);
try {
@@ -69,7 +69,7 @@ export function HealthRecordsTab({ patientId }: Props) {
await healthDataApi.updateHealthRecord(patientId, editingRecord.id, {
record_type: values.record_type,
record_date: values.record_date.format('YYYY-MM-DD'),
content: values.content,
overall_assessment: values.overall_assessment,
version: editingRecord.version,
});
message.success('健康记录更新成功');
@@ -77,7 +77,7 @@ export function HealthRecordsTab({ patientId }: Props) {
await healthDataApi.createHealthRecord(patientId, {
record_type: values.record_type,
record_date: values.record_date.format('YYYY-MM-DD'),
content: values.content,
overall_assessment: values.overall_assessment,
});
message.success('健康记录添加成功');
}
@@ -105,7 +105,7 @@ export function HealthRecordsTab({ patientId }: Props) {
const columns = useMemo(() => [
{ title: '记录类型', dataIndex: 'record_type', key: 'record_type', width: 120, render: (v: string) => <Tag>{RECORD_TYPE_MAP[v] || v}</Tag> },
{ title: '记录日期', dataIndex: 'record_date', key: 'record_date', width: 120 },
{ title: '内容', dataIndex: 'content', key: 'content', ellipsis: true },
{ title: '内容', dataIndex: 'overall_assessment', key: 'overall_assessment', ellipsis: true },
{ title: '创建时间', dataIndex: 'created_at', key: 'created_at', width: 170, render: (v: string) => new Date(v).toLocaleString('zh-CN') },
{
title: '操作',
@@ -177,7 +177,7 @@ export function HealthRecordsTab({ patientId }: Props) {
<Form.Item name="record_date" label="记录日期" rules={[{ required: true, message: '请选择日期' }]}>
<DatePicker style={{ width: '100%' }} />
</Form.Item>
<Form.Item name="content" label="内容">
<Form.Item name="overall_assessment" label="内容">
<Input.TextArea rows={4} placeholder="健康记录详细内容" />
</Form.Item>
</Form>

View File

@@ -79,7 +79,7 @@ export function LabReportsTab({ patientId }: Props) {
form.setFieldsValue({
report_date: dayjs(record.report_date),
report_type: record.report_type,
doctor_interpretation: record.doctor_interpretation,
doctor_notes: record.doctor_notes,
});
setModalOpen(true);
};
@@ -87,7 +87,7 @@ export function LabReportsTab({ patientId }: Props) {
const handleSubmit = async (values: {
report_date: Dayjs;
report_type: string;
doctor_interpretation?: string;
doctor_notes?: string;
}) => {
setSubmitting(true);
try {
@@ -95,7 +95,7 @@ export function LabReportsTab({ patientId }: Props) {
await healthDataApi.updateLabReport(patientId, editingRecord.id, {
report_date: values.report_date.format('YYYY-MM-DD'),
report_type: values.report_type,
doctor_interpretation: values.doctor_interpretation,
doctor_notes: values.doctor_notes,
version: editingRecord.version,
});
message.success('化验报告更新成功');
@@ -103,7 +103,7 @@ export function LabReportsTab({ patientId }: Props) {
await healthDataApi.createLabReport(patientId, {
report_date: values.report_date.format('YYYY-MM-DD'),
report_type: values.report_type,
doctor_interpretation: values.doctor_interpretation,
doctor_notes: values.doctor_notes,
});
message.success('化验报告添加成功');
}
@@ -164,7 +164,7 @@ export function LabReportsTab({ patientId }: Props) {
return m ? <Tag color={m.color}>{m.label}</Tag> : <Tag>{v}</Tag>;
},
},
{ title: '医生解读', dataIndex: 'doctor_interpretation', key: 'doctor_interpretation', ellipsis: true },
{ title: '医生解读', dataIndex: 'doctor_notes', key: 'doctor_notes', ellipsis: true },
{ title: '创建时间', dataIndex: 'created_at', key: 'created_at', width: 170, render: (v: string) => new Date(v).toLocaleString('zh-CN') },
{
title: '操作',
@@ -248,7 +248,7 @@ export function LabReportsTab({ patientId }: Props) {
<Form.Item name="report_type" label="报告类型" rules={[{ required: true, message: '请选择类型' }]}>
<Input placeholder="如:血常规、生化全套" />
</Form.Item>
<Form.Item name="doctor_interpretation" label="医生解读">
<Form.Item name="doctor_notes" label="医生解读">
<Input.TextArea rows={3} placeholder="检查结果解读备注" />
</Form.Item>
</Form>
@@ -271,9 +271,9 @@ export function LabReportsTab({ patientId }: Props) {
<p style={{ marginBottom: 8 }}>
<strong></strong>{reviewRecord.report_date}
</p>
{reviewRecord.doctor_interpretation && (
{reviewRecord.doctor_notes && (
<p style={{ marginBottom: 8 }}>
<strong></strong>{reviewRecord.doctor_interpretation}
<strong></strong>{reviewRecord.doctor_notes}
</p>
)}
<div style={{ marginTop: 16 }}>