diff --git a/yuthon_hr_attendance/models/yuthon_run_planning.py b/yuthon_hr_attendance/models/yuthon_run_planning.py index ef834e56c..3a54f55ba 100644 --- a/yuthon_hr_attendance/models/yuthon_run_planning.py +++ b/yuthon_hr_attendance/models/yuthon_run_planning.py @@ -1,3 +1,5 @@ +from dateutils import years + from odoo import api, fields, models, tools, _ from datetime import datetime, time, timedelta from odoo.exceptions import UserError @@ -8,62 +10,110 @@ class YuthonRunPlanning(models.Model): _description = '运行班排班计划' name = fields.Char(string='排班计划名称', required=True) - number_of_shifts = fields.Integer(string='轮班次数', default=0) illustrate = fields.Char(string='排班说明', default='默认轮排到下个月') - engineering_run_ids = fields.One2many('yuthon.engineering.run.line', 'engineering_planning_id', string='关联运行班排班明细') + engineering_run_ids = fields.One2many('yuthon.engineering.run.line', 'engineering_planning_id', + string='关联运行班排班明细') def confirm(self): - start_date = datetime.now().replace(day=1, hour=0, minute=0, second=0, microsecond=0) # 获取本月第一天零点 - end_date = (start_date + timedelta(days=32)).replace(day=1) # 获取下个月第一天零点 - role_a = self.env['planning.role'].search([('name', '=', '运行班白班')], limit=1) - role_b = self.env['planning.role'].search([('name', '=', '运行班中值夜班')], limit=1) - - end_date = start_date + timedelta(days=30) - employees = self.engineering_run_ids - num_employees = len(employees) - for employee in employees: - current_date = start_date - # 计算下个月的第一天 - if current_date.month == 12: - next_month_start = datetime(current_date.year + 1, 1, 1, 0, 0, 0) - else: - next_month_start = datetime(current_date.year, current_date.month + 1, 1, 0, 0, 0) - - while current_date < next_month_start and current_date <= end_date: - self.create_planning_slot(employee, role_a.id, self.get_role_template(role_a), current_date) - current_date += timedelta(days=1) - - current_date = start_date - while current_date <= end_date: - current_employee = employees[(current_date - start_date).days % num_employees] - self.create_planning_slot(current_employee, role_b.id, self.get_role_template(role_b), current_date) - current_date += timedelta(days=1) - - def create_planning_slot(self, record, role, role_template, current_date): - start_hour = int(role_template.start_time) - start_minute = int(round((role_template.start_time - start_hour) * 60)) - end_hour = int(role_template.end_time) - end_minute = int(round((role_template.end_time - end_hour) * 60)) - - start_time = current_date.replace(hour=start_hour, minute=start_minute, second=0, - microsecond=0) + timedelta(hours=16) - if role_template.end_time < role_template.start_time: - end_time = (current_date + timedelta(days=1)).replace(hour=end_hour, minute=end_minute, second=0, - microsecond=0) + timedelta(hours=16) + today = datetime.today().date() + first_day_of_month = today.replace(day=1) + if today.month < 12: + last_day_of_month = (today.replace(month=today.month + 1, day=1) - timedelta(days=1)) else: - end_time = current_date.replace(hour=end_hour, minute=end_minute, second=0, - microsecond=0) + timedelta(hours=16) + last_day_of_month = (today.replace(year=today.year + 1, month=1, day=1) - timedelta(days=1)) + role_a = self.env['planning.role'].search([('name', '=', '工程部白班')], limit=1) + start_time = int(self.env['planning.slot.template'].search([('role_id', '=', role_a.id)]).start_time) + end_time = int(self.env['planning.slot.template'].search([('role_id', '=', role_a.id)]).end_time) + for employee in self.engineering_run_ids: + current_date = first_day_of_month + while current_date <= last_day_of_month: + resource_id = employee.employee_id.resource_id + self.env['planning.slot'].create({ + 'resource_id': resource_id.id, + 'start_datetime': datetime(current_date.year, current_date.month, current_date.day, start_time) + timedelta(hours=16), + 'end_datetime': datetime(current_date.year, current_date.month, current_date.day, end_time) + timedelta(hours=16), + 'role_id': role_a.id, + 'allocated_hours': 8, + }) + current_date += timedelta(days=1) + if current_date > last_day_of_month: + break + role_b = self.env['planning.role'].search([('name', '=', '工程部中值夜班')], limit=1) + start_time2 = int(self.env['planning.slot.template'].search([('role_id', '=', role_b.id)]).start_time) + end_time2 = int(self.env['planning.slot.template'].search([('role_id', '=', role_b.id)]).end_time) + all_slot = self.env['planning.slot'].search([('department_id.name', '=', '运行班')]) + current_date = first_day_of_month + i = -1 + while current_date <= last_day_of_month: + for employee in range(0, len(self.engineering_run_ids)): + i = i + 1 + slot_id = all_slot.search([('resource_id', '=', self.engineering_run_ids[employee].employee_id.resource_id.id)]).sorted('start_datetime')[i] + slot_id.sudo().write({ + 'template_id': self.env['planning.slot.template'].search([('role_id', '=', role_b.id)]).id, + 'start_datetime': datetime(current_date.year, current_date.month, current_date.day, + start_time2) + timedelta(hours=16), + 'end_datetime': datetime(current_date.year, current_date.month, current_date.day, + end_time2) + timedelta(days=1, hours=16), + 'role_id': role_b.id, + 'allocated_hours': 8, + }) + current_date += timedelta(days=1) + if current_date > last_day_of_month: + break + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'type': 'success', + 'message': '运行班已排完', + 'sticky': False, + } + } + # employees = self.engineering_run_ids + # num_employees = len(employees) + # for employee in employees: + # current_date = start_date + # # 计算下个月的第一天 + # if current_date.month == 12: + # next_month_start = datetime(current_date.year + 1, 1, 1, 0, 0, 0) + # else: + # next_month_start = datetime(current_date.year, current_date.month + 1, 1, 0, 0, 0) + # + # while current_date < next_month_start and current_date <= end_date: + # self.create_planning_slot(employee, role_a.id, self.get_role_template(role_a), current_date) + # current_date += timedelta(days=1) + # + # current_date = start_date + # while current_date <= end_date: + # current_employee = employees[(current_date - start_date).days % num_employees] + # self.create_planning_slot(current_employee, role_b.id, self.get_role_template(role_b), current_date) + # current_date += timedelta(days=1) - self.env['planning.slot'].create({ - 'resource_id': record.employee_id.resource_id.id, - 'role_id': role, - 'start_datetime': start_time, - 'end_datetime': end_time, - 'allocated_hours': 8, - }) - - def get_role_template(self, role): - return self.env['planning.slot.template'].search([('role_id', '=', role.id)], limit=1) + # def create_planning_slot(self, record, role, role_template, current_date): + # start_hour = int(role_template.start_time) + # start_minute = int(round((role_template.start_time - start_hour) * 60)) + # end_hour = int(role_template.end_time) + # end_minute = int(round((role_template.end_time - end_hour) * 60)) + # + # start_time = current_date.replace(hour=start_hour, minute=start_minute, second=0, + # microsecond=0) + timedelta(hours=16) + # if role_template.end_time < role_template.start_time: + # end_time = (current_date + timedelta(days=1)).replace(hour=end_hour, minute=end_minute, second=0, + # microsecond=0) + timedelta(hours=16) + # else: + # end_time = current_date.replace(hour=end_hour, minute=end_minute, second=0, + # microsecond=0) + timedelta(hours=16) + # + # self.env['planning.slot'].create({ + # 'resource_id': record.employee_id.resource_id.id, + # 'role_id': role, + # 'start_datetime': start_time, + # 'end_datetime': end_time, + # 'allocated_hours': 8, + # }) + # + # def get_role_template(self, role): + # return self.env['planning.slot.template'].search([('role_id', '=', role.id)], limit=1) class YuthonEngineeringRunLine(models.Model): diff --git a/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml b/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml index 9a52a2458..f17b1ac9f 100644 --- a/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml +++ b/yuthon_hr_attendance/views/yuthon_hv_planning_views.xml @@ -24,7 +24,7 @@ - + diff --git a/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml b/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml index f22e7d022..c0d2b9cd7 100644 --- a/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml +++ b/yuthon_hr_attendance/views/yuthon_overall_planning_views.xml @@ -24,7 +24,7 @@ - + diff --git a/yuthon_hr_attendance/views/yuthon_run_planning_views.xml b/yuthon_hr_attendance/views/yuthon_run_planning_views.xml index df07e8f76..5988119ad 100644 --- a/yuthon_hr_attendance/views/yuthon_run_planning_views.xml +++ b/yuthon_hr_attendance/views/yuthon_run_planning_views.xml @@ -22,13 +22,12 @@ - - +