|
|
@@ -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;
|