整合所有模块依赖
This commit is contained in:
@@ -1 +1 @@
|
||||
|
||||
from . import models
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
{
|
||||
'name': '机企猫智能工厂 产品管理',
|
||||
'name': '机企猫智能工厂 产品',
|
||||
'version': '1.0',
|
||||
'summary': '智能工厂产品模块',
|
||||
'sequence': 1,
|
||||
@@ -10,16 +10,12 @@
|
||||
""",
|
||||
'category': 'sf',
|
||||
'website': 'https://www.sf.jikimo.com',
|
||||
'depends': ['mrp', 'base', 'sf_manufacturing', 'web_widget_model_viewer', 'mrp_subcontracting',
|
||||
'purchase_stock',
|
||||
'uom', 'jikimo_frontend', 'product'],
|
||||
'depends': ['sf_base', 'web_widget_model_viewer', 'mrp_subcontracting', 'purchase_stock', 'uom', ],
|
||||
'data': [
|
||||
'data/product_data.xml',
|
||||
'data/uom_data.xml',
|
||||
'security/ir.model.access.csv',
|
||||
# 'wizard/cutting_tool_specification_wizard.xml',
|
||||
'views/product_template_view.xml',
|
||||
'views/product_workorder.xml'
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# from . import product_template
|
||||
from . import product_supplierinfo
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,113 @@
|
||||
from odoo import models
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class ResProductCategory(models.Model):
|
||||
_inherit = "product.category"
|
||||
|
||||
type = fields.Selection(
|
||||
[("成品", "成品"), ("坯料", "坯料"), ("原材料", "原材料"), ("表面工艺", "表面工艺"), ("刀具", "刀具"),
|
||||
("夹具", "夹具"), ("功能刀具", "功能刀具")],
|
||||
default="", string="类型")
|
||||
|
||||
|
||||
class ResProductProduct(models.Model):
|
||||
_inherit = 'product.product'
|
||||
|
||||
single_manufacturing = fields.Boolean(string="单个制造")
|
||||
is_bfm = fields.Boolean('业务平台是否自动创建', default=False)
|
||||
|
||||
|
||||
class ResProducTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
single_manufacturing = fields.Binary('模型文件')
|
||||
|
||||
|
||||
class ResMrpBomMo(models.Model):
|
||||
_inherit = 'mrp.bom'
|
||||
|
||||
subcontractor_id = fields.Many2one('res.partner', string='外包商')
|
||||
|
||||
def bom_create_line_has(self, embryo):
|
||||
vals = {
|
||||
'bom_id': self.id,
|
||||
'product_id': embryo.id,
|
||||
'product_tmpl_id': embryo.product_tmpl_id.id,
|
||||
'product_qty': 1,
|
||||
'product_uom_id': 1
|
||||
}
|
||||
return self.env['mrp.bom.line'].create(vals)
|
||||
|
||||
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
|
||||
def bom_create(self, product, bom_type, product_type):
|
||||
bom_id = self.env['mrp.bom'].create({
|
||||
'product_tmpl_id': product.product_tmpl_id.id,
|
||||
'type': bom_type,
|
||||
# 'subcontractor_id': '' or subcontract.partner_id.id,
|
||||
'product_qty': 1,
|
||||
'product_uom_id': 1
|
||||
})
|
||||
if bom_type == 'subcontract' and product_type is not False:
|
||||
subcontract = self.get_supplier(product.materials_type_id)
|
||||
bom_id.subcontractor_id = subcontract.partner_id.id
|
||||
return bom_id
|
||||
|
||||
# 坯料BOM组件:选取当前坯料原材料,
|
||||
# 然后根据当前的坯料的体积得出需要的原材料重量(立方米m³) *材料密度 * 1000 = 所需原材料重量KG(公斤)
|
||||
# 坯料所需原材料公式:当前的坯料的体积(立方米m³) *材料密度 * 1000 = 所需原材料重量KG(公斤)
|
||||
|
||||
def bom_create_line(self, embryo):
|
||||
# 选取当前坯料原材料
|
||||
raw_bom_line = self.get_raw_bom(embryo)
|
||||
if raw_bom_line:
|
||||
qty = 1
|
||||
if round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000) > 1:
|
||||
qty = round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000)
|
||||
bom_line = self.env['mrp.bom.line'].create({
|
||||
'bom_id': self.id,
|
||||
'product_id': raw_bom_line.id,
|
||||
'product_tmpl_id': raw_bom_line.product_tmpl_id.id,
|
||||
'product_qty': qty,
|
||||
'product_uom_id': raw_bom_line.uom_id.id,
|
||||
})
|
||||
return bom_line
|
||||
else:
|
||||
return False
|
||||
|
||||
# 查询材料型号默认排第一的供应商
|
||||
|
||||
def get_supplier(self, materials_type):
|
||||
seller_id = self.env['sf.supplier.sort'].search(
|
||||
[('materials_model_id', '=', materials_type.id)],
|
||||
limit=1,
|
||||
order='sequence asc')
|
||||
return seller_id
|
||||
|
||||
# 匹配bom
|
||||
|
||||
def get_bom(self, product):
|
||||
embryo_has = self.env['product.product'].search(
|
||||
[('categ_id.type', '=', '坯料'), ('materials_type_id', '=', product.materials_type_id.id),
|
||||
('length', '>', product.length), ('width', '>', product.width),
|
||||
('height', '>', product.height), ('is_bfm', '=', False)
|
||||
],
|
||||
limit=1,
|
||||
order='volume desc'
|
||||
)
|
||||
logging.info('get_bom-vals:%s' % embryo_has)
|
||||
if embryo_has:
|
||||
rate_of_waste = ((embryo_has.volume - product.model_volume) % embryo_has.volume) * 100
|
||||
if rate_of_waste <= 20:
|
||||
return embryo_has
|
||||
else:
|
||||
return
|
||||
|
||||
# 查bom的原材料
|
||||
def get_raw_bom(self, product):
|
||||
raw_bom = self.env['product.product'].search(
|
||||
[('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)])
|
||||
return raw_bom
|
||||
|
||||
|
||||
class ResSupplierInfo(models.Model):
|
||||
@@ -8,5 +117,5 @@ class ResSupplierInfo(models.Model):
|
||||
for supplier in self:
|
||||
boms = supplier.product_id.variant_bom_ids
|
||||
boms |= supplier.product_tmpl_id.bom_ids.filtered(lambda b: not b.product_id or b.product_id in (
|
||||
supplier.product_id or supplier.product_tmpl_id.product_variant_ids))
|
||||
supplier.product_id or supplier.product_tmpl_id.product_variant_ids))
|
||||
supplier.is_subcontractor = supplier.partner_id in boms.subcontractor_id
|
||||
|
||||
@@ -1,407 +0,0 @@
|
||||
from odoo import models, fields, api
|
||||
from odoo.exceptions import ValidationError
|
||||
from odoo.modules import get_resource_path
|
||||
from OCC.Extend.DataExchange import read_step_file
|
||||
from OCC.Extend.DataExchange import write_stl_file
|
||||
import logging
|
||||
import base64
|
||||
import hashlib
|
||||
import os
|
||||
|
||||
|
||||
# class ResProduct(models.Model):
|
||||
# _inherit = 'product.template'
|
||||
|
||||
# image_1920 = fields.Image(related='cutting_tool_parameter_image', store=True,
|
||||
# domain=[('cutting_tool_parameter_image', '!=', False)])
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_length',)
|
||||
# def _check_length_or_width(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '刀片':
|
||||
# if record.cutting_tool_parameter_length <= 0 \
|
||||
# and record.cutting_tool_parameter_width <= 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
#
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_length',
|
||||
# 'cutting_tool_parameter_width')
|
||||
# def _check_length_or_width(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '刀片':
|
||||
# if record.cutting_tool_parameter_length <= 0 \
|
||||
# and record.cutting_tool_parameter_width <= 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
# # if self.cutting_tool == '刀片':
|
||||
# # if self.cutting_tool_parameter_length == 0 \
|
||||
# # or self.cutting_tool_parameter_width == 0:
|
||||
# # raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_height')
|
||||
# def _check_height(self):
|
||||
# if self.cutting_tool == '刀片':
|
||||
# if self.cutting_tool_parameter_height <= 0:
|
||||
# raise ValueError('该产品中高度不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_top_angle')
|
||||
# def _check_top_angle(self):
|
||||
# if self.cutting_tool == '刀片':
|
||||
# if self.cutting_tool_parameter_top_angle <= 0:
|
||||
# raise ValueError('该产品中顶角不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_r_angle')
|
||||
# def _check_r_angle(self):
|
||||
# if self.cutting_tool == '刀片':
|
||||
# if self.cutting_tool_parameter_r_angle <= 0:
|
||||
# raise ValueError('该产品中R角不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_radius')
|
||||
# def _check_radius(self):
|
||||
# if self.cutting_tool == '刀片':
|
||||
# if self.cutting_tool_parameter_radius <= 0:
|
||||
# raise ValueError('该产品中刀尖半径不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_handle_length',
|
||||
# 'cutting_tool_parameter_length1',
|
||||
# 'cutting_tool_parameter_diameter1')
|
||||
# # 'cutting_tool_parameter_body_accuracy',
|
||||
# # 'cutting_tool_parameter_detection_accuracy',
|
||||
# # 'cutting_tool_parameter_detection_hardness')
|
||||
# def _check_handle(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '刀柄':
|
||||
# if record.cutting_tool_parameter_handle_length == 0 \
|
||||
# or record.cutting_tool_parameter_diameter1 == 0 \
|
||||
# or record.cutting_tool_parameter_length1 == 0:
|
||||
# # or record.cutting_tool_parameter_detection_accuracy == 0 \
|
||||
# # or record.cutting_tool_parameter_detection_hardness == 0 \
|
||||
# # or record.cutting_tool_parameter_body_accuracy == 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
# # if self.cutting_tool == '刀柄':
|
||||
# # if self.cutting_tool_parameter_handle_length == 0 \
|
||||
# # or self.cutting_tool_parameter_diameter1 == 0 \
|
||||
# # or self.cutting_tool_parameter_length1 == 0 \
|
||||
# # or self.cutting_tool_parameter_detection_accuracy == 0 \
|
||||
# # or self.cutting_tool_parameter_detection_hardness == 0 \
|
||||
# # or self.cutting_tool_parameter_body_accuracy == 0:
|
||||
# # raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_weight')
|
||||
# def _check_weight(self):
|
||||
# if self.cutting_tool == '刀柄':
|
||||
# if self.cutting_tool_parameter_weight == 0:
|
||||
# raise ValueError('该产品中重量不能为零,请确认并重新输入!')
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_c_diameter',
|
||||
# 'cutting_tool_parameter_l_total_length',
|
||||
# 'cutting_tool_parameter_d_diameter',
|
||||
# 'cutting_tool_parameter_wrench',
|
||||
# 'cutting_tool_parameter_screw',
|
||||
# 'cutting_tool_parameter_rounded_corner',
|
||||
# 'cutting_tool_parameter_hardness')
|
||||
# def _check_angle(self):
|
||||
# if self.cutting_tool in ['刀杆', '刀盘']:
|
||||
# if self.cutting_tool_parameter_c_diameter == 0 \
|
||||
# or self.cutting_tool_parameter_l_total_length == 0 \
|
||||
# or self.cutting_tool_parameter_d_diameter == 0 \
|
||||
# or self.cutting_tool_parameter_wrench == 0 \
|
||||
# or self.cutting_tool_parameter_screw == 0 \
|
||||
# or self.cutting_tool_parameter_rounded_corner == 0 \
|
||||
# or self.cutting_tool_parameter_hardness:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_c_diameter',
|
||||
# 'cutting_tool_parameter_l_total_length',
|
||||
# 'cutting_tool_parameter_diameter1')
|
||||
# def _check_angle(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '整体式刀具' or record.cutting_tool == '刀片':
|
||||
# if record.cutting_tool_parameter_c_diameter == 0 \
|
||||
# or record.cutting_tool_parameter_l_total_length == 0 \
|
||||
# or record.cutting_tool_parameter_diameter1 == 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_outer_diameter',
|
||||
# 'cutting_tool_parameter_inner_diameter',
|
||||
# 'cutting_tool_parameter_body_accuracy',
|
||||
# 'cutting_tool_parameter_handle_length',
|
||||
# 'cutting_tool_parameter_length1',
|
||||
# 'cutting_tool_parameter_diameter1')
|
||||
# def _check_angle(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '整体式刀具' or record.cutting_tool == '刀片':
|
||||
# if record.cutting_tool_parameter_front_angle == 0 \
|
||||
# or record.cutting_tool_parameter_rear_angle == 0 \
|
||||
# or record.cutting_tool_parameter_main_included_angle == 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_front_angle',
|
||||
# 'cutting_tool_parameter_rear_angle',
|
||||
# 'cutting_tool_parameter_main_included_angle')
|
||||
# def _check_angle(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '整体式刀具' or record.cutting_tool == '刀片':
|
||||
# if record.cutting_tool_parameter_front_angle <= 0 \
|
||||
# or record.cutting_tool_parameter_rear_angle <= 0 \
|
||||
# or record.cutting_tool_parameter_main_included_angle <= 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_total_length',
|
||||
# 'cutting_tool_parameter_shank_length',
|
||||
# 'cutting_tool_parameter_blade_length',
|
||||
# 'cutting_tool_parameter_diameter')
|
||||
# def _check_length(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '整体式刀具':
|
||||
# if record.cutting_tool_parameter_total_length <= 0 \
|
||||
# or record.cutting_tool_parameter_shank_length <= 0 \
|
||||
# or record.cutting_tool_parameter_blade_length <= 0 \
|
||||
# or record.cutting_tool_parameter_diameter <= 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_total_length',
|
||||
# 'cutting_tool_parameter_shank_length',
|
||||
# 'cutting_tool_parameter_blade_length',
|
||||
# 'cutting_tool_parameter_diameter')
|
||||
# def _check_length(self):
|
||||
# for record in self:
|
||||
# if record.cutting_tool == '整体式刀具':
|
||||
# if record.cutting_tool_parameter_total_length == 0 \
|
||||
# or record.cutting_tool_parameter_shank_length == 0 \
|
||||
# or record.cutting_tool_parameter_blade_length == 0 \
|
||||
# or record.cutting_tool_parameter_diameter == 0:
|
||||
# raise ValueError('该产品中有字段不能为零,请确认并重新输入!')
|
||||
|
||||
# @api.constrains('cutting_tool_parameter_blade_number')
|
||||
# def _check_blade_number(self):
|
||||
# if self.cutting_tool in ['整体式刀具', '刀杆', '刀盘']:
|
||||
# if self.cutting_tool_parameter_blade_number <= 0:
|
||||
# raise ValueError('该产品中刃数不能为零,请确认并重新输入!')
|
||||
#
|
||||
# @api.constrains('cutting_tool_parameter_nut')
|
||||
# def _check_nut(self):
|
||||
# if self.cutting_tool in ['整体式刀具', '刀片', '刀柄', '夹头']:
|
||||
# if self.cutting_tool_parameter_nut <= 0:
|
||||
# raise ValueError('该产品中配对螺母不能为零,请确认并重新输入!')
|
||||
|
||||
|
||||
# @api.onchange('cutting_tool_material_id')
|
||||
# def _get_cutting_tool_material_info(self):
|
||||
# for item in self:
|
||||
# if self.cutting_tool_type == '整体式刀具':
|
||||
# item.cutting_tool_parameter_brand_id = item.cutting_tool_model_id.brand.id
|
||||
# item.cutting_tool_parameter_total_length = item.cutting_tool_model_id.total_length
|
||||
# item.cutting_tool_parameter_shank_length = item.cutting_tool_model_id.shank_length
|
||||
# item.cutting_tool_parameter_blade_length = item.cutting_tool_model_id.blade_length
|
||||
# item.cutting_tool_parameter_diameter = item.cutting_tool_model_id.diameter
|
||||
# item.cutting_tool_parameter_nut = item.cutting_tool_model_id.nut
|
||||
# item.cutting_tool_parameter_blade_number = item.cutting_tool_model_id.blade_number
|
||||
# item.cutting_tool_parameter_material_model_id = item.cutting_tool_model_id.material_model.id
|
||||
# item.cutting_tool_parameter_front_angle = item.cutting_tool_model_id.front_angle
|
||||
# item.cutting_tool_parameter_rear_angle = item.cutting_tool_model_id.rear_angle
|
||||
# item.cutting_tool_parameter_main_included_angle = item.cutting_tool_model_id.main_included_angle
|
||||
# item.cutting_tool_parameter_chuck_model_ids = self._get_ids(
|
||||
# item.cutting_tool_model_id.chuck_model)
|
||||
# item.cutting_tool_parameter_scope = item.cutting_tool_model_id.scope
|
||||
# item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image
|
||||
# elif self.cutting_tool_type == '刀片':
|
||||
# item.cutting_tool_parameter_brand_id = item.cutting_tool_model_id.brand.id
|
||||
# item.cutting_tool_parameter_top_angle = item.cutting_tool_model_id.top_angle
|
||||
# item.cutting_tool_parameter_front_angle = item.cutting_tool_model_id.front_angle
|
||||
# item.cutting_tool_parameter_rear_angle = item.cutting_tool_model_id.rear_angle
|
||||
# item.cutting_tool_parameter_main_included_angle = item.cutting_tool_model_id.main_included_angle
|
||||
# item.cutting_tool_parameter_r_angle = item.cutting_tool_model_id.r_angle
|
||||
# item.cutting_tool_parameter_working_hardness = item.cutting_tool_model_id.hardness
|
||||
# item.cutting_tool_parameter_material_model_id = item.cutting_tool_model_id.material_model.id
|
||||
# item.cutting_tool_parameter_length = item.cutting_tool_model_id.length
|
||||
# item.cutting_tool_parameter_width = item.cutting_tool_model_id.width
|
||||
# item.cutting_tool_parameter_height = item.cutting_tool_model_id.height
|
||||
# item.cutting_tool_parameter_radius = item.cutting_tool_model_id.radius
|
||||
# item.cutting_tool_parameter_nut = item.cutting_tool_model_id.nut
|
||||
# item.cutting_tool_parameter_cutter_bar_ids = self._get_ids(item.cutting_tool_model_id.cutter_bar)
|
||||
# item.cutting_tool_parameter_cutter_pad_ids = self._get_ids(item.cutting_tool_model_id.cutter_pad)
|
||||
# item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image
|
||||
# elif self.cutting_tool_type == '刀杆':
|
||||
# item.cutting_tool_parameter_brand_id = item.cutting_tool_model_id.brand.id
|
||||
# item.cutting_tool_parameter_c_diameter = item.cutting_tool_model_id.c_diameter
|
||||
# item.cutting_tool_parameter_d_diameter = item.cutting_tool_model_id.d_diameter
|
||||
# item.cutting_tool_parameter_l_total_length = item.cutting_tool_model_id.total_length
|
||||
# item.cutting_tool_parameter_wrench = item.cutting_tool_model_id.wrench
|
||||
# item.cutting_tool_parameter_screw = item.cutting_tool_model_id.screw
|
||||
# item.cutting_tool_parameter_blade_ids = self._get_ids(item.cutting_tool_model_id.blade)
|
||||
# item.cutting_tool_parameter_scope = item.cutting_tool_model_id.scope
|
||||
# item.cutting_tool_parameter_material_model_id = item.cutting_tool_model_id.material_model.id
|
||||
# item.cutting_tool_parameter_rounded_corner = item.cutting_tool_model_id.radius
|
||||
# item.cutting_tool_parameter_accuracy_level = item.cutting_tool_model_id.accuracy
|
||||
# item.cutting_tool_parameter_blade_number = item.cutting_tool_model_id.blade_number
|
||||
# item.cutting_tool_parameter_hardness = item.cutting_tool_model_id.hardness
|
||||
# item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image
|
||||
# elif self.cutting_tool_type == '刀盘':
|
||||
# item.cutting_tool_parameter_brand_id = item.cutting_tool_model_id.brand.id
|
||||
# item.cutting_tool_parameter_c_diameter = item.cutting_tool_model_id.c_diameter
|
||||
# item.cutting_tool_parameter_d_diameter = item.cutting_tool_model_id.d_diameter
|
||||
# item.cutting_tool_parameter_l_total_length = item.cutting_tool_model_id.total_length
|
||||
# item.cutting_tool_parameter_wrench = item.cutting_tool_model_id.wrench
|
||||
# item.cutting_tool_parameter_screw = item.cutting_tool_model_id.screw
|
||||
# item.cutting_tool_parameter_blade_ids = item.cutting_tool_model_id.blade.id
|
||||
# item.cutting_tool_parameter_scope = item.cutting_tool_model_id.scope
|
||||
# item.cutting_tool_parameter_material_model_id = item.cutting_tool_model_id.material_model.id
|
||||
# item.cutting_tool_parameter_rounded_corner = item.cutting_tool_model_id.radius
|
||||
# item.cutting_tool_parameter_accuracy_level = item.cutting_tool_model_id.accuracy
|
||||
# item.cutting_tool_parameter_blade_number = item.cutting_tool_model_id.blade_number
|
||||
# item.cutting_tool_parameter_hardness = item.cutting_tool_model_id.hardness
|
||||
# item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image
|
||||
# elif self.cutting_tool_type == '刀柄':
|
||||
# item.cutting_tool_parameter_brand_id = item.cutting_tool_model_id.brand.id
|
||||
# item.cutting_tool_parameter_handle_length = item.cutting_tool_model_id.length
|
||||
# item.cutting_tool_parameter_length1 = item.cutting_tool_model_id.length1
|
||||
# item.cutting_tool_parameter_diameter1 = item.cutting_tool_model_id.diameter1
|
||||
# item.cutting_tool_parameter_body_accuracy = item.cutting_tool_model_id.body_accuracy
|
||||
# item.cutting_tool_parameter_nut = item.cutting_tool_model_id.nut
|
||||
# item.cutting_tool_parameter_clamping_range = item.cutting_tool_model_id.clamping_range
|
||||
# item.cutting_tool_parameter_weight = item.cutting_tool_model_id.weight
|
||||
# item.cutting_tool_parameter_material_model_id = item.cutting_tool_model_id.material_model.id
|
||||
# item.cutting_tool_parameter_chuck_model_ids = self._get_ids(item.cutting_tool_model_id.chuck_model)
|
||||
# item.cutting_tool_parameter_detection_accuracy = item.cutting_tool_model_id.detection_accuracy
|
||||
# item.cutting_tool_parameter_detection_hardness = item.cutting_tool_model_id.detection_hardness
|
||||
# item.cutting_tool_parameter_standard_speed = item.cutting_tool_model_id.standard_speed
|
||||
# item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image
|
||||
# elif self.cutting_tool_type == '夹头':
|
||||
# item.cutting_tool_parameter_brand_id = item.cutting_tool_model_id.brand.id
|
||||
# item.cutting_tool_parameter_outer_diameter = item.cutting_tool_model_id.diameter
|
||||
# item.cutting_tool_parameter_inner_diameter = item.cutting_tool_model_id.inner_diameter
|
||||
# item.cutting_tool_parameter_accuracy = item.cutting_tool_model_id.accuracy
|
||||
# item.cutting_tool_parameter_nut = item.cutting_tool_model_id.nut
|
||||
# item.cutting_tool_parameter_clamping_range = item.cutting_tool_model_id.clamping_range
|
||||
# item.cutting_tool_parameter_handle_model_ids = self._get_ids(item.cutting_tool_model_id.handle_model)
|
||||
# item.cutting_tool_parameter_material_model_id = item.cutting_tool_model_id.material_model.id
|
||||
# item.cutting_tool_parameter_height = item.cutting_tool_model_id.height
|
||||
# item.cutting_tool_parameter_feature = item.cutting_tool_model_id.feature
|
||||
# item.image_1920 = '' if not item.cutting_tool_model_id.image else item.cutting_tool_model_id.image
|
||||
# else:
|
||||
# item.cutting_tool_parameter_brand_id = False
|
||||
# item.cutting_tool_parameter_total_length = False
|
||||
# item.cutting_tool_parameter_shank_length = False
|
||||
# item.cutting_tool_parameter_blade_length = False
|
||||
# item.cutting_tool_parameter_diameter = False
|
||||
# item.cutting_tool_parameter_nut = False
|
||||
# item.cutting_tool_parameter_blade_number = False
|
||||
# item.cutting_tool_parameter_material_model_id = False
|
||||
# item.cutting_tool_parameter_front_angle = False
|
||||
# item.cutting_tool_parameter_rear_angle = False
|
||||
# item.cutting_tool_parameter_main_included_angle = False
|
||||
# item.cutting_tool_parameter_chuck_model_ids = False
|
||||
# item.cutting_tool_parameter_scope = False
|
||||
# item.cutting_tool_parameter_top_angle = False
|
||||
# item.cutting_tool_parameter_r_angle = False
|
||||
# item.cutting_tool_parameter_working_hardness = False
|
||||
# item.cutting_tool_parameter_length = False
|
||||
# item.cutting_tool_parameter_width = False
|
||||
# item.cutting_tool_parameter_height = False
|
||||
# item.cutting_tool_parameter_radius = False
|
||||
# item.cutting_tool_parameter_cutter_bar_ids = False
|
||||
# item.cutting_tool_parameter_cutter_pad_ids = False
|
||||
# item.cutting_tool_parameter_c_diameter = False
|
||||
# item.cutting_tool_parameter_d_diameter = False
|
||||
# item.cutting_tool_parameter_l_total_length = False
|
||||
# item.cutting_tool_parameter_wrench = False
|
||||
# item.cutting_tool_parameter_screw = False
|
||||
# item.cutting_tool_parameter_blade_ids = False
|
||||
# item.cutting_tool_parameter_rounded_corner = False
|
||||
# item.cutting_tool_parameter_accuracy_level = False
|
||||
# item.cutting_tool_parameter_hardness = False
|
||||
# item.cutting_tool_parameter_handle_length = False
|
||||
# item.cutting_tool_parameter_length1 = False
|
||||
# item.cutting_tool_parameter_diameter1 = False
|
||||
# item.cutting_tool_parameter_body_accuracy = False
|
||||
# item.cutting_tool_parameter_clamping_range = False
|
||||
# item.cutting_tool_parameter_weight = False
|
||||
# item.cutting_tool_parameter_detection_accuracy = False
|
||||
# item.cutting_tool_parameter_detection_hardness = False
|
||||
# item.cutting_tool_parameter_standard_speed = False
|
||||
# item.image_1920 = False
|
||||
|
||||
|
||||
class ResMrpBom(models.Model):
|
||||
_inherit = 'mrp.bom'
|
||||
|
||||
def bom_create_line_has(self, embryo):
|
||||
vals = {
|
||||
'bom_id': self.id,
|
||||
'product_id': embryo.id,
|
||||
'product_tmpl_id': embryo.product_tmpl_id.id,
|
||||
'product_qty': 1,
|
||||
'product_uom_id': 1
|
||||
}
|
||||
return self.env['mrp.bom.line'].create(vals)
|
||||
|
||||
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom
|
||||
def bom_create(self, product, bom_type, product_type):
|
||||
bom_id = self.env['mrp.bom'].create({
|
||||
'product_tmpl_id': product.product_tmpl_id.id,
|
||||
'type': bom_type,
|
||||
# 'subcontractor_id': '' or subcontract.partner_id.id,
|
||||
'product_qty': 1,
|
||||
'product_uom_id': 1
|
||||
})
|
||||
if bom_type == 'subcontract' and product_type is not False:
|
||||
subcontract = self.get_supplier(product.materials_type_id)
|
||||
bom_id.subcontractor_id = subcontract.partner_id.id
|
||||
return bom_id
|
||||
|
||||
# 坯料BOM组件:选取当前坯料原材料,
|
||||
# 然后根据当前的坯料的体积得出需要的原材料重量(立方米m³) *材料密度 * 1000 = 所需原材料重量KG(公斤)
|
||||
# 坯料所需原材料公式:当前的坯料的体积(立方米m³) *材料密度 * 1000 = 所需原材料重量KG(公斤)
|
||||
def bom_create_line(self, embryo):
|
||||
# 选取当前坯料原材料
|
||||
raw_bom_line = self.get_raw_bom(embryo)
|
||||
if raw_bom_line:
|
||||
bom_line = self.env['mrp.bom.line'].create({
|
||||
'bom_id': self.id,
|
||||
'product_id': raw_bom_line.id,
|
||||
'product_tmpl_id': raw_bom_line.product_tmpl_id.id,
|
||||
'product_qty': round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000),
|
||||
'product_uom_id': raw_bom_line.uom_id.id,
|
||||
})
|
||||
return bom_line
|
||||
else:
|
||||
return False
|
||||
|
||||
# 查询材料型号默认排第一的供应商
|
||||
def get_supplier(self, materials_type):
|
||||
seller_id = self.env['sf.supplier.sort'].search(
|
||||
[('materials_model_id', '=', materials_type.id)],
|
||||
limit=1,
|
||||
order='sequence asc')
|
||||
return seller_id
|
||||
|
||||
# 匹配bom
|
||||
def get_bom(self, product):
|
||||
embryo_has = self.env['product.product'].search(
|
||||
[('categ_id.type', '=', '坯料'), ('materials_type_id', '=', product.materials_type_id.id),
|
||||
('length', '>', product.length), ('width', '>', product.width),
|
||||
('height', '>', product.height), ('is_bfm', '=', False)
|
||||
],
|
||||
limit=1,
|
||||
order='volume desc'
|
||||
)
|
||||
logging.info('get_bom-vals:%s' % embryo_has)
|
||||
if embryo_has:
|
||||
rate_of_waste = ((embryo_has.volume - product.model_volume) % embryo_has.volume) * 100
|
||||
if rate_of_waste <= 20:
|
||||
return embryo_has
|
||||
else:
|
||||
return
|
||||
|
||||
# 查bom的原材料
|
||||
def get_raw_bom(self, product):
|
||||
raw_bom = self.env['product.product'].search(
|
||||
[('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)])
|
||||
return raw_bom
|
||||
|
||||
# @api.constrains('type')
|
||||
# def _check_type(self):
|
||||
# category = self.env['product.category'].search(
|
||||
# [('type', '=', self.type)])
|
||||
# if category:
|
||||
# raise ValidationError("该类别已存在,请选择其他类别")
|
||||
@@ -1,559 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<data>
|
||||
<!-- <record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">-->
|
||||
<!-- <field name="name">product.template.only.form.inherit.sf</field>-->
|
||||
<!-- <field name="model">product.template</field>-->
|
||||
<!-- <field name="inherit_id" ref="product.product_template_only_form_view"/>-->
|
||||
<!-- <field name="arch" type="xml">-->
|
||||
<!-- <field name="barcode" position="replace">-->
|
||||
<!-- <field name='barcode' invisible="1"/>-->
|
||||
<!-- </field>-->
|
||||
<!-- <field name="default_code" position="replace">-->
|
||||
<!-- <field name='default_code' invisible="1"/>-->
|
||||
<!-- </field>-->
|
||||
<!-- </field>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<record model="ir.ui.view" id="view_product_template_form_inherit_sf">
|
||||
<field name="name">product.template.form.inherit.sf</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="sale.product_template_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//label[@for='list_price']" position="before">
|
||||
<field name='categ_type' invisible="1"/>
|
||||
<field name="upload_model_file"
|
||||
widget="many2many_binary"
|
||||
attrs="{'invisible': ['|', ('categ_type', '!=', '成品'),('categ_type', '=', False)]}"/>
|
||||
<field name="model_file" widget="Viewer3D" string="模型" readonly="1" force_save="1"
|
||||
attrs="{'invisible': ['|','|', ('categ_type', '!=', '成品'),('categ_type', '=', False),('model_file', '=', False)]}"/>
|
||||
</xpath>
|
||||
<field name="categ_id" position="replace">
|
||||
<field name='categ_id' invisible="1"/>
|
||||
</field>
|
||||
<field name="product_tag_ids" position="after">
|
||||
<field name="default_code" attrs="{'invisible': [('product_variant_count', '>', 1)]}"/>
|
||||
<field name="barcode" attrs="{'invisible': [('product_variant_count', '>', 1)]}"/>
|
||||
</field>
|
||||
<field name="invoice_policy" position="after">
|
||||
<field name='categ_id'/>
|
||||
<field name='cutting_tool_type' invisible="1"/>
|
||||
<field name="fixture_material_type" invisible="1"/>
|
||||
<field name="embryo_model_type_id" string="模型类型"
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)]}"/>
|
||||
<field name="materials_id" string="材料" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])]}"/>
|
||||
<field name="materials_type_id" string="型号" placeholder="请选择"
|
||||
domain="[('materials_id', '=', materials_id)]"
|
||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])]}"/>
|
||||
<field name="server_product_process_parameters_id" string="表面工艺参数"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '表面工艺'),('categ_type', '=', False)]}"/>
|
||||
<field name="cutting_tool_material_id" attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||
placeholder="请选择"/>
|
||||
<field name="cutting_tool_model_id" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
|
||||
<!-- <lable for="specification_id" class="type_label">规格</lable>-->
|
||||
<!-- <div class="button_width">-->
|
||||
<field name="specification_id" placeholder="请选择"
|
||||
attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||
domain="[('standard_library_id','=',cutting_tool_model_id)]"/>
|
||||
<!-- <button name="choice" type="object" class="oe_highlight">选择</button>-->
|
||||
<!-- </div>-->
|
||||
<field name="fixture_material_id" attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
||||
placeholder="请选择"/>
|
||||
<!-- <field name="fixture_model_id" string="型号" placeholder="请选择"-->
|
||||
<!-- context="{'default_fixture_material_id': fixture_material_id,'default_multi_mounting_type_id': fixture_multi_mounting_type_id}"-->
|
||||
<!-- attrs="{'invisible': [('categ_type', '!=', '夹具')]}"-->
|
||||
<!-- domain="[('fixture_material_id','=',fixture_material_id)]"/>-->
|
||||
</field>
|
||||
|
||||
<xpath expr="//label[@for='volume']" position="before">
|
||||
<label for="length" string="尺寸"
|
||||
attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/>
|
||||
<div class="o_address_format"
|
||||
attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}">
|
||||
<label for="length" string="长"/>
|
||||
<field name="length" class="o_address_zip"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="width" string="宽"/>
|
||||
<field name="width" class="o_address_zip"/>
|
||||
<span>&nbsp;</span>
|
||||
<label for="height" string="高"/>
|
||||
<field name="height" class="o_address_zip"/>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//page[last()]" position="after">
|
||||
<page string="加工参数">
|
||||
<group>
|
||||
<group string="模型">
|
||||
<label for="model_long" string="尺寸[mm]"/>
|
||||
<div class="o_address_format">
|
||||
<label for="model_long" string="长"/>
|
||||
<field name="model_long" class="o_address_zip"/>
|
||||
<label for="model_width" string="宽"/>
|
||||
<field name="model_width" class="o_address_zip"/>
|
||||
<label for="model_height" string="高"/>
|
||||
<field name="model_height" class="o_address_zip"/>
|
||||
</div>
|
||||
<field name="model_volume" string="体积[mm³]"/>
|
||||
<field name="product_model_type_id" string="模型类型"/>
|
||||
<field name="model_processing_panel" placeholder="例如R,U" string="加工面板"/>
|
||||
<field name="model_machining_precision"/>
|
||||
<field name="model_process_parameters_ids" string="表面工艺参数" widget="many2many_tags"
|
||||
options="{'no_create': True}"/>
|
||||
<field name="model_remark" string="备注说明"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
<!-- <xpath expr="//page[@name='general_information']" position="after">-->
|
||||
<!-- <page string="刀具物料参数" attrs="{'invisible': [('categ_type', '!=', '刀具')]}">-->
|
||||
<!-- </page>-->
|
||||
<!-- </xpath>-->
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
|
||||
<field name="name">product.template.only.form.inherit.sf</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="barcode" position="replace">
|
||||
<field name='barcode' invisible="1"/>
|
||||
</field>
|
||||
<field name="default_code" position="replace">
|
||||
<field name='default_code' invisible="1"/>
|
||||
</field>
|
||||
<xpath expr="//page[@name='variants']" position="before">
|
||||
<page string="刀具物料参数" attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
||||
<group>
|
||||
<group attrs="{'invisible': [('categ_type', '!=', '刀具')]}" col="1">
|
||||
<field name="cutting_tool_type_id" options="{'no_create': True}" placeholder="请选择"/>
|
||||
<field name="brand_id" options="{'no_create': True}" placeholder="请选择"/>
|
||||
<field name="cutting_tool_total_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','夹头','刀柄'))]}"/>
|
||||
<field name="tool_hardness" string="硬度(hrc)"/>
|
||||
<label for="cutting_tool_run_out_accuracy_min" string="端跳精度"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<div class="o_address_format"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<label for="cutting_tool_run_out_accuracy_min" string="最小"/>
|
||||
<field name="cutting_tool_run_out_accuracy_min" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
||||
<span>(mm)&nbsp;</span>
|
||||
<label for="cutting_tool_run_out_accuracy_max" string="最大"/>
|
||||
<field name="cutting_tool_run_out_accuracy_max" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
||||
<span>(mm)&nbsp;</span>
|
||||
</div>
|
||||
|
||||
<field name="tool_width"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="tool_height"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_flange_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_shank_outer_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_shank_inner_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
|
||||
<!-- <field name="materials_type_id" options="{'no_create': True}" string="刀具材质"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"-->
|
||||
<!-- placeholder="请选择"/>-->
|
||||
<!-- <field name="tool_hardness" string="刀具硬度(hrc)"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>-->
|
||||
<!-- <field name="materials_type_id" options="{'no_create': True}" string="夹头材质"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"-->
|
||||
<!-- placeholder="请选择"/>-->
|
||||
<!-- <field name="tool_hardness" string="夹头硬度(hrc)"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>-->
|
||||
<!-- <field name="materials_type_id" options="{'no_create': True}" string="刀柄材质"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"-->
|
||||
<!-- placeholder="请选择"/>-->
|
||||
<!-- <field name="tool_hardness" string="刀柄硬度(hrc)"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>-->
|
||||
|
||||
<field name="cutting_tool_blade_diameter" string="刃部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_width"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_depth"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_helix_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_number" placeholder="请选择"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_tip_working_size"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_tip_diameter" string="刀尖直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_blade_tip_taper" string="刀尖锥度(°)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<!--刀片-->
|
||||
<label for="tool_length" string="尺寸(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<div class="test_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}">
|
||||
<label for="tool_length" string="长"/>
|
||||
<field name="tool_length" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="tool_thickness" string="厚"/>
|
||||
<field name="tool_thickness" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="tool_width" string="宽"/>
|
||||
<field name="tool_width" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="cutting_tool_cut_blade_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_tip_circular_arc_radius"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_tip_height_tolerance"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_inscribed_circle_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_inscribed_circle_tolerance"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_install_aperture_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_chip_breaker_groove"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_cut_depth_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_blade_number" string="刃数"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_blade_width" string="刃宽"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<!--刀杆-->
|
||||
|
||||
<label for="cutting_tool_knife_head_length" string="刀头尺寸(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<div class="test_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
|
||||
<label for="cutting_tool_knife_head_length" string="长"/>
|
||||
<field name="cutting_tool_knife_head_length" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="cutting_tool_knife_head_width" string="宽"/>
|
||||
<field name="cutting_tool_knife_head_width" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<label for="cutting_tool_knife_head_height" string="高"/>
|
||||
<field name="cutting_tool_knife_head_height" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="cutting_tool_blade_diameter" string="刃部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
|
||||
<field name="cutting_tool_blade_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
|
||||
<field name="cutting_tool_cutter_arbor_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_cut_blade_length" string="切削刃长度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_cut_depth_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_min_machining_aperture"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_install_blade_tip_num"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<!--刀盘-->
|
||||
<field name="cutting_tool_cutter_head_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
<field name="cutting_tool_interface_diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
|
||||
<!--夹头-->
|
||||
<field name="cutting_tool_clamping_length"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<field name="cutting_tool_clamping_tolerance"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<label for="cutting_tool_clamping_diameter_min" string="夹持直径"
|
||||
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))]}'/>
|
||||
<div class="o_address_format"
|
||||
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))]}'>
|
||||
<label for="cutting_tool_clamping_diameter_min" string="最小"/>
|
||||
<field name="cutting_tool_clamping_diameter_min" class="o_address_zip diameter"
|
||||
options="{'format': false}"
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||
<span>(mm)&nbsp;</span>
|
||||
<label for="cutting_tool_clamping_diameter_max" string="最大"/>
|
||||
<field name="cutting_tool_clamping_diameter_max" class="o_address_zip diameter"
|
||||
options="{'format': false}"
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||
<span>(mm)&nbsp;</span>
|
||||
</div>
|
||||
<field name="cutting_tool_clamping_way"
|
||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||
<field name="cutting_tool_top_diameter" class="diameter"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<field name="cutting_tool_outer_diameter" class="diameter"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<field name="cutting_tool_inner_diameter" class="diameter"
|
||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
||||
<!--夹头-->
|
||||
|
||||
<field name="cutting_tool_standard_speed"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_speed_max"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_change_time"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_cooling_type"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
||||
<field name="materials_type_id" options="{'no_create': True}" placeholder="请选择"
|
||||
string="材质"/>
|
||||
<field name="coating_material"/>
|
||||
<field name="cutting_tool_blade_type"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_coarse_medium_fine" string="粗/中/精" placeholder="请选择"
|
||||
attrs="{'required': [('cutting_tool_type','=','整体式刀具')],'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}"/>
|
||||
<!--整体式刀具-->
|
||||
<field name="cutting_tool_shank_diameter" string="柄部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_shank_length"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_neck_diameter" string="颈部直径(mm)" class="diameter"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_neck_length" string="颈部长度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_cut_depth"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_pitch"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="tool_weight"
|
||||
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))]}'/>
|
||||
<field name="cutting_tool_taper"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头','刀柄'))]}"/>
|
||||
<field name="cutting_tool_jump_accuracy"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_rear_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>
|
||||
<field name="cutting_tool_main_included_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片','刀杆'))]}"/>
|
||||
<!-- <field name="cutting_tool_front_angle"-->
|
||||
<!-- attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>-->
|
||||
<field name="cutting_tool_top_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>
|
||||
<field name="cutting_tool_blade_tip_dip_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_side_cutting_edge_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_pitch"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_bladed_teeth_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_thickness_tolerance"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_thread_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_thread_num"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_cutter_bar_ids" widget="many2many_tags"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_cutter_pad_ids" widget="many2many_tags"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<!--刀柄-->
|
||||
<field name="cutting_tool_is_rough_finish"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_finish"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_drill_hole"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_high_speed_cutting"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_is_safety_lock" string="有无安全锁"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
|
||||
|
||||
<field name="cutting_tool_jump_accuracy" string="跳动精度(mm)"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_max_load_capacity"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_er_size_model"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_handle_ids" widget="many2many_tags"
|
||||
options="{'no_create': True}"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cooling_suit_type_ids"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<!-- 刀杆 -->
|
||||
<field name="cutting_tool_rear_angle"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_installing_structure"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_is_cooling_hole"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_locating_slot_code"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}"/>
|
||||
<field name="cutting_tool_tool_shim"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_cotter_pin"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_pressing_plate"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||
<field name="cutting_tool_screw"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀柄'))]}"/>
|
||||
<field name="cutting_tool_wrench"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀柄'))]}"/>
|
||||
<!-- 刀盘 -->
|
||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||
|
||||
</group>
|
||||
</group>
|
||||
<group string="适配刀片形状"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'in', ('刀柄','夹头','整体式刀具',False))]}">
|
||||
<field name="fit_blade_shape_id" string="" widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group string="适合加工方式"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<field name="suitable_machining_method_ids" string=""
|
||||
widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group string="刀尖特征"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<field name="blade_tip_characteristics_id" string=""
|
||||
widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<group string="柄部类型" attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<field name="handle_type_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group string="压紧方式"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}">
|
||||
<field name="compaction_way_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
</group>
|
||||
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||
<group string="走刀方向">
|
||||
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
<group string="适合冷却液">
|
||||
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="切削速度Vc"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||
<field name="cutting_speed_ids" string="" widget="one2many">
|
||||
<tree editable="bottom">
|
||||
<!-- <field name="order"/>-->
|
||||
<field name="execution_standard_id"/>
|
||||
<field name="material_code"/>
|
||||
<field name="material_id"/>
|
||||
<field name="material_grade"/>
|
||||
<field name="tensile_strength"/>
|
||||
<field name="hardness"/>
|
||||
<field name="cutting_speed_n1"/>
|
||||
<field name="cutting_speed_n2"/>
|
||||
<field name="cutting_speed_n3"/>
|
||||
<field name="cutting_speed_n4"/>
|
||||
<field name="cutting_speed_n5"/>
|
||||
<field name="rough_machining"/>
|
||||
<field name="precision_machining"/>
|
||||
<field name="application"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<page string="每齿走刀量fz"
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||
<field name="feed_per_tooth_ids" string="" widget="one2many">
|
||||
<tree editable="bottom">
|
||||
<field name="cutting_speed"
|
||||
attrs="{'readonly': [('materials_type_id','!=',False)]}"/>
|
||||
<field name="machining_method" placeholder="请选择"
|
||||
attrs="{'readonly': [('cutting_speed','!=',False)]}"/>
|
||||
<field name="materials_type_id" placeholder="请选择"
|
||||
attrs="{'readonly': [('cutting_speed','!=',False)]}"/>
|
||||
<field name="blade_diameter"/>
|
||||
<field name="feed_per_tooth"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</page>
|
||||
<page string="夹具物料参数" attrs="{'invisible': [('categ_type', '!=', '夹具')]}">
|
||||
<group attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","转接板(锁板)夹具","磁吸夹具","虎钳夹具","零点卡盘","零点托盘"))]}'>
|
||||
<group>
|
||||
<field name="brand_id"/>
|
||||
<field name="fixture_multi_mounting_type_id" options="{'no_create': True}"/>
|
||||
<label for="tool_length" string="尺寸(mm)"/>
|
||||
<div class="o_address_format">
|
||||
<label for="tool_length" string="长"/>
|
||||
<field name="tool_length" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<!-- <span>&nbsp;</span>-->
|
||||
<label for="tool_width" string="宽"/>
|
||||
<field name="tool_width" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
<!-- <span>&nbsp;</span>-->
|
||||
<label for="tool_height" string="高"/>
|
||||
<field name="tool_height" class="o_address_zip"
|
||||
options="{'format': false}"/>
|
||||
</div>
|
||||
<field name="tool_weight"></field>
|
||||
<label for="fixture_clamp_workpiece_length_max" string="夹持工件最大尺寸(mm)"
|
||||
attrs='{"invisible": [("fixture_material_type","in",("零点卡盘","零点托盘"))]}'/>
|
||||
<div class="o_address_format"
|
||||
attrs='{"invisible": [("fixture_material_type","in",("零点卡盘","零点托盘"))]}'>
|
||||
<label for="fixture_clamp_workpiece_length_max" string="长"/>
|
||||
<field name="fixture_clamp_workpiece_length_max" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
||||
<!-- <span>&nbsp;</span>-->
|
||||
<label for="fixture_clamp_workpiece_width_max" string="宽"/>
|
||||
<field name="fixture_clamp_workpiece_width_max" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
||||
<!-- <span>&nbsp;</span>-->
|
||||
<label for="fixture_clamp_workpiece_height_max" string="高"/>
|
||||
<field name="fixture_clamp_workpiece_height_max" class="o_address_zip"
|
||||
options="{'format': false}"
|
||||
attrs="{'required': [('fixture_material_type', 'in',('气动托盘','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
||||
</div>
|
||||
<field name="fixture_clamp_workpiece_diameter_max"
|
||||
attrs="{'invisible': [('fixture_material_type','in',('零点卡盘','零点托盘'))],'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
||||
<field name="fixture_maximum_carrying_weight"></field>
|
||||
<field name="fixture_maximum_clamping_force"></field>
|
||||
</group>
|
||||
<group>
|
||||
<field name="materials_type_id" options="{'no_create': True}"/>
|
||||
<field name="fixture_clamping_way"
|
||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","磁吸夹具","虎钳夹具"))]}'/>
|
||||
<field name="fixture_port_type"
|
||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","磁吸夹具","虎钳夹具"))]}'/>
|
||||
<field name="fixture_through_hole_size"
|
||||
attrs='{"invisible": [("fixture_material_type","!=",("转接板(锁板)夹具"))]}'/>
|
||||
<field name="fixture_screw_size"
|
||||
attrs='{"invisible": [("fixture_material_type","!=",("转接板(锁板)夹具"))]}'/>
|
||||
<field name="fixture_driving_way"
|
||||
attrs='{"invisible": [("fixture_material_type","not in",("虎钳夹具","零点卡盘","零点托盘"))]}'/>
|
||||
<field name="fixture_apply_machine_tool_type_ids" options="{'no_create': True}"
|
||||
widget="many2many_tags"
|
||||
attrs='{"invisible": [("fixture_material_type","not in",("零点卡盘","零点托盘"))]}'/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_product_category_form_inherit_sf" model="ir.ui.view">
|
||||
<field name="name">product.category.form.inherit.sf</field>
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="view_mrp_production_workorder_tray_form_inherit_sf1" model="ir.ui.view">
|
||||
<field name="name">production.workorder.dlm</field>
|
||||
<field name="model">mrp.workorder</field>
|
||||
<field name="inherit_id" ref="sf_manufacturing.view_mrp_production_workorder_tray_form_inherit_sf"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[1]" position="before">
|
||||
<page string="开料要求" attrs='{"invisible": [("routing_type","!=","切割")]}'>
|
||||
<group>
|
||||
<group>
|
||||
<field name="product_tmpl_id_materials_id" widget="many2one"/>
|
||||
<field name="product_tmpl_id_materials_type_id" widget="many2one"/>
|
||||
|
||||
</group>
|
||||
<group>
|
||||
<field name="product_tmpl_id_length"/>
|
||||
<field name="product_tmpl_id_width"/>
|
||||
<field name="product_tmpl_id_height"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user