diff --git a/yuthon_hr_attendance/models/yuthon_shift_approval.py b/yuthon_hr_attendance/models/yuthon_shift_approval.py index 41e28b1cb..d6494fb95 100644 --- a/yuthon_hr_attendance/models/yuthon_shift_approval.py +++ b/yuthon_hr_attendance/models/yuthon_shift_approval.py @@ -17,7 +17,7 @@ class YuthonShiftApproval(models.Model): alternate_id = fields.Many2one('resource.resource', string="顶班对象", domain="[('id', 'in', resource_ids)]") alternate_shifts = fields.Selection([('transferees', '换班'), ('alternate', '顶班')], string="申请类型" , default='transferees') shift_date = fields.Date(string="日期") - shift_id = fields.Many2one('planning.slot', string="我的班次", compute='_compute_shift_id') + shift_id = fields.Many2one('planning.slot', string="我的班次") shift_two_date = fields.Date(string="日期") shift_two_id = fields.Many2one('planning.slot', string="我的班次") return_date = fields.Date(string="日期") @@ -42,6 +42,59 @@ class YuthonShiftApproval(models.Model): name_title = fields.Char(default=_get_default_name_title) self_users_ids = fields.Many2many('res.users', string="当前经办人", default=lambda self: [(6, 0, [self.env.user.id])]) + @api.onchange('shift_date', 'resource_id', + 'shift_two_date', + 'return_date', 'transferees_id', 'alternate_id', 'alternate_shifts', + 'return_two_date') + def _onchange_shifts(self): + # 1. 校验并计算"我的班次" + if self.shift_date and self.resource_id: + slot = self._get_slot(self.resource_id.id, self.shift_date) + if not slot: + raise UserError(f"申请人在 {self.shift_date} 没有班次,请重新选择日期!") + self.shift_id = slot + else: + self.shift_id = False + + # 2. 校验并计算"我的第二班次" + if self.shift_two_date and self.resource_id: + slot = self._get_slot(self.resource_id.id, self.shift_two_date) + if not slot: + raise UserError(f"申请人在 {self.shift_two_date} 没有班次,请重新选择日期!") + self.shift_two_id = slot + else: + self.shift_two_id = False + + # 3. 确定对方资源 + other_resource = self.transferees_id if self.alternate_shifts == 'transferees' else self.alternate_id + + # 4. 校验并计算"对方班次" + if self.return_date and other_resource: + slot = self._get_slot(other_resource.id, self.return_date) + if not slot: + raise UserError(f"{other_resource.name} 在 {self.return_date} 没有班次,请重新选择日期!") + self.return_id = slot + else: + self.return_id = False + + # 5. 校验并计算"对方第二班次" + if self.return_two_date and other_resource: + slot = self._get_slot(other_resource.id, self.return_two_date) + if not slot: + raise UserError(f"{other_resource.name} 在 {self.return_two_date} 没有班次,请重新选择日期!") + self.return_two_id = slot + else: + self.return_two_id = False + + def _get_slot(self, resource_id, date): + if not resource_id or not date: + return False + return self.env['planning.slot'].search([ + ('resource_id', '=', resource_id), + ('start_datetime', '>=', f"{date} 00:00:00"), + ('end_datetime', '<=', f"{date} 23:59:59") + ], limit=1) + @api.onchange('is_issues') def _onchange_is_issues(self): if self.is_issues: diff --git a/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml b/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml index b2ec3cb61..f4f52e483 100644 --- a/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml +++ b/yuthon_hr_attendance/views/yuthon_shift_approval_views.xml @@ -44,7 +44,7 @@