outing_log_detail_page.dart 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import '../../core/theme/app_colors.dart';
  4. import '../../core/utils/date_utils.dart' as du;
  5. import '../../core/utils/responsive.dart';
  6. import '../../shared/widgets/form_section.dart';
  7. import '../../shared/widgets/form_field_row.dart';
  8. import 'outing_log_model.dart';
  9. final outingLogDetailProvider = FutureProvider.autoDispose.family<OutingLogModel, String>((ref, id) async {
  10. await Future.delayed(const Duration(milliseconds: 300));
  11. return OutingLogModel(
  12. id: id,
  13. visitNo: 'VL202605001',
  14. salespersonId: 'u-001',
  15. salespersonName: '张三',
  16. deptId: 'dept-001',
  17. deptName: '市场部',
  18. customerName: '华软科技',
  19. visitDate: DateTime(2026, 5, 20),
  20. visitStartTime: DateTime(2026, 5, 20, 9, 0),
  21. visitEndTime: DateTime(2026, 5, 20, 11, 30),
  22. visitType: '常规拜访',
  23. visitPurpose: '产品演示及方案交流',
  24. visitLocation: '深圳市南山区科技园',
  25. visitSummary: '向客户展示了公司最新产品功能,客户对数据看板功能比较感兴趣,约定下周安排试用。',
  26. nextVisitTime: DateTime(2026, 5, 27),
  27. status: '已完成',
  28. createTime: DateTime(2026, 5, 20),
  29. updateTime: DateTime(2026, 5, 20),
  30. );
  31. });
  32. class OutingLogDetailPage extends ConsumerWidget {
  33. final String id;
  34. const OutingLogDetailPage({super.key, required this.id});
  35. @override
  36. Widget build(BuildContext context, WidgetRef ref) {
  37. final detailAsync = ref.watch(outingLogDetailProvider(id));
  38. final r = ResponsiveHelper.of(context);
  39. return Scaffold(
  40. appBar: AppBar(title: const Text('日志详情')),
  41. body: detailAsync.when(
  42. loading: () => const Center(child: CircularProgressIndicator()),
  43. error: (_, __) => const Center(child: Text('加载失败')),
  44. data: (log) => Center(
  45. child: ConstrainedBox(
  46. constraints: BoxConstraints(maxWidth: r.detailTwoColumns ? 700 : double.infinity),
  47. child: SingleChildScrollView(
  48. padding: const EdgeInsets.symmetric(vertical: 8),
  49. child: FormSection(
  50. title: '外出日志',
  51. children: [
  52. FormFieldRow(label: '拜访单号', value: log.visitNo, showArrow: false),
  53. FormFieldRow(label: '日期', value: du.DateUtils.formatDate(log.visitDate), showArrow: false),
  54. FormFieldRow(label: '拜访客户', value: log.customerName.isEmpty ? '-' : log.customerName, showArrow: false),
  55. FormFieldRow(label: '联系人', value: log.contactName.isEmpty ? '-' : log.contactName, showArrow: false),
  56. FormFieldRow(label: '拜访方式', value: log.visitType, showArrow: false),
  57. FormFieldRow(label: '拜访地点', value: log.visitLocation.isEmpty ? '-' : log.visitLocation, showArrow: false),
  58. FormFieldRow(label: '拜访结果', value: log.visitResult.isEmpty ? '-' : log.visitResult, showArrow: false),
  59. FormFieldRow(label: '打卡校验', value: log.checkInStatus, showArrow: false),
  60. FormFieldRow(label: '创建人', value: log.salespersonName, showArrow: false),
  61. FormFieldRow(label: '创建时间', value: du.DateUtils.formatDateTime(log.createTime), showArrow: false),
  62. const SizedBox(height: 8),
  63. const Padding(
  64. padding: EdgeInsets.symmetric(horizontal: 14),
  65. child: Text('日志内容', style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.textSecondary)),
  66. ),
  67. Padding(
  68. padding: const EdgeInsets.all(14),
  69. child: Text(log.visitSummary.isEmpty ? '-' : log.visitSummary, style: const TextStyle(color: AppColors.textPrimary, fontSize: 14, height: 1.6)),
  70. ),
  71. ],
  72. ),
  73. ),
  74. ),
  75. ),
  76. ),
  77. );
  78. }
  79. }