| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 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<OutingLogCreatePage> createState() => _OutingLogCreatePageState();
- }
- class _OutingLogCreatePageState extends ConsumerState<OutingLogCreatePage> {
- 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<void> _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);
- }
- }
- }
|