Accept Merge Request #1281: (feature/仓库发货下发bfm -> develop)
Merge Request: 工厂发货下发bfm Created By: @胡嘉莹 Reviewed By: @马广威 Approved By: @马广威 Accepted By: @胡嘉莹 URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1281?initial=true
This commit is contained in:
4
sf_stock/__init__.py
Normal file
4
sf_stock/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import controllers
|
||||||
|
from . import models
|
||||||
36
sf_stock/__manifest__.py
Normal file
36
sf_stock/__manifest__.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
{
|
||||||
|
'name': "sf_stock",
|
||||||
|
|
||||||
|
'summary': """
|
||||||
|
Short (1 phrase/line) summary of the module's purpose, used as
|
||||||
|
subtitle on modules listing or apps.openerp.com""",
|
||||||
|
|
||||||
|
'description': """
|
||||||
|
Long description of module's purpose
|
||||||
|
""",
|
||||||
|
|
||||||
|
'author': "My Company",
|
||||||
|
'website': "https://www.yourcompany.com",
|
||||||
|
|
||||||
|
# Categories can be used to filter modules in modules listing
|
||||||
|
# Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml
|
||||||
|
# for the full list
|
||||||
|
'category': 'Uncategorized',
|
||||||
|
'version': '0.1',
|
||||||
|
|
||||||
|
# any module necessary for this one to work correctly
|
||||||
|
'depends': ['sf_sale', 'stock'],
|
||||||
|
|
||||||
|
# always loaded
|
||||||
|
'data': [
|
||||||
|
# 'security/ir.model.access.csv',
|
||||||
|
'views/stock_picking.xml',
|
||||||
|
],
|
||||||
|
# only loaded in demonstration mode
|
||||||
|
'demo': [
|
||||||
|
'demo/demo.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': True,
|
||||||
|
}
|
||||||
3
sf_stock/controllers/__init__.py
Normal file
3
sf_stock/controllers/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import controllers
|
||||||
21
sf_stock/controllers/controllers.py
Normal file
21
sf_stock/controllers/controllers.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# from odoo import http
|
||||||
|
|
||||||
|
|
||||||
|
# class SfStock(http.Controller):
|
||||||
|
# @http.route('/sf_stock/sf_stock', auth='public')
|
||||||
|
# def index(self, **kw):
|
||||||
|
# return "Hello, world"
|
||||||
|
|
||||||
|
# @http.route('/sf_stock/sf_stock/objects', auth='public')
|
||||||
|
# def list(self, **kw):
|
||||||
|
# return http.request.render('sf_stock.listing', {
|
||||||
|
# 'root': '/sf_stock/sf_stock',
|
||||||
|
# 'objects': http.request.env['sf_stock.sf_stock'].search([]),
|
||||||
|
# })
|
||||||
|
|
||||||
|
# @http.route('/sf_stock/sf_stock/objects/<model("sf_stock.sf_stock"):obj>', auth='public')
|
||||||
|
# def object(self, obj, **kw):
|
||||||
|
# return http.request.render('sf_stock.object', {
|
||||||
|
# 'object': obj
|
||||||
|
# })
|
||||||
30
sf_stock/demo/demo.xml
Normal file
30
sf_stock/demo/demo.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<!--
|
||||||
|
<record id="object0" model="sf_stock.sf_stock">
|
||||||
|
<field name="name">Object 0</field>
|
||||||
|
<field name="value">0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object1" model="sf_stock.sf_stock">
|
||||||
|
<field name="name">Object 1</field>
|
||||||
|
<field name="value">10</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object2" model="sf_stock.sf_stock">
|
||||||
|
<field name="name">Object 2</field>
|
||||||
|
<field name="value">20</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object3" model="sf_stock.sf_stock">
|
||||||
|
<field name="name">Object 3</field>
|
||||||
|
<field name="value">30</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="object4" model="sf_stock.sf_stock">
|
||||||
|
<field name="name">Object 4</field>
|
||||||
|
<field name="value">40</field>
|
||||||
|
</record>
|
||||||
|
-->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
3
sf_stock/models/__init__.py
Normal file
3
sf_stock/models/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import stock_picking
|
||||||
110
sf_stock/models/stock_picking.py
Normal file
110
sf_stock/models/stock_picking.py
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# -*- 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'
|
||||||
|
|
||||||
|
cancel_backorder_ids = fields.Boolean(default=False, string='是否取消后置单据')
|
||||||
|
|
||||||
|
# 重写验证,下发发货到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')
|
||||||
|
# 下发发货到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': skip_backorder,
|
||||||
|
'move_type': self.move_type,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
url1 = config['bfm_url_new'] + '/api/stock/deliver_goods'
|
||||||
|
json_str = json.dumps(data)
|
||||||
|
print('json_str', 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失败')
|
||||||
2
sf_stock/security/ir.model.access.csv
Normal file
2
sf_stock/security/ir.model.access.csv
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_sf_stock_sf_stock,sf_stock.sf_stock,model_sf_stock_sf_stock,base.group_user,1,1,1,1
|
||||||
|
5
sf_stock/views/stock_picking.xml
Normal file
5
sf_stock/views/stock_picking.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
Reference in New Issue
Block a user