添加功能

This commit is contained in:
zhouzhou
2024-12-03 22:21:51 +08:00
parent 039089d961
commit bc60d30ba0
4 changed files with 104 additions and 55 deletions
@@ -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):
@@ -24,7 +24,7 @@
<field name="engineering_hv_ids" string=" ">
<tree editable="bottom">
<field name="hv_planning_id" column_invisible="1"/>
<field name="sequence"/>
<field name="sequence" widget="handle"/>
<field name="employee_id"/>
</tree>
</field>
@@ -24,7 +24,7 @@
<field name="overall_ids" string=" ">
<tree editable="bottom">
<field name="overall_planning_id" column_invisible="1"/>
<field name="sequence"/>
<field name="sequence" widget="handle"/>
<field name="employee_id"/>
</tree>
</field>
@@ -22,13 +22,12 @@
<group>
<field name="name"/>
<field name="illustrate"/>
<field name="number_of_shifts"/>
</group>
<group string="排班安排">
<field name="engineering_run_ids" string=" ">
<tree editable="bottom" >
<field name="engineering_planning_id" column_invisible="1"/>
<field name="sequence"/>
<field name="sequence" widget="handle"/>
<field name="employee_id"/>
</tree>
</field>