diff --git a/sf_plan_management/models/calendar_base.py b/sf_plan_management/models/calendar_base.py index 6176bde3..6304d2e1 100644 --- a/sf_plan_management/models/calendar_base.py +++ b/sf_plan_management/models/calendar_base.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import datetime, timedelta, date from odoo import models, fields, api import re @@ -97,52 +97,101 @@ class WorkLogSetting(models.Model): 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): + # @api.onchange('day_off_id') + # 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 - # 获取当年的一月一号的日期 - 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}) + def generate_work_calendar(self): + """ + 生成工作日历 + """ + self.ensure_one() + # start_date = date.today() # 开始日期 + # end_date = start_date + timedelta(days=365) # 结束日期 + # 获取本年第一天和最后一天 + start_date = datetime.now().replace(month=1, day=1).date() + end_date = datetime.now().replace(month=12, day=31).date() + # 休息日列表 + rest_days = self.day_off_id.mapped('name') + for single_date in self.daterange(start_date, end_date): + is_workday = single_date.strftime("%A") + if is_workday in rest_days: + print('is_workday in rest_days', is_workday) + self.env['sf.work.schedule.calendar'].create({ + 'name': '休息日', + 'name_id': self.id, + 'calendar_code': self.code, + 'date_time': single_date}) + @staticmethod + def daterange(start_date, end_date): + """ + 生成日期范围 + """ + # 生成日期范围 + for n in range(int((end_date - start_date).days)): + yield start_date + timedelta(n) class WorkingShift(models.Model): @@ -190,7 +239,7 @@ class WorkScheduleCalendar(models.Model): _name = 'sf.work.schedule.calendar' _description = '工作日历' - name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机')], '日历事件名称') + name = fields.Selection([('休息日', '休息日'), ('计划停机', '计划停机'), ('工作日', '工作日')], '日历事件名称') date_time = fields.Date('休息时间') name_id = fields.Many2one('sf.work.log.setting', '工作日历名称') calendar_code = fields.Char('工作日历编码') @@ -201,6 +250,3 @@ class WorkScheduleCalendar(models.Model): annual_rest_days = fields.Char('年休息天数', readonly=True) monthly_planned_downtime = fields.Char('月计划停机时长', readonly=True) annual_planned_downtime = fields.Char('年计划停机时长', readonly=True) - - -