From 24b930b1b806cf7f1f10cba62d581e0912bb0efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Wed, 14 Jan 2026 10:20:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/overtime_approval.py | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/yuthon_hr_attendance/models/overtime_approval.py b/yuthon_hr_attendance/models/overtime_approval.py index 467df2006..6f61230be 100644 --- a/yuthon_hr_attendance/models/overtime_approval.py +++ b/yuthon_hr_attendance/models/overtime_approval.py @@ -123,7 +123,6 @@ class OvertimeApprovals(models.Model): corrected_end_time = max_allowed_end_time - timedelta(hours=8) rec.end_time = corrected_end_time - @api.depends('start_time', 'end_time', 'attendance_id', 'rest_start_time', 'rest_end_time') def _compute_duration(self): for rec in self: @@ -132,18 +131,28 @@ class OvertimeApprovals(models.Model): rec.overtime_hours = 0.0 if not (rec.start_time and rec.end_time): continue + + base_start_time = rec.start_time + timedelta(hours=8) # 基准开始时间(+8小时后) + end_time = rec.end_time + timedelta(hours=8) # 结束时间(+8小时后) + + nine_clock = base_start_time.replace(hour=9, minute=0, second=0, microsecond=0) + total_seconds = 0.0 + if base_start_time < nine_clock: + morning_end = min(nine_clock, end_time) + total_seconds = (morning_end - base_start_time).total_seconds() + if rec.attendance_id.shift_id: rel_end_time = rec.attendance_id.shift_id.end_datetime + timedelta(hours=8) else: - rel_end_time = rec.start_time.replace(hour=18, minute=0, second=0, microsecond=0) + rel_end_time = base_start_time.replace(hour=18, minute=0, second=0, microsecond=0) + rel_end_time = max(rel_end_time, base_start_time) - end_time = rec.end_time + timedelta(hours=8) - rel_end_time = max(rel_end_time, rec.start_time + timedelta(hours=8)) - # 只有工作日18点开始算加班 if rec.type_overtime == 'work': - total_seconds = (end_time - rel_end_time).total_seconds() + if end_time > rel_end_time: + total_seconds = (end_time - rel_end_time).total_seconds() else: - total_seconds = (end_time - (rec.start_time + timedelta(hours=8))).total_seconds() + if end_time > base_start_time: + total_seconds = (end_time - base_start_time).total_seconds() original_hours = total_seconds / 3600 # 加班起步一小时 @@ -283,6 +292,14 @@ class OvertimeApprovals(models.Model): elif record.type_overtime == 'holiday': legal_day = record.duration + start_year = record.start_time.date().year + if record.company_id.name == "天河物管": + valid_date = datetime(start_year + 1, 2, 1).date() + relativedelta(months=1) - relativedelta(days=1) + elif record.company_id.name == "天河粮储": + valid_date = datetime(start_year + 1, 6, 30).date() + else: + valid_date = False + overtime_data = { 'vacation_id': reports_id.id, 'update_type': 'add', @@ -290,6 +307,7 @@ class OvertimeApprovals(models.Model): 'workflow_record_id': workflow_record_id.id if workflow_record_id else False, 'workday': workday, 'legal_day': legal_day, + 'valid_date': valid_date, 'public_holidays': public_holidays, 'update_date': fields.Datetime.now(), 'text': '审批'