# -*- coding: utf-8 -*- import json import requests from odoo import models, fields, api from odoo.exceptions import UserError import logging from odoo.tools import date_utils _logger = logging.getLogger(__name__) class StockPicking(models.Model): _inherit = 'stock.picking' pro_purchase_count = fields.Integer('坯料采购单数量', compute='_compute_pro_purchase_count', store=True) @api.depends('name') def _compute_pro_purchase_count(self): for sp in self: if sp.name and sp.name != '/': po_ids = self.env['purchase.order'].sudo().search([ ('origin', 'like', sp.name), ('purchase_type', '=', 'standard')]) if po_ids: sp.pro_purchase_count = len(po_ids) def pro_purchase_order(self): """ 坯料采购 """ po_ids = self.env['purchase.order'].sudo().search([ ('origin', 'like', self.name), ('purchase_type', '=', 'standard')]) action = { 'res_model': 'purchase.order', 'type': 'ir.actions.act_window', } if len(po_ids) == 1: action.update({ 'view_mode': 'form', 'res_id': po_ids.id, }) else: action.update({ 'name': _("采购订单列表"), 'domain': [('id', 'in', po_ids.ids)], 'view_mode': 'tree,form', }) return action pro_out_purchase_count = fields.Integer('坯料委外单数量', compute='_compute_pro_out_purchase_count', store=True) @api.depends('name') def _compute_pro_out_purchase_count(self): for sp in self: if sp.name and sp.name != '/': po_ids = self.env['purchase.order'].sudo().search([ ('origin', 'like', sp.name), ('purchase_type', '=', 'outsourcing')]) if po_ids: sp.pro_out_purchase_count = len(po_ids) def pro_out_purchase_order(self): """ 坯料委外 """ po_ids = self.env['purchase.order'].sudo().search([ ('origin', 'like', self.name), ('purchase_type', '=', 'outsourcing')]) action = { 'res_model': 'purchase.order', 'type': 'ir.actions.act_window', } if len(po_ids) == 1: action.update({ 'view_mode': 'form', 'res_id': po_ids.id, }) else: action.update({ 'name': _("委外订单列表"), 'domain': [('id', 'in', po_ids.ids)], 'view_mode': 'tree,form', }) return action # 重写验证,下发发货到bfm def button_validate(self): info = super(StockPicking, self).button_validate() if self.picking_type_code == 'outgoing': self.send_to_bfm() return info def deal_move_ids(self, send_move_ids, send_move_line_ids): move_ids = [] # 本次发货单 move_line_ids = [] # 本次发货单行 if send_move_ids: for item in send_move_ids: val = { 'name': item.product_id.upload_model_file.display_name if item.product_id.upload_model_file else item.product_id.model_name, 'quantity_done': item.quantity_done, 'date': date_utils.json_default(item.date) if item.date else None, 'description_picking': item.description_picking, 'date_deadline': date_utils.json_default(item.date_deadline) if item.date_deadline else None, 'product_uom_qty': item.product_uom_qty, 'sequence': item.sequence, 'price_unit': item.price_unit, 'priority': item.priority, 'state': item.state, } move_ids.append(val) for item in send_move_line_ids: val = { 'qty_done': item.qty_done, 'reserved_qty': item.reserved_qty, 'reserved_uom_qty': item.reserved_uom_qty, 'date': date_utils.json_default(item.date) if item.date else None, 'description_picking': item.description_picking, 'state': item.state, } move_line_ids.append(val) return move_ids, move_line_ids def deal_send_backorder_id(self, backorder_ids1): backorder_ids = [] if backorder_ids1: for item in backorder_ids1: move_ids, move_line_ids = self.deal_move_ids(item.move_ids, item.move_line_ids) val = { 'receiverName': item.receiverName, 'name': item.sale_id.default_code, 'send_no': item.name, 'scheduled_date': date_utils.json_default(item.scheduled_date) if item.scheduled_date else None, 'date': date_utils.json_default(item.date) if item.date else None, 'date_deadline': date_utils.json_default(item.date_deadline) if item.date_deadline else None, 'date_done': date_utils.json_default(item.date_done) if item.date_done else None, 'move_ids': move_ids, 'move_line_ids': move_line_ids, 'state': item.state, 'move_type': item.move_type, } backorder_ids.append(val) return backorder_ids def send_to_bfm(self): skip_backorder = self.env.context.get('skip_backorder') cancel_backorder_ids = self.env.context.get('picking_ids_not_to_backorder') # 下发发货到bfm config = self.env['res.config.settings'].get_values() move_ids, move_line_ids = self.deal_move_ids(self.move_ids, self.move_line_ids) data = { 'params': { 'receiverName': self.receiverName, 'priority': self.priority, 'name': self.sale_id.default_code, 'send_no': self.name, 'scheduled_date': date_utils.json_default(self.scheduled_date) if self.scheduled_date else None, 'date': date_utils.json_default(self.date) if self.date else None, 'date_deadline': date_utils.json_default(self.date_deadline) if self.date_deadline else None, 'date_done': date_utils.json_default(self.date_done) if self.date_done else None, 'move_ids': move_ids, 'move_line_ids': move_line_ids, 'state': self.state, 'backorder_id': self.deal_send_backorder_id(self.backorder_id), 'backorder_ids': self.deal_send_backorder_id(self.backorder_ids), 'cancel_backorder_ids': True if skip_backorder and cancel_backorder_ids else False, # 没有欠单判断 'move_type': self.move_type, }, } url1 = config['bfm_url_new'] + '/api/stock/deliver_goods' json_str = json.dumps(data) logging.info('json_str= %s', json_str) r = requests.post(url1, json=data, data=None) if r.status_code == 200: result = json.loads(r.json()['result']) if result['code'] != 200: raise UserError(result['message'] or '工厂发货下发bfm失败') else: raise UserError('工厂发货下发bfm失败')