Files
jikimo_sf/sf_plan_management/models/calendar_base.py

202 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime, timedelta
from odoo import models, fields, api
import re
def time_H_selection():
return [('00', '00'), ('01', '01'), ('02', '02'), ('03', '03'), ('04', '04'), ('05', '05'),
('06', '06'), ('07', '07'), ('08', '08'), ('09', '09'), ('10', '10'), ('11', '11'),
('12', '12'), ('13', '13'), ('14', '14'), ('15', '15'), ('16', '16'), ('17', '17'),
('18', '18'), ('19', '19'), ('20', '20'), ('21', '21'), ('22', '22'), ('23', '23')]
def time_M_or_S_selection():
return [('00', '00'), ('05', '05'), ('10', '10'), ('15', '15'), ('20', '20'), ('25', '25'),
('30', '30'), ('35', '35'), ('40', '40'), ('45', '45'), ('50', '50'), ('55', '55')]
class WorkLogSetting(models.Model):
_name = 'sf.work.log.setting'
_description = '工作日历设置'
def _get_code(self):
"""
自动生成编码
:return:
"""
fixture_material = self.env['sf.work.log.setting'].sudo().search(
[('code', '!=', '')],
limit=1,
order="id desc")
if not fixture_material:
num = "%03d" % 1
else:
m = int(fixture_material.code) + 1
num = "%03d" % m
return num
code = fields.Char(string='序号', default=_get_code, readonly=True)
name = fields.Char(string='工作日历名称', required=True)
start_time = fields.Char(string='日开始时间', readonly=True, compute='_compute_start_time')
start_time_H = fields.Selection(time_H_selection(), '', required=True)
start_time_M = fields.Selection(time_M_or_S_selection(), '', required=True)
end_time = fields.Char(string='日结束时间', readonly=True, compute='_compute_end_time')
end_time_H = fields.Selection(time_H_selection(), '', required=True)
end_time_M = fields.Selection(time_M_or_S_selection(), '', required=True)
duration = fields.Char(string='时长', readonly=True, compute='_compute_duration')
day_off_id = fields.Many2many('sf.day.off', string='休息日', required=True)
working_shift_id = fields.Many2many('sf.working.shift', string='班次')
status = fields.Boolean(string='状态', default=True)
update_person = fields.Char(string='更新人', default=lambda self: self.env.user.name)
update_time = fields.Datetime(string='更新时间', default=lambda self: fields.Datetime.now())
@api.depends('start_time_H', 'start_time_M')
def _compute_start_time(self):
"""
设置输入日开始时间
:return:
"""
for record in self:
record.start_time = f"{record.start_time_H}:{record.start_time_M}:00"
@api.depends('end_time_H', 'end_time_M')
def _compute_end_time(self):
"""
设置输入日结束时间
:return:
"""
for record in self:
record.end_time = f"{record.end_time_H}:{record.end_time_M}:00"
@api.depends('start_time_H', 'start_time_M', 'end_time_H', 'end_time_M')
def _compute_duration(self):
"""
根据日开始时间和日结束时间计算每日工作时长
:return:
"""
for record in self:
st_h = float(record.start_time_H)
st_m = float(record.start_time_M)
end_h = float(record.end_time_H)
end_m = float(record.end_time_M)
# 日开始时间小于日结束时间
if st_h < end_h:
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60, 2))
else:
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60 + 24, 2))
@api.onchange('day_off_id')
def _onchange_day_off_id(self):
# 先删除之前创建的工作日历事件记录
self.env['sf.work.schedule.calendar'].search([
('calendar_code', '=', self.code), ('name_id', '=', self.name)]).unlink()
# 获取当年的一月一号的日期
year = fields.Datetime.now().year # 2023
first_day = datetime(year, 1, 1).date() # 2023-01-01
day_of_week = first_day.strftime("%A") # 星期日
# 根据day_of_week将其设置为起始0循环周一到周日按循环顺序设置为0-6
# 列:{'星期日': 0, '星期一': 1, '星期二': 2, '星期三': 3, '星期四': 4, '星期五': 5, '星期六': 6}
desc = {}
desc_weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
status = False
ints = 0
while len(desc) < 7:
if len(desc) != 0:
for week in desc_weekdays:
if len(desc) < 7:
desc.update({week: ints})
ints += 1
else:
for week in desc_weekdays:
if status:
desc.update({week: ints})
ints += 1
if day_of_week == week:
desc.update({week: ints})
status = True
ints += 1
# 创建工作日历的休息日事件
# day_off_ids = self.day_off_id.mapped('name')
# for week in day_off_ids:
# num = desc[week]
# while num <= 30:
# target_date = first_day + timedelta(days=num)
# self.env['sf.work.schedule.calendar'].create({'name': '休息日',
# 'name_id': self.name.id,
# 'date_time': target_date})
# num += 7
class WorkingShift(models.Model):
_name = 'sf.working.shift'
_description = '班次'
def _get_code(self):
"""
自动生成编码
:return:
"""
fixture_material = self.env['sf.working.shift'].sudo().search(
[('code', '!=', '')],
limit=1,
order="id desc")
if not fixture_material:
num = "%03d" % 1
else:
m = int(fixture_material.code) + 1
num = "%03d" % m
return num
code = fields.Char('编码', default=_get_code, readonly=True)
name = fields.Char('名称', required=True)
start_time = fields.Datetime('班次开始时间')
end_time = fields.Datetime('班次结束时间')
remark = fields.Char('备注')
class DayOff(models.Model):
_name = 'sf.day.off'
_description = '休息日'
name = fields.Selection([
('星期一', '星期一'),
('星期二', '星期二'),
('星期三', '星期三'),
('星期四', '星期四'),
('星期五', '星期五'),
('星期六', '星期六'),
('星期日', '星期日')], '休息日名称')
class WorkScheduleCalendar(models.Model):
_name = 'sf.work.schedule.calendar'
_description = '工作日历'
name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机')], '日历事件名称')
date_time = fields.Date('休息时间')
name_id = fields.Many2one('sf.work.log.setting', '工作日历名称')
calendar_code = fields.Char('工作日历编码')
day_off_id = fields.Many2many('sf.day.off', string='休息日')
scheduled_outage = fields.Char('计划停机')
monthly_rest_days = fields.Char('月休息天数', readonly=True)
annual_rest_days = fields.Char('年休息天数', readonly=True)
monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True)
annual_planned_downtime = fields.Char('年计划停机时长', readonly=True)
@api.onchange('name_id')
def _onchange_name_id(self):
for record in self:
record.calendar_code = record.name_id.code