表面工艺外协需求,不包含页面展示外协出入库单

This commit is contained in:
jinling.yang
2023-04-21 15:32:55 +08:00
parent 82dcfb5018
commit 32d53df8ec
4 changed files with 70 additions and 18 deletions

View File

@@ -1,6 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<data noupdate="1"> <data noupdate="1">
<record id="sequence_stock_picking_in" model="ir.sequence">
<field name="name">YourCompany Sequence ocin</field>
<field name="prefix">WH/OCIN/</field>
<field name="padding">5</field>
</record>
<record id="sequence_stock_picking_out" model="ir.sequence">
<field name="name">YourCompany Sequence ocout</field>
<field name="prefix">WH/OCOUT/</field>
<field name="padding">5</field>
</record>
<record id="stock_location_locations_virtual_outcontract" model="stock.location"> <record id="stock_location_locations_virtual_outcontract" model="stock.location">
<field name="name">外协</field> <field name="name">外协</field>
<field name="location_id" ref="stock.stock_location_locations_virtual"/> <field name="location_id" ref="stock.stock_location_locations_virtual"/>
@@ -14,6 +27,7 @@
<field name="name">外协入库</field> <field name="name">外协入库</field>
<field name="code">internal</field> <field name="code">internal</field>
<field name="active">true</field> <field name="active">true</field>
<field name="sequence_id" ref="sequence_stock_picking_in"/>
<field name="company_id" ref="base.main_company"/> <field name="company_id" ref="base.main_company"/>
<field name="sequence_code">OCIN</field> <field name="sequence_code">OCIN</field>
<field name="default_location_src_id" ref="stock_location_locations_virtual_outcontract"/> <field name="default_location_src_id" ref="stock_location_locations_virtual_outcontract"/>
@@ -24,6 +38,7 @@
<record id="outcontract_picking_out" model="stock.picking.type"> <record id="outcontract_picking_out" model="stock.picking.type">
<field name="name">外协出库</field> <field name="name">外协出库</field>
<field name="code">internal</field> <field name="code">internal</field>
<field name="sequence_id" ref="sequence_stock_picking_out"/>
<field name="active">true</field> <field name="active">true</field>
<field name="company_id" ref="base.main_company"/> <field name="company_id" ref="base.main_company"/>
<field name="sequence_code">OCOUT</field> <field name="sequence_code">OCOUT</field>
@@ -31,5 +46,7 @@
search="[('barcode','=','WH-PREPRODUCTION')]"/> search="[('barcode','=','WH-PREPRODUCTION')]"/>
<field name="default_location_dest_id" ref="stock_location_locations_virtual_outcontract"/> <field name="default_location_dest_id" ref="stock_location_locations_virtual_outcontract"/>
</record> </record>
</data> </data>
</odoo> </odoo>

View File

@@ -142,7 +142,7 @@ class MrpProduction(models.Model):
[('production_process_ids.id', 'in', surface_technics_arr)], [('production_process_ids.id', 'in', surface_technics_arr)],
order='sequence asc' order='sequence asc'
) )
#用filter刷选表面工艺id'是否存在工艺类别对象里 # 用filter刷选表面工艺id'是否存在工艺类别对象里
if production_process_category: if production_process_category:
for p in production_process_category: for p in production_process_category:
production_process = p.production_process_ids.filtered( production_process = p.production_process_ids.filtered(
@@ -176,7 +176,8 @@ class MrpProduction(models.Model):
self.env['mrp.workorder'].json_workorder_str('', production, route)) self.env['mrp.workorder'].json_workorder_str('', production, route))
production.workorder_ids = workorders_values production.workorder_ids = workorders_values
process_parameter_workorder = self.env['mrp.workorder'].search( process_parameter_workorder = self.env['mrp.workorder'].search(
[('surface_technics_parameters_id', '!=', False), ('production_id', '=', production.id)]) [('surface_technics_parameters_id', '!=', False), ('production_id', '=', production.id),
('is_subcontract', '=', True)])
if process_parameter_workorder: if process_parameter_workorder:
is_pick = False is_pick = False
consecutive_workorders = [] consecutive_workorders = []
@@ -185,10 +186,8 @@ class MrpProduction(models.Model):
for i in range(len(sorted_workorders) - 1): for i in range(len(sorted_workorders) - 1):
if m == 0: if m == 0:
is_pick = False is_pick = False
# if sorted_workorders[i].id in consecutive_workorders: if sorted_workorders[i].supplier_id.id == sorted_workorders[i + 1].supplier_id.id and \
# consecutive_workorders = [x for x in consecutive_workorders if x not in sorted_workorders[i].id] sorted_workorders[i].is_subcontract == sorted_workorders[i + 1].is_subcontract and \
# continue
if sorted_workorders[i].supplier_id == sorted_workorders[i + 1].supplier_id and \
sorted_workorders[i].id == sorted_workorders[i + 1].id - 1: sorted_workorders[i].id == sorted_workorders[i + 1].id - 1:
if sorted_workorders[i] not in consecutive_workorders: if sorted_workorders[i] not in consecutive_workorders:
consecutive_workorders.append(sorted_workorders[i]) consecutive_workorders.append(sorted_workorders[i])
@@ -196,16 +195,16 @@ class MrpProduction(models.Model):
m += 1 m += 1
continue continue
else: else:
if m == len(consecutive_workorders)-1 and m != 0: if m == len(consecutive_workorders) - 1 and m != 0:
self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production)
if sorted_workorders[i] in consecutive_workorders: if sorted_workorders[i] in consecutive_workorders:
is_pick = True is_pick = True
consecutive_workorders = [] consecutive_workorders = []
m = 0 m = 0
# 当前面的连续工序生成对应的外协出入库单再生成当前工序的外协出入库单 # 当前面的连续工序生成对应的外协出入库单再生成当前工序的外协出入库单
if is_pick is False: if is_pick is False:
self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production) self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production)
if m == len(consecutive_workorders)-1 and m != 0: if m == len(consecutive_workorders) - 1 and m != 0:
self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production)
if sorted_workorders[i] in consecutive_workorders: if sorted_workorders[i] in consecutive_workorders:
is_pick = True is_pick = True
@@ -213,7 +212,7 @@ class MrpProduction(models.Model):
m = 0 m = 0
if m == len(consecutive_workorders) - 1 and m != 0: if m == len(consecutive_workorders) - 1 and m != 0:
self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production) self.env['stock.picking'].create_outcontract_picking(consecutive_workorders, production)
if is_pick is False: if is_pick is False and m == 0:
self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production) self.env['stock.picking'].create_outcontract_picking(sorted_workorders[i], production)
for workorder in production.workorder_ids: for workorder in production.workorder_ids:
workorder.duration_expected = workorder._get_duration_expected() workorder.duration_expected = workorder._get_duration_expected()
@@ -240,7 +239,7 @@ class MrpProduction(models.Model):
'user_id': production.user_id.id} 'user_id': production.user_id.id}
return production_values_str return production_values_str
def _get_stock_move_values_Res(self,item,location_src_id,location_dest_id): def _get_stock_move_values_Res(self, item, location_src_id, location_dest_id, picking_type_id):
move_values = { move_values = {
'name': item.name if item.name else '/', 'name': item.name if item.name else '/',
'company_id': item.company_id.id, 'company_id': item.company_id.id,
@@ -250,7 +249,7 @@ class MrpProduction(models.Model):
'location_id': location_src_id, 'location_id': location_src_id,
'location_dest_id': location_dest_id, 'location_dest_id': location_dest_id,
'origin': item.origin, 'origin': item.origin,
'picking_type_id': self.picking_type_id.id, 'picking_type_id': picking_type_id,
} }
return move_values return move_values

View File

@@ -95,7 +95,7 @@ class ResMrpWorkOrder(models.Model):
surface_technics_parameters_id = fields.Many2one('sf.production.process.parameter', string="表面工艺可选参数") surface_technics_parameters_id = fields.Many2one('sf.production.process.parameter', string="表面工艺可选参数")
picking_in_id = fields.Many2one('stock.picking', string='外协入库单') picking_in_id = fields.Many2one('stock.picking', string='外协入库单')
picking_out_id = fields.Many2one('stock.picking', string='外协出库单') picking_out_id = fields.Many2one('stock.picking', string='外协出库单')
supplier_id = fields.Integer('供应商Id') supplier_id = fields.Many2one('res.partner', string='外协供应商')
def get_no_data(self, production_id): def get_no_data(self, production_id):
process_parameter_workorder = self.search( process_parameter_workorder = self.search(

View File

@@ -230,12 +230,23 @@ class ProductionLot(models.Model):
return "%s-%03d" % (product.name, 1) return "%s-%03d" % (product.name, 1)
class ResStockPicking(models.Model): class StockPicking(models.Model):
_inherit = 'stock.picking' _inherit = 'stock.picking'
workorder_in_id = fields.One2many('mrp.workorder', 'picking_in_id') workorder_in_id = fields.One2many('mrp.workorder', 'picking_in_id')
workorder_out_id = fields.One2many('mrp.workorder', 'picking_out_id') workorder_out_id = fields.One2many('mrp.workorder', 'picking_out_id')
# 设置外协出入单的名称
def _get_name_Res(self, rescode):
count = self.env['ir.sequence'].search_count([('prefix', 'like', rescode)])
if not count:
num = "%04d" % 1
else:
m = int(count) + 1
num = "%04d" % m
return '%s%s' % (rescode, num)
# 创建 外协出库入单
def create_outcontract_picking(self, sorted_workorders_arr, item): def create_outcontract_picking(self, sorted_workorders_arr, item):
m = 0 m = 0
for sorted_workorders in sorted_workorders_arr: for sorted_workorders in sorted_workorders_arr:
@@ -247,13 +258,21 @@ class ResStockPicking(models.Model):
'sf_manufacturing.stock_location_locations_virtual_outcontract').id, 'sf_manufacturing.stock_location_locations_virtual_outcontract').id,
location_dest_id = self.env['stock.location'].search( location_dest_id = self.env['stock.location'].search(
[('barcode', '=', 'WH-PREPRODUCTION')]).id, [('barcode', '=', 'WH-PREPRODUCTION')]).id,
outcontract_picking_type_in = self.env.ref(
'sf_manufacturing.outcontract_picking_in').id,
outcontract_picking_type_out = self.env.ref(
'sf_manufacturing.outcontract_picking_out').id,
moves_in = self.env['stock.move'].sudo().create( moves_in = self.env['stock.move'].sudo().create(
item._get_stock_move_values_Res(item, location_id, location_dest_id)) item._get_stock_move_values_Res(item, location_id, location_dest_id,
outcontract_picking_type_in))
moves_out = self.env['stock.move'].sudo().create( moves_out = self.env['stock.move'].sudo().create(
item._get_stock_move_values_Res(item, location_dest_id, location_id)) item._get_stock_move_values_Res(item, location_dest_id, location_id,
outcontract_picking_type_out))
new_picking = True new_picking = True
picking_in = self.env['stock.picking'].create(moves_in._get_new_picking_values()) picking_in = self.env['stock.picking'].create(
picking_out = self.env['stock.picking'].create(moves_out._get_new_picking_values()) moves_in._get_new_picking_values_Res(item, sorted_workorders,'WH/OCIN/'))
picking_out = self.env['stock.picking'].create(
moves_out._get_new_picking_values_Res(item, sorted_workorders, 'WH/OCOUT/'))
moves_in.write({'picking_id': picking_in.id}) moves_in.write({'picking_id': picking_in.id})
moves_out.write({'picking_id': picking_out.id}) moves_out.write({'picking_id': picking_out.id})
moves_in._assign_picking_post_process(new=new_picking) moves_in._assign_picking_post_process(new=new_picking)
@@ -261,3 +280,20 @@ class ResStockPicking(models.Model):
m += 1 m += 1
sorted_workorders.write({'picking_in_id': picking_in.id, 'picking_out_id': picking_out.id}) sorted_workorders.write({'picking_in_id': picking_in.id, 'picking_out_id': picking_out.id})
class ReStockMove(models.Model):
_inherit = 'stock.move'
def _get_new_picking_values_Res(self, item, sorted_workorders, rescode):
return {
'name': self.env['stock.picking']._get_name_Res(rescode),
'origin': item.name,
'company_id': self.mapped('company_id').id,
'user_id': False,
'move_type': self.mapped('group_id').move_type or 'direct',
'partner_id': sorted_workorders.supplier_id.id,
'picking_type_id': self.mapped('picking_type_id').id,
'location_id': self.mapped('location_id').id,
'location_dest_id': self.mapped('location_dest_id').id,
'state': 'draft',
}