Merge branch 'hotfix/新增刀具按批次管理' into hotfix/新增刀具按批次管理_1.1
# Conflicts: # sf_tool_management/controllers/controllers.py
This commit is contained in:
@@ -413,8 +413,9 @@ class FunctionalToolAssembly(models.Model):
|
||||
return categories.browse(functional_tool_type_ids)
|
||||
|
||||
# 刀具物料信息
|
||||
# ==============整体式刀具型号============
|
||||
integral_freight_barcode = fields.Char('整体式刀具货位')
|
||||
# ==============整体式刀具型号=============
|
||||
integral_freight_barcode_id = fields.Many2one('sf.shelf.location', string='整体式刀具货位')
|
||||
integral_lot_id = fields.Many2one('stock.lot', string='整体式刀具批次')
|
||||
integral_product_id = fields.Many2one('product.product', string='整体式刀具名称',
|
||||
compute='_compute_integral_product_id', store=True)
|
||||
cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号',
|
||||
@@ -424,19 +425,15 @@ class FunctionalToolAssembly(models.Model):
|
||||
sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌',
|
||||
related='integral_product_id.brand_id')
|
||||
|
||||
@api.depends('integral_freight_barcode')
|
||||
@api.depends('integral_freight_barcode_id')
|
||||
def _compute_integral_product_id(self):
|
||||
for item in self:
|
||||
if item.integral_freight_barcode:
|
||||
location = self.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', item.integral_freight_barcode)])
|
||||
if location:
|
||||
item.integral_product_id = location.product_id.id
|
||||
else:
|
||||
item.integral_product_id = False
|
||||
if item.integral_freight_barcode_id:
|
||||
item.integral_product_id = item.integral_freight_barcode_id.product_id.id
|
||||
|
||||
# =================刀片型号=============
|
||||
blade_freight_barcode = fields.Char('刀片货位')
|
||||
blade_freight_barcode_id = fields.Many2one('sf.shelf.location', string='刀片货位')
|
||||
blade_lot_id = fields.Many2one('stock.lot', string='刀片批次')
|
||||
blade_product_id = fields.Many2one('product.product', string='刀片名称', compute='_compute_blade_product_id',
|
||||
store=True)
|
||||
cutting_tool_blade_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀片型号',
|
||||
@@ -445,18 +442,15 @@ class FunctionalToolAssembly(models.Model):
|
||||
related='blade_product_id.specification_id')
|
||||
sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', related='blade_product_id.brand_id')
|
||||
|
||||
@api.depends('blade_freight_barcode')
|
||||
@api.depends('blade_freight_barcode_id')
|
||||
def _compute_blade_product_id(self):
|
||||
for item in self:
|
||||
if item.blade_freight_barcode:
|
||||
location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', item.blade_freight_barcode)])
|
||||
if location:
|
||||
item.blade_product_id = location.product_id.id
|
||||
else:
|
||||
item.blade_product_id = False
|
||||
if item.blade_freight_barcode_id:
|
||||
item.blade_product_id = item.blade_freight_barcode_id.product_id.id
|
||||
|
||||
# ==============刀杆型号================
|
||||
bar_freight_barcode = fields.Char('刀杆货位')
|
||||
bar_freight_barcode_id = fields.Many2one('sf.shelf.location', string='刀杆货位')
|
||||
bar_lot_id = fields.Many2one('stock.lot', string='刀杆批次')
|
||||
bar_product_id = fields.Many2one('product.product', string='刀杆名称', compute='_compute_bar_product_id',
|
||||
store=True)
|
||||
cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号',
|
||||
@@ -465,18 +459,15 @@ class FunctionalToolAssembly(models.Model):
|
||||
related='bar_product_id.specification_id')
|
||||
sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', related='bar_product_id.brand_id')
|
||||
|
||||
@api.depends('bar_freight_barcode')
|
||||
@api.depends('bar_freight_barcode_id')
|
||||
def _compute_bar_product_id(self):
|
||||
for item in self:
|
||||
if item.bar_freight_barcode:
|
||||
location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', item.bar_freight_barcode)])
|
||||
if location:
|
||||
item.bar_product_id = location.product_id.id
|
||||
else:
|
||||
item.bar_product_id = False
|
||||
if item.bar_freight_barcode_id:
|
||||
item.bar_product_id = item.bar_freight_barcode_id.product_id.id
|
||||
|
||||
# =============刀盘型号================
|
||||
pad_freight_barcode = fields.Char('刀盘货位')
|
||||
pad_freight_barcode_id = fields.Many2one('sf.shelf.location', string='刀盘货位')
|
||||
pad_lot_id = fields.Many2one('stock.lot', string='刀盘批次')
|
||||
pad_product_id = fields.Many2one('product.product', string='刀盘名称', compute='_compute_pad_product_id',
|
||||
store=True)
|
||||
cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号',
|
||||
@@ -485,15 +476,11 @@ class FunctionalToolAssembly(models.Model):
|
||||
related='pad_product_id.specification_id')
|
||||
sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', related='pad_product_id.brand_id')
|
||||
|
||||
@api.depends('pad_freight_barcode')
|
||||
@api.depends('pad_freight_barcode_id')
|
||||
def _compute_pad_product_id(self):
|
||||
for item in self:
|
||||
if item.pad_freight_barcode:
|
||||
location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', item.pad_freight_barcode)])
|
||||
if location:
|
||||
item.pad_product_id = location.product_id.id
|
||||
else:
|
||||
item.pad_product_id = False
|
||||
if item.pad_freight_barcode_id:
|
||||
item.pad_product_id = item.pad_freight_barcode_id.product_id.id
|
||||
|
||||
# ==============刀柄型号==============
|
||||
handle_freight_rfid = fields.Char('刀柄Rfid', compute='_compute_handle_product_id', store=True)
|
||||
@@ -517,7 +504,8 @@ class FunctionalToolAssembly(models.Model):
|
||||
item.handle_freight_rfid = False
|
||||
|
||||
# ==============夹头型号==============
|
||||
chuck_freight_barcode = fields.Char('夹头货位')
|
||||
chuck_freight_barcode_id = fields.Many2one('sf.shelf.location', string='夹头货位')
|
||||
chuck_lot_id = fields.Many2one('stock.lot', string='夹头批次')
|
||||
chuck_product_id = fields.Many2one('product.product', string='夹头名称', compute='_compute_chuck_product_id',
|
||||
store=True)
|
||||
cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号',
|
||||
@@ -526,17 +514,18 @@ class FunctionalToolAssembly(models.Model):
|
||||
related='chuck_product_id.specification_id')
|
||||
sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', related='chuck_product_id.brand_id')
|
||||
|
||||
@api.depends('chuck_freight_barcode')
|
||||
@api.depends('chuck_freight_barcode_id')
|
||||
def _compute_chuck_product_id(self):
|
||||
for item in self:
|
||||
if item.chuck_freight_barcode:
|
||||
location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', item.chuck_freight_barcode)])
|
||||
if location:
|
||||
item.chuck_product_id = location.product_id.id
|
||||
else:
|
||||
item.chuck_product_id = False
|
||||
if item.chuck_freight_barcode_id:
|
||||
item.chuck_product_id = item.chuck_freight_barcode_id.product_id.id
|
||||
|
||||
# ==================待删除字段==================
|
||||
integral_freight_barcode = fields.Char('整体式刀具货位')
|
||||
blade_freight_barcode = fields.Char('刀片货位')
|
||||
bar_freight_barcode = fields.Char('刀杆货位')
|
||||
pad_freight_barcode = fields.Char('刀盘货位')
|
||||
chuck_freight_barcode = fields.Char('夹头货位')
|
||||
blade_name = fields.Char('')
|
||||
integral_name = fields.Char('')
|
||||
blade_code_id = fields.Many2one('stock.lot', '刀片序列号')
|
||||
@@ -740,6 +729,22 @@ class FunctionalToolDismantle(models.Model):
|
||||
raise ValidationError('该功能刀具因为%s拆解,无需录入库位' % self.dismantle_cause)
|
||||
|
||||
name = fields.Char('名称', related='functional_tool_id.name')
|
||||
code = fields.Char('拆解单号', default=lambda self: self._get_code(), readonly=True)
|
||||
|
||||
def _get_code(self):
|
||||
"""
|
||||
自动生成拆解单编码
|
||||
"""
|
||||
new_time = str(fields.Date.today())
|
||||
datetime = new_time[2:4] + new_time[5:7] + new_time[-2:]
|
||||
functional_tool_dismantle = self.env['sf.functional.tool.dismantle'].sudo().search(
|
||||
[('code', 'ilike', datetime)], limit=1, order="id desc")
|
||||
if not functional_tool_dismantle:
|
||||
num = "%03d" % 1
|
||||
else:
|
||||
m = int(functional_tool_dismantle.code[-3:]) + 1
|
||||
num = "%03d" % m
|
||||
return 'GNDJ-CJD-%s-%s' % (datetime, num)
|
||||
|
||||
functional_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', required=True,
|
||||
domain=[('functional_tool_status', '!=', '已拆除')])
|
||||
@@ -771,6 +776,8 @@ class FunctionalToolDismantle(models.Model):
|
||||
related='handle_product_id.cutting_tool_model_id')
|
||||
handle_brand_id = fields.Many2one('sf.machine.brand', string='刀柄品牌', related='handle_product_id.brand_id')
|
||||
handle_rfid = fields.Char(string='刀柄Rfid', compute='_compute_functional_tool_num', store=True)
|
||||
handle_lot_id = fields.Many2one('stock.lot', string='刀柄序列号', compute='_compute_functional_tool_num',
|
||||
store=True)
|
||||
scrap_boolean = fields.Boolean(string='刀柄是否报废', default=False)
|
||||
|
||||
# 整体式
|
||||
@@ -780,6 +787,8 @@ class FunctionalToolDismantle(models.Model):
|
||||
related='integral_product_id.cutting_tool_model_id')
|
||||
integral_brand_id = fields.Many2one('sf.machine.brand', string='整体式刀具品牌',
|
||||
related='integral_product_id.brand_id')
|
||||
integral_lot_id = fields.Many2one('stock.lot', string='整体式刀具批次', compute='_compute_functional_tool_num',
|
||||
store=True)
|
||||
integral_freight_id = fields.Many2one('sf.shelf.location', '整体式刀具目标货位',
|
||||
domain="[('product_id', 'in', (integral_product_id, False))]")
|
||||
|
||||
@@ -789,6 +798,7 @@ class FunctionalToolDismantle(models.Model):
|
||||
blade_type_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀片型号',
|
||||
related='blade_product_id.cutting_tool_model_id')
|
||||
blade_brand_id = fields.Many2one('sf.machine.brand', string='刀片品牌', related='blade_product_id.brand_id')
|
||||
blade_lot_id = fields.Many2one('stock.lot', string='刀片批次', compute='_compute_functional_tool_num', store=True)
|
||||
blade_freight_id = fields.Many2one('sf.shelf.location', '刀片目标货位',
|
||||
domain="[('product_id', 'in', (blade_product_id, False))]")
|
||||
|
||||
@@ -798,6 +808,7 @@ class FunctionalToolDismantle(models.Model):
|
||||
bar_type_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号',
|
||||
related='bar_product_id.cutting_tool_model_id')
|
||||
bar_brand_id = fields.Many2one('sf.machine.brand', string='刀杆品牌', related='bar_product_id.brand_id')
|
||||
bar_lot_id = fields.Many2one('stock.lot', string='刀杆批次', compute='_compute_functional_tool_num', store=True)
|
||||
bar_freight_id = fields.Many2one('sf.shelf.location', '刀杆目标货位',
|
||||
domain="[('product_id', 'in', (bar_product_id, False))]")
|
||||
|
||||
@@ -807,6 +818,7 @@ class FunctionalToolDismantle(models.Model):
|
||||
pad_type_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号',
|
||||
related='pad_product_id.cutting_tool_model_id')
|
||||
pad_brand_id = fields.Many2one('sf.machine.brand', string='刀盘品牌', related='pad_product_id.brand_id')
|
||||
pad_lot_id = fields.Many2one('stock.lot', string='刀盘批次', compute='_compute_functional_tool_num', store=True)
|
||||
pad_freight_id = fields.Many2one('sf.shelf.location', '刀盘目标货位',
|
||||
domain="[('product_id', 'in', (pad_product_id, False))]")
|
||||
|
||||
@@ -816,6 +828,7 @@ class FunctionalToolDismantle(models.Model):
|
||||
chuck_type_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号',
|
||||
related='chuck_product_id.cutting_tool_model_id')
|
||||
chuck_brand_id = fields.Many2one('sf.machine.brand', string='夹头品牌', related='chuck_product_id.brand_id')
|
||||
chuck_lot_id = fields.Many2one('stock.lot', string='夹头批次', compute='_compute_functional_tool_num', store=True)
|
||||
chuck_freight_id = fields.Many2one('sf.shelf.location', '夹头目标货位',
|
||||
domain="[('product_id', 'in', (chuck_product_id, False))]")
|
||||
|
||||
@@ -839,12 +852,20 @@ class FunctionalToolDismantle(models.Model):
|
||||
item.rfid = item.functional_tool_id.rfid
|
||||
item.handle_rfid = item.functional_tool_id.rfid
|
||||
|
||||
# 产品
|
||||
item.handle_product_id = item.functional_tool_id.functional_tool_name_id.handle_product_id.id
|
||||
item.integral_product_id = item.functional_tool_id.functional_tool_name_id.integral_product_id.id
|
||||
item.blade_product_id = item.functional_tool_id.functional_tool_name_id.blade_product_id.id
|
||||
item.bar_product_id = item.functional_tool_id.functional_tool_name_id.bar_product_id.id
|
||||
item.pad_product_id = item.functional_tool_id.functional_tool_name_id.pad_product_id.id
|
||||
item.chuck_product_id = item.functional_tool_id.functional_tool_name_id.chuck_product_id.id
|
||||
# 批次/序列号
|
||||
item.handle_lot_id = item.functional_tool_id.functional_tool_name_id.handle_code_id.id
|
||||
item.integral_lot_id = item.functional_tool_id.functional_tool_name_id.integral_lot_id.id
|
||||
item.blade_lot_id = item.functional_tool_id.functional_tool_name_id.blade_lot_id.id
|
||||
item.bar_lot_id = item.functional_tool_id.functional_tool_name_id.bar_lot_id.id
|
||||
item.pad_lot_id = item.functional_tool_id.functional_tool_name_id.pad_lot_id.id
|
||||
item.chuck_lot_id = item.functional_tool_id.functional_tool_name_id.chuck_lot_id.id
|
||||
else:
|
||||
item.tool_groups_id = False
|
||||
item.tool_type_id = False
|
||||
@@ -860,8 +881,16 @@ class FunctionalToolDismantle(models.Model):
|
||||
item.pad_product_id = False
|
||||
item.chuck_product_id = False
|
||||
|
||||
item.handle_lot_id = False
|
||||
item.integral_lot_id = False
|
||||
item.blade_lot_id = False
|
||||
item.bar_lot_id = False
|
||||
item.pad_lot_id = False
|
||||
item.chuck_lot_id = False
|
||||
|
||||
def confirmation_disassembly(self):
|
||||
logging.info('%s刀具确认开始拆解' % self.dismantle_cause)
|
||||
code = self.code
|
||||
if self.functional_tool_id.functional_tool_status == '已拆除':
|
||||
raise ValidationError('Rfid为【%s】的功能刀具已经拆解,请勿重复操作!' % self.functional_tool_id.rfid_dismantle)
|
||||
# 对拆解的功能刀具进行校验,只有在刀具房的功能刀具才能拆解
|
||||
@@ -889,43 +918,52 @@ class FunctionalToolDismantle(models.Model):
|
||||
if self.dismantle_cause in ['寿命到期报废', '崩刀报废']:
|
||||
# 除刀柄外物料报废 入库到Scrap
|
||||
if self.integral_product_id:
|
||||
self.integral_product_id.dismantle_stock_moves(False, location, location_dest_scrap)
|
||||
self.integral_product_id.dismantle_stock_moves(False, self.integral_lot_id, location,
|
||||
location_dest_scrap, code)
|
||||
elif self.blade_product_id:
|
||||
self.blade_product_id.dismantle_stock_moves(False, location, location_dest_scrap)
|
||||
self.blade_product_id.dismantle_stock_moves(False, self.blade_lot_id, location, location_dest_scrap,
|
||||
code)
|
||||
if self.bar_product_id:
|
||||
self.bar_product_id.dismantle_stock_moves(False, location, location_dest_scrap)
|
||||
self.bar_product_id.dismantle_stock_moves(False, self.bar_lot_id, location, location_dest_scrap,
|
||||
code)
|
||||
elif self.pad_product_id:
|
||||
self.pad_product_id.dismantle_stock_moves(False, location, location_dest_scrap)
|
||||
self.pad_product_id.dismantle_stock_moves(False, self.pad_lot_id, location, location_dest_scrap,
|
||||
code)
|
||||
if self.chuck_product_id:
|
||||
self.chuck_product_id.dismantle_stock_moves(False, location, location_dest_scrap)
|
||||
self.chuck_product_id.dismantle_stock_moves(False, self.chuck_lot_id, location, location_dest_scrap,
|
||||
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)
|
||||
# ==============功能刀具[更换]拆解==============
|
||||
elif self.dismantle_cause in ['更换为其他刀具']:
|
||||
# 除刀柄外物料拆解 入库到具体库位
|
||||
# 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)
|
||||
# ==============功能刀具[更换,磨削]拆解==============
|
||||
elif self.dismantle_cause in ['更换为其他刀具', '刀具需磨削']:
|
||||
# 除刀柄外物料拆解 入库到具体货位
|
||||
if self.integral_freight_id:
|
||||
self.integral_product_id.dismantle_stock_moves(self.integral_freight_id.barcode, location,
|
||||
location_dest)
|
||||
self.integral_product_id.dismantle_stock_moves(self.integral_freight_id, self.integral_lot_id, location,
|
||||
location_dest, code)
|
||||
elif self.blade_freight_id:
|
||||
self.blade_product_id.dismantle_stock_moves(self.blade_freight_id.barcode, location, location_dest)
|
||||
self.blade_product_id.dismantle_stock_moves(self.blade_freight_id, self.blade_lot_id, location,
|
||||
location_dest, code)
|
||||
if self.bar_freight_id:
|
||||
self.bar_product_id.dismantle_stock_moves(self.bar_freight_id.barcode, location, location_dest)
|
||||
self.bar_product_id.dismantle_stock_moves(self.bar_freight_id, self.bar_lot_id, location,
|
||||
location_dest, code)
|
||||
elif self.pad_freight_id:
|
||||
self.pad_product_id.dismantle_stock_moves(self.pad_freight_id.barcode, location, location_dest)
|
||||
self.pad_product_id.dismantle_stock_moves(self.pad_freight_id, self.pad_lot_id, location,
|
||||
location_dest, code)
|
||||
if self.chuck_freight_id:
|
||||
self.chuck_product_id.dismantle_stock_moves(self.chuck_freight_id.barcode, location, location_dest)
|
||||
self.chuck_product_id.dismantle_stock_moves(self.chuck_freight_id, self.chuck_lot_id, location,
|
||||
location_dest, code)
|
||||
# ===============删除功能刀具的Rfid字段的值, 赋值给Rfid(已拆解)字段=====
|
||||
self.functional_tool_id.write({
|
||||
'rfid_dismantle': self.functional_tool_id.rfid,
|
||||
@@ -946,26 +984,22 @@ class FunctionalToolDismantle(models.Model):
|
||||
class ProductProduct(models.Model):
|
||||
_inherit = 'product.product'
|
||||
|
||||
def dismantle_stock_moves(self, shelf_location_barcode, location_id, location_dest_id):
|
||||
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': '功能刀具拆解',
|
||||
'name': code,
|
||||
'product_id': self.id,
|
||||
'location_id': location_id.id,
|
||||
'location_dest_id': location_dest_id.id,
|
||||
'product_uom_qty': 1.00,
|
||||
'state': 'done'
|
||||
})
|
||||
if shelf_location_barcode:
|
||||
location = self.env['sf.shelf.location'].sudo().search([('barcode', '=', shelf_location_barcode)])
|
||||
location.product_num = location.product_num + 1
|
||||
else:
|
||||
location = self.env['sf.shelf.location']
|
||||
# 创建移动历史记录
|
||||
stock_move_line_id = self.env['stock.move.line'].sudo().create({
|
||||
'product_id': self.id,
|
||||
'lot_id': lot_id.id,
|
||||
'move_id': stock_move_id.id,
|
||||
'current_location_id': location.id,
|
||||
'destination_location_id': shelf_location_id.id,
|
||||
'install_tool_time': fields.Datetime.now(),
|
||||
'qty_done': 1.0,
|
||||
'state': 'done',
|
||||
|
||||
Reference in New Issue
Block a user