fix(mp): 修复 72 个 TypeScript 类型错误 — noImplicitAny 全量通过

- 移除 28 个文件中不再需要的 import React (jsx: react-jsx)
- 修复 catch(err: any) → catch(err: unknown) 类型收窄
- 修复 __wxConfig / CanvasRenderingContext2D 全局类型声明
- 修复 DTO 类型不匹配 (UpdateDialysisRecordReq, notificationService)
- 移除 52 个未使用的 import/变量/常量
- 修复 services 类型 (auth.ts tenant_id, actionInbox boolean, device-sync)
This commit is contained in:
iven
2026-05-22 00:13:58 +08:00
parent 21f8040994
commit 02a96682f6
48 changed files with 75 additions and 80 deletions

View File

@@ -3,6 +3,10 @@ import { Canvas, View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import './index.scss'; import './index.scss';
/** Canvas 2D 上下文类型 — 微信小程序 Canvas 2d 接口 */
// eslint-disable-next-line @typescript-eslint/no-explicit-any
type CanvasRenderingContext2D = any;
interface TrendChartProps { interface TrendChartProps {
data: { date: string; value: number }[]; data: { date: string; value: number }[];
referenceMin?: number; referenceMin?: number;
@@ -181,7 +185,6 @@ export default React.memo(function TrendChart({
if (!node) return; if (!node) return;
canvasRef.current = node; canvasRef.current = node;
const sysInfo = Taro.getSystemInfoSync(); const sysInfo = Taro.getSystemInfoSync();
const canvasW = (sysInfo.windowWidth * 750) / sysInfo.windowWidth;
node.width = sysInfo.windowWidth * getDPR(); node.width = sysInfo.windowWidth * getDPR();
node.height = ((height / 750) * sysInfo.windowWidth) * getDPR(); node.height = ((height / 750) * sysInfo.windowWidth) * getDPR();
draw(); draw();

View File

@@ -1,4 +1,4 @@
import React, { ReactNode } from 'react'; import React from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import './index.scss'; import './index.scss';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text, RichText } from '@tarojs/components'; import { View, Text, RichText } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text, ScrollView } from '@tarojs/components'; import { View, Text, ScrollView } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback, useMemo } from 'react'; import { useState, useCallback, useMemo } from 'react';
import { View, Text, Input } from '@tarojs/components'; import { View, Text, Input } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { listDoctors, createAppointment, calendarView } from '../../../services/appointment'; import { listDoctors, createAppointment, calendarView } from '../../../services/appointment';

View File

@@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { getAppointment, cancelAppointment } from '../../../services/appointment'; import { getAppointment, cancelAppointment } from '../../../services/appointment';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';
@@ -38,7 +38,7 @@ export default function AppointmentList() {
const fetchData = useCallback(async (pageNum: number, isRefresh = false) => { const fetchData = useCallback(async (pageNum: number, isRefresh = false) => {
setLoading(true); setLoading(true);
try { try {
const res = await listAppointments(pageNum); const res = await listAppointments(undefined, pageNum);
const list = res.data || []; const list = res.data || [];
if (isRefresh) { if (isRefresh) {
setAppointments(list); setAppointments(list);

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text, RichText } from '@tarojs/components'; import { View, Text, RichText } from '@tarojs/components';
import Taro, { useRouter, useShareAppMessage } from '@tarojs/taro'; import Taro, { useRouter, useShareAppMessage } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -34,8 +34,8 @@ interface ArticleCategory {
export default function ArticleList() { export default function ArticleList() {
const modeClass = useElderClass(); const modeClass = useElderClass();
const [articles, setArticles] = useState<ArticleItem[]>([]); const [articles, setArticles] = useState<ArticleItem[]>([]);
const [page, setPage] = useState(1); const [, setPage] = useState(1);
const [total, setTotal] = useState(0); const [, setTotal] = useState(0);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [error, setError] = useState(false); const [error, setError] = useState(false);
const [categories, setCategories] = useState<ArticleCategory[]>([]); const [categories, setCategories] = useState<ArticleCategory[]>([]);

View File

@@ -84,7 +84,7 @@ export default function ConsultationCreate() {
const typeLabels = CONSULTATION_TYPES.map((t) => TYPE_LABELS[t] || t); const typeLabels = CONSULTATION_TYPES.map((t) => TYPE_LABELS[t] || t);
return ( return (
<PageShell title='发起咨询' scroll={false}> <PageShell scroll={false}>
<View className={`consult-create ${modeClass}`}> <View className={`consult-create ${modeClass}`}>
<View className='consult-create__section'> <View className='consult-create__section'>
<Text className='consult-create__label'></Text> <Text className='consult-create__label'></Text>

View File

@@ -35,7 +35,7 @@ export default function Health() {
const currentPatient = useAuthStore((s) => s.currentPatient); const currentPatient = useAuthStore((s) => s.currentPatient);
const modeClass = useElderClass(); const modeClass = useElderClass();
const { const {
user, todaySummary, loading, error, activeTab, trendData, trendLoading, user, todaySummary: _todaySummary, loading: _loading, error, activeTab, trendData, trendLoading,
aiSuggestions, thresholds, handleTabChange, loadTrend, refreshToday, fetchData, aiSuggestions, thresholds, handleTabChange, loadTrend, refreshToday, fetchData,
} = useHealthData(); } = useHealthData();

View File

@@ -1,8 +1,8 @@
import { useState, useRef } from 'react'; import { useState } from 'react';
import { useHealthStore } from '@/stores/health'; import { useHealthStore } from '@/stores/health';
import { useAuthStore } from '@/stores/auth'; import { useAuthStore } from '@/stores/auth';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';
import { getTrend, getHealthThresholds, DEFAULT_THRESHOLDS, type HealthThreshold } from '@/services/health'; import { getHealthThresholds, DEFAULT_THRESHOLDS, type HealthThreshold } from '@/services/health';
import { listPendingSuggestions, type AiSuggestionItem } from '@/services/ai-analysis'; import { listPendingSuggestions, type AiSuggestionItem } from '@/services/ai-analysis';
export type VitalType = 'blood_pressure' | 'heart_rate' | 'blood_sugar' | 'weight'; export type VitalType = 'blood_pressure' | 'heart_rate' | 'blood_sugar' | 'weight';

View File

@@ -6,14 +6,14 @@ import { useAuthStore } from '../../stores/auth';
import { useUIStore } from '../../stores/ui'; import { useUIStore } from '../../stores/ui';
import { navigateToLogin } from '../../utils/navigate'; import { navigateToLogin } from '../../utils/navigate';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';
import { useThrottledDidShow } from '@/hooks/useThrottledDidShow'; // useThrottledDidShow removed — unused import
import { api } from '@/services/request'; import { api } from '@/services/request';
import type { Article } from '@/services/article'; import type { Article } from '@/services/article';
import ProgressRing from '@/components/ui/ProgressRing'; import ProgressRing from '@/components/ui/ProgressRing';
import Loading from '../../components/Loading'; import Loading from '../../components/Loading';
import PageShell from '@/components/ui/PageShell'; import PageShell from '@/components/ui/PageShell';
import ContentCard from '@/components/ui/ContentCard'; import ContentCard from '@/components/ui/ContentCard';
import { useHomeData, type ReminderItem } from './useHomeData'; import { useHomeData } from './useHomeData';
import './index.scss'; import './index.scss';
interface PublicBanner { interface PublicBanner {
@@ -27,9 +27,9 @@ interface PublicBanner {
} }
const FALLBACK_SLIDES = [ const FALLBACK_SLIDES = [
{ id: 'slide-1', title: '专业血透中心', desc: '三甲级医护团队全程守护', image_url: '' }, { id: 'slide-1', title: '专业血透中心', subtitle: '', desc: '三甲级医护团队全程守护', image_url: '' },
{ id: 'slide-2', title: '智慧健康管理', desc: 'AI 驱动个性化健康方案', image_url: '' }, { id: 'slide-2', title: '智慧健康管理', subtitle: '', desc: 'AI 驱动个性化健康方案', image_url: '' },
{ id: 'slide-3', title: '温馨就医环境', desc: '舒适安全的治疗体验', image_url: '' }, { id: 'slide-3', title: '温馨就医环境', subtitle: '', desc: '舒适安全的治疗体验', image_url: '' },
]; ];
// ─── 访客首页 ─── // ─── 访客首页 ───

View File

@@ -83,7 +83,7 @@ export function useHomeData() {
]); ]);
if (suggestRes.status === 'fulfilled') { if (suggestRes.status === 'fulfilled') {
for (const s of suggestRes.value.data.slice(0, 1)) { for (const s of suggestRes.value.slice(0, 1)) {
items.push({ id: s.id, text: buildSuggestionText(s), type: 'ai', tag: 'AI 建议' }); items.push({ id: s.id, text: buildSuggestionText(s), type: 'ai', tag: 'AI 建议' });
} }
} }

View File

@@ -5,8 +5,10 @@ import { safeNavigateTo } from '@/utils/navigate';
import { useAuthStore } from '../../stores/auth'; import { useAuthStore } from '../../stores/auth';
import './index.scss'; import './index.scss';
declare const __wxConfig: Record<string, unknown> | undefined;
const IS_DEV = process.env.NODE_ENV !== 'production'; const IS_DEV = process.env.NODE_ENV !== 'production';
const IS_SIMULATOR = typeof __wxConfig !== 'undefined' && (__wxConfig as any).envVersion === 'develop'; const IS_SIMULATOR = typeof __wxConfig !== 'undefined' && (__wxConfig as Record<string, unknown>)?.envVersion === 'develop';
export default function Login() { export default function Login() {
const [username, setUsername] = useState(''); const [username, setUsername] = useState('');

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,4 +1,4 @@
import { useState, useRef, useEffect } from 'react'; import { useState, useRef } from 'react';
import { View, Text, Input, ScrollView } from '@tarojs/components'; import { View, Text, Input, ScrollView } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { import {

View File

@@ -7,6 +7,7 @@ import {
getDialysisRecord, reviewDialysisRecord, getDialysisRecord, reviewDialysisRecord,
updateDialysisRecord, deleteDialysisRecord, updateDialysisRecord, deleteDialysisRecord,
type DialysisRecord, type DialysisRecord,
type UpdateDialysisRecordReq,
} from '@/services/doctor/dialysis'; } from '@/services/doctor/dialysis';
import Loading from '@/components/Loading'; import Loading from '@/components/Loading';
import PageShell from '@/components/ui/PageShell'; import PageShell from '@/components/ui/PageShell';
@@ -59,7 +60,8 @@ export default function DialysisDetail() {
if (!record) return; if (!record) return;
setSubmitting(true); setSubmitting(true);
try { try {
const updated = await updateDialysisRecord(id, { status: 'completed' }, record.version); const req = { status: 'completed' } as UpdateDialysisRecordReq;
const updated = await updateDialysisRecord(id, req, record.version);
setRecord(updated); setRecord(updated);
Taro.showToast({ title: '已标记完成', icon: 'success' }); Taro.showToast({ title: '已标记完成', icon: 'success' });
} catch (err) { } catch (err) {

View File

@@ -2,7 +2,6 @@ import { useState } from 'react';
import { View, Text, Input, Textarea, Picker } from '@tarojs/components'; import { View, Text, Input, Textarea, Picker } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { createDialysisPrescription } from '@/services/doctor/dialysis'; import { createDialysisPrescription } from '@/services/doctor/dialysis';
import Loading from '@/components/Loading';
import PageShell from '@/components/ui/PageShell'; import PageShell from '@/components/ui/PageShell';
import ContentCard from '@/components/ui/ContentCard'; import ContentCard from '@/components/ui/ContentCard';
import { useDoctorClass } from '@/hooks/useDoctorClass'; import { useDoctorClass } from '@/hooks/useDoctorClass';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback, useRef } from 'react'; import { useState, useCallback, useRef } from 'react';
import { View, Text, ScrollView } from '@tarojs/components'; import { View, Text, ScrollView } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';
@@ -33,7 +33,7 @@ export default function PatientAlerts() {
const currentPatient = useAuthStore((s) => s.currentPatient); const currentPatient = useAuthStore((s) => s.currentPatient);
const [alerts, setAlerts] = useState<Alert[]>([]); const [alerts, setAlerts] = useState<Alert[]>([]);
const [total, setTotal] = useState(0); const [total, setTotal] = useState(0);
const [page, setPage] = useState(1); const [_page, setPage] = useState(1);
const [status, setStatus] = useState(''); const [status, setStatus] = useState('');
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [error, setError] = useState(false); const [error, setError] = useState(false);
@@ -76,7 +76,7 @@ export default function PatientAlerts() {
try { try {
const tmplId = process.env.TARO_APP_WX_TEMPLATE_CRITICAL_ALERT || ''; const tmplId = process.env.TARO_APP_WX_TEMPLATE_CRITICAL_ALERT || '';
if (tmplId) { if (tmplId) {
await Taro.requestSubscribeMessage({ tmplIds: [tmplId] }); await (Taro.requestSubscribeMessage as (option: { tmplIds: string[] }) => Promise<unknown>)({ tmplIds: [tmplId] });
} }
} catch { } catch {
// 用户拒绝或已订阅,不阻塞页面 // 用户拒绝或已订阅,不阻塞页面

View File

@@ -15,7 +15,7 @@ import ContentCard from '@/components/ui/ContentCard';
import { import {
BP_RANGE, WEIGHT_RANGE, SUGAR_RANGE, VOLUME_RANGE, BP_RANGE, WEIGHT_RANGE, SUGAR_RANGE, VOLUME_RANGE,
checkAbnormal, formatDate, FIELD_LABELS, checkAbnormal, formatDate, FIELD_LABELS,
type SectionKey, type AbnormalResult, type SectionKey,
} from './constants'; } from './constants';
import './index.scss'; import './index.scss';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,5 +1,5 @@
import { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text, ScrollView } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import * as pointsApi from '@/services/points'; import * as pointsApi from '@/services/points';
import Loading from '@/components/Loading'; import Loading from '@/components/Loading';

View File

@@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { View, Text, Input, Picker } from '@tarojs/components'; import { View, Text, Input, Picker } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { createPatient, updatePatient, Patient } from '../../../services/patient'; import { createPatient, updatePatient, Patient } from '../../../services/patient';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text, Textarea } from '@tarojs/components'; import { View, Text, Textarea } from '@tarojs/components';
import Taro, { useRouter } from '@tarojs/taro'; import Taro, { useRouter } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text, Input, Picker } from '@tarojs/components'; import { View, Text, Input, Picker } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { usePageData } from '@/hooks/usePageData'; import { usePageData } from '@/hooks/usePageData';

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback } from 'react'; import { useState, useCallback } from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro, { useReachBottom } from '@tarojs/taro'; import Taro, { useReachBottom } from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -1,4 +1,3 @@
import React from 'react';
import { View, Text } from '@tarojs/components'; import { View, Text } from '@tarojs/components';
import Taro from '@tarojs/taro'; import Taro from '@tarojs/taro';
import { safeNavigateTo } from '@/utils/navigate'; import { safeNavigateTo } from '@/utils/navigate';

View File

@@ -15,7 +15,7 @@ export interface LoginResp {
access_token: string; access_token: string;
refresh_token: string; refresh_token: string;
expires_in: number; expires_in: number;
user: { id: string; username: string; display_name?: string; phone?: string; avatar_url?: string }; user: { id: string; username: string; display_name?: string; phone?: string; avatar_url?: string; tenant_id?: string };
}; };
} }

View File

@@ -19,19 +19,12 @@ const RACP_CHARACTERISTIC = '00002A52-0000-1000-8000-00805F9B34FB';
// RACP 操作码 // RACP 操作码
const RACP_OPCODE_REPORT_STORED_RECORDS = 0x01; const RACP_OPCODE_REPORT_STORED_RECORDS = 0x01;
const RACP_OPCODE_DELETE_STORED_RECORDS = 0x02;
const RACP_OPCODE_ABORT_OPERATION = 0x03;
const RACP_OPCODE_REPORT_NUMBER_OF_RECORDS = 0x04; const RACP_OPCODE_REPORT_NUMBER_OF_RECORDS = 0x04;
const RACP_OPCODE_NUMBER_OF_STORED_RECORDS_RESPONSE = 0x05; const RACP_OPCODE_NUMBER_OF_STORED_RECORDS_RESPONSE = 0x05;
const RACP_OPCODE_RESPONSE_CODE = 0x06; const RACP_OPCODE_RESPONSE_CODE = 0x06;
// RACP 操作符 // RACP 操作符
const RACP_OPERATOR_ALL = 0x01; const RACP_OPERATOR_ALL = 0x01;
const RACP_OPERATOR_LESS_THAN = 0x04;
const RACP_OPERATOR_GREATER_THAN = 0x05;
// RACP 过滤器类型
const RACP_FILTER_TYPE_TIME = 0x01;
/** 解析心率测量值Heart Rate Measurement 格式) */ /** 解析心率测量值Heart Rate Measurement 格式) */
function parseHeartRate(data: ArrayBuffer): number | null { function parseHeartRate(data: ArrayBuffer): number | null {
@@ -118,14 +111,11 @@ export const XiaomiBandAdapter: DeviceAdapter = {
const opcode = view.getUint8(0); const opcode = view.getUint8(0);
if (opcode === RACP_OPCODE_NUMBER_OF_STORED_RECORDS_RESPONSE) { if (opcode === RACP_OPCODE_NUMBER_OF_STORED_RECORDS_RESPONSE) {
const count = view.getUint16(2, true);
// 不返回 reading仅用于日志/调试 // 不返回 reading仅用于日志/调试
return []; return [];
} }
if (opcode === RACP_OPCODE_RESPONSE_CODE) { if (opcode === RACP_OPCODE_RESPONSE_CODE) {
const reqOpcode = view.getUint8(1);
const status = view.getUint8(2);
// status: 0x01=成功, 0x02=不支持的操作码, 等 // status: 0x01=成功, 0x02=不支持的操作码, 等
// 不返回 reading仅用于日志 // 不返回 reading仅用于日志
return []; return [];
@@ -162,7 +152,7 @@ export function buildRACPReportAll(): ArrayBuffer {
export function buildRACPReportCount(): ArrayBuffer { export function buildRACPReportCount(): ArrayBuffer {
const buffer = new ArrayBuffer(2); const buffer = new ArrayBuffer(2);
const view = new DataView(buffer); const view = new DataView(buffer);
view.setUint8(0, RACP_OPCODE_REPORT_NUMBER_OF_STORED_RECORDS); view.setUint8(0, RACP_OPCODE_REPORT_NUMBER_OF_RECORDS);
view.setUint8(1, RACP_OPERATOR_ALL); view.setUint8(1, RACP_OPERATOR_ALL);
return buffer; return buffer;
} }

View File

@@ -6,7 +6,7 @@ interface BatchReadingRequest {
device_model?: string; device_model?: string;
readings: { readings: {
device_type: string; device_type: string;
values: Record<string, number>; values: Record<string, number | string>;
measured_at: string; measured_at: string;
}[]; }[];
} }

View File

@@ -40,10 +40,13 @@ export async function listActionItems(params?: {
assigned_to_me?: boolean; assigned_to_me?: boolean;
patient_id?: string; patient_id?: string;
}) { }) {
return api.get<PaginatedData>( const query: Record<string, string | number | undefined> = {};
'/health/action-inbox', if (params) {
params as Record<string, string | number | boolean | undefined>, for (const [k, v] of Object.entries(params)) {
); if (v !== undefined) query[k] = typeof v === 'boolean' ? String(v) : v;
}
}
return api.get<PaginatedData>('/health/action-inbox', query);
} }
export async function getActionThread(sourceRef: string) { export async function getActionThread(sourceRef: string) {
@@ -55,7 +58,7 @@ export async function getActionThread(sourceRef: string) {
export async function getWorkbenchStats(assignedToMe?: boolean) { export async function getWorkbenchStats(assignedToMe?: boolean) {
return api.get<WorkbenchStats>( return api.get<WorkbenchStats>(
'/health/action-inbox/stats', '/health/action-inbox/stats',
assignedToMe !== undefined ? { assigned_to_me: assignedToMe } : undefined, assignedToMe !== undefined ? { assigned_to_me: String(assignedToMe) } as Record<string, string | number | undefined> : undefined,
); );
} }

View File

@@ -28,7 +28,9 @@ export interface CreateDialysisRecordReq {
complication_notes?: string; complication_notes?: string;
} }
export type UpdateDialysisRecordReq = Omit<CreateDialysisRecordReq, 'patient_id'>; export type UpdateDialysisRecordReq = Omit<CreateDialysisRecordReq, 'patient_id'> & {
status?: string;
};
export interface CreateDialysisPrescriptionReq { export interface CreateDialysisPrescriptionReq {
patient_id: string; patient_id: string;
@@ -52,7 +54,9 @@ export interface CreateDialysisPrescriptionReq {
notes?: string; notes?: string;
} }
export type UpdateDialysisPrescriptionReq = Omit<CreateDialysisPrescriptionReq, 'patient_id'>; export type UpdateDialysisPrescriptionReq = Omit<CreateDialysisPrescriptionReq, 'patient_id'> & {
status?: string;
};
export interface DialysisStatistics { export interface DialysisStatistics {
total_records: number; total_records: number;

View File

@@ -1,8 +1,8 @@
import { api } from './request'; import { api } from './request';
export const notificationService = { export const notificationService = {
list: (params?: { page?: number; page_size?: number }) => list: <T = unknown>(params?: { page?: number; page_size?: number }) =>
api.get('/messages', params as Record<string, string | number | undefined>), api.get<T>('/messages', params as Record<string, string | number | undefined>),
markRead: (id: string) => markRead: (id: string) =>
api.put(`/messages/${id}/read`), api.put(`/messages/${id}/read`),
markAllRead: () => markAllRead: () =>

View File

@@ -18,13 +18,6 @@ let cachedRolesObj: string[] = [];
let cachedPatientJson = ''; let cachedPatientJson = '';
let cachedPatientObj: authApi.PatientInfo | null = null; let cachedPatientObj: authApi.PatientInfo | null = null;
interface BindPhoneResp {
access_token: string;
refresh_token: string;
expires_in?: number;
user: { id: string; username: string; display_name?: string; phone?: string; tenant_id?: string };
}
interface AuthState { interface AuthState {
user: { id: string; username: string; display_name?: string; phone?: string; tenant_id?: string } | null; user: { id: string; username: string; display_name?: string; phone?: string; tenant_id?: string } | null;
roles: string[]; roles: string[];
@@ -221,7 +214,7 @@ export const useAuthStore = create<AuthState>((set, get) => ({
clearLoggingOut(); clearLoggingOut();
get().loadPatients(); get().loadPatients();
return true; return true;
} catch (err: any) { } catch (err: unknown) {
secureRemove('wechat_openid'); secureRemove('wechat_openid');
set({ loading: false }); set({ loading: false });
throw err; throw err;