当前位置:首页>python>中篇Python(ODOO)篇 第四章 ODOO项目优化部分(四)预约模块增强 共用函数等

中篇Python(ODOO)篇 第四章 ODOO项目优化部分(四)预约模块增强 共用函数等

  • 2026-10-11 07:13:14
中篇Python(ODOO)篇 第四章 ODOO项目优化部分(四)预约模块增强 共用函数等

公用函数

为了方便管理,我们将公用函数代码modles下的nebula_tools.py文件中,一般情况下,是需要另外新增一个目录管理的,引用的时候使用相对路径。
新增两个函数。
1、获取没有分钟的日期。
def appointment_begin_date(add_hours):    now_str = datetime.strftime(datetime.now(), "%Y-%m-%d%H:00:00")    now_date = datetime.strptime(now_str, "%Y-%m-%d%H:%M:%S")    if add_hours != 0:        now_date = now_date + timedelta(hours=add_hours)    return now_date
2、比较时间,一般是为了检查准备预约起止时间是不是和已经有的时间冲突。
def check_time_out(in_begin_time, in_end_time, check_begin_time, check_end_time):    if (check_begin_time <= in_begin_time) and (in_begin_time <= check_end_time):        re = True  # 传入开始时间在要检查的时间中间    elif (check_begin_time <= in_end_time) and (in_end_time <= check_end_time):        re = True  # 传入结束时间在要检查的时间中间    elif (in_begin_time <= check_begin_time) and (check_end_time <= in_end_time):        re = True  # 传入开始时间和传入结束时间跨越了要检查的时间段    else:        re = False    return re
代码截图:

复制费用部分数据

预约表有个每小时收费字段,来自费用明细子表,需要在费用标准和排档类这两个字段变化后实时获取每小时收费字段,我们用到depends装饰器。
@api.depends(依赖的字段值),依赖的字段值一旦发生变化,就会触发该函数,从而更新compute字段值。
我们将排档类和费用标准用required=True方式设置为必填。
我们将每小时收费设置为计算字段,并且保存到数据库中,防止因价格变动导致查询不准。
work_charge_hour = fields.Integer('每小时收费', compute="_get_charge_hour",                                  store=True)
同时导入get_charge_hour函数位置,并调用该函数。
from myaddons.peijia.models.system_info import get_charge_hourwork_charge_hour = fields.Integer('每小时收费', compute="_get_charge_hour",                                  store=True)@api.depends('fee_type', 'car_auto_type_name')def _get_charge_hour(self):    order_id = self.fee_type.id    auto_type = self.car_auto_type_name    self.work_charge_hour = get_charge_hour(self, order_id, auto_type)
相关代码在后续贴出。

计算字段

balance :学员缴费之和-本次支付费用之和。
appointment_end_date:预约结束时间=预约开始时间+预约小时数
complete_end_date:实际结束时间=实际开始实际+实际小时数
相关关键代码:
balance = fields.Integer('余额', readonly=True) appointment_end_date = fields.Datetime('预约结束时间',                                       compute='_calc_appointment_end_date',                                       store=True)complete_end_date = fields.Datetime('实际结束时间', compute='_calc_complete_end_date',                                    store=True)@api.depends('appointment_begin_date', 'appointment_hours')def _calc_appointment_end_date(self):    for order in self:        begin_date = order.appointment_begin_date        add_hours = order.appointment_hours        end_date = begin_date + timedelta(hours=add_hours)        end_date = end_date - timedelta(seconds=1)        order.appointment_end_date = end_date@api.depends('complete_begin_date', 'complete_hours')def _calc_complete_end_date(self):    for order in self:        if order.complete_begin_date:            begin_date = order.complete_begin_date            add_hours = order.complete_hours            begin_date += timedelta(hours=add_hours)            begin_date -= timedelta(seconds=1)            order.complete_end_date = begin_date@api.onchange('appointment_hours')def onchange_appointment_hours(self):    if self.appointment_hours <= 0:        self.appointment_hours = 1@api.onchange('student_seq', 'deposit', 'give_money', 'pay')def onchange_get_balance(self):    balance = 0    if self.student_seq:        if self.deposit:            balance += self.deposit        if self.give_money:            balance += self.give_money        if self.pay:            balance -= self.pay        domain = [('active', '=', 'True'),                  ('student_seq', '=', self.student_seq),                  ('id', '!=', self.id.origin)]        field_names = ['deposit', 'give_money', 'pay']        records = self.search_read(domain, field_names)        for rec in records:            if rec['deposit']:                balance += rec['deposit']            if rec['give_money']:                balance += rec['give_money']            if rec['pay']:                balance -= rec['pay']    self.balance = balance
请读者想想为啥domain里面要加id排除条件?

复制预约部分数据

我们添加一个学员参考字段,当选择一个学员后,在该字段上可以找到旧的预约记录,选择一个后,自动将选定的记录的教练、上下车地点等复制过来。
关键代码:
references_appointment = fields.Many2one('nebula.appointment',                                         string='参考预约单',                                         size=30, domain=[('active', '=', True)])@api.onchange('student_seq')def _onchange_student_seq(self):    # TODO: 如果是同一个学员,则不清空    self.references_appointment = None    if self.student_seq:        return {            'domain': {'references_appointment': [('active', '=', True), ('student_seq', '=', self.student_seq)]}}    else:        return {'domain': {'references_appointment': [('active', '=', True)]}}@api.onchange('references_appointment')def _onchange_references_appointment(self):    if self.references_appointment:        domain = [('id', '=', self.references_appointment.id)]        field_names = ['auto_type_name', 'teacher_name', 'car_name',  'begin_address', 'end_address', 'student_name', 'fee_type']        records = self.env['nebula.appointment'].search_read(domain, field_names)        for rec in records:            if rec['auto_type_name']:                self.auto_type_name = rec['auto_type_name']            if rec['teacher_name']:                self.teacher_name = rec['teacher_name']            if rec['car_name']:                self.car_name = rec['car_name']            if rec['begin_address']:                self.begin_address = rec['begin_address']            if rec['end_address']:                self.end_address = rec['end_address']                if rec['fee_type']:                    self.fee_type = rec['fee_type']            if not self.student_name and rec['student_name']:                self.student_name = rec['student_name']

最新文章

随机文章