|
|
|
@@ -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):
|
|
|
|
|