From 68c239ea44b426580dcc6b78f8ee81af0692c367 Mon Sep 17 00:00:00 2001 From: ljmwkx <1340053001@qq.com> Date: Tue, 31 Dec 2024 17:16:58 +0800 Subject: [PATCH] =?UTF-8?q?=20=E8=A1=8C=E6=94=BF=E7=8F=AD=E6=AC=A1?= =?UTF-8?q?=E4=B9=9F=E4=BD=BF=E7=94=A8=E5=8C=BA=E9=97=B4=EF=BC=8C=20?= =?UTF-8?q?=E8=AF=B7=E5=85=88=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/hr_attendance_detail_wechat.py | 116 +++++++++++------- 1 file changed, 70 insertions(+), 46 deletions(-) diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index edba2c6f3..53713555d 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -620,13 +620,13 @@ class HrAttendanceDetail(models.Model): return True self._do_not_planning_role(user, current_date, attendance_obj) - # 查询出当前抓取微信的当前时间的所有数据 - attendance_detail_obj = self.env['hr.attendance.detail'].sudo().search( - [("userid", "=", user.oauth_uid), - ("checkin_time", ">=", current_datetime_start - timedelta(hours=8)), - ("checkin_time", "<=", current_datetime_end - timedelta(hours=8))]) - # 关联 打卡详情 - attendance_detail_obj.hr_attendance_id = attendance_obj.id + # # 查询出当前抓取微信的当前时间的所有数据 + # attendance_detail_obj = self.env['hr.attendance.detail'].sudo().search( + # [("userid", "=", user.oauth_uid), + # ("checkin_time", ">=", current_datetime_start - timedelta(hours=8)), + # ("checkin_time", "<=", current_datetime_end - timedelta(hours=8))]) + # # 关联 打卡详情 + # attendance_detail_obj.hr_attendance_id = attendance_obj.id return True def _do_plan_save_wx_attendance_data(self, user, current_date): @@ -685,51 +685,75 @@ class HrAttendanceDetail(models.Model): max_hour_to = self.env['resource.calendar'].search([])[0].attendance_ids[-1].hour_to max_hour = int(max_hour_to) max_minute = int(max_hour_to * 10 % max_hour_to) + will_datetime_start = current_datetime_start.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8) + will_datetime_end = current_datetime_end.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8) # 判断打卡情况排除未打卡情况 - attendance_detail_obj = self.env['hr.attendance.detail'].sudo().search( + # 6:00 - 17:00 // 10.00 - // 5.00。 + # 改为区间打卡 + check_in_start = datetime.strptime(str(current_date) + " " + "06:00", "%Y-%m-%d %H:%M") - timedelta(hours=8) + check_in_end = datetime.strptime(str(current_date) + " " + "17:00", "%Y-%m-%d %H:%M") - timedelta(hours=8) + check_out_start = datetime.strptime(str(current_date) + " " + "10:00", "%Y-%m-%d %H:%M") - timedelta(hours=8) + check_out_end = datetime.strptime(str(current_date) + " " + "05:00", "%Y-%m-%d %H:%M") + relativedelta(days=1) - timedelta(hours=8) + + # 上班 + attendance_detail_obj_in = self.env['hr.attendance.detail'].sudo().search( [("exception_type", "!=", "未打卡"), ("userid", "=", user.oauth_uid), - ("checkin_time", ">=", current_datetime_start - timedelta(hours=8)), - ("checkin_time", "<=", current_datetime_end - timedelta(hours=8))]) + ("checkin_time", ">=", check_in_start), + ("checkin_time", "<=", check_in_end)]) + # 关联 打卡详情 + attendance_detail_obj_in.hr_attendance_id = attendance_obj.id # 没有打卡记录说明缺卡 - if len(attendance_detail_obj) <= 0: + if len(attendance_detail_obj_in) <= 0: attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) - return True - # 打了一次卡记录说明缺卡 - elif len(attendance_detail_obj) == 1: - checkin_time = attendance_detail_obj.checkin_time - will_datetime_start = current_datetime_start.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8) - will_datetime_end = current_datetime_end.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8) - # 既不是上班也不是下班,默认为上班打卡 - attendance_obj.sudo().write({ - "sch_check_in_time": will_datetime_start, - "check_in": checkin_time, - "is_late_card": checkin_time > will_datetime_start, - "is_no_card": True, - "is_abnormal": True, - }) - return True else: # 多次打卡时间的集合 - checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj] - # 最早 和 最晚 时间 + checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj_in] + # 最早 时间 min_time = min(checkin_time_list) - max_time = max(checkin_time_list) - - # 赋值企业微信打卡数据 - will_datetime_start = current_datetime_start.replace(hour=min_hour, minute=min_minute) - timedelta(hours=8) - will_datetime_end = current_datetime_end.replace(hour=max_hour, minute=max_minute) - timedelta(hours=8) # 查询最早时间上班时间 查询最晚下班时间 attendance_obj.sudo().write({ - "is_no_card": False, "sch_check_in_time": will_datetime_start, "check_in": min_time, "is_late_card": min_time > will_datetime_start, - "sch_check_out_time": will_datetime_end, - "check_out": max_time, - "is_early_card": will_datetime_end > max_time, - "is_abnormal": min_time > will_datetime_start or will_datetime_end > max_time, + "is_no_card": False, + "is_abnormal": False, }) + # 下班 + attendance_detail_obj_out = self.env['hr.attendance.detail'].sudo().search( + [("exception_type", "!=", "未打卡"), + ("userid", "=", user.oauth_uid), + ("checkin_time", ">=", check_out_start), + ("checkin_time", "<=", check_out_end), + ]) + # 关联 打卡详情 + attendance_detail_obj_out.hr_attendance_id = attendance_obj.id + + if len(attendance_detail_obj_out) <= 0: + attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) + # 打了一次卡记录说明缺卡 + else: + # 多次打卡时间的集合 + checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj_out] + # 最早 时间 + max_time = max(checkin_time_list) + # 如果上班没有打卡 + if not attendance_obj.check_in: + attendance_obj.sudo().write({ + "sch_check_in_time": will_datetime_start, + "check_in": max_time, + "is_late_card": max_time < will_datetime_start, + "is_no_card": True, + "is_abnormal": True, + }) + else: + attendance_obj.sudo().write({ + "sch_check_out_time": will_datetime_end, + "check_out": max_time, + "is_late_card": max_time < will_datetime_end, + "is_no_card": False, + "is_abnormal": False, + }) return True def _do_planning_role(self, user, current_date, attendance_obj, planning_id): @@ -788,21 +812,21 @@ class HrAttendanceDetail(models.Model): # 判断打卡情况排除未打卡情况 # 上班 - attendance_detail_obj = self.env['hr.attendance.detail'].sudo().search( + attendance_detail_obj_in = self.env['hr.attendance.detail'].sudo().search( [("exception_type", "!=", "未打卡"), ("userid", "=", user.oauth_uid), ("checkin_time", ">=", check_in_start), ("checkin_time", "<=", check_in_end), ]) # 关联 打卡详情 - attendance_detail_obj.hr_attendance_id = attendance_obj.id + attendance_detail_obj_in.hr_attendance_id = attendance_obj.id - if len(attendance_detail_obj) <= 0: + if len(attendance_detail_obj_in) <= 0: attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) # 打了一次卡记录说明缺卡 else: # 多次打卡时间的集合 - checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj] + checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj_in] # 最早 时间 min_time = min(checkin_time_list) attendance_obj.sudo().write({ @@ -814,21 +838,21 @@ class HrAttendanceDetail(models.Model): }) # 下班 - attendance_detail_obj = self.env['hr.attendance.detail'].sudo().search( + attendance_detail_obj_out = self.env['hr.attendance.detail'].sudo().search( [("exception_type", "!=", "未打卡"), ("userid", "=", user.oauth_uid), ("checkin_time", ">=", check_out_start), ("checkin_time", "<=", check_out_end), ]) # 关联 打卡详情 - attendance_detail_obj.hr_attendance_id = attendance_obj.id + attendance_detail_obj_out.hr_attendance_id = attendance_obj.id - if len(attendance_detail_obj) <= 0: + if len(attendance_detail_obj_out) <= 0: attendance_obj.sudo().write({"is_no_card": True, "is_abnormal": True}) # 打了一次卡记录说明缺卡 else: # 多次打卡时间的集合 - checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj] + checkin_time_list = [obj.checkin_time for obj in attendance_detail_obj_out] # 最早 时间 max_time = max(checkin_time_list) # 如果上班没有打卡