import calendar from datetime import timedelta from odoo import models, fields class IrSequence(models.Model): _inherit = 'ir.sequence' date_range_period = fields.Selection( [('day', '每日'), ('month', '每月'), ('year', '每年')], string='日期期间', ) def _next(self, sequence_date=None): """ Returns the next number in the preferred sequence in all the ones given in self.""" if not self.use_date_range: return self._next_do() # date mode dt = sequence_date or self._context.get('ir_sequence_date', fields.Date.today()) seq_date = self.env['ir.sequence.date_range'].search( [('sequence_id', '=', self.id), ('date_from', '<=', dt), ('date_to', '>=', dt)], limit=1) if not seq_date: if self.date_range_period: seq_date = self._create_date_range_seq_by_period(dt, self.date_range_period) else: seq_date = self._create_date_range_seq(dt) return seq_date.with_context(ir_sequence_date_range=seq_date.date_from)._next() def _create_date_range_seq_by_period(self, date, period): if period == 'year': year = fields.Date.from_string(date).strftime('%Y') date_from = '{}-01-01'.format(year) date_to = '{}-12-31'.format(year) if period == 'month': # 计算当前月份的第一天和最后一天 year = fields.Date.from_string(date).strftime('%Y') month = fields.Date.from_string(date).strftime('%m') date_from = fields.Date.from_string(date).strftime('%Y-%m-01') date_to = '{}-{}-{}'.format(year, month, calendar.monthrange(int(year), int(month))[1]) if period == 'day': date_from = date date_to = date date_range = self.env['ir.sequence.date_range'].search( [ ('sequence_id', '=', self.id), ('date_to', '>=', date_from), ('date_to', '<=', date), ('date_range_period', '=', period) ], order='date_to desc', limit=1) if date_range: date_from = date_range.date_to + timedelta(days=1) seq_date_range = self.env['ir.sequence.date_range'].sudo().create({ 'date_from': date_from, 'date_to': date_to, 'sequence_id': self.id, 'date_range_period': period, }) return seq_date_range class IrSequenceDateRange(models.Model): _inherit = 'ir.sequence.date_range' date_range_period = fields.Selection( [('day', '每日'), ('month', '每月'), ('year', '每年')], string='日期期间', )