From 63f66ee2e4dfb5bf98e901e21cf99c27165d30a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 29 May 2026 17:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=81=87=E6=9C=9F=E5=88=86=E9=85=8D=E6=8B=92?= =?UTF-8?q?=E7=BB=9D=E5=90=8C=E6=AD=A5=EF=BC=8C=E5=AD=97=E6=AE=B5=E4=B8=8D?= =?UTF-8?q?=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/inherit_hr_leave_allocation.py | 96 ++++++++++++++++++- yuthon_issue/views/issue_library_views.xml | 8 +- 2 files changed, 99 insertions(+), 5 deletions(-) diff --git a/yuthon_holiday/models/inherit_hr_leave_allocation.py b/yuthon_holiday/models/inherit_hr_leave_allocation.py index 9f86c829a..ccff80585 100644 --- a/yuthon_holiday/models/inherit_hr_leave_allocation.py +++ b/yuthon_holiday/models/inherit_hr_leave_allocation.py @@ -228,10 +228,98 @@ class HrLeaveAllocation(models.Model): return super(HrLeaveAllocation, self).unlink() + def action_refuse(self): + """拒绝假期分配时,删除之前验证时添加的明细行并重新计算""" + import logging + logger = logging.getLogger(__name__) + + result = super(HrLeaveAllocation, self).action_refuse() + + for leave in self: + logger.info("===== 拒绝假期分配处理开始 =====") + logger.info(f"假期分配ID: {leave.id}") + logger.info(f"假期类型: {leave.holiday_status_id.name}") + logger.info(f"员工ID: {leave.employee_id.id}, 员工姓名: {leave.employee_id.name}") + logger.info(f"date_from: {leave.date_from}") + logger.info(f"分配类型: {leave.allocation_type}") + + # 使用date_from或date_to计算月份 + if leave.date_from: + vacation_date = leave.date_from.replace(day=1) + elif leave.date_to: + vacation_date = leave.date_to.replace(day=1) + else: + vacation_date = fields.Date.today().replace(day=1) + logger.info(f"vacation_date: {vacation_date}") + + reports_id = self.env['yuthon.vacation.reports'].search([ + ('employee_id', '=', leave.employee_id.id), + ('vacation_date', '=', vacation_date) + ], limit=1) + + logger.info(f"找到的reports_id: {reports_id}") + + if not reports_id: + logger.info("未找到对应的考勤报告记录") + continue + + if leave.holiday_status_id.name == '年假': + # 精确查找并删除当前表单添加的年假明细行 + lines_to_delete = reports_id.leave_ids.filtered( + lambda l: l.update_type == 'add' and l.allocation_id.id == leave.id + ) + logger.info(f"找到需要删除的年假明细行数量: {len(lines_to_delete)}") + if lines_to_delete: + lines_to_delete.unlink() + reports_id.update_line() + logger.info("年假明细行已删除并重新计算") + else: + # 尝试按旧方式查找(没有allocation_id的记录) + old_lines = reports_id.leave_ids.filtered( + lambda l: l.update_type == 'add' and f'({leave.id})' in (l.text or '') + ) + logger.info(f"按旧方式找到的明细行数量: {len(old_lines)}") + if old_lines: + old_lines.unlink() + reports_id.update_line() + logger.info("按旧方式删除年假明细行并重新计算") + + elif leave.holiday_status_id.name == '补休': + # 精确查找并删除当前表单添加的补休明细行 + lines_to_delete = reports_id.overtime_ids.filtered( + lambda o: o.update_type == 'add' and o.allocation_id.id == leave.id + ) + logger.info(f"找到需要删除的补休明细行数量: {len(lines_to_delete)}") + if lines_to_delete: + lines_to_delete.unlink() + reports_id.update_line() + logger.info("补休明细行已删除并重新计算") + else: + # 尝试按旧方式查找 + old_lines = reports_id.overtime_ids.filtered( + lambda o: o.update_type == 'add' and f'({leave.id})' in (o.text or '') + ) + logger.info(f"按旧方式找到的明细行数量: {len(old_lines)}") + if old_lines: + old_lines.unlink() + reports_id.update_line() + logger.info("按旧方式删除补休明细行并重新计算") + + logger.info("===== 拒绝假期分配处理结束 =====") + + return result + def action_validate(self): + import logging + logger = logging.getLogger(__name__) + result = super(HrLeaveAllocation, self).action_validate() for leave in self: + logger.info("===== 验证假期分配处理开始 =====") + logger.info(f"假期分配ID: {leave.id}") + logger.info(f"假期类型: {leave.holiday_status_id.name}") + logger.info(f"number_of_days_display: {leave.number_of_days_display}") if leave.holiday_status_id.name == '年假': vacation_date = leave.date_from.replace(day=1) if leave.date_from else fields.Date.today().replace(day=1) @@ -242,17 +330,22 @@ class HrLeaveAllocation(models.Model): if reports_id: leave_hours = leave.number_of_days_display * 8 + logger.info(f"准备写入年假明细行: allocation_id={leave.id}, update_lines={leave_hours}, text={leave.name}") reports_id.write({ 'valid_date': leave.date_to, 'leave_ids': [(0, 0, { 'vacation_id': reports_id.id, + 'allocation_id': leave.id, 'update_type': 'add', 'update_date': fields.Datetime.now(), 'valid_date': leave.date_from, 'update_lines': leave_hours, - 'text': '年假分配' + 'text': leave.name })] }) + # 验证是否写入成功 + new_line = reports_id.leave_ids.filtered(lambda l: l.allocation_id.id == leave.id) + logger.info(f"写入后的年假明细行: {new_line}") reports_id.update_line() elif leave.holiday_status_id.name == '补休': @@ -269,6 +362,7 @@ class HrLeaveAllocation(models.Model): 'valid_date1': leave.date_to, 'overtime_ids': [(0, 0, { 'vacation_id': reports_id.id, + 'allocation_id': leave.id, 'update_type': 'add', 'update_date': fields.Datetime.now(), 'valid_date': leave.date_to, diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml index d5507f318..5f19b06f6 100644 --- a/yuthon_issue/views/issue_library_views.xml +++ b/yuthon_issue/views/issue_library_views.xml @@ -248,7 +248,7 @@ + context="{'search_default_group_scope': 1}" options="{'no_create': True}"/> + context="{'search_default_group_scope': 1}" options="{'no_create': True}"/> @@ -773,7 +773,7 @@ + context="{'search_default_group_scope': 1}" options="{'no_create': True}"/> @@ -970,7 +970,7 @@ + context="{'search_default_group_scope': 1}" options="{'no_create': True}"/>