功能刀具清单 bom添加查询排序与清单明细行删除校验

This commit is contained in:
liaodanlong
2024-09-11 10:23:02 +08:00
parent e1f7aeaa96
commit 9eee8557c2
5 changed files with 40 additions and 6 deletions

View File

@@ -11,3 +11,4 @@ from . import stock
from . import jikimo_bom from . import jikimo_bom
from . import tool_inventory from . import tool_inventory
from . import functional_cutting_tool_model from . import functional_cutting_tool_model
# from . import product_product

View File

@@ -3,4 +3,4 @@ from odoo import models, fields
class SyncFunctionalCuttingToolModel(models.Model): class SyncFunctionalCuttingToolModel(models.Model):
_inherit = 'sf.functional.cutting.tool.model' _inherit = 'sf.functional.cutting.tool.model'
cutting_tool_type_ids = fields.Many2many('sf.cutting.tool.type', string='刀具物料类型') cutting_tool_type_ids = fields.Many2many('sf.cutting.tool.type', string='适用刀具物料类型', required=True)

View File

@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from collections import Counter
from xml import etree from xml import etree
from odoo import models, fields, api, Command from odoo import models, fields, api, Command
from odoo.exceptions import UserError from odoo.exceptions import UserError, AccessError
from odoo.http import request from odoo.http import request
@@ -28,6 +29,26 @@ class jikimo_bom(models.Model):
result.append((bom.id, '功能刀具物料清单')) result.append((bom.id, '功能刀具物料清单'))
return result return result
def check_types_in_list(self):
# 统计每个元素的类型
type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids)
return all(count > 0 for count in type_counts.values()) and len(type_counts) == self.options.split('+')
def write(self, vals):
# 在更新模型时记录旧的 Many2many ID 列表
if 'product_ids' in vals:
old_product_counter = Counter(self.product_ids.ids)
super(jikimo_bom, self).write(vals)
new_product_counter = Counter(self.product_ids.ids)
delete_product_counter = old_product_counter - new_product_counter
if delete_product_counter:
# 删除操作
if self.check_types_in_list():
return True
else:
raise UserError('每种物料最少要有一个')
return super(jikimo_bom, self).write(vals)
def bom_product_domains(self, assembly_options): def bom_product_domains(self, assembly_options):
self.options = assembly_options self.options = assembly_options
cutting_tool_materials = self.env['sf.cutting.tool.material'].search( cutting_tool_materials = self.env['sf.cutting.tool.material'].search(
@@ -65,6 +86,7 @@ class jikimo_bom(models.Model):
# product = self.env['product.product'].search(domain) # product = self.env['product.product'].search(domain)
# if product: # if product:
# products = products + product # products = products + product
domains = domains + [('stock_move_count', '>', 0)]
return domains return domains
def generate_bill_materials(self, assembly_options): def generate_bill_materials(self, assembly_options):
@@ -88,6 +110,16 @@ class jikimo_bom_line(models.Model):
class ProductProduct(models.Model): class ProductProduct(models.Model):
_inherit = 'product.product' _inherit = 'product.product'
_order = 'cutting_tool_material_id, cutting_tool_type_id'
stock_move_count = fields.Integer(string='stock_move count', compute='_compute_stock_move_count', store=True)
@api.depends('stock_move_ids')
def _compute_stock_move_count(self):
for record in self:
if record.stock_move_ids:
record.stock_move_count = len(record.stock_move_ids)
else:
record.stock_move_count = 0
def search(self, args, offset=0, limit=None, order=None, count=False): def search(self, args, offset=0, limit=None, order=None, count=False):
# 你可以在这里修改 `args` 以调整搜索条件 # 你可以在这里修改 `args` 以调整搜索条件

View File

@@ -5,10 +5,10 @@ from odoo.http import request
class ToolInventory(models.Model): class ToolInventory(models.Model):
_inherit = 'sf.tool.inventory' _inherit = 'sf.tool.inventory'
_description = '功能刀具清单' _description = '功能刀具清单'
knife_handle_model = fields.Selection([('BT30', 'BT30'), ('BT40', 'BT40'), ('BT50', 'BT50'), ('GSK30', 'GSK30'), ('GSK40', 'GSK40'), ('GSK50', 'GSK50')], string='使用刀柄型号') knife_handle_model = fields.Selection([('BT30', 'BT30'), ('BT40', 'BT40'), ('BT50', 'BT50'), ('GSK30', 'GSK30'), ('GSK40', 'GSK40'), ('GSK50', 'GSK50')], string='使用刀柄型号', required=True)
jikimo_bom_ids = fields.One2many('jikimo.bom','tool_inventory_id', 'bom单') jikimo_bom_ids = fields.One2many('jikimo.bom','tool_inventory_id', 'bom单')
blade_length = fields.Float('刃长(mm)')
def bom_mainfest(self): def bom_mainfest(self):
jikimo_bom_ids = self.mapped('jikimo_bom_ids') jikimo_bom_ids = self.mapped('jikimo_bom_ids')
if not jikimo_bom_ids: if not jikimo_bom_ids:
self._bom_mainfest() self._bom_mainfest()

View File

@@ -35,11 +35,12 @@
<field name="name"/> <field name="name"/>
<!-- <field name="categ_id"/>--> <!-- <field name="categ_id"/>-->
<field name="cutting_tool_material_id"/> <field name="cutting_tool_material_id"/>
<field name="cutting_tool_type_id"/>
<field name="cutting_tool_model_id"/> <field name="cutting_tool_model_id"/>
<field name="specification_id"/> <field name="specification_id"/>
<field name="brand_id"/> <field name="brand_id"/>
<field name="qty_available"/> <field name="qty_available"/>
</tree> </tree>
</field> </field>
</page> </page>