import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../../core/theme/app_colors.dart'; import '../../core/utils/responsive.dart'; import '../../shared/widgets/form_section.dart'; import 'outing_log_api.dart'; import 'outing_log_model.dart'; class OutingLogCreatePage extends ConsumerStatefulWidget { const OutingLogCreatePage({super.key}); @override ConsumerState createState() => _OutingLogCreatePageState(); } class _OutingLogCreatePageState extends ConsumerState { final _contentCtrl = TextEditingController(); final _clientCtrl = TextEditingController(); final _addressCtrl = TextEditingController(); DateTime _date = DateTime.now(); bool _isSubmitting = false; @override void dispose() { _contentCtrl.dispose(); _clientCtrl.dispose(); _addressCtrl.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final r = ResponsiveHelper.of(context); return Scaffold( appBar: AppBar(title: const Text('新建外出日志')), body: Column( children: [ Expanded( child: Center( child: ConstrainedBox( constraints: BoxConstraints(maxWidth: r.formMaxWidth), child: SingleChildScrollView( padding: const EdgeInsets.symmetric(vertical: 8), child: FormSection( title: '日志信息', children: [ ListTile( title: const Text('日期', style: TextStyle(color: AppColors.textSecondary, fontSize: 13)), trailing: Text('${_date.year}-${_date.month.toString().padLeft(2, '0')}-${_date.day.toString().padLeft(2, '0')}', style: const TextStyle(color: AppColors.textPrimary, fontSize: 13)), onTap: () async { final picked = await showDatePicker(context: context, initialDate: _date, firstDate: DateTime(2020), lastDate: DateTime(2030)); if (picked != null) setState(() => _date = picked); }, ), _buildTextField('拜访客户', _clientCtrl), _buildTextField('拜访地点', _addressCtrl), _buildTextField('日志内容', _contentCtrl, maxLines: 5), ], ), ), ), ), ), Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration(color: Colors.white, boxShadow: [BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 4, offset: const Offset(0, -1))]), child: ElevatedButton( onPressed: _isSubmitting ? null : _submit, child: _isSubmitting ? const SizedBox(width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2, color: Colors.white)) : const Text('提交'), ), ), ], ), ); } Widget _buildTextField(String label, TextEditingController ctrl, {int maxLines = 1}) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 6), child: TextField( controller: ctrl, maxLines: maxLines, decoration: InputDecoration(labelText: label, border: const OutlineInputBorder(), floatingLabelStyle: const TextStyle(color: AppColors.primary)), ), ); } Future _submit() async { setState(() => _isSubmitting = true); try { await ref.read(outingLogApiProvider).create(OutingLogModel( id: '', visitNo: '', salespersonId: '', salespersonName: '', deptId: '', deptName: '', customerName: _clientCtrl.text, visitDate: _date, visitStartTime: _date, visitEndTime: _date, visitType: '常规拜访', visitPurpose: '', visitLocation: _addressCtrl.text, visitSummary: _contentCtrl.text, nextVisitTime: _date, createTime: DateTime.now(), updateTime: DateTime.now(), )); if (context.mounted) context.pop(); } catch (_) {} finally { if (mounted) setState(() => _isSubmitting = false); } } }