1、添加拆解的仓库管理地点;2、优化功能刀具拆解库存管理;3、代码迁移
This commit is contained in:
@@ -22,6 +22,16 @@
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
</record>
|
||||
|
||||
<record id="stock_location_tool_dismantle" model="stock.location">
|
||||
<field name="name">拆解</field>
|
||||
<field name="location_id" ref="stock.stock_location_locations_virtual"/>
|
||||
<field name="usage">internal</field>
|
||||
<field name="barcode">DJCJ</field>
|
||||
<field name="scrap_location">true</field>
|
||||
<field name="active">true</field>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="after_assembly_picking_in" model="stock.picking.type">
|
||||
<field name="name">刀具组装入库</field>
|
||||
|
||||
@@ -933,79 +933,55 @@ class FunctionalToolDismantle(models.Model):
|
||||
self.rfid, self.functional_tool_id.current_location))
|
||||
# 目标重复校验
|
||||
self.location_duplicate_check()
|
||||
location = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
|
||||
location_dest = self.env['stock.location'].search([('name', '=', '刀具房')])
|
||||
datas = {'scrap': [], 'picking': []}
|
||||
# =================刀柄是否[报废]拆解=======
|
||||
location_dest_scrap_ids = self.env['stock.location'].search([('name', 'in', ('Scrap', '报废'))])
|
||||
if self.handle_rfid:
|
||||
lot = self.env['stock.lot'].sudo().search([('rfid', '=', self.handle_rfid)])
|
||||
if not lot:
|
||||
raise ValidationError('Rfid为【%s】的功能刀具序列号不存在!' % self.handle_rfid)
|
||||
raise ValidationError('Rfid为【%s】的刀柄序列号不存在!' % self.handle_rfid)
|
||||
if self.scrap_boolean:
|
||||
# 刀柄报废 入库到Scrap
|
||||
lot.create_stock_quant(location, location_dest_scrap_ids[-1], False, code, False, False)
|
||||
datas['scrap'].append({'lot_id': lot})
|
||||
lot.tool_material_status = '报废'
|
||||
else:
|
||||
# 刀柄不报废 入库到刀具房
|
||||
lot.create_stock_quant(location, location_dest, False, code, False, False)
|
||||
datas['picking'].append({'lot_id': lot, 'destination': self.env['sf.shelf.location']})
|
||||
lot.tool_material_status = '可用'
|
||||
|
||||
# ==============功能刀具[报废]拆解================
|
||||
if self.dismantle_cause in ['寿命到期报废', '崩刀报废']:
|
||||
# 除刀柄外物料报废 入库到Scrap
|
||||
if self.integral_product_id:
|
||||
self.integral_product_id.dismantle_stock_moves(False, self.integral_lot_id, location,
|
||||
location_dest_scrap_ids[-1], code)
|
||||
datas['scrap'].append({'lot_id': self.integral_lot_id})
|
||||
elif self.blade_product_id:
|
||||
self.blade_product_id.dismantle_stock_moves(False, self.blade_lot_id, location,
|
||||
location_dest_scrap_ids[-1], code)
|
||||
datas['scrap'].append({'lot_id': self.blade_lot_id})
|
||||
if self.bar_product_id:
|
||||
self.bar_product_id.dismantle_stock_moves(False, self.bar_lot_id, location,
|
||||
location_dest_scrap_ids[-1], code)
|
||||
datas['scrap'].append({'lot_id': self.bar_lot_id})
|
||||
elif self.pad_product_id:
|
||||
self.pad_product_id.dismantle_stock_moves(False, self.pad_lot_id, location,
|
||||
location_dest_scrap_ids[-1], code)
|
||||
datas['scrap'].append({'lot_id': self.pad_lot_id})
|
||||
if self.chuck_product_id:
|
||||
self.chuck_product_id.dismantle_stock_moves(False, self.chuck_lot_id, location,
|
||||
location_dest_scrap_ids[-1], code)
|
||||
# ===========功能刀具[磨削]拆解==============
|
||||
# elif self.dismantle_cause in ['刀具需磨削']:
|
||||
# location_dest = self.env['stock.location'].search([('name', '=', '磨削房')])
|
||||
# # 除刀柄外物料拆解 入库到具体库位
|
||||
# if self.integral_product_id:
|
||||
# self.integral_product_id.dismantle_stock_moves(False, location, location_dest)
|
||||
# elif self.blade_product_id:
|
||||
# self.blade_product_id.dismantle_stock_moves(False, location, location_dest)
|
||||
# if self.bar_product_id:
|
||||
# self.bar_product_id.dismantle_stock_moves(False, location, location_dest)
|
||||
# elif self.pad_product_id:
|
||||
# self.pad_product_id.dismantle_stock_moves(False, location, location_dest)
|
||||
# if self.chuck_product_id:
|
||||
# self.chuck_product_id.dismantle_stock_moves(False, location, location_dest)
|
||||
datas['scrap'].append({'lot_id': self.chuck_lot_id})
|
||||
# ==============功能刀具[更换,磨削]拆解==============
|
||||
elif self.dismantle_cause in ['更换为其他刀具', '刀具需磨削']:
|
||||
# 除刀柄外物料拆解 入库到具体货位
|
||||
if self.integral_freight_id:
|
||||
self.integral_product_id.dismantle_stock_moves(self.integral_freight_id, self.integral_lot_id, location,
|
||||
location_dest, code)
|
||||
datas['picking'].append({'lot_id': self.integral_lot_id, 'destination': self.integral_freight_id})
|
||||
elif self.blade_freight_id:
|
||||
self.blade_product_id.dismantle_stock_moves(self.blade_freight_id, self.blade_lot_id, location,
|
||||
location_dest, code)
|
||||
datas['picking'].append({'lot_id': self.blade_lot_id, 'destination': self.blade_freight_id})
|
||||
if self.bar_freight_id:
|
||||
self.bar_product_id.dismantle_stock_moves(self.bar_freight_id, self.bar_lot_id, location,
|
||||
location_dest, code)
|
||||
datas['picking'].append({'lot_id': self.bar_lot_id, 'destination': self.bar_freight_id})
|
||||
elif self.pad_freight_id:
|
||||
self.pad_product_id.dismantle_stock_moves(self.pad_freight_id, self.pad_lot_id, location,
|
||||
location_dest, code)
|
||||
datas['picking'].append({'lot_id': self.pad_lot_id, 'destination': self.pad_freight_id})
|
||||
if self.chuck_freight_id:
|
||||
self.chuck_product_id.dismantle_stock_moves(self.chuck_freight_id, self.chuck_lot_id, location,
|
||||
location_dest, code)
|
||||
# ===============删除功能刀具的Rfid字段的值, 赋值给Rfid(已拆解)字段=====
|
||||
datas['picking'].append({'lot_id': self.chuck_lot_id, 'destination': self.chuck_freight_id})
|
||||
self.create_tool_picking_scrap(datas)
|
||||
# ===============修改功能刀具数据=====
|
||||
self.functional_tool_id.write({
|
||||
'rfid_dismantle': self.functional_tool_id.rfid,
|
||||
'rfid': '',
|
||||
'functional_tool_status': '已拆除'
|
||||
})
|
||||
# 创建功能刀具拆解移动记录
|
||||
location_dismantle_id = self.env['stock.location'].search([('name', '=', '拆解')])
|
||||
# 修改拆解单的值
|
||||
self.write({
|
||||
'rfid_dismantle': self.rfid,
|
||||
@@ -1016,31 +992,120 @@ class FunctionalToolDismantle(models.Model):
|
||||
})
|
||||
logging.info('【%s】刀具拆解成功!' % self.name)
|
||||
|
||||
def create_tool_picking_scrap(self, datas):
|
||||
scrap_data = datas['scrap']
|
||||
picking_data = datas['picking']
|
||||
if scrap_data:
|
||||
for data in scrap_data:
|
||||
if data:
|
||||
self.env['stock.scrap'].create_tool_dismantle_stock_scrap(data['lot_id'], self)
|
||||
if picking_data:
|
||||
picking_id = self.env['stock.picking'].create_tool_dismantle_picking(self)
|
||||
self.env['stock.move'].create_tool_stock_move({'data': picking_data, 'picking_id': picking_id})
|
||||
# 将刀具物料出库库单的状态更改为就绪
|
||||
picking_id.action_confirm()
|
||||
# 修改刀具物料出库移动历史记录
|
||||
self.env['stock.move'].write_tool_stock_move_line({'data': picking_data, 'picking_id': picking_id})
|
||||
# 设置数量,并验证完成
|
||||
picking_id.action_set_quantities_to_reservation()
|
||||
picking_id.button_validate()
|
||||
|
||||
class ProductProduct(models.Model):
|
||||
_inherit = 'product.product'
|
||||
|
||||
def dismantle_stock_moves(self, shelf_location_id, lot_id, location_id, location_dest_id, code):
|
||||
# 创建功能刀具拆解单产品库存移动记录
|
||||
stock_move_id = self.env['stock.move'].sudo().create({
|
||||
'name': code,
|
||||
'product_id': self.id,
|
||||
class StockPicking(models.Model):
|
||||
_inherit = 'stock.picking'
|
||||
|
||||
def create_tool_dismantle_picking(self, obj):
|
||||
"""
|
||||
创建刀具物料入库单
|
||||
"""
|
||||
# 获取名称为内部调拨的作业类型
|
||||
picking_type_id = self.env['stock.picking.type'].sudo().search([('name', '=', '内部调拨')])
|
||||
location_id = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
|
||||
location_dest_id = self.env['stock.location'].search([('name', '=', '刀具房')])
|
||||
if not location_id:
|
||||
raise ValidationError('缺少名称为【刀具组装位置】的仓库管理地点')
|
||||
if not location_dest_id:
|
||||
raise ValidationError('缺少名称为【刀具房】的仓库管理地点')
|
||||
# 创建刀具物料出库单
|
||||
picking_id = self.env['stock.picking'].create({
|
||||
'name': self._get_name_stock1(picking_type_id),
|
||||
'picking_type_id': picking_type_id.id,
|
||||
'location_id': location_id.id,
|
||||
'location_dest_id': location_dest_id.id,
|
||||
'origin': obj.code
|
||||
})
|
||||
|
||||
return picking_id
|
||||
|
||||
|
||||
class StockMove(models.Model):
|
||||
_inherit = 'stock.move'
|
||||
|
||||
def create_tool_stock_move(self, datas):
|
||||
picking_id = datas['picking_id']
|
||||
data = datas['data']
|
||||
stock_move_ids = []
|
||||
for res in data:
|
||||
if res:
|
||||
# 创建库存移动记录
|
||||
stock_move_id = self.env['stock.move'].sudo().create({
|
||||
'name': picking_id.name,
|
||||
'picking_id': picking_id.id,
|
||||
'product_id': res['lot_id'].product_id.id,
|
||||
'location_id': picking_id.location_id.id,
|
||||
'location_dest_id': picking_id.location_dest_id.id,
|
||||
'product_uom_qty': 1.00,
|
||||
'reserved_availability': 1.00
|
||||
})
|
||||
stock_move_ids.append(stock_move_id)
|
||||
return stock_move_ids
|
||||
|
||||
def write_tool_stock_move_line(self, datas):
|
||||
picking_id = datas['picking_id']
|
||||
data = datas['data']
|
||||
move_line_ids = picking_id.move_line_ids
|
||||
for move_line_id in move_line_ids:
|
||||
for res in data:
|
||||
if move_line_id.lot_id.product_id == res['lot_id'].product_id:
|
||||
move_line_id.write({
|
||||
'destination_location_id': res.get('destination').id,
|
||||
'lot_id': res.get('lot_id').id
|
||||
})
|
||||
return True
|
||||
|
||||
def create_functional_tool_stock_move(self, location_inventory_id, stock_location_id, functional_tool_assembly_id,
|
||||
name, obj,
|
||||
tool_groups_id):
|
||||
"""
|
||||
对功能刀具拆解过程的功能刀具进行库存移动,以及创建移动历史
|
||||
"""
|
||||
# 创建库存移动记录
|
||||
stock_move_id = self.env['stock.move'].sudo().create({
|
||||
'name': name,
|
||||
'product_id': self.product_id.id,
|
||||
'location_id': location_inventory_id.id,
|
||||
'location_dest_id': stock_location_id.id,
|
||||
'product_uom_qty': 1.00,
|
||||
'state': 'done'
|
||||
})
|
||||
|
||||
# 创建移动历史记录
|
||||
stock_move_line_id = self.env['stock.move.line'].sudo().create({
|
||||
'product_id': self.id,
|
||||
'lot_id': lot_id.id,
|
||||
'product_id': self.product_id.id,
|
||||
'functional_tool_name_id': functional_tool_assembly_id,
|
||||
'lot_id': self.id,
|
||||
'move_id': stock_move_id.id,
|
||||
'destination_location_id': shelf_location_id.id if shelf_location_id else False,
|
||||
'install_tool_time': fields.Datetime.now(),
|
||||
'qty_done': 1.0,
|
||||
'state': 'done',
|
||||
'functional_tool_type_id': False if not obj else obj.functional_tool_type_id.id,
|
||||
'diameter': None if not obj else obj.after_assembly_functional_tool_diameter,
|
||||
'knife_tip_r_angle': None if not obj else obj.after_assembly_knife_tip_r_angle,
|
||||
'code': '' if not obj else obj.code,
|
||||
'rfid': '' if not obj else obj.rfid,
|
||||
'functional_tool_name': '' if not obj else obj.after_assembly_functional_tool_name,
|
||||
'tool_groups_id': False if not tool_groups_id else tool_groups_id.id
|
||||
})
|
||||
|
||||
return stock_move_id, stock_move_line_id
|
||||
|
||||
|
||||
@@ -1048,3 +1113,22 @@ class CustomStockScrap(models.Model):
|
||||
_inherit = 'stock.scrap'
|
||||
|
||||
functional_tool_dismantle_id = fields.Many2one('sf.functional.tool.dismantle', string="功能刀具拆解单")
|
||||
|
||||
def create_tool_dismantle_stock_scrap(self, lot, dismantle_id):
|
||||
location_id = self.env['stock.location'].search([('name', '=', '刀具组装位置')])
|
||||
scrap_location_id = self.env['stock.location'].search([('name', 'in', ('Scrap', '报废'))])
|
||||
if not location_id:
|
||||
raise ValidationError('缺少名称为【刀具组装位置】的仓库管理地点')
|
||||
if not scrap_location_id:
|
||||
raise ValidationError('缺少名称为【Scrap】或【Scrap】的仓库管理地点')
|
||||
stock_scrap_id = self.create({
|
||||
'product_id': lot.product_id.id,
|
||||
'lot_id': lot.id,
|
||||
'location_id': location_id.id,
|
||||
'scrap_location_id': scrap_location_id.id,
|
||||
'functional_tool_dismantle_id': dismantle_id.id,
|
||||
'origin': dismantle_id.code
|
||||
})
|
||||
# 完成报废单
|
||||
stock_scrap_id.action_validate()
|
||||
return stock_scrap_id
|
||||
|
||||
@@ -711,10 +711,14 @@
|
||||
</searchpanel>
|
||||
|
||||
<group expand="0" string="Group By...">
|
||||
<filter string="功能刀具名称" name="name" domain="[]" context="{'group_by': 'functional_tool_name'}"/>
|
||||
<filter string="刀具组" name="tool_groups" domain="[]" context="{'group_by': 'tool_groups_id'}"/>
|
||||
<filter string="任务来源" name="loading_task_source" domain="[]" context="{'group_by': 'loading_task_source'}"/>
|
||||
<filter string="用刀时间" name="use_tool_time" domain="[]" context="{'group_by': 'use_tool_time'}"/>
|
||||
<filter string="功能刀具名称" name="name" domain="[]"
|
||||
context="{'group_by': 'functional_tool_name'}"/>
|
||||
<filter string="刀具组" name="tool_groups" domain="[]"
|
||||
context="{'group_by': 'tool_groups_id'}"/>
|
||||
<filter string="任务来源" name="loading_task_source" domain="[]"
|
||||
context="{'group_by': 'loading_task_source'}"/>
|
||||
<filter string="用刀时间" name="use_tool_time" domain="[]"
|
||||
context="{'group_by': 'use_tool_time'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
@@ -791,8 +795,8 @@
|
||||
attrs="{'readonly': [('state', '=', '已拆解')]}"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="scrap_id"
|
||||
attrs="{'invisible': [('dismantle_cause', 'not in', ['寿命到期报废','崩刀报废'])]}"/>
|
||||
<!-- <field name="scrap_id"-->
|
||||
<!-- attrs="{'invisible': [('dismantle_cause', 'not in', ['寿命到期报废','崩刀报废'])]}"/>-->
|
||||
<field name="grinding_id"
|
||||
attrs="{'invisible': [('dismantle_cause', 'not in', ['刀具需磨削'])]}"/>
|
||||
</group>
|
||||
@@ -879,6 +883,9 @@
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="报废" attrs="{'invisible':[('dismantle_cause', 'not in', ['寿命到期报废','崩刀报废'])]}">
|
||||
<field name="scrap_ids"/>
|
||||
</page>
|
||||
<page string="其他">
|
||||
<group>
|
||||
<group>
|
||||
|
||||
@@ -622,9 +622,9 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
||||
# 封装功能刀具数据,用于创建功能刀具记录
|
||||
desc_2 = self.get_desc_2(stock_lot, functional_tool_assembly)
|
||||
# 创建功能刀具组装入库单
|
||||
self.env['stock.picking'].create_stocking_picking(stock_lot, functional_tool_assembly, self)
|
||||
self.env['stock.picking'].create_tool_stocking_picking(stock_lot, functional_tool_assembly, self)
|
||||
# 创建刀具物料出库单
|
||||
self.env['stock.picking'].create_stocking_picking1(self)
|
||||
self.env['stock.picking'].create_tool_stocking_picking1(self)
|
||||
|
||||
# ============================创建功能刀具列表、安全库存记录===============================
|
||||
# 创建功能刀具列表记录
|
||||
@@ -770,7 +770,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel):
|
||||
class StockPicking(models.Model):
|
||||
_inherit = 'stock.picking'
|
||||
|
||||
def create_stocking_picking(self, stock_lot, functional_tool_assembly, obj):
|
||||
def create_tool_stocking_picking(self, stock_lot, functional_tool_assembly, obj):
|
||||
"""
|
||||
创建功能刀具组装入库单
|
||||
"""
|
||||
@@ -821,7 +821,7 @@ class StockPicking(models.Model):
|
||||
num = "%03d" % m
|
||||
return name + str(num)
|
||||
|
||||
def create_stocking_picking1(self, obj):
|
||||
def create_tool_stocking_picking1(self, obj):
|
||||
"""
|
||||
创建刀具物料出库单
|
||||
"""
|
||||
@@ -874,10 +874,10 @@ class StockPicking(models.Model):
|
||||
order="id desc"
|
||||
)
|
||||
if not stock_id:
|
||||
num = "%03d" % 1
|
||||
num = "%05d" % 1
|
||||
else:
|
||||
m = int(stock_id.name[-3:]) + 1
|
||||
num = "%03d" % m
|
||||
num = "%05d" % m
|
||||
return name + str(num)
|
||||
|
||||
|
||||
@@ -950,53 +950,3 @@ class ProductProduct(models.Model):
|
||||
m = int(stock_lot_id.name[-3:]) + 1
|
||||
num = "%03d" % m
|
||||
return '%s-%s' % (code, num)
|
||||
|
||||
|
||||
class StockLot(models.Model):
|
||||
_inherit = 'stock.lot'
|
||||
|
||||
def create_stock_quant(self, location_inventory_id, stock_location_id, functional_tool_assembly_id, name, obj,
|
||||
tool_groups_id):
|
||||
"""
|
||||
对功能刀具组装过程的功能刀具和刀具物料进行库存移动,以及创建移动历史
|
||||
"""
|
||||
|
||||
# 创建库存移动记录
|
||||
stock_move_id = self.env['stock.move'].sudo().create({
|
||||
'name': name,
|
||||
'product_id': self.product_id.id,
|
||||
'location_id': location_inventory_id.id,
|
||||
'location_dest_id': stock_location_id.id,
|
||||
'product_uom_qty': 1.00,
|
||||
'state': 'done'
|
||||
})
|
||||
|
||||
# 创建移动历史记录
|
||||
stock_move_line_id = self.env['stock.move.line'].sudo().create({
|
||||
'product_id': self.product_id.id,
|
||||
'functional_tool_name_id': functional_tool_assembly_id,
|
||||
'lot_id': self.id,
|
||||
'move_id': stock_move_id.id,
|
||||
'install_tool_time': fields.Datetime.now(),
|
||||
'qty_done': 1.0,
|
||||
'state': 'done',
|
||||
'functional_tool_type_id': False if not obj else obj.functional_tool_type_id.id,
|
||||
'diameter': None if not obj else obj.after_assembly_functional_tool_diameter,
|
||||
'knife_tip_r_angle': None if not obj else obj.after_assembly_knife_tip_r_angle,
|
||||
'code': '' if not obj else obj.code,
|
||||
'rfid': '' if not obj else obj.rfid,
|
||||
'functional_tool_name': '' if not obj else obj.after_assembly_functional_tool_name,
|
||||
'tool_groups_id': False if not tool_groups_id else tool_groups_id.id
|
||||
})
|
||||
return stock_move_id, stock_move_line_id
|
||||
|
||||
# class StockQuant(models.Model):
|
||||
# _inherit = 'stock.quant'
|
||||
#
|
||||
# @api.model_create_multi
|
||||
# def create(self, vals_list):
|
||||
# records = super(StockQuant, self).create(vals_list)
|
||||
# for record in records:
|
||||
# if record.lot_id.product_id.categ_id.name == '刀具':
|
||||
# record.lot_id.enroll_tool_material_stock()
|
||||
# return records
|
||||
|
||||
Reference in New Issue
Block a user