Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/刀具产品模板优化
# Conflicts: # sf_mrs_connect/models/res_config_setting.py
This commit is contained in:
@@ -21,7 +21,7 @@ class FunctionalCuttingTool(models.Model):
|
||||
|
||||
code = fields.Char('编码')
|
||||
name = fields.Char('名称')
|
||||
mrs_cutting_tool_type_id = fields.Many2one('sf.cutting.tool.type', string='功能刀具类型')
|
||||
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||
mrs_cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', string='刀具型号')
|
||||
diameter = fields.Float('直径(mm)')
|
||||
tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')],
|
||||
@@ -68,6 +68,9 @@ class CuttingToolModel(models.Model):
|
||||
|
||||
# 整体式刀具特有字段
|
||||
integral_code = fields.Char('整体式刀具编码')
|
||||
integral_accuracy = fields.Float('精度(μm)')
|
||||
integral_hardness = fields.Float('加工硬度(HRC)')
|
||||
integral_coating_material = fields.Char('涂层材质')
|
||||
integral_total_length = fields.Float('总长度(mm)')
|
||||
integral_shank_length = fields.Float('柄部长度(mm)')
|
||||
integral_blade_length = fields.Float('刃部长度(mm)')
|
||||
@@ -81,6 +84,7 @@ class CuttingToolModel(models.Model):
|
||||
|
||||
# 刀片特有字段
|
||||
blade_code = fields.Char('刀片编码')
|
||||
blade_coating_material = fields.Char('涂层材质')
|
||||
blade_length = fields.Float('长度L(mm)')
|
||||
blade_width = fields.Float('宽度D(mm)')
|
||||
blade_height = fields.Float('高度T(mm)')
|
||||
@@ -90,6 +94,7 @@ class CuttingToolModel(models.Model):
|
||||
blade_main_included_angle = fields.Float('主偏角(°)')
|
||||
blade_r_angle = fields.Float('R角(°)')
|
||||
blade_hardness = fields.Char('加工硬度')
|
||||
blade_accuracy = fields.Char('精度等级')
|
||||
blade_radius = fields.Float('刀尖半径(mm)')
|
||||
blade_nut = fields.Float('配对螺母(mm)')
|
||||
mrs_cutting_tool_model_blade_cutter_bar_ids = fields.Many2many(
|
||||
@@ -112,7 +117,7 @@ class CuttingToolModel(models.Model):
|
||||
)
|
||||
|
||||
# 刀杆特有字段
|
||||
bar_code = fields.Char('刀杆编码', readonly=True)
|
||||
bar_code = fields.Char('刀杆编码')
|
||||
bar_c_diameter = fields.Float('C柄径(mm)')
|
||||
bar_total_length = fields.Float('L总长(mm)')
|
||||
bar_blade_number = fields.Integer('刃数')
|
||||
@@ -134,7 +139,7 @@ class CuttingToolModel(models.Model):
|
||||
bar_scope = fields.Char('适用范围')
|
||||
|
||||
# 刀盘特有字段
|
||||
pad_code = fields.Char('刀盘编码', readonly=True)
|
||||
pad_code = fields.Char('刀盘编码')
|
||||
pad_c_diameter = fields.Float('C柄径(mm)')
|
||||
pad_total_length = fields.Float('L总长(mm)')
|
||||
pad_blade_number = fields.Integer('刃数')
|
||||
@@ -156,10 +161,17 @@ class CuttingToolModel(models.Model):
|
||||
pad_scope = fields.Char('适用范围')
|
||||
|
||||
# 刀柄特有字段
|
||||
handle_code = fields.Char('刀柄编码', readonly=True)
|
||||
handle_length = fields.Float('L(mm)')
|
||||
handle_length1 = fields.Float('L1(mm)')
|
||||
handle_diameter1 = fields.Float('D1(mm)')
|
||||
handle_code = fields.Char('刀柄编码')
|
||||
# 柄长L(mm)、法兰柄长L1(mm)、法兰直径D1(mm)
|
||||
handle_length = fields.Float('柄长L(mm)')
|
||||
handle_diameter = fields.Float('直径D(mm)')
|
||||
handle_flange_length = fields.Float('法兰柄长L1(mm)')
|
||||
handle_flange_diameter = fields.Float('法兰直径D1(mm)')
|
||||
# 夹持直径min、夹持直径max、径跳精度、最大转速n/min、3D模型图
|
||||
handle_clamping_diameter_min = fields.Float('夹持直径min')
|
||||
handle_clamping_diameter_max = fields.Float('夹持直径max')
|
||||
handle_jump_accuracy = fields.Float('径跳精度')
|
||||
handle_max_speed = fields.Float('最大转速n/min')
|
||||
handle_weight = fields.Float('重量(kg)')
|
||||
handle_body_accuracy = fields.Float('本体精度(mm)')
|
||||
handle_nut = fields.Float('配对螺母(mm)')
|
||||
@@ -178,8 +190,11 @@ class CuttingToolModel(models.Model):
|
||||
handle_standard_speed = fields.Float('标准转速')
|
||||
|
||||
# 夹头特有字段
|
||||
chuck_code = fields.Char('夹头编码', readonly=True)
|
||||
chuck_code = fields.Char('夹头编码')
|
||||
chuck_accuracy = fields.Float('精度(mm)')
|
||||
# 夹持直径min、夹持直径max、3D模型图
|
||||
chuck_clamping_diameter_min = fields.Float('夹持直径min')
|
||||
chuck_clamping_diameter_max = fields.Float('夹持直径max')
|
||||
chuck_diameter = fields.Float('外径(mm)')
|
||||
chuck_inner_diameter = fields.Float('内径(mm)')
|
||||
chuck_height = fields.Float('高度(mm)')
|
||||
@@ -197,6 +212,7 @@ class CuttingToolModel(models.Model):
|
||||
chuck_feature = fields.Char('特性')
|
||||
|
||||
image = fields.Binary('图片')
|
||||
three_d_model = fields.Many2one('ir.attachment', '3D模型')
|
||||
|
||||
hide_integral = fields.Boolean(compute='_compute_hide_model_number', default=False, string='隐藏整体式刀具')
|
||||
hide_blade = fields.Boolean(compute='_compute_hide_model_number', default=False, string='隐藏刀片')
|
||||
@@ -205,6 +221,12 @@ class CuttingToolModel(models.Model):
|
||||
hide_handler = fields.Boolean(compute='_compute_hide_model_number', default=False, string='隐藏刀柄')
|
||||
hide_chuck = fields.Boolean(compute='_compute_hide_model_number', default=False, string='隐藏夹头')
|
||||
hide_model = fields.Boolean(compute='_compute_hide_model_number', default=True, string='隐藏型号')
|
||||
image_is_visible = fields.Boolean(compute='_compute_image_is_visible', default=True, string='隐藏图片')
|
||||
|
||||
@api.depends('mrs_cutting_tool_material_id')
|
||||
def _compute_image_is_visible(self):
|
||||
for record in self:
|
||||
record.image_is_visible = not (record.hide_handler or record.hide_chuck)
|
||||
|
||||
@api.depends('mrs_cutting_tool_material_id')
|
||||
def _compute_hide_model_number(self):
|
||||
|
||||
@@ -213,6 +213,8 @@
|
||||
<field name="integral_blade_length" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_diameter" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_blade_number" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_accuracy" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_hardness" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
|
||||
<field name="blade_length" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
<field name="blade_width" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
@@ -236,10 +238,13 @@
|
||||
|
||||
|
||||
<field name="handle_length" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_length1" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_diameter1" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_flange_length" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_flange_diameter" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_weight" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_body_accuracy" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_clamping_diameter_min" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_clamping_diameter_max" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
|
||||
|
||||
<field name="chuck_accuracy" attrs="{'invisible': [('hide_chuck', '=', False)], 'required': [('hide_chuck', '!=', False)]}"/>
|
||||
<field name="chuck_diameter" attrs="{'invisible': [('hide_chuck', '=', False)], 'required': [('hide_chuck', '!=', False)]}"/>
|
||||
@@ -253,12 +258,14 @@
|
||||
<field name="integral_front_angle" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_rear_angle" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_main_included_angle" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_coating_material" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_nut" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
<field name="integral_scope" attrs="{'invisible': [('hide_integral', '=', False)], 'required': [('hide_integral', '!=', False)]}"/>
|
||||
|
||||
|
||||
<field name="blade_main_included_angle" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
<field name="blade_r_angle" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
<field name="blade_coating_material" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
<field name="blade_hardness" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
<field name="blade_radius" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
<field name="blade_nut" attrs="{'invisible': [('hide_blade', '=', False)], 'required': [('hide_blade', '!=', False)]}"/>
|
||||
@@ -282,6 +289,8 @@
|
||||
<field name="handle_detection_accuracy" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_detection_hardness" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_standard_speed" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_jump_accuracy" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
<field name="handle_max_speed" attrs="{'invisible': [('hide_handler', '=', False)], 'required': [('hide_handler', '!=', False)]}"/>
|
||||
|
||||
<field name="chuck_nut" attrs="{'invisible': [('hide_chuck', '=', False)], 'required': [('hide_chuck', '!=', False)]}"/>
|
||||
<field name="chuck_clamping_range" attrs="{'invisible': [('hide_chuck', '=', False)], 'required': [('hide_chuck', '!=', False)]}"/>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
'data': [
|
||||
'data/product_data.xml',
|
||||
'data/uom_data.xml',
|
||||
'data/cutting_tool_data.xml',
|
||||
# 'data/cutting_tool_data.xml',
|
||||
'views/product_template_view.xml',
|
||||
'views/product_workorder.xml'
|
||||
],
|
||||
|
||||
@@ -20,16 +20,15 @@
|
||||
<field name="type">表面工艺</field>
|
||||
</record>
|
||||
|
||||
<record id="product_category_cutting_tool_sf" model="product.category">
|
||||
<field name="name">刀具</field>
|
||||
<field name="type">刀具</field>
|
||||
</record>
|
||||
|
||||
<!-- <record id="product_category_cutting_tool_sf" model="product.category">-->
|
||||
<!-- <field name="name">刀具</field>-->
|
||||
<!-- <field name="type">刀具</field>-->
|
||||
<!-- </record>-->
|
||||
|
||||
<!-- <record id="product_category_clamp_sf" model="product.category">-->
|
||||
<!-- <field name="name">夹具</field>-->
|
||||
<!-- <field name="type">夹具</field>-->
|
||||
<!-- </record>-->
|
||||
<record id="product_category_clamp_sf" model="product.category">
|
||||
<field name="name">夹具</field>
|
||||
<field name="type">夹具</field>
|
||||
</record>
|
||||
|
||||
<record id="product_template_sf" model="product.product">
|
||||
<field name="name">CNC加工产品模板</field>
|
||||
@@ -37,15 +36,15 @@
|
||||
<field name="categ_id" ref="product_category_finished_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('mrp.route_warehouse0_manufacture')]"/>
|
||||
<!-- <field name="invoice_policy">delivery</field>-->
|
||||
<field name="invoice_policy">delivery</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="purchase_ok">false</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<!-- <field name="single_manufacturing">true</field>-->
|
||||
<field name="single_manufacturing">true</field>
|
||||
<field name="tracking">serial</field>
|
||||
<!-- <field name="is_bfm">false</field>-->
|
||||
<field name="is_bfm">false</field>
|
||||
</record>
|
||||
<record id="product_embryo_sf_self_machining" model="product.product">
|
||||
<field name="name">坯料自加工模板</field>
|
||||
@@ -53,15 +52,15 @@
|
||||
<field name="categ_id" ref="product_category_embryo_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('mrp.route_warehouse0_manufacture')]"/>
|
||||
<!-- <field name="invoice_policy">delivery</field>-->
|
||||
<field name="invoice_policy">delivery</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="purchase_ok">false</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<!-- <field name="single_manufacturing">true</field>-->
|
||||
<field name="single_manufacturing">true</field>
|
||||
<field name="tracking">serial</field>
|
||||
<!-- <field name="is_bfm">false</field>-->
|
||||
<field name="is_bfm">false</field>
|
||||
</record>
|
||||
|
||||
<record id="product_embryo_sf_outsource" model="product.product">
|
||||
@@ -70,14 +69,14 @@
|
||||
<field name="categ_id" ref="product_category_embryo_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('purchase_stock.route_warehouse0_buy'),ref('mrp_subcontracting.route_resupply_subcontractor_mto')]"/>
|
||||
<!-- <field name="invoice_policy">delivery</field>-->
|
||||
<field name="invoice_policy">delivery</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="purchase_ok">true</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="tracking">serial</field>
|
||||
<!-- <field name="is_bfm">false</field>-->
|
||||
<field name="is_bfm">false</field>
|
||||
</record>
|
||||
<record id="product_embryo_sf_purchase" model="product.product">
|
||||
<field name="name">坯料采购模板</field>
|
||||
@@ -85,14 +84,14 @@
|
||||
<field name="categ_id" ref="product_category_embryo_sf"/>
|
||||
<field name="route_ids"
|
||||
eval="[ref('stock.route_warehouse0_mto'), ref('purchase_stock.route_warehouse0_buy')]"/>
|
||||
<!-- <field name="invoice_policy">delivery</field>-->
|
||||
<field name="invoice_policy">delivery</field>
|
||||
<field name="detailed_type">product</field>
|
||||
<field name="purchase_ok">true</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
<field name="tracking">serial</field>
|
||||
<!-- <field name="is_bfm">false</field>-->
|
||||
<field name="is_bfm">false</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -1,94 +1,17 @@
|
||||
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
|
||||
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 ResProductTemplate(models.Model):
|
||||
class ResProduct(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
# 模型的长,宽,高,体积,精度,材料
|
||||
|
||||
|
||||
# cutting_tool = fields.Selection([
|
||||
# ('整体式刀具', '整体式刀具'),
|
||||
# ('刀片', '刀片'),
|
||||
# ('刀杆', '刀杆'),
|
||||
# ('刀盘', '刀盘'),
|
||||
# ('刀柄', '刀柄'),
|
||||
# ('夹头', '夹头')], string='刀具物料')
|
||||
# # 关联整体式刀具型号
|
||||
# integral_cutting_tool_type_id = fields.Many2one('sf.integral.cutting.tool', '整体式刀具型号')
|
||||
# # 关联刀片型号
|
||||
# blade_type_id = fields.Many2one('sf.blade', '刀片型号')
|
||||
# # 关联刀杆型号
|
||||
# cutter_bar_type_id = fields.Many2one('sf.cutter.bar', '刀杆型号')
|
||||
# # 关联刀盘型号
|
||||
# cutter_pad_type_id = fields.Many2one('sf.cutter.pad', '刀盘型号')
|
||||
# # 关联刀柄型号
|
||||
# handle_type_id = fields.Many2one('sf.handle', '刀柄型号')
|
||||
# # 关联夹头型号
|
||||
# chuck_type_id = fields.Many2one('sf.chuck', '夹头型号')
|
||||
# cutting_tool_parameter_brand_id = fields.Many2one('sf.machine.brand', '品牌')
|
||||
# # 整体式刀具参数
|
||||
# cutting_tool_parameter_total_length = fields.Float('总长度[mm]')
|
||||
# cutting_tool_parameter_shank_length = fields.Float('柄部长度[mm]')
|
||||
# cutting_tool_parameter_blade_length = fields.Float('刃部长度[mm]')
|
||||
# cutting_tool_parameter_diameter = fields.Float('直径[mm]')
|
||||
# cutting_tool_parameter_blade_number = fields.Integer('刃数')
|
||||
# cutting_tool_parameter_front_angle = fields.Float('前角(°)')
|
||||
# cutting_tool_parameter_rear_angle = fields.Float('后角(°)')
|
||||
# cutting_tool_parameter_main_included_angle = fields.Float('主偏角(°)')
|
||||
# cutting_tool_parameter_material_model_id = fields.Many2one('sf.materials.model', '材料型号')
|
||||
# cutting_tool_parameter_nut = fields.Float('配对螺母[mm]')
|
||||
# # 适用夹头型号可以多选
|
||||
# cutting_tool_parameter_chuck_model_ids = fields.Many2many('sf.chuck', 'rel_product_chuck', string='适用夹头型号')
|
||||
# cutting_tool_parameter_scope = fields.Char('适用范围')
|
||||
# # 刀片参数
|
||||
# cutting_tool_parameter_length = fields.Float('长度L[mm]')
|
||||
# cutting_tool_parameter_width = fields.Float('宽度D[mm])')
|
||||
# cutting_tool_parameter_height = fields.Float('高度T[mm]')
|
||||
# cutting_tool_parameter_top_angle = fields.Float('顶角(°)')
|
||||
# cutting_tool_parameter_r_angle = fields.Float('R角(°)')
|
||||
# cutting_tool_parameter_working_hardness = fields.Char('加工硬度')
|
||||
# cutting_tool_parameter_cutter_bar_ids = fields.Many2many('sf.cutter.bar', 'rel_product_cutter_bar',
|
||||
# string='适用刀杆型号')
|
||||
# cutting_tool_parameter_cutter_pad_ids = fields.Many2many('sf.cutter.pad', 'rel_product_cutter_pad',
|
||||
# string='适用刀盘型号')
|
||||
# cutting_tool_parameter_radius = fields.Float('刀尖半径[mm]')
|
||||
# # 刀杆/刀盘参数
|
||||
# cutting_tool_parameter_c_diameter = fields.Float('C柄径[mm]')
|
||||
# cutting_tool_parameter_l_total_length = fields.Float('L总长[mm]')
|
||||
# cutting_tool_parameter_d_diameter = fields.Float('D刃径[mm]')
|
||||
# cutting_tool_parameter_blade_ids = fields.Many2many('sf.blade', 'rel_product_blade', string='适用刀片型号')
|
||||
# cutting_tool_parameter_wrench = fields.Float('配对扳手[mm]')
|
||||
# cutting_tool_parameter_screw = fields.Float('配备螺丝[mm]')
|
||||
# cutting_tool_parameter_accuracy_level = fields.Char('精度等级')
|
||||
# cutting_tool_parameter_rounded_corner = fields.Float('刀尖圆角半径[mm]')
|
||||
# cutting_tool_parameter_hardness = fields.Char('硬度(°)')
|
||||
# # 刀柄参数
|
||||
# cutting_tool_parameter_handle_length = fields.Float('L[mm]')
|
||||
# cutting_tool_parameter_length1 = fields.Float('L1[mm]')
|
||||
# cutting_tool_parameter_diameter1 = fields.Float('D1[mm]')
|
||||
# cutting_tool_parameter_weight = fields.Float('重量(kg)')
|
||||
# cutting_tool_parameter_body_accuracy = fields.Float('本体精度[mm]')
|
||||
# cutting_tool_parameter_clamping_range = fields.Float('夹持范围[mm]')
|
||||
# cutting_tool_parameter_detection_accuracy = fields.Float('检测精度')
|
||||
# cutting_tool_parameter_detection_hardness = fields.Float('检测硬度')
|
||||
# cutting_tool_parameter_standard_speed = fields.Float('标准转速')
|
||||
# # 夹头参数
|
||||
# cutting_tool_parameter_accuracy = fields.Float('精度[mm]')
|
||||
# cutting_tool_parameter_outer_diameter = fields.Float('外径[mm]')
|
||||
# cutting_tool_parameter_inner_diameter = fields.Float('内径[mm]')
|
||||
# cutting_tool_parameter_handle_model_ids = fields.Many2many('sf.handle.model', 'rel_product_handle_model',
|
||||
# string='适用刀柄型号')
|
||||
# cutting_tool_parameter_feature = fields.Char('特性')
|
||||
|
||||
# image_1920 = fields.Image(related='cutting_tool_parameter_image', store=True,
|
||||
# domain=[('cutting_tool_parameter_image', '!=', False)])
|
||||
|
||||
@@ -403,7 +326,7 @@ class ResProductTemplate(models.Model):
|
||||
vals['model_file'] = self.transition_glb_file(report_path, model_code)
|
||||
logging.info('create-model_file:%s' % len(vals['model_file']))
|
||||
self._sanitize_vals(vals)
|
||||
templates = super(ResProductTemplate, self).create(vals_list)
|
||||
templates = super(ResProduct, self).create(vals_list)
|
||||
if "create_product_product" not in self._context:
|
||||
templates._create_variant_ids()
|
||||
|
||||
@@ -415,7 +338,6 @@ class ResProductTemplate(models.Model):
|
||||
related_vals[field_name] = vals[field_name]
|
||||
if related_vals:
|
||||
template.write(related_vals)
|
||||
logging.info('create-model_file:%s' % templates.model_file)
|
||||
return templates
|
||||
|
||||
@api.onchange('upload_model_file')
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
attrs="{'invisible': ['|', ('categ_type', '!=', '成品'),('categ_type', '=', False)]}"/>
|
||||
</field>
|
||||
<field name="invoice_policy" position="after">
|
||||
<field name='cutting_tool' invisible="1"/>
|
||||
<field name='cutting_tool_type' invisible="1"/>
|
||||
<field name="embryo_model_type_id" string="模型类型"
|
||||
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)]}"/>
|
||||
<field name="materials_id" string="材料"
|
||||
@@ -75,53 +75,53 @@
|
||||
<page string="刀具物料参数" attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
||||
<group>
|
||||
<!--整体式刀具-->
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '整体式刀具')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<field name="cutting_tool_parameter_brand_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')],'required': [('cutting_tool', '=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'required': [('cutting_tool_type', '=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_parameter_total_length"/>
|
||||
<field name="cutting_tool_parameter_shank_length"/>
|
||||
<field name="cutting_tool_parameter_blade_length"/>
|
||||
<field name="cutting_tool_parameter_diameter"/>
|
||||
<field name="cutting_tool_parameter_nut"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_parameter_blade_number"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '整体式刀具')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<field name="cutting_tool_parameter_material_model_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')],'required': [('cutting_tool', '=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'required': [('cutting_tool_type', '=', '整体式刀具')]}"/>
|
||||
/>
|
||||
<field name="cutting_tool_parameter_front_angle"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_parameter_rear_angle"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_parameter_main_included_angle"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '整体式刀具')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||
<field name="cutting_tool_parameter_chuck_model_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')],'required': [('cutting_tool', '=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'required': [('cutting_tool_type', '=', '整体式刀具')]}"/>
|
||||
<field name="cutting_tool_parameter_scope"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '整体式刀具')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||
</group>
|
||||
<!--刀片-->
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '刀片')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '刀片')]}">
|
||||
<field name="cutting_tool_parameter_brand_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')],'required': [('cutting_tool', '=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'required': [('cutting_tool_type', '=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_top_angle"/>
|
||||
<field name="cutting_tool_parameter_front_angle"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_rear_angle"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_main_included_angle"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_r_angle"/>
|
||||
<field name="cutting_tool_parameter_working_hardness"
|
||||
attrs="{'required': [('cutting_tool', '=', '刀片')]}"/>
|
||||
attrs="{'required': [('cutting_tool_type', '=', '刀片')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '刀片')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '刀片')]}">
|
||||
<field name="cutting_tool_parameter_material_model_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')],'required': [('cutting_tool', '=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'required': [('cutting_tool_type', '=', '刀片')]}"/>
|
||||
<label for="cutting_tool_parameter_length" string="尺寸[mm]"/>
|
||||
<div class="o_address_format">
|
||||
<label for="cutting_tool_parameter_length" string="长度L"/>
|
||||
@@ -129,23 +129,23 @@
|
||||
<label for="cutting_tool_parameter_width" string="宽度D"/>
|
||||
<field name="cutting_tool_parameter_width" class="o_address_zip"/>
|
||||
<label for="cutting_tool_parameter_height" string="高度T"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_height" class="o_address_zip"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
</div>
|
||||
<field name="cutting_tool_parameter_radius"/>
|
||||
<field name="cutting_tool_parameter_nut"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀片')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_cutter_bar_ids" widget="many2many_tags"
|
||||
attrs="{'required': [('cutting_tool', '=', '刀片')]}"/>
|
||||
attrs="{'required': [('cutting_tool_type', '=', '刀片')]}"/>
|
||||
<field name="cutting_tool_parameter_cutter_pad_ids" widget="many2many_tags"
|
||||
attrs="{'required': [('cutting_tool', '=', '刀片')]}"/>
|
||||
attrs="{'required': [('cutting_tool_type', '=', '刀片')]}"/>
|
||||
</group>
|
||||
|
||||
<!--刀杆/刀盘-->
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', 'not in', ['刀杆','刀盘'])]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', 'not in', ['刀杆','刀盘'])]}">
|
||||
<field name="cutting_tool_parameter_brand_id"
|
||||
attrs="{'invisible': [('cutting_tool', 'not in', ['刀杆','刀盘'])],'required': [('cutting_tool', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ['刀杆','刀盘'])],'required': [('cutting_tool_type', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
<field name="cutting_tool_parameter_c_diameter"/>
|
||||
<field name="cutting_tool_parameter_d_diameter"/>
|
||||
<field name="cutting_tool_parameter_l_total_length"/>
|
||||
@@ -153,60 +153,60 @@
|
||||
<field name="cutting_tool_parameter_screw"/>
|
||||
<field name="cutting_tool_parameter_blade_ids" widget="many2many_tags"/>
|
||||
<field name="cutting_tool_parameter_scope"
|
||||
attrs="{'invisible': [('cutting_tool', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', 'not in', ['刀杆','刀盘'])]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', 'not in', ['刀杆','刀盘'])]}">
|
||||
<field name="cutting_tool_parameter_material_model_id"
|
||||
attrs="{'invisible': [('cutting_tool', 'not in', ['刀杆','刀盘'])],'required': [('cutting_tool', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ['刀杆','刀盘'])],'required': [('cutting_tool_type', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
<field name="cutting_tool_parameter_rounded_corner"/>
|
||||
<field name="cutting_tool_parameter_accuracy_level"/>
|
||||
<field name="cutting_tool_parameter_blade_number"
|
||||
attrs="{'invisible': [('cutting_tool', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ['刀杆','刀盘'])]}"/>
|
||||
<field name="cutting_tool_parameter_hardness"/>
|
||||
</group>
|
||||
<!--刀柄-->
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '刀柄')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '刀柄')]}">
|
||||
<field name="cutting_tool_parameter_brand_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀柄')],'required': [('cutting_tool', '=', '刀柄')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'required': [('cutting_tool_type', '=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_parameter_handle_length"/>
|
||||
<field name="cutting_tool_parameter_length1"/>
|
||||
<field name="cutting_tool_parameter_diameter1"/>
|
||||
<field name="cutting_tool_parameter_body_accuracy"/>
|
||||
<field name="cutting_tool_parameter_nut"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀柄')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_parameter_clamping_range"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀柄')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_parameter_weight"/>
|
||||
<field name="cutting_tool_parameter_chuck_model_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀柄')],'required': [('cutting_tool', '=', '刀柄')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'required': [('cutting_tool_type', '=', '刀柄')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '刀柄')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '刀柄')]}">
|
||||
<field name="cutting_tool_parameter_material_model_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '刀柄')],'required': [('cutting_tool', '=', '刀柄')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'required': [('cutting_tool_type', '=', '刀柄')]}"/>
|
||||
<field name="cutting_tool_parameter_detection_accuracy"/>
|
||||
<field name="cutting_tool_parameter_detection_hardness"/>
|
||||
<field name="cutting_tool_parameter_standard_speed"/>
|
||||
</group>
|
||||
<!--夹头-->
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '夹头')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '夹头')]}">
|
||||
<field name="cutting_tool_parameter_brand_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '夹头')],'required': [('cutting_tool', '=', '夹头')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'required': [('cutting_tool_type', '=', '夹头')]}"/>
|
||||
<field name="cutting_tool_parameter_outer_diameter"/>
|
||||
<field name="cutting_tool_parameter_inner_diameter"/>
|
||||
<field name="cutting_tool_parameter_accuracy"/>
|
||||
<field name="cutting_tool_parameter_nut"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '夹头')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_parameter_clamping_range"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '夹头')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_parameter_handle_model_ids" widget="many2many_tags"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '夹头')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
</group>
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool', '!=', '夹头')]}">
|
||||
<group attrs="{'invisible': ['|',('categ_type', '!=', '刀具'),('cutting_tool_type', '!=', '夹头')]}">
|
||||
<field name="cutting_tool_parameter_material_model_id"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '夹头')],'required': [('cutting_tool', '=', '夹头')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'required': [('cutting_tool_type', '=', '夹头')]}"/>
|
||||
<field name="cutting_tool_parameter_height" string="高度[mm]"
|
||||
attrs="{'invisible': [('cutting_tool', '!=', '夹头')]}"/>
|
||||
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||
<field name="cutting_tool_parameter_feature"/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
@@ -1,21 +1,7 @@
|
||||
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 ResMrpBom_mo(models.Model):
|
||||
_inherit = 'mrp.bom'
|
||||
|
||||
subcontractor_id = fields.Many2one('res.partner', string='外包商')
|
||||
|
||||
|
||||
class ResProduct_mo(models.Model):
|
||||
class ResProductMo(models.Model):
|
||||
_inherit = 'product.template'
|
||||
model_file = fields.Binary('模型文件')
|
||||
categ_type = fields.Selection(
|
||||
@@ -54,7 +40,7 @@ class ResProduct_mo(models.Model):
|
||||
string='表面工艺参数')
|
||||
|
||||
cutting_tool_material_id = fields.Many2one('sf.cutting.tool.material', string='刀具物料')
|
||||
cutting_tool = fields.Char(string="刀具物料类型", related='cutting_tool_material_id.name')
|
||||
cutting_tool_type = fields.Char(string="刀具物料类型", related='cutting_tool_material_id.name', store=True)
|
||||
|
||||
cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', string='型号',
|
||||
)
|
||||
@@ -145,565 +131,19 @@ class ResProduct_mo(models.Model):
|
||||
)
|
||||
cutting_tool_parameter_feature = fields.Char('特性')
|
||||
|
||||
# image_1920 = fields.Image(related='cutting_tool_parameter_image', store=True,
|
||||
# domain=[('cutting_tool_parameter_image', '!=', False)])
|
||||
@api.onchange('categ_id')
|
||||
def _onchange_categ_id(self):
|
||||
if self.categ_type == '刀具':
|
||||
self.invoice_policy = 'delivery'
|
||||
self.sale_ok = 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('该产品中配对螺母不能为零,请确认并重新输入!')
|
||||
|
||||
def _get_volume_uom_id_from_ir_config_parameter(self):
|
||||
product_length_in_feet_param = self.env['ir.config_parameter'].sudo().get_param('product.volume_in_cubic_feet')
|
||||
if product_length_in_feet_param == '1':
|
||||
return self.env.ref('uom.product_uom_cubic_foot')
|
||||
else:
|
||||
return self.env.ref('sf_dlm.product_uom_cubic_millimeter')
|
||||
|
||||
# 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品
|
||||
def product_create(self, product_id, item, order_id, order_number, i):
|
||||
copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy()
|
||||
copy_product_id.product_tmpl_id.active = True
|
||||
model_type = self.env['sf.model.type'].search([], limit=1)
|
||||
attachment = self.attachment_create(item['model_name'], item['model_data'])
|
||||
vals = {
|
||||
'name': '%s-%s-%s' % ('P', order_id.name, i),
|
||||
'model_long': item['model_long'] + model_type.embryo_tolerance,
|
||||
'model_width': item['model_width'] + model_type.embryo_tolerance,
|
||||
'model_height': item['model_height'] + model_type.embryo_tolerance,
|
||||
'model_volume': (item['model_long'] + model_type.embryo_tolerance) * (
|
||||
item['model_width'] + model_type.embryo_tolerance) * (
|
||||
item['model_height'] + model_type.embryo_tolerance),
|
||||
'product_model_type_id': model_type.id,
|
||||
'model_processing_panel': 'R',
|
||||
'model_machining_precision': item['model_machining_precision'],
|
||||
'model_code': item['barcode'],
|
||||
'length': item['model_long'],
|
||||
'width': item['model_width'],
|
||||
'height': item['model_height'],
|
||||
'volume': item['model_long'] * item['model_width'] * item['model_height'],
|
||||
'model_file': '' if not item['model_file'] else base64.b64decode(item['model_file']),
|
||||
'model_name': attachment.name,
|
||||
'upload_model_file': [(6, 0, [attachment.id])],
|
||||
# 'tag_ids': [(6, 0, [t.id for t in account_template.tag_ids])],
|
||||
# 'single_manufacturing': True,
|
||||
# 'tracking': 'serial',
|
||||
'list_price': item['price'],
|
||||
# 'categ_id': self.env.ref('sf_dlm.product_category_finished_sf').id,
|
||||
'materials_id': self.env['sf.production.materials'].search(
|
||||
[('materials_no', '=', item['texture_code'])]).id,
|
||||
'materials_type_id': self.env['sf.materials.model'].search(
|
||||
[('materials_no', '=', item['texture_type_code'])]).id,
|
||||
# 'model_surface_process_ids': self.get_production_process_id(item['surface_process_code']),
|
||||
'model_process_parameters_ids': self.get_process_parameters_id(item['process_parameters_code']),
|
||||
'model_remark': item['remark'],
|
||||
'default_code': '%s-%s' % (order_number, i),
|
||||
# 'barcode': item['barcode'],
|
||||
'active': True,
|
||||
# 'route_ids': self._get_routes('')
|
||||
}
|
||||
copy_product_id.sudo().write(vals)
|
||||
# product_id.product_tmpl_id.active = False
|
||||
return copy_product_id
|
||||
|
||||
def _get_ids(self, param):
|
||||
type_ids = []
|
||||
if not param:
|
||||
return []
|
||||
for item in param:
|
||||
type_ids.append(item.id)
|
||||
return [(6, 0, type_ids)]
|
||||
|
||||
def get_process_parameters_id(self, process_parameters_code):
|
||||
process_parameters_ids = []
|
||||
for item in process_parameters_code:
|
||||
process_parameters = self.env['sf.production.process.parameter'].search([('code', '=', item)])
|
||||
process_parameters_ids.append(process_parameters.id)
|
||||
return [(6, 0, process_parameters_ids)]
|
||||
|
||||
def attachment_create(self, name, data):
|
||||
attachment = self.env['ir.attachment'].create({
|
||||
'datas': base64.b64decode(data),
|
||||
'type': 'binary',
|
||||
'public': True,
|
||||
'description': '模型文件',
|
||||
'name': name
|
||||
})
|
||||
return attachment
|
||||
|
||||
# 创建坯料
|
||||
def no_bom_product_create(self, product_id, item, order_id, route_type, i):
|
||||
no_bom_copy_product_id = product_id.with_user(self.env.ref("base.user_admin")).copy()
|
||||
no_bom_copy_product_id.product_tmpl_id.active = True
|
||||
materials_id = self.env['sf.production.materials'].search(
|
||||
[('materials_no', '=', item['texture_code'])])
|
||||
materials_type_id = self.env['sf.materials.model'].search(
|
||||
[('materials_no', '=', item['texture_type_code'])])
|
||||
model_type = self.env['sf.model.type'].search([], limit=1)
|
||||
supplier = self.env['mrp.bom'].get_supplier(materials_type_id)
|
||||
logging.info('no_bom_copy_product_supplier-vals:%s' % supplier)
|
||||
vals = {
|
||||
'name': '%s-%s-%s [%s %s-%s * %s * %s]' % ('R',
|
||||
order_id.name, i, materials_id.name, materials_type_id.name,
|
||||
item['model_long'] + model_type.embryo_tolerance,
|
||||
item['model_width'] + model_type.embryo_tolerance,
|
||||
item['model_height'] + model_type.embryo_tolerance),
|
||||
'length': item['model_long'] + model_type.embryo_tolerance,
|
||||
'width': item['model_width'] + model_type.embryo_tolerance,
|
||||
'height': item['model_height'] + model_type.embryo_tolerance,
|
||||
'volume': (item['model_long'] + model_type.embryo_tolerance) * (
|
||||
item['model_width'] + model_type.embryo_tolerance) * (
|
||||
item['model_height'] + model_type.embryo_tolerance),
|
||||
'embryo_model_type_id': model_type.id,
|
||||
'list_price': item['price'],
|
||||
'materials_id': materials_id.id,
|
||||
'materials_type_id': materials_type_id.id,
|
||||
'is_bfm': True,
|
||||
# 'route_ids': self._get_routes(route_type),
|
||||
# 'categ_id': self.env.ref('sf_dlm.product_category_embryo_sf').id,
|
||||
# 'model_surface_process_id': self.env['sf.production.process'].search(
|
||||
# [('process_encode', '=', item['surface_process_code'])]).id,
|
||||
# 'model_process_parameters_id': self.env['sf.processing.technology'].search(
|
||||
# [('process_encode', '=', item['process_parameters_code'])]).id,
|
||||
'active': True
|
||||
}
|
||||
# 外协和采购生成的坯料需要根据材料型号绑定供应商
|
||||
if route_type == 'subcontract' or route_type == 'purchase':
|
||||
no_bom_copy_product_id.purchase_ok = True
|
||||
no_bom_copy_product_id.seller_ids = [
|
||||
(0, 0, {'partner_id': supplier.partner_id.id, 'delay': 1.0})]
|
||||
if route_type == 'subcontract':
|
||||
partner = self.env['res.partner'].search([('id', '=', supplier.partner_id.id)])
|
||||
partner.is_subcontractor = True
|
||||
no_bom_copy_product_id.write(vals)
|
||||
logging.info('no_bom_copy_product_id-vals:%s' % vals)
|
||||
# product_id.product_tmpl_id.active = False
|
||||
return no_bom_copy_product_id
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
for vals in vals_list:
|
||||
if vals.get('upload_model_file'):
|
||||
if vals.get('is_bfm') is False and vals.get('categ_type') == '成品':
|
||||
for item in vals['upload_model_file']:
|
||||
logging.info('create-attachment:%s' % int(item[2][0]))
|
||||
attachment = self.env['ir.attachment'].sudo().search([('id', '=', int(item[2][0]))])
|
||||
base64_data = base64.b64encode(attachment.datas)
|
||||
base64_datas = base64_data.decode('utf-8')
|
||||
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
|
||||
report_path = attachment._full_path(attachment.store_fname)
|
||||
vals['model_file'] = self.transition_glb_file(report_path, model_code)
|
||||
logging.info('create-model_file:%s' % len(vals['model_file']))
|
||||
self._sanitize_vals(vals)
|
||||
templates = super(ResProductTemplate, self).create(vals_list)
|
||||
if "create_product_product" not in self._context:
|
||||
templates._create_variant_ids()
|
||||
|
||||
# This is needed to set given values to first variant after creation
|
||||
for template, vals in zip(templates, vals_list):
|
||||
related_vals = {}
|
||||
for field_name in self._get_related_fields_variant_template():
|
||||
if vals.get(field_name):
|
||||
related_vals[field_name] = vals[field_name]
|
||||
if related_vals:
|
||||
template.write(related_vals)
|
||||
logging.info('create-model_file:%s' % templates.model_file)
|
||||
return templates
|
||||
|
||||
@api.onchange('upload_model_file')
|
||||
def onchange_model_file(self):
|
||||
for item in self:
|
||||
if item.upload_model_file:
|
||||
if len(item.upload_model_file) > 1:
|
||||
raise ValidationError('只允许上传一个文件')
|
||||
manufacturing_order = self.env['mrp.production'].search([('product_id', '=', self.id)])
|
||||
if manufacturing_order:
|
||||
raise ValidationError('该产品已生成制造订单,无法进行修改')
|
||||
file_attachment_id = item.upload_model_file[0]
|
||||
# 附件路径
|
||||
report_path = file_attachment_id._full_path(file_attachment_id.store_fname)
|
||||
base64_data = base64.b64encode(file_attachment_id.datas)
|
||||
base64_datas = base64_data.decode('utf-8')
|
||||
model_code = hashlib.sha1(base64_datas.encode('utf-8')).hexdigest()
|
||||
item.model_file = self.transition_glb_file(report_path, model_code)
|
||||
|
||||
# 将attach的datas内容转为glb文件
|
||||
# def transition_glb_file(self, report_path, code):
|
||||
# shapes = read_step_file(report_path)
|
||||
# output_file = os.path.join('/tmp', str(code) + '.stl')
|
||||
# write_stl_file(shapes, output_file, 'binary', 0.03, 0.5)
|
||||
# # 转化为glb
|
||||
# output_glb_file = os.path.join('/tmp', str(code) + '.glb')
|
||||
# util_path = get_resource_path('sf_dlm', 'static/util')
|
||||
# cmd = 'python3 %s/stl2gltf.py %s %s -b' % (util_path, output_file, output_glb_file)
|
||||
# os.system(cmd)
|
||||
# # 转base64
|
||||
# with open(output_glb_file, 'rb') as fileObj:
|
||||
# image_data = fileObj.read()
|
||||
# base64_data = base64.b64encode(image_data)
|
||||
# return base64_data
|
||||
|
||||
@api.onchange('integral_cutting_tool_type_id')
|
||||
def _get_integral_cutting_tool_type_info(self):
|
||||
if self.integral_cutting_tool_type_id:
|
||||
for item in self:
|
||||
item.cutting_tool_parameter_brand_id = item.integral_cutting_tool_type_id.brand.id
|
||||
item.cutting_tool_parameter_total_length = item.integral_cutting_tool_type_id.total_length
|
||||
item.cutting_tool_parameter_shank_length = item.integral_cutting_tool_type_id.shank_length
|
||||
item.cutting_tool_parameter_blade_length = item.integral_cutting_tool_type_id.blade_length
|
||||
item.cutting_tool_parameter_diameter = item.integral_cutting_tool_type_id.diameter
|
||||
item.cutting_tool_parameter_nut = item.integral_cutting_tool_type_id.nut
|
||||
item.cutting_tool_parameter_blade_number = item.integral_cutting_tool_type_id.blade_number
|
||||
item.cutting_tool_parameter_material_model_id = item.integral_cutting_tool_type_id.material_model.id
|
||||
item.cutting_tool_parameter_front_angle = item.integral_cutting_tool_type_id.front_angle
|
||||
item.cutting_tool_parameter_rear_angle = item.integral_cutting_tool_type_id.rear_angle
|
||||
item.cutting_tool_parameter_main_included_angle = item.integral_cutting_tool_type_id.main_included_angle
|
||||
item.cutting_tool_parameter_chuck_model_ids = self._get_ids(
|
||||
item.integral_cutting_tool_type_id.chuck_model)
|
||||
item.cutting_tool_parameter_scope = item.integral_cutting_tool_type_id.scope
|
||||
item.image_1920 = '' if not item.integral_cutting_tool_type_id.image else item.integral_cutting_tool_type_id.image
|
||||
|
||||
@api.onchange('blade_type_id')
|
||||
def _get_blade_type_info(self):
|
||||
if self.blade_type_id:
|
||||
for item in self:
|
||||
item.cutting_tool_parameter_brand_id = item.blade_type_id.brand.id
|
||||
item.cutting_tool_parameter_top_angle = item.blade_type_id.top_angle
|
||||
item.cutting_tool_parameter_front_angle = item.blade_type_id.front_angle
|
||||
item.cutting_tool_parameter_rear_angle = item.blade_type_id.rear_angle
|
||||
item.cutting_tool_parameter_main_included_angle = item.blade_type_id.main_included_angle
|
||||
item.cutting_tool_parameter_r_angle = item.blade_type_id.r_angle
|
||||
item.cutting_tool_parameter_working_hardness = item.blade_type_id.hardness
|
||||
item.cutting_tool_parameter_material_model_id = item.blade_type_id.material_model.id
|
||||
item.cutting_tool_parameter_length = item.blade_type_id.length
|
||||
item.cutting_tool_parameter_width = item.blade_type_id.width
|
||||
item.cutting_tool_parameter_height = item.blade_type_id.height
|
||||
item.cutting_tool_parameter_radius = item.blade_type_id.radius
|
||||
item.cutting_tool_parameter_nut = item.blade_type_id.nut
|
||||
item.cutting_tool_parameter_cutter_bar_ids = self._get_ids(item.blade_type_id.cutter_bar)
|
||||
item.cutting_tool_parameter_cutter_pad_ids = self._get_ids(item.blade_type_id.cutter_pad)
|
||||
item.image_1920 = '' if not item.blade_type_id.image else item.blade_type_id.image
|
||||
|
||||
@api.onchange('cutter_bar_type_id')
|
||||
def _get_cutter_bar_type_info(self):
|
||||
if self.cutter_bar_type_id:
|
||||
for item in self:
|
||||
item.cutting_tool_parameter_brand_id = item.cutter_bar_type_id.brand.id
|
||||
item.cutting_tool_parameter_c_diameter = item.cutter_bar_type_id.c_diameter
|
||||
item.cutting_tool_parameter_d_diameter = item.cutter_bar_type_id.d_diameter
|
||||
item.cutting_tool_parameter_l_total_length = item.cutter_bar_type_id.total_length
|
||||
item.cutting_tool_parameter_wrench = item.cutter_bar_type_id.wrench
|
||||
item.cutting_tool_parameter_screw = item.cutter_bar_type_id.screw
|
||||
item.cutting_tool_parameter_blade_ids = self._get_ids(item.cutter_bar_type_id.blade)
|
||||
item.cutting_tool_parameter_scope = item.cutter_bar_type_id.scope
|
||||
item.cutting_tool_parameter_material_model_id = item.cutter_bar_type_id.material_model.id
|
||||
item.cutting_tool_parameter_rounded_corner = item.cutter_bar_type_id.radius
|
||||
item.cutting_tool_parameter_accuracy_level = item.cutter_bar_type_id.accuracy
|
||||
item.cutting_tool_parameter_blade_number = item.cutter_bar_type_id.blade_number
|
||||
item.cutting_tool_parameter_hardness = item.cutter_bar_type_id.hardness
|
||||
item.image_1920 = '' if not item.cutter_bar_type_id.image else item.cutter_bar_type_id.image
|
||||
|
||||
@api.onchange('cutter_pad_type_id')
|
||||
def _get_cutter_pad_type_info(self):
|
||||
if self.cutter_pad_type_id:
|
||||
for item in self:
|
||||
item.cutting_tool_parameter_brand_id = item.cutter_pad_type_id.brand.id
|
||||
item.cutting_tool_parameter_c_diameter = item.cutter_pad_type_id.c_diameter
|
||||
item.cutting_tool_parameter_d_diameter = item.cutter_pad_type_id.d_diameter
|
||||
item.cutting_tool_parameter_l_total_length = item.cutter_pad_type_id.total_length
|
||||
item.cutting_tool_parameter_wrench = item.cutter_pad_type_id.wrench
|
||||
item.cutting_tool_parameter_screw = item.cutter_pad_type_id.screw
|
||||
item.cutting_tool_parameter_blade_ids = item.cutter_pad_type_id.blade.id
|
||||
item.cutting_tool_parameter_scope = item.cutter_pad_type_id.scope
|
||||
item.cutting_tool_parameter_material_model_id = item.cutter_pad_type_id.material_model.id
|
||||
item.cutting_tool_parameter_rounded_corner = item.cutter_pad_type_id.radius
|
||||
item.cutting_tool_parameter_accuracy_level = item.cutter_pad_type_id.accuracy
|
||||
item.cutting_tool_parameter_blade_number = item.cutter_pad_type_id.blade_number
|
||||
item.cutting_tool_parameter_hardness = item.cutter_pad_type_id.hardness
|
||||
item.image_1920 = '' if not item.cutter_pad_type_id.image else item.cutter_pad_type_id.image
|
||||
|
||||
@api.onchange('handle_type_id')
|
||||
def _get_handle_type_info(self):
|
||||
if self.handle_type_id:
|
||||
for item in self:
|
||||
item.cutting_tool_parameter_brand_id = item.handle_type_id.brand.id
|
||||
item.cutting_tool_parameter_handle_length = item.handle_type_id.length
|
||||
item.cutting_tool_parameter_length1 = item.handle_type_id.length1
|
||||
item.cutting_tool_parameter_diameter1 = item.handle_type_id.diameter1
|
||||
item.cutting_tool_parameter_body_accuracy = item.handle_type_id.body_accuracy
|
||||
item.cutting_tool_parameter_nut = item.handle_type_id.nut
|
||||
item.cutting_tool_parameter_clamping_range = item.handle_type_id.clamping_range
|
||||
item.cutting_tool_parameter_weight = item.handle_type_id.weight
|
||||
item.cutting_tool_parameter_material_model_id = item.handle_type_id.material_model.id
|
||||
item.cutting_tool_parameter_chuck_model_ids = self._get_ids(item.handle_type_id.chuck_model)
|
||||
item.cutting_tool_parameter_detection_accuracy = item.handle_type_id.detection_accuracy
|
||||
item.cutting_tool_parameter_detection_hardness = item.handle_type_id.detection_hardness
|
||||
item.cutting_tool_parameter_standard_speed = item.handle_type_id.standard_speed
|
||||
item.image_1920 = '' if not item.handle_type_id.image else item.handle_type_id.image
|
||||
|
||||
@api.onchange('chuck_type_id')
|
||||
def _get_chuck_type_info(self):
|
||||
if self.chuck_type_id:
|
||||
for item in self:
|
||||
item.cutting_tool_parameter_brand_id = item.chuck_type_id.brand.id
|
||||
item.cutting_tool_parameter_outer_diameter = item.chuck_type_id.diameter
|
||||
item.cutting_tool_parameter_inner_diameter = item.chuck_type_id.inner_diameter
|
||||
item.cutting_tool_parameter_accuracy = item.chuck_type_id.accuracy
|
||||
item.cutting_tool_parameter_nut = item.chuck_type_id.nut
|
||||
item.cutting_tool_parameter_clamping_range = item.chuck_type_id.clamping_range
|
||||
item.cutting_tool_parameter_handle_model_ids = self._get_ids(item.chuck_type_id.handle_model)
|
||||
item.cutting_tool_parameter_material_model_id = item.chuck_type_id.material_model.id
|
||||
item.cutting_tool_parameter_height = item.chuck_type_id.height
|
||||
item.cutting_tool_parameter_feature = item.chuck_type_id.feature
|
||||
item.image_1920 = '' if not item.chuck_type_id.image else item.chuck_type_id.image
|
||||
@api.onchange('cutting_tool_material_id')
|
||||
def _onchange_cutting_tool_material_id(self):
|
||||
if self.cutting_tool_material_id != self.cutting_tool_model_id.mrs_cutting_tool_material_id:
|
||||
self.cutting_tool_model_id = False
|
||||
|
||||
|
||||
class ResMrpBom(models.Model):
|
||||
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:
|
||||
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("该类别已存在,请选择其他类别")
|
||||
|
||||
@@ -49,81 +49,12 @@ class ResConfigSettings(models.TransientModel):
|
||||
_logger.info("同步所有刀具物料...")
|
||||
self.env['sf.cutting.tool.material'].sync_all_cutting_tool_material()
|
||||
_logger.info("同步所有刀具物料完成")
|
||||
# _logger.info("同步每日刀片类型列表...")
|
||||
# self.env['sf.blade.model'].sync_blade_model()
|
||||
# _logger.info("同步每日刀片类型完成")
|
||||
# _logger.info("同步所有刀片类型列表...")
|
||||
# self.env['sf.blade.model'].sync_all_blade_model()
|
||||
# _logger.info("同步所有刀片类型完成")
|
||||
# _logger.info("同步每日刀杆类型...")
|
||||
# self.env['sf.cutter.bar.model'].sync_cutter_bar_model()
|
||||
# _logger.info("同步每日刀杆类型完成")
|
||||
# _logger.info("同步所有刀杆类型...")
|
||||
# self.env['sf.cutter.bar.model'].sync_all_cutter_bar_model()
|
||||
# _logger.info("同步所有刀杆类型完成")
|
||||
# _logger.info("同步每日刀盘类型...")
|
||||
# self.env['sf.cutter.pad.model'].sync_cutter_pad_model()
|
||||
# _logger.info("同步每日刀盘类型完成")
|
||||
# _logger.info("同步所有刀盘类型...")
|
||||
# self.env['sf.cutter.pad.model'].sync_all_cutter_pad_model()
|
||||
# _logger.info("同步所有刀盘类型完成")
|
||||
# _logger.info("同步每日刀柄类型...")
|
||||
# self.env['sf.handle.model'].sync_handle_model()
|
||||
# _logger.info("同步每日刀柄类型完成")
|
||||
# _logger.info("同步所有刀柄类型...")
|
||||
# self.env['sf.handle.model'].sync_all_handle_model()
|
||||
# _logger.info("同步所有刀柄类型完成")
|
||||
# _logger.info("同步每日夹头类型...")
|
||||
# self.env['sf.chuck.model'].sync_chuck_model()
|
||||
# _logger.info("同步每日夹头类型完成")
|
||||
# _logger.info("同步所有夹头类型...")
|
||||
# self.env['sf.chuck.model'].sync_all_chuck_model()
|
||||
# _logger.info("同步所有夹头类型完成")
|
||||
# _logger.info("同步每日整体式刀具类型...")
|
||||
# self.env['sf.integral.cutting.tool.model'].sync_integral_cutting_tool_model()
|
||||
# _logger.info("同步每日整体式刀具类型完成")
|
||||
# _logger.info("同步所有整体式刀具类型...")
|
||||
# self.env['sf.integral.cutting.tool.model'].sync_all_integral_cutting_tool_model()
|
||||
# _logger.info("同步所有整体式刀具类型完成")
|
||||
# _logger.info("同步每日刀片列表...")
|
||||
# self.env['sf.blade'].sync_blade()
|
||||
# _logger.info("同步每日刀片完成")
|
||||
# _logger.info("同步所有刀片列表...")
|
||||
# self.env['sf.blade'].sync_all_blade()
|
||||
# _logger.info("同步所有刀片完成")
|
||||
# _logger.info("同步每日刀杆列表...")
|
||||
# self.env['sf.cutter.bar'].sync_cutter_bar()
|
||||
# _logger.info("同步每日刀杆完成")
|
||||
# _logger.info("同步所有刀杆列表...")
|
||||
# self.env['sf.cutter.bar'].sync_all_cutter_bar()
|
||||
# _logger.info("同步所有刀杆完成")
|
||||
# # _logger.info("同步每日刀盘列表...")
|
||||
# # self.env['sf.cutter.pad'].sync_cutter_pad()
|
||||
# # _logger.info("同步每日刀盘完成")
|
||||
# _logger.info("同步所有刀盘列表...")
|
||||
# self.env['sf.cutter.pad'].sync_all_cutter_pad()
|
||||
# _logger.info("同步所有刀盘完成")
|
||||
# # _logger.info("同步每日刀柄列表...")
|
||||
# # self.env['sf.handle'].sync_handle()
|
||||
# # _logger.info("同步每日刀柄完成")
|
||||
# _logger.info("同步所有刀柄列表...")
|
||||
# self.env['sf.handle'].sync_all_handle()
|
||||
# _logger.info("同步所有刀柄完成")
|
||||
# # _logger.info("同步每日夹头列表...")
|
||||
# # self.env['sf.chuck'].sync_chuck()
|
||||
# # _logger.info("同步每日夹头完成")
|
||||
# _logger.info("同步所有夹头列表...")
|
||||
# self.env['sf.chuck'].sync_all_chuck()
|
||||
# _logger.info("同步所有夹头完成")
|
||||
# # _logger.info("同步每日整体式刀具列表...")
|
||||
# # self.env['sf.integral.cutting.tool'].sync_integral_cutting_tool()
|
||||
# # _logger.info("同步每日整体式刀具完成")
|
||||
# _logger.info("同步所有整体式刀具列表...")
|
||||
# self.env['sf.integral.cutting.tool'].sync_all_integral_cutting_tool()
|
||||
# _logger.info("同步所有整体式刀具完成")
|
||||
# _logger.info("同步每日同步功能刀具列表...")
|
||||
# self.env['sf.functional.cutting.tool'].sync_functional_cutting_tool()
|
||||
# _logger.info("同步每日功能刀具列表完成")
|
||||
_logger.info("定时同步每日功能刀具类型列表...")
|
||||
self.env['sf.functional.cutting.tool.model'].sync_functional_cutting_tool_model()
|
||||
_logger.info("同步每日功能刀具类型完成")
|
||||
_logger.info("定时同步所有功能刀具类型列表...")
|
||||
self.env['sf.functional.cutting.tool.model'].sync_all_functional_cutting_tool_model()
|
||||
_logger.info("同步所有功能刀具类型完成")
|
||||
_logger.info("同步每日刀具类型...")
|
||||
self.env['sf.cutting.tool.type'].sync_tool_type()
|
||||
_logger.info("同步每日刀具类型完成")
|
||||
|
||||
@@ -3294,7 +3294,7 @@ class SfToolType(models.Model):
|
||||
"chuck_type_code": item['chuck_type_code'],
|
||||
"remark": item['remark'],
|
||||
})
|
||||
print('同步每日刀柄类型列表成功')
|
||||
|
||||
else:
|
||||
raise ValidationError("认证未通过")
|
||||
|
||||
@@ -3343,7 +3343,7 @@ class SfToolType(models.Model):
|
||||
"chuck_type_code": item['chuck_type_code'],
|
||||
"remark": item['remark'],
|
||||
})
|
||||
print('同步所有刀柄类型列表成功')
|
||||
|
||||
else:
|
||||
raise ValidationError("认证未通过")
|
||||
|
||||
@@ -3477,8 +3477,13 @@ class SfToolModel(models.Model):
|
||||
"pad_scope": item['pad_scope'],
|
||||
"handle_code": item['handle_code'],
|
||||
"handle_length": item['handle_length'],
|
||||
"handle_length1": item['handle_length1'],
|
||||
"handle_diameter1": item['handle_diameter1'],
|
||||
"handle_diameter": item['handle_diameter'],
|
||||
"handle_flange_length": item['handle_flange_length'],
|
||||
"handle_flange_diameter": item['handle_flange_diameter'],
|
||||
"handle_clamping_diameter_min": item['handle_clamping_diameter_min'],
|
||||
"handle_clamping_diameter_max": item['handle_clamping_diameter_max'],
|
||||
"handle_jump_accuracy": item['handle_jump_accuracy'],
|
||||
"handle_max_speed": item['handle_max_speed'],
|
||||
"handle_weight": item['handle_weight'],
|
||||
"handle_body_accuracy": item['handle_body_accuracy'],
|
||||
"handle_nut": item['handle_nut'],
|
||||
@@ -3578,8 +3583,13 @@ class SfToolModel(models.Model):
|
||||
"pad_scope": item['pad_scope'],
|
||||
"handle_code": item['handle_code'],
|
||||
"handle_length": item['handle_length'],
|
||||
"handle_length1": item['handle_length1'],
|
||||
"handle_diameter1": item['handle_diameter1'],
|
||||
"handle_diameter": item['handle_diameter'],
|
||||
"handle_flange_length": item['handle_flange_length'],
|
||||
"handle_flange_diameter": item['handle_flange_diameter'],
|
||||
"handle_clamping_diameter_min": item['handle_clamping_diameter_min'],
|
||||
"handle_clamping_diameter_max": item['handle_clamping_diameter_max'],
|
||||
"handle_jump_accuracy": item['handle_jump_accuracy'],
|
||||
"handle_max_speed": item['handle_max_speed'],
|
||||
"handle_weight": item['handle_weight'],
|
||||
"handle_body_accuracy": item['handle_body_accuracy'],
|
||||
"handle_nut": item['handle_nut'],
|
||||
@@ -3743,8 +3753,13 @@ class SfToolModel(models.Model):
|
||||
"pad_scope": item['pad_scope'],
|
||||
"handle_code": item['handle_code'],
|
||||
"handle_length": item['handle_length'],
|
||||
"handle_length1": item['handle_length1'],
|
||||
"handle_diameter1": item['handle_diameter1'],
|
||||
"handle_diameter": item['handle_diameter'],
|
||||
"handle_flange_length": item['handle_flange_length'],
|
||||
"handle_flange_diameter": item['handle_flange_diameter'],
|
||||
"handle_clamping_diameter_min": item['handle_clamping_diameter_min'],
|
||||
"handle_clamping_diameter_max": item['handle_clamping_diameter_max'],
|
||||
"handle_jump_accuracy": item['handle_jump_accuracy'],
|
||||
"handle_max_speed": item['handle_max_speed'],
|
||||
"handle_weight": item['handle_weight'],
|
||||
"handle_body_accuracy": item['handle_body_accuracy'],
|
||||
"handle_nut": item['handle_nut'],
|
||||
@@ -3840,8 +3855,13 @@ class SfToolModel(models.Model):
|
||||
"pad_scope": item['pad_scope'],
|
||||
"handle_code": item['handle_code'],
|
||||
"handle_length": item['handle_length'],
|
||||
"handle_length1": item['handle_length1'],
|
||||
"handle_diameter1": item['handle_diameter1'],
|
||||
"handle_diameter": item['handle_diameter'],
|
||||
"handle_flange_length": item['handle_flange_length'],
|
||||
"handle_flange_diameter": item['handle_flange_diameter'],
|
||||
"handle_clamping_diameter_min": item['handle_clamping_diameter_min'],
|
||||
"handle_clamping_diameter_max": item['handle_clamping_diameter_max'],
|
||||
"handle_jump_accuracy": item['handle_jump_accuracy'],
|
||||
"handle_max_speed": item['handle_max_speed'],
|
||||
"handle_weight": item['handle_weight'],
|
||||
"handle_body_accuracy": item['handle_body_accuracy'],
|
||||
"handle_nut": item['handle_nut'],
|
||||
|
||||
@@ -27,6 +27,9 @@
|
||||
|
||||
'web.assets_qweb': [
|
||||
],
|
||||
'web.assets_backend':[
|
||||
'sf_tool_management/static/src/change.scss'
|
||||
]
|
||||
|
||||
|
||||
},
|
||||
|
||||
@@ -8,7 +8,7 @@ class FunctionalCuttingToolEntity(models.Model):
|
||||
_description = '功能刀具管理'
|
||||
|
||||
order = fields.Char(string='序')
|
||||
functional_cutting_tool_id = fields.Many2one('sf.functional.cutting.tool', string='功能刀具', invisible=True)
|
||||
functional_cutting_tool_id = fields.Char(string='功能刀具', invisible=True)
|
||||
# 功能刀具预警 特有字段
|
||||
install_tool_time = fields.Char("装刀时间")
|
||||
outbound_time = fields.Char('出库时间')
|
||||
@@ -104,11 +104,11 @@ class MachineTableToolChangingApply(models.Model):
|
||||
_name = 'sf.machine.table.tool.changing.apply'
|
||||
_description = '机床换刀申请'
|
||||
|
||||
apply_to_tool_change_ids = fields.One2many(
|
||||
'sf.tool.change.requirement.information',
|
||||
'tool_change_to_apply_id',
|
||||
string='换刀需求信息',
|
||||
attrs="{'invisible': 1}")
|
||||
# apply_to_tool_change_ids = fields.One2many(
|
||||
# 'sf.tool.change.requirement.information',
|
||||
# 'tool_change_to_apply_id',
|
||||
# string='换刀需求信息',
|
||||
# attrs="{'invisible': 1}")
|
||||
|
||||
CNC_machine_table = fields.Char(string='CNC机床')
|
||||
# todo 机床类型和刀位号 为 Many2one
|
||||
@@ -260,7 +260,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
||||
|
||||
def automation_apply_for_tooling(self):
|
||||
"""
|
||||
todo 自动申请装刀
|
||||
自动申请装刀
|
||||
:return:
|
||||
"""
|
||||
self.env['sf.functional.tool.assembly'].create({
|
||||
@@ -303,6 +303,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
||||
class FunctionalToolAssembly(models.Model):
|
||||
_name = 'sf.functional.tool.assembly'
|
||||
_description = '功能刀具组装'
|
||||
_order = 'use_tool_time asc'
|
||||
|
||||
functional_tool_code = fields.Char(string='功能刀具编码')
|
||||
functional_tool_name = fields.Char(string='功能刀具名称')
|
||||
@@ -317,7 +318,6 @@ class FunctionalToolAssembly(models.Model):
|
||||
knife_handle_name = fields.Char(string='刀柄名称')
|
||||
knife_handle_brand = fields.Char(string='品牌')
|
||||
knife_handle_type = fields.Char(string='型号')
|
||||
|
||||
coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精')
|
||||
tool_loading_length = fields.Char(string='装刀长')
|
||||
new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧')
|
||||
@@ -330,7 +330,6 @@ class FunctionalToolAssembly(models.Model):
|
||||
applicant = fields.Char(string='申请人')
|
||||
reason_for_applying = fields.Char(string='申请原因')
|
||||
apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now())
|
||||
|
||||
assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装'), ('2', '已出库')],string='组装状态', default='0')
|
||||
use_tool_time = fields.Datetime(string='用刀时间')
|
||||
production_line_name = fields.Char(string='产线名称')
|
||||
@@ -343,6 +342,8 @@ class FunctionalToolAssembly(models.Model):
|
||||
receive_time = fields.Datetime(string='领用出库时间')
|
||||
remark = fields.Char(string='备注说明')
|
||||
|
||||
check_box = fields.Boolean(string='复选框', default=False, attrs="{'readonly': [('assemble_status', '!=', '1')]}")
|
||||
|
||||
def cancel_functional_tool_assembly(self):
|
||||
"""
|
||||
取消功能刀具组装
|
||||
@@ -367,3 +368,62 @@ class FunctionalToolAssembly(models.Model):
|
||||
'cut_number': None,
|
||||
'assemble_status': '0'
|
||||
})
|
||||
|
||||
|
||||
def show_popup(self):
|
||||
"""
|
||||
单个功能刀具出库
|
||||
:return:
|
||||
"""
|
||||
self.env['sf.delivery.of.cargo.from.storage'].search([]).unlink()
|
||||
|
||||
vals = self.env['sf.functional.tool.assembly'].search([('check_box', '=', True),('assemble_status', '=', '1')])
|
||||
|
||||
if vals:
|
||||
for val in vals:
|
||||
self.env['sf.delivery.of.cargo.from.storage'].create({
|
||||
'functional_tool_code': val.functional_tool_code,
|
||||
'functional_tool_name': val.functional_tool_name,
|
||||
'functional_tool_type': val.functional_tool_type,
|
||||
'production_line_name': val.production_line_name,
|
||||
'machine_tool_code': val.machine_tool_code,
|
||||
'receive_person': val.receive_person,
|
||||
'receive_time': val.receive_time
|
||||
})
|
||||
else:
|
||||
self.env['sf.delivery.of.cargo.from.storage'].create({
|
||||
'functional_tool_code': self.functional_tool_code,
|
||||
'functional_tool_name': self.functional_tool_name,
|
||||
'functional_tool_type': self.functional_tool_type,
|
||||
'production_line_name': self.production_line_name,
|
||||
'machine_tool_code': self.machine_tool_code,
|
||||
'receive_person': self.receive_person,
|
||||
'receive_time': self.receive_time
|
||||
})
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': '功能刀具出库',
|
||||
'res_model': 'sf.delivery.of.cargo.from.storage',
|
||||
'view_mode': 'tree',
|
||||
'view_type': 'tree',
|
||||
'target': 'new'
|
||||
}
|
||||
|
||||
def automated_assembly(self):
|
||||
"""
|
||||
todo 自动组装
|
||||
:return:
|
||||
"""
|
||||
|
||||
def automatic_printing_of_QR_code(self):
|
||||
"""
|
||||
todo 自动打印二维码
|
||||
:return:
|
||||
"""
|
||||
|
||||
def assemble_single_print(self):
|
||||
"""
|
||||
todo 组装单打印
|
||||
:return:
|
||||
"""
|
||||
11
sf_tool_management/static/src/change.scss
Normal file
11
sf_tool_management/static/src/change.scss
Normal file
@@ -0,0 +1,11 @@
|
||||
.modal-content .o_cp_buttons {
|
||||
display:none
|
||||
}
|
||||
|
||||
.modal-content .o_control_panel {
|
||||
display:none
|
||||
}
|
||||
|
||||
.modal-content .o_list_button {
|
||||
|
||||
}
|
||||
@@ -417,31 +417,20 @@
|
||||
class="btn-primary"/>
|
||||
<button string="组装" name="" attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"/>
|
||||
|
||||
<button string="取消组装" name="cancel_functional_tool_assembly" type="object" attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"/>
|
||||
<button string="取消组装" name="" attrs="{'invisible': [('assemble_status', '!=', '0')]}" class="btn-primary"/>
|
||||
<button string="取消组装" name="cancel_functional_tool_assembly" type="object" attrs="{'invisible': [('assemble_status', '!=', '1')]}" class="btn-primary"/>
|
||||
<button string="取消组装" name="" attrs="{'invisible': [('assemble_status', '=', '1')]}" class="btn-primary"/>
|
||||
|
||||
<button string="自动打印二维码" name="" class="btn-primary"/>
|
||||
<button string="自动打印二维码" name="automatic_printing_of_QR_code" type="object" class="btn-primary"/>
|
||||
|
||||
<button string="出库"
|
||||
name="%(sf_tool_management.sf_delivery_of_cargo_from_storager_act)d"
|
||||
type="action"
|
||||
context="{
|
||||
'default_functional_tool_code': functional_tool_code,
|
||||
'default_machine_tool_name': machine_tool_name,
|
||||
'default_functional_tool_type': functional_tool_type,
|
||||
'default_production_line_name': production_line_name,
|
||||
'default_machine_tool_code': machine_tool_code,
|
||||
'default_receive_person': receive_person,
|
||||
'default_receive_time': receive_time
|
||||
}"
|
||||
attrs="{'invisible': [('assemble_status', '!=', '1')]}" class="btn-primary"/>
|
||||
<button string="出库" name="show_popup" type="object" attrs="{'invisible': [('assemble_status', '!=', '1')]}" class="btn-primary"/>
|
||||
<button string="出库" name="" attrs="{'invisible': [('assemble_status', '=', '1')]}" class="btn-primary"/>
|
||||
|
||||
<button string="组装单打印" name="" class="btn-primary"/>
|
||||
<button string="组装单打印" name="assemble_single_print" type="object" class="btn-primary"/>
|
||||
|
||||
<field name="check_box"/>
|
||||
|
||||
<field name="assemble_status"/>
|
||||
<field name="use_tool_time"/>
|
||||
<field name="use_tool_time" />
|
||||
<field name="production_line_name"/>
|
||||
<field name="machine_tool_name"/>
|
||||
<field name="machine_tool_code"/>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from odoo import fields, models, api
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ToolChangeRequirementInformation(models.TransientModel):
|
||||
_name = 'sf.tool.change.requirement.information'
|
||||
_description = '换刀需求信息'
|
||||
|
||||
tool_change_to_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', string='机床换刀申请')
|
||||
# tool_change_to_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', string='机床换刀申请')
|
||||
|
||||
CNC_machine_table = fields.Char(string='CNC机床', readonly=True)
|
||||
machine_tool_code = fields.Char(string='机台号', readonly=True)
|
||||
@@ -224,6 +224,7 @@ class DeliveryOfCargoFromStorage(models.TransientModel):
|
||||
_name = 'sf.delivery.of.cargo.from.storage'
|
||||
_description = '出库'
|
||||
|
||||
order = fields.Integer(string='序')
|
||||
functional_tool_code = fields.Char(string='功能刀具编码')
|
||||
functional_tool_name = fields.Char(string='功能刀具名称')
|
||||
functional_tool_type = fields.Char(string='功能刀具类型')
|
||||
@@ -236,4 +237,13 @@ class DeliveryOfCargoFromStorage(models.TransientModel):
|
||||
"""
|
||||
出库
|
||||
:return:
|
||||
"""
|
||||
"""
|
||||
vals = self.env['sf.delivery.of.cargo.from.storage'].search([])
|
||||
if vals:
|
||||
for val in vals:
|
||||
self.env['sf.functional.tool.assembly'].search([
|
||||
('functional_tool_code', '=', val.functional_tool_code),
|
||||
('functional_tool_name', '=', val.functional_tool_name)
|
||||
]).write({
|
||||
'assemble_status': '2'
|
||||
})
|
||||
|
||||
@@ -273,14 +273,19 @@
|
||||
<field name="model">sf.delivery.of.cargo.from.storage</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree>
|
||||
<field name="functional_tool_code" string="编码"/>
|
||||
<field name="functional_tool_name" string="名称"/>
|
||||
<field name="functional_tool_type" string="类型"/>
|
||||
<field name="production_line_name" string="生产线"/>
|
||||
<field name="machine_tool_code" string="机台"/>
|
||||
<field name="order"/>
|
||||
<field name="functional_tool_code"/>
|
||||
<field name="functional_tool_name"/>
|
||||
<field name="functional_tool_type"/>
|
||||
<field name="production_line_name"/>
|
||||
<field name="machine_tool_code"/>
|
||||
<field name="receive_person"/>
|
||||
<field name="receive_time" string="出库时间"/>
|
||||
<field name="receive_time"/>
|
||||
</tree>
|
||||
<footer>
|
||||
<button string="确定" name="stock_removal" type="object" class="btn-primary" />
|
||||
<button string="取消" class="btn-secondary" special="cancel"/>
|
||||
</footer>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user