소스 검색

加班申请单:加班时长计算优化

chengc 1 일 전
부모
커밋
f8034adb8b
1개의 변경된 파일18개의 추가작업 그리고 3개의 파일을 삭제
  1. 18 3
      lib/features/overtime/widgets/overtime_apply_detail_dialog.dart

+ 18 - 3
lib/features/overtime/widgets/overtime_apply_detail_dialog.dart

@@ -332,7 +332,10 @@ class _OvertimeApplyDetailDialogState extends State<OvertimeApplyDetailDialog> {
     }
     final st = DateTime.tryParse(_startTime);
     final et = DateTime.tryParse(_endTime);
-    if (st == null || et == null || et.isBefore(st) || et.isAtSameMomentAs(st)) {
+    if (st == null ||
+        et == null ||
+        et.isBefore(st) ||
+        et.isAtSameMomentAs(st)) {
       TDToast.showText(_l10n.get('endTimeMustLater'), context: context);
       return;
     }
@@ -415,7 +418,13 @@ class _OvertimeApplyDetailDialogState extends State<OvertimeApplyDetailDialog> {
                           _buildStartTimePicker(colors),
                           if (_startTime.isNotEmpty &&
                               _endTime.isNotEmpty &&
-                              () { final st = DateTime.tryParse(_startTime); final et = DateTime.tryParse(_endTime); return st != null && et != null && !et.isAfter(st); }())
+                              () {
+                                final st = DateTime.tryParse(_startTime);
+                                final et = DateTime.tryParse(_endTime);
+                                return st != null &&
+                                    et != null &&
+                                    !et.isAfter(st);
+                              }())
                             Padding(
                               padding: const EdgeInsets.only(top: 8),
                               child: _buildTimeErrorHint(),
@@ -857,9 +866,15 @@ class _OvertimeApplyDetailDialogState extends State<OvertimeApplyDetailDialog> {
   void _autoCalcHours() {
     if (_startTime.isEmpty || _endTime.isEmpty) return;
     final st = DateTime.tryParse(_startTime);
-    final et = DateTime.tryParse(_endTime);
+    DateTime? et = DateTime.tryParse(_endTime);
     if (st == null || et == null) return;
 
+    // 结束时间 23:59 视为当天结束(24:00),时长补 1 分钟。
+    // 数据库不支持 "24:00" 格式,同一天约束下以 23:59 表达"加班到晚上12点整"。
+    if (et.hour == 23 && et.minute == 59) {
+      et = et.add(const Duration(minutes: 1));
+    }
+
     double totalHours = et.difference(st).inMinutes / 60.0;
     // 跨午夜:结束时间早于开始时间 → 加 24 小时
     if (totalHours < 0) totalHours += 24;