Odoo 12 POS前端部分订单退货时可退数量未正常扣减问题求解
问题修复方案
你当前代码的问题出在分支逻辑不一致、字段判断顺序错误两个核心点,按以下方案修改即可解决:
核心问题梳理
- 仅
enable_print_valid_days关闭的else分支做了return_qty字段补全,开启有效期的if分支完全没有处理该逻辑,导致这部分订单行返回的字典缺少return_qty字段,前端只能默认读取原始数量 - else分支的字段判断顺序错误:先判断值大小再判断字段是否存在,字段不存在时
rec.get('return_qty')返回None,和数值比较会触发异常导致赋值逻辑失效 - 开启有效期分支的搜索条件直接过滤
return_qty > 0,如果订单行本身没有return_qty字段,会直接被过滤掉,无法进入后续处理逻辑
修正后代码
def load_return_order_lines(self, pos_order_id): valid_return_lines = [] current_date = datetime.today().strftime('%Y-%m-%d') if pos_order_id: order_id = self.env['pos.order'].browse(pos_order_id) if order_id and order_id.config_id.enable_print_valid_days: # 移除return_qty过滤条件,先拉取所有有效订单行 order_lines = self.search([('order_id', '=', pos_order_id), ('price_subtotal', '>', 0)]) for line in order_lines: if line.return_valid_days > 0 and not line.product_id.is_dummy_product: date_N_days_after = (order_id.date_order + timedelta(days=line.return_valid_days)).strftime('%Y-%m-%d') if current_date <= date_N_days_after: line_dict = line.read()[0] # 统一补全return_qty字段:不存在则取qty,值<=0也重置为qty if 'return_qty' not in line_dict or line_dict.get('return_qty') <= 0: line_dict['return_qty'] = line_dict.get('qty') valid_return_lines.append(line_dict) else: order_line_dicts = self.search_read([('order_id', '=', pos_order_id), ('price_subtotal', '>', 0)]) for rec in order_line_dicts: # 调整判断顺序:先判断字段是否存在,再判断值大小 if 'return_qty' not in rec or rec.get('return_qty') <= 0: rec['return_qty'] = rec.get('qty') return order_line_dicts return valid_return_lines
改动说明
- 统一两个分支的
return_qty补全逻辑:不管是否开启退货有效期,所有返回给前端的订单行字典都会自动检查return_qty字段,不存在则取qty的值 - 调整判断顺序:先检查字段是否存在,再判断值是否小于等于0,避免
None和数值比较的异常 - 移除开启有效期分支搜索条件里的
return_qty > 0过滤,避免无return_qty字段的正常订单行被误过滤 - 移除无用的调试打印代码,避免日志冗余
修改后所有订单的可退数量都会优先取return_qty的值,字段不存在时自动用原始购买数量qty填充,不会再出现退货后可退数量不更新的问题。
内容的提问来源于stack exchange,提问作者Sidharth Panda
相关产品推荐
相关产品推荐

