179 lines
7.3 KiB
Python
179 lines
7.3 KiB
Python
# -*- 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,
|
||
'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失败')
|