Files
test/sf_dlm/models/product_template.py

408 lines
25 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("该类别已存在,请选择其他类别")