From fd9b96b526a0ada66f85c1bf613212e6f30b49be Mon Sep 17 00:00:00 2001 From: zhou <123@> Date: Wed, 18 Jun 2025 16:28:56 +0800 Subject: [PATCH 1/3] =?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 --- .../controllers/applet_attendance.py | 80 +++++++++++++++---- 1 file changed, 65 insertions(+), 15 deletions(-) diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py index dcfc158ed..107b32912 100644 --- a/yuthon_hr_attendance/controllers/applet_attendance.py +++ b/yuthon_hr_attendance/controllers/applet_attendance.py @@ -5,7 +5,7 @@ import logging from geopy.distance import geodesic from datetime import timedelta import json - +from dateutil.relativedelta import relativedelta _logger = logging.getLogger(__name__) @@ -214,19 +214,8 @@ class AppletAttendance(Controller): current_month_last = datetime(year, month + 1, 1) - timedelta(days=1) calendar_leaves = request.env(user=SUPERUSER_ID)['resource.calendar.leaves'].search([("calendar_id", "=", "行政考勤工作日")]) # 少一个search - holidays_list = [] # 假期 - shift_days_list = [] # 调休 - for leaves in calendar_leaves: - if leaves.holidays: - holidays_list.extend(leaves.holidays.split(',')) # 法定节假日 - if leaves.shift_replacement_day: - shift_days_list.extend(leaves.shift_replacement_day.split(',')) # 调班补班 - if leaves.alternate_rest_day: - holidays_list.extend(leaves.alternate_rest_day.split(',')) # 调休日 - holiday_data = { - "holiday_list": holidays_list, - "shift_days_list": shift_days_list, - } + # 本月的节假日 + holiday_data = self.get_holiday_data(current_month_first.date(), current_month_last.date()) # 本月考勤记录 current_attendance = request.env(user=SUPERUSER_ID)['hr.attendance'].sudo().search([ ('employee_id.user_id', '=', user_id), @@ -309,7 +298,68 @@ class AppletAttendance(Controller): }) return records - # 水电表接口 + def get_holiday_data(self, start_date_str=None, end_date_str=None): + """ + 获取指定日期范围内的假期和调休数据 + + 参数: + start_date_str: 开始日期字符串,格式为'YYYY-MM-DD' + end_date_str: 结束日期字符串,格式为'YYYY-MM-DD' + 返回: + 包含假期和调休信息的字典 + """ + # 将字符串转换为date对象 + start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date() if start_date_str else None + end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date() if end_date_str else None + # 从start_date中提取年份 + current_year = start_date.year if start_date else datetime.now().year + domain = [("calendar_id", "=", "行政考勤工作日")] + if start_date and end_date: + # 将date对象转换为datetime对象 + start_datetime = datetime.combine(start_date, datetime.min.time()) + end_datetime = datetime.combine(end_date, datetime.max.time()) + domain.extend([ + ("date_from", "<=", end_datetime), + ("date_to", ">=", start_datetime) + ]) + calendar_leaves = request.env(user=SUPERUSER_ID)['resource.calendar.leaves'].search(domain) + holidays_list = [] # 假期 + shift_days_list = [] # 调休 + for leaves in calendar_leaves: + # 处理法定节假日和调休日- 直接从date_from和date_to获取 + if leaves.date_from and leaves.date_to: + # 将datetime类型转换为date类型并格式化为YYYY-MM-DD + date_from = leaves.date_from.date().isoformat() + date_to = leaves.date_to.date().isoformat() + # 如果是同一天,只添加一次 + if date_from == date_to: + holidays_list.append(date_from) + else: + # 处理日期范围,添加从date_from到date_to的所有日期 + start_date_obj = datetime.strptime(date_from, '%Y-%m-%d').date() + end_date_obj = datetime.strptime(date_to, '%Y-%m-%d').date() + delta = end_date_obj - start_date_obj + for i in range(delta.days + 1): + day = start_date_obj + timedelta(days=i) + holidays_list.append(day.isoformat()) + + # 处理调班补班 + if leaves.shift_replacement_day: + for shift_day in leaves.shift_replacement_day.split(','): + month, day = shift_day.replace('月', '').replace('日', '').split() + formatted_date = f"{current_year}-{int(month):02d}-{int(day):02d}" + shift_days_list.append(formatted_date) + + return { + "holiday_list": holidays_list, + "shift_days_list": shift_days_list, + } + + + + + + # 水电表接口 @route('/yuthon/meter/reading', methods=['POST'], type='http', auth='none', cors='*', csrf=False) def yuthon_meter_reading(self, **kw): """ From 9f6a1be2575b9a20d8d1ab2dcdcb815eff1508c1 Mon Sep 17 00:00:00 2001 From: zhou <123@> Date: Wed, 18 Jun 2025 16:31:28 +0800 Subject: [PATCH 2/3] =?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/controllers/applet_attendance.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py index 107b32912..a000387b6 100644 --- a/yuthon_hr_attendance/controllers/applet_attendance.py +++ b/yuthon_hr_attendance/controllers/applet_attendance.py @@ -298,19 +298,16 @@ class AppletAttendance(Controller): }) return records - def get_holiday_data(self, start_date_str=None, end_date_str=None): + def get_holiday_data(self, start_date=None, end_date=None): """ 获取指定日期范围内的假期和调休数据 参数: - start_date_str: 开始日期字符串,格式为'YYYY-MM-DD' - end_date_str: 结束日期字符串,格式为'YYYY-MM-DD' + start_date: 开始日期,date类型 + end_date: 结束日期,date类型 返回: 包含假期和调休信息的字典 """ - # 将字符串转换为date对象 - start_date = datetime.strptime(start_date_str, '%Y-%m-%d').date() if start_date_str else None - end_date = datetime.strptime(end_date_str, '%Y-%m-%d').date() if end_date_str else None # 从start_date中提取年份 current_year = start_date.year if start_date else datetime.now().year domain = [("calendar_id", "=", "行政考勤工作日")] From 4fc671dd214270f4af129f0fdf09be547bc1cc89 Mon Sep 17 00:00:00 2001 From: zhou <123@> Date: Wed, 18 Jun 2025 16:32:16 +0800 Subject: [PATCH 3/3] =?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/controllers/applet_attendance.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py index a000387b6..8ff0064b3 100644 --- a/yuthon_hr_attendance/controllers/applet_attendance.py +++ b/yuthon_hr_attendance/controllers/applet_attendance.py @@ -298,7 +298,7 @@ class AppletAttendance(Controller): }) return records - def get_holiday_data(self, start_date=None, end_date=None): + def get_holiday_data(self, start_date, end_date): """ 获取指定日期范围内的假期和调休数据 @@ -309,7 +309,7 @@ class AppletAttendance(Controller): 包含假期和调休信息的字典 """ # 从start_date中提取年份 - current_year = start_date.year if start_date else datetime.now().year + current_year = start_date.year domain = [("calendar_id", "=", "行政考勤工作日")] if start_date and end_date: # 将date对象转换为datetime对象