From d2248afcc88be0d46d0d030f8e2a74e7311263f3 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: Tue, 18 Nov 2025 15:58:23 +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 --- yuthon_hr_attendance/models/hr_attendance.py | 110 ++++++++++++------- 1 file changed, 68 insertions(+), 42 deletions(-) diff --git a/yuthon_hr_attendance/models/hr_attendance.py b/yuthon_hr_attendance/models/hr_attendance.py index 1c6e100a6..6d93d3057 100644 --- a/yuthon_hr_attendance/models/hr_attendance.py +++ b/yuthon_hr_attendance/models/hr_attendance.py @@ -791,17 +791,21 @@ class HrAttendance(models.Model): else: record.week = False - def _common_card_remind(self, dept_name=None, planning_name=None, is_check_in=True): - """ - 通用打卡提醒函数(全量使用start_datetime) - :param dept_name: 部门名称(如"保安部"),为空则不筛选部门 - :param planning_name: 班次名称(如"早班") - :param is_check_in: 是否上班打卡(True=上班,False=下班) - """ + def _common_card_remind(self, dept_name=None, planning_name=None, is_check_in=True, method_name=None): + """通用打卡提醒函数""" + if not method_name: + return + now = fields.Datetime.now() + timedelta(hours=8) current_date = fields.Date.today() + timedelta(hours=8) + cron_code = f'{self._name}.{method_name}()' + cron = self.env['ir.cron'].search([('code', '=', cron_code)], limit=1) + next_call = cron.nextcall + timedelta(hours=8) + start_window = next_call - timedelta(minutes=5) + end_window = next_call + timedelta(minutes=5) + if not (start_window <= now <= end_window): + return slot_start = datetime.combine(current_date, datetime.min.time()) slot_end = datetime.combine(current_date + timedelta(days=1), datetime.min.time()) - # 构建查询条件 domain = [ ('template_id.planning_name', '=', planning_name), ('start_datetime', '>=', slot_start), @@ -811,108 +815,130 @@ class HrAttendance(models.Model): planning_slots = self.env['planning.slot'].search(domain) for slot in planning_slots: if is_check_in: - is_card = self.env['hr.attendance'].search([('employee_id', '=', slot.employee_id.id), ('check_in', '!=', False), - ('current_data', '=', current_date) - ]) + is_card = self.env['hr.attendance'].search([('employee_id', '=', slot.employee_id.id), ('check_in', '!=', False), ('current_data', '=', current_date.date())], limit=1) if not is_card: self.card_in_comment(slot.employee_id, planning_name) else: - is_card = self.env['hr.attendance'].search([('employee_id', '=', slot.employee_id.id), ('check_out', '!=', False), - ('current_data', '=', current_date) - ]) + is_card = self.env['hr.attendance'].search([('employee_id', '=', slot.employee_id.id), ('check_out', '!=', False), ('current_data', '=', current_date.date())], limit=1) if not is_card: self.card_out_comment(slot.employee_id, planning_name) # 保安部 - 早班 def ba_card_white_up(self): - self._common_card_remind(dept_name='保安部', planning_name='早班', is_check_in=True) + self._common_card_remind(dept_name='保安部', planning_name='早班', is_check_in=True, + method_name='ba_card_white_up') def ba_card_white_down(self): - self._common_card_remind(dept_name='保安部', planning_name='早班', is_check_in=False) + self._common_card_remind(dept_name='保安部', planning_name='早班', is_check_in=False, + method_name='ba_card_white_down') # 保安部 - 中班 def ba_card_mid_up(self): - self._common_card_remind(dept_name='保安部', planning_name='中班', is_check_in=True) + self._common_card_remind(dept_name='保安部', planning_name='中班', is_check_in=True, + method_name='ba_card_mid_up') def ba_card_mid_down(self): - self._common_card_remind(dept_name='保安部', planning_name='中班', is_check_in=False) + self._common_card_remind(dept_name='保安部', planning_name='中班', is_check_in=False, + method_name='ba_card_mid_down') # 保安部 - 夜班 def ba_card_night_up(self): - self._common_card_remind(dept_name='保安部', planning_name='夜班', is_check_in=True) + self._common_card_remind(dept_name='保安部', planning_name='夜班', is_check_in=True, + method_name='ba_card_night_up') def ba_card_night_down(self): - self._common_card_remind(dept_name='保安部', planning_name='夜班', is_check_in=False) + self._common_card_remind(dept_name='保安部', planning_name='夜班', is_check_in=False, + method_name='ba_card_night_down') - # 保安部 - 旧晚(旧区府晚班 + # 保安部 - 旧晚(旧区府晚班) def ba_card_old_night_up(self): - self._common_card_remind(dept_name='保安部', planning_name='旧晚(旧区府晚班)', is_check_in=True,) + self._common_card_remind(dept_name='保安部', planning_name='旧晚(旧区府晚班)', is_check_in=True, + method_name='ba_card_old_night_up') def ba_card_old_night_down(self): - self._common_card_remind(dept_name='保安部', planning_name='旧晚(旧区府晚班)', is_check_in=False) + self._common_card_remind(dept_name='保安部', planning_name='旧晚(旧区府晚班)', is_check_in=False, + method_name='ba_card_old_night_down') # 保安部 - 旧白(旧区府白班) def ba_card_old_white_up(self): - self._common_card_remind(dept_name='保安部', planning_name='旧白(旧区府白班)', is_check_in=True) + self._common_card_remind(dept_name='保安部', planning_name='旧白(旧区府白班)', is_check_in=True, + method_name='ba_card_old_white_up') def ba_card_old_white_down(self): - self._common_card_remind(dept_name='保安部', planning_name='旧白(旧区府白班)', is_check_in=False) + self._common_card_remind(dept_name='保安部', planning_name='旧白(旧区府白班)', is_check_in=False, + method_name='ba_card_old_white_down') # 工程部 - 白班 def gc_white_in_remind(self): - self._common_card_remind(dept_name='工程部', planning_name='白班', is_check_in=True) + self._common_card_remind(dept_name='工程部', planning_name='白班', is_check_in=True, + method_name='gc_white_in_remind') def gc_white_out_remind(self): - self._common_card_remind(dept_name='工程部', planning_name='白班', is_check_in=False) + self._common_card_remind(dept_name='工程部', planning_name='白班', is_check_in=False, + method_name='gc_white_out_remind') # 工程部 - 白值 def gc_white_remind_in(self): - self._common_card_remind(dept_name='工程部', planning_name='白值', is_check_in=True) + self._common_card_remind(dept_name='工程部', planning_name='白值', is_check_in=True, + method_name='gc_white_remind_in') def gc_white_remind_out(self): - self._common_card_remind(dept_name='工程部', planning_name='白值', is_check_in=False) + self._common_card_remind(dept_name='工程部', planning_name='白值', is_check_in=False, + method_name='gc_white_remind_out') # 工程部 - 中夜 def gc_night_remind_in(self): - self._common_card_remind(dept_name='工程部', planning_name='中夜', is_check_in=True) + self._common_card_remind(dept_name='工程部', planning_name='中夜', is_check_in=True, + method_name='gc_night_remind_in') def gc_night_remind_out(self): - self._common_card_remind(dept_name='工程部', planning_name='中夜', is_check_in=False) + self._common_card_remind(dept_name='工程部', planning_name='中夜', is_check_in=False, + method_name='gc_night_remind_out') - # 工程部 - 旧晚(旧区府晚班 + # 工程部 - 旧晚(旧区府晚班) def card_old_night_remind_in(self): - self._common_card_remind(dept_name='工程部', planning_name='旧晚(旧区府晚班)', is_check_in=True) + self._common_card_remind(dept_name='工程部', planning_name='旧晚(旧区府晚班)', is_check_in=True, + method_name='card_old_night_remind_in') def card_old_night_remind_out(self): - self._common_card_remind(dept_name='工程部', planning_name='旧晚(旧区府晚班)', is_check_in=False) + self._common_card_remind(dept_name='工程部', planning_name='旧晚(旧区府晚班)', is_check_in=False, + method_name='card_old_night_remind_out') # 工程部 - 旧白(旧区府白班) def card_old_day_remind_in(self): - self._common_card_remind(dept_name='工程部', planning_name='旧白(旧区府白班)', is_check_in=True) + self._common_card_remind(dept_name='工程部', planning_name='旧白(旧区府白班)', is_check_in=True, + method_name='card_old_day_remind_in') def card_old_day_remind_out(self): - self._common_card_remind(dept_name='工程部', planning_name='旧白(旧区府白班)', is_check_in=False) + self._common_card_remind(dept_name='工程部', planning_name='旧白(旧区府白班)', is_check_in=False, + method_name='card_old_day_remind_out') # 粮储-白班 def card_lc_remind_in(self): - self._common_card_remind(dept_name='联安粮库', planning_name='白班', is_check_in=True) + self._common_card_remind(dept_name='联安粮库', planning_name='白班', is_check_in=True, + method_name='card_lc_remind_in') def card_lc_remind_out(self): - self._common_card_remind(dept_name='联安粮库', planning_name='白班', is_check_in=False) + self._common_card_remind(dept_name='联安粮库', planning_name='白班', is_check_in=False, + method_name='card_lc_remind_out') # 粮储-值班(白值) def card_lc_shift_remind_in(self): - self._common_card_remind(dept_name='联安粮库', planning_name='白值', is_check_in=True) + self._common_card_remind(dept_name='联安粮库', planning_name='白值', is_check_in=True, + method_name='card_lc_shift_remind_in') def card_lc_shift_remind_out(self): - self._common_card_remind(dept_name='联安粮库', planning_name='白值', is_check_in=False) + self._common_card_remind(dept_name='联安粮库', planning_name='白值', is_check_in=False, + method_name='card_lc_shift_remind_out') # 保安计划行政 def card_lc_shift_remind_on_administrative(self): - self._common_card_remind(dept_name='保安部', planning_name='保安计划行政', is_check_in=True) + self._common_card_remind(dept_name='保安部', planning_name='保安计划行政', is_check_in=True, + method_name='card_lc_shift_remind_on_administrative') def card_lc_shift_remind_out_administrative(self): - self._common_card_remind(dept_name='保安部', planning_name='保安计划行政', is_check_in=False) + self._common_card_remind(dept_name='保安部', planning_name='保安计划行政', is_check_in=False, + method_name='card_lc_shift_remind_out_administrative') def card_in_comment(self, employee_id, planning_name): data = f"您的班次是{planning_name},还有5分钟上班,记得打卡"