fix: 用药模块重做 + 运动计划不限7天 + 打卡可切换 + 删除修复

- 用药: 重写列表页(标签筛选+详情弹窗+打卡切换+滑动删除)
- 用药: 重写编辑页(选择器替代输入+同列布局+频率改为每天几次)
- 用药: 加Notes字段+DELETE端点+修复重复端点
- 运动: 不限7天, startDate+索引推算当天
- 打卡: 药/运动打卡可切换(点✓取消)
- 删除: 修复滑动删除热区, 一次点击即删除
- 侧边栏: 一键清理历史对话
- 饮食/运动/用药/问诊 API路径加/api/前缀
- 通知时机修正: 新建计划不再提前弹窗
This commit is contained in:
MingNian
2026-06-04 21:15:23 +08:00
parent b944a31983
commit cd65bc4d65
11 changed files with 1069 additions and 1242 deletions

View File

@@ -80,6 +80,18 @@ class MedicationService {
await _api.delete('/api/medications/$id');
}
Future<List<Map<String, dynamic>>> getMedications(String filter) async {
final params = <String, dynamic>{};
if (filter.isNotEmpty) params['filter'] = filter;
final res = await _api.get('/api/medications', queryParameters: params.isNotEmpty ? params : null);
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<void> deleteMedication(String id) async {
await _api.delete('/api/medications/$id');
}
Future<void> confirm(String id) async {
await _api.post('/api/medications/$id/confirm');
}
@@ -120,31 +132,31 @@ class ConsultationService {
ConsultationService(this._api);
Future<List<Map<String, dynamic>>> getDoctors() async {
final res = await _api.get('/doctors');
final res = await _api.get('/api/doctors');
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<Map<String, dynamic>> getQuota() async {
final res = await _api.get('/user/consultation-quota');
final res = await _api.get('/api/user/consultation-quota');
return res.data['data'] ?? {};
}
Future<Map<String, dynamic>> createConsultation(String doctorId) async {
final res = await _api.post('/consultations', data: {'doctorId': doctorId});
final res = await _api.post('/api/consultations', data: {'doctorId': doctorId});
return res.data['data'];
}
Future<List<Map<String, dynamic>>> getMessages(String consultationId, {String? after}) async {
final params = <String, dynamic>{};
if (after != null) params['after'] = after;
final res = await _api.get('/consultations/$consultationId/messages', queryParameters: params);
final res = await _api.get('/api/consultations/$consultationId/messages', queryParameters: params);
final list = res.data['data'] as List? ?? [];
return list.cast<Map<String, dynamic>>();
}
Future<void> sendMessage(String consultationId, String content) async {
await _api.post('/consultations/$consultationId/messages', data: {'content': content});
await _api.post('/api/consultations/$consultationId/messages', data: {'content': content});
}
}
@@ -154,15 +166,33 @@ class ExerciseService {
ExerciseService(this._api);
Future<Map<String, dynamic>?> getCurrentPlan() async {
final res = await _api.get('/exercise-plans/current');
final res = await _api.get('/api/exercise-plans/current');
return res.data['data'];
}
Future<void> createPlan(Map<String, dynamic> data) async {
await _api.post('/exercise-plans', data: data);
await _api.post('/api/exercise-plans', data: data);
}
Future<void> createPlanSimple(Map<String, dynamic> data) async {
await _api.post('/api/exercise-plans', data: data);
}
Future<void> deletePlan(String id) async {
await _api.delete('/api/exercise-plans/$id');
}
Future<void> checkIn(String itemId) async {
await _api.post('/exercise-plans/items/$itemId/checkin');
await _api.post('/api/exercise-plans/items/$itemId/checkin');
}
Future<List<Map<String, dynamic>>> getPlans() async {
final res = await _api.get('/api/exercise-plans');
return (res.data['data'] as List?)?.cast<Map<String, dynamic>>() ?? [];
}
Future<Map<String, dynamic>?> getPlanDetail(String id) async {
final res = await _api.get('/api/exercise-plans/$id');
return res.data['data'];
}
}