公用函数
为了方便管理,我们将公用函数代码modles下的nebula_tools.py文件中,一般情况下,是需要另外新增一个目录管理的,引用的时候使用相对路径。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
复制预约部分数据
我们添加一个学员参考字段,当选择一个学员后,在该字段上可以找到旧的预约记录,选择一个后,自动将选定的记录的教练、上下车地点等复制过来。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']