工作日历及其设置bug已解决,优化已完成
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta, date
|
||||||
|
|
||||||
from odoo import models, fields, api
|
from odoo import models, fields, api
|
||||||
import re
|
import re
|
||||||
@@ -97,52 +97,101 @@ class WorkLogSetting(models.Model):
|
|||||||
else:
|
else:
|
||||||
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60 + 24, 2))
|
record.duration = str(round(end_h - st_h + (end_m - st_m) / 60 + 24, 2))
|
||||||
|
|
||||||
@api.onchange('day_off_id')
|
# @api.onchange('day_off_id')
|
||||||
def _onchange_day_off_id(self):
|
# def _onchange_day_off_id(self):
|
||||||
|
# # 先删除之前创建的工作日历事件记录
|
||||||
|
# self.env['sf.work.schedule.calendar'].search([('calendar_code', '=', self.code)]).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')
|
||||||
|
# record = self.env['sf.work.log.setting'].search([('code', '=', self.code)])
|
||||||
|
# # record.setting_to_calendar_ids.unlink()
|
||||||
|
# # self.env.cr.commit()
|
||||||
|
# for week in day_off_ids:
|
||||||
|
# num = desc[week]
|
||||||
|
# while num <= 30:
|
||||||
|
# target_date = first_day + timedelta(days=num)
|
||||||
|
# num += 7
|
||||||
|
# self.env['sf.work.schedule.calendar'].create({'name': '休息日',
|
||||||
|
# 'name_id': record.id,
|
||||||
|
# 'calendar_code': self.code,
|
||||||
|
# 'date_time': target_date})
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create(self, vals):
|
||||||
|
"""
|
||||||
|
创建记录时,生成工作日历
|
||||||
|
"""
|
||||||
|
record = super(WorkLogSetting, self).create(vals)
|
||||||
|
record.generate_work_calendar()
|
||||||
|
return record
|
||||||
|
|
||||||
|
def write(self, vals):
|
||||||
|
"""
|
||||||
|
更新记录时,生成工作日历
|
||||||
|
"""
|
||||||
# 先删除之前创建的工作日历事件记录
|
# 先删除之前创建的工作日历事件记录
|
||||||
# self.env['sf.work.schedule.calendar'].search([('calendar_code', '=', self.code)]).unlink()
|
self.env['sf.work.schedule.calendar'].search([('calendar_code', '=', self.code)]).unlink()
|
||||||
|
result = super(WorkLogSetting, self).write(vals)
|
||||||
|
self.generate_work_calendar()
|
||||||
|
return result
|
||||||
|
|
||||||
# 获取当年的一月一号的日期
|
def generate_work_calendar(self):
|
||||||
year = fields.Datetime.now().year # 2023
|
"""
|
||||||
first_day = datetime(year, 1, 1).date() # 2023-01-01
|
生成工作日历
|
||||||
day_of_week = first_day.strftime("%A") # 星期日
|
"""
|
||||||
|
self.ensure_one()
|
||||||
# 根据day_of_week,将其设置为起始0,循环周一到周日,按循环顺序设置为0-6
|
# start_date = date.today() # 开始日期
|
||||||
# 列:{'星期日': 0, '星期一': 1, '星期二': 2, '星期三': 3, '星期四': 4, '星期五': 5, '星期六': 6}
|
# end_date = start_date + timedelta(days=365) # 结束日期
|
||||||
desc = {}
|
# 获取本年第一天和最后一天
|
||||||
desc_weekdays = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
|
start_date = datetime.now().replace(month=1, day=1).date()
|
||||||
status = False
|
end_date = datetime.now().replace(month=12, day=31).date()
|
||||||
ints = 0
|
# 休息日列表
|
||||||
while len(desc) < 7:
|
rest_days = self.day_off_id.mapped('name')
|
||||||
if len(desc) != 0:
|
for single_date in self.daterange(start_date, end_date):
|
||||||
for week in desc_weekdays:
|
is_workday = single_date.strftime("%A")
|
||||||
if len(desc) < 7:
|
if is_workday in rest_days:
|
||||||
desc.update({week: ints})
|
print('is_workday in rest_days', is_workday)
|
||||||
ints += 1
|
self.env['sf.work.schedule.calendar'].create({
|
||||||
else:
|
'name': '休息日',
|
||||||
for week in desc_weekdays:
|
'name_id': self.id,
|
||||||
if status:
|
'calendar_code': self.code,
|
||||||
desc.update({week: ints})
|
'date_time': single_date})
|
||||||
ints += 1
|
@staticmethod
|
||||||
if day_of_week == week:
|
def daterange(start_date, end_date):
|
||||||
desc.update({week: ints})
|
"""
|
||||||
status = True
|
生成日期范围
|
||||||
ints += 1
|
"""
|
||||||
|
# 生成日期范围
|
||||||
# 创建工作日历的休息日事件
|
for n in range(int((end_date - start_date).days)):
|
||||||
day_off_ids = self.day_off_id.mapped('name')
|
yield start_date + timedelta(n)
|
||||||
record = self.env['sf.work.log.setting'].search([('code', '=', self.code)])
|
|
||||||
# record.setting_to_calendar_ids.unlink()
|
|
||||||
# self.env.cr.commit()
|
|
||||||
for week in day_off_ids:
|
|
||||||
num = desc[week]
|
|
||||||
while num <= 30:
|
|
||||||
target_date = first_day + timedelta(days=num)
|
|
||||||
num += 7
|
|
||||||
self.env['sf.work.schedule.calendar'].create({'name': '休息日',
|
|
||||||
'name_id': record.id,
|
|
||||||
'calendar_code': self.code,
|
|
||||||
'date_time': target_date})
|
|
||||||
|
|
||||||
|
|
||||||
class WorkingShift(models.Model):
|
class WorkingShift(models.Model):
|
||||||
@@ -190,7 +239,7 @@ class WorkScheduleCalendar(models.Model):
|
|||||||
_name = 'sf.work.schedule.calendar'
|
_name = 'sf.work.schedule.calendar'
|
||||||
_description = '工作日历'
|
_description = '工作日历'
|
||||||
|
|
||||||
name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机')], '日历事件名称')
|
name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机'), ('工作日', '工作日')], '日历事件名称')
|
||||||
date_time = fields.Date('休息时间')
|
date_time = fields.Date('休息时间')
|
||||||
name_id = fields.Many2one('sf.work.log.setting', '工作日历名称')
|
name_id = fields.Many2one('sf.work.log.setting', '工作日历名称')
|
||||||
calendar_code = fields.Char('工作日历编码')
|
calendar_code = fields.Char('工作日历编码')
|
||||||
@@ -201,6 +250,3 @@ class WorkScheduleCalendar(models.Model):
|
|||||||
annual_rest_days = fields.Char('年休息天数', readonly=True)
|
annual_rest_days = fields.Char('年休息天数', readonly=True)
|
||||||
monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True)
|
monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True)
|
||||||
annual_planned_downtime = fields.Char('年计划停机时长', readonly=True)
|
annual_planned_downtime = fields.Char('年计划停机时长', readonly=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user