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:
@@ -287,9 +287,17 @@ function HomeDashboard({ modeClass }: { modeClass: string }) {
|
||||
|
||||
export default function Index() {
|
||||
const user = useAuthStore((s) => s.user);
|
||||
const isMedicalStaff = useAuthStore((s) => s.isMedicalStaff);
|
||||
const mode = useUIStore((s) => s.mode);
|
||||
const modeClass = mode === 'elder' ? 'elder-mode' : '';
|
||||
|
||||
// 医护人员访问患者首页时,自动跳转到医生端
|
||||
useDidShow(() => {
|
||||
if (user && isMedicalStaff()) {
|
||||
Taro.redirectTo({ url: '/pages/pkg-doctor-core/index' });
|
||||
}
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return <GuestHome modeClass={modeClass} />;
|
||||
}
|
||||
|
||||
@@ -45,14 +45,15 @@ export default function ReportDetail() {
|
||||
usePageData(fetchReport, { throttleMs: 60000 });
|
||||
|
||||
const indicators: IndicatorItem[] = React.useMemo(() => {
|
||||
if (!report?.indicators || typeof report.indicators !== 'object') return [];
|
||||
return Object.entries(report.indicators).map(([name, val]) => ({
|
||||
name,
|
||||
value: val.value,
|
||||
unit: val.unit,
|
||||
reference_min: val.reference_min,
|
||||
reference_max: val.reference_max,
|
||||
status: val.status,
|
||||
if (!report?.items || typeof report.items !== 'object') return [];
|
||||
const items = Array.isArray(report.items) ? report.items : [];
|
||||
return items.map((val: Record<string, unknown>, idx: number) => ({
|
||||
name: (val.name as string) || `指标 ${idx + 1}`,
|
||||
value: val.value as number,
|
||||
unit: val.unit as string,
|
||||
reference_min: (val.reference_low ?? val.reference_min) as number | undefined,
|
||||
reference_max: (val.reference_high ?? val.reference_max) as number | undefined,
|
||||
status: val.is_abnormal ? '异常' : '正常',
|
||||
}));
|
||||
}, [report]);
|
||||
|
||||
@@ -89,10 +90,10 @@ export default function ReportDetail() {
|
||||
<Text className='detail-label'>报告日期</Text>
|
||||
<Text className='detail-value'>{report.report_date}</Text>
|
||||
</View>
|
||||
{report.doctor_interpretation && (
|
||||
{report.doctor_notes && (
|
||||
<View className='detail-row'>
|
||||
<Text className='detail-label'>医生解读</Text>
|
||||
<Text className='detail-value'>{report.doctor_interpretation}</Text>
|
||||
<Text className='detail-value'>{report.doctor_notes}</Text>
|
||||
</View>
|
||||
)}
|
||||
</ContentCard>
|
||||
|
||||
@@ -53,10 +53,10 @@ export default function MyReports() {
|
||||
};
|
||||
|
||||
const formatStatus = (report: LabReport) => {
|
||||
const indicators = report.indicators;
|
||||
if (!indicators || typeof indicators !== 'object') return 'unknown';
|
||||
const vals = Object.values(indicators) as Array<{ status?: string }>;
|
||||
const hasAbnormal = vals.some((v) => v.status === 'high' || v.status === 'low');
|
||||
const items = report.items;
|
||||
if (!items || !Array.isArray(items)) return 'unknown';
|
||||
const vals = items as Array<{ is_abnormal?: boolean }>;
|
||||
const hasAbnormal = vals.some((v) => v.is_abnormal);
|
||||
return hasAbnormal ? 'abnormal' : 'normal';
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user