diff --git a/jikimo_frontend/__manifest__.py b/jikimo_frontend/__manifest__.py index fc3c7549..716bc918 100644 --- a/jikimo_frontend/__manifest__.py +++ b/jikimo_frontend/__manifest__.py @@ -22,7 +22,7 @@ ], 'web.assets_backend': [ 'jikimo_frontend/static/src/fields/custom_many2many_checkboxes/*', - 'jikimo_frontend/static/src/scss/test.scss', + 'jikimo_frontend/static/src/scss/custom_style.scss', ], }, diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.css b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.css index de17fabb..df6cdfb6 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.css +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.css @@ -1,6 +1,41 @@ .zoomed { - position: fixed; + position: fixed !important; top: 50%; left: 50%; - transform: translate(-50%, -50%) scale(20); + transform: translate(-50%, -50%) scale(10); } + +.many2many_flex { + display: flex; +} + +.many2many_flex>div { + margin-right: 15px; + display: flex; + flex-direction: column; + align-items: center; +} + +.many2many_flex>div>:nth-child(2) { + position: relative; +} + +.close { + width: 20px; + height: 20px; + position: absolute; + top: -8.8px; + right: -8.8px; + color: #fff; + background-color: #000; + opacity: 0; + text-align: center; + line-height: 20px; + font-size: 18px; +} + +.img_close { + opacity: 1; + transform: scale(0.1); + cursor: pointer; +} \ No newline at end of file diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js index f3cadea1..3b0799cc 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.js @@ -1,25 +1,36 @@ /** @odoo-module **/ -import { Many2ManyCheckboxesField } from "@web/views/fields/many2many_checkboxes/many2many_checkboxes_field"; -import { registry } from "@web/core/registry"; +import {Many2ManyCheckboxesField} from "@web/views/fields/many2many_checkboxes/many2many_checkboxes_field"; +import {registry} from "@web/core/registry"; export class MyCustomWidget extends Many2ManyCheckboxesField { - // 你可以重写或者添加一些方法和属性 - // 例如,你可以重写setup方法来添加一些事件监听器或者初始化一些变量 - setup() { - super.setup(); // 调用父类的setup方法 - // 你自己的代码 - } - onImageClick(event) { - // 放大图片逻辑 - // 获取图片元素 - const img = event.target; + // 你可以重写或者添加一些方法和属性 + // 例如,你可以重写setup方法来添加一些事件监听器或者初始化一些变量 + setup() { + super.setup(); // 调用父类的setup方法 + // 你自己的代码 + } - // 实现放大图片逻辑 - // 比如使用 CSS 放大 - img.classList.add('zoomed'); - } + onImageClick(event) { + // 放大图片逻辑 + // 获取图片元素 + const img = event.target; + const close = img.nextSibling + + // 实现放大图片逻辑 + // 比如使用 CSS 放大 + img.parentElement.classList.add('zoomed'); + close.classList.add('img_close') + } + + onCloseClick(event) { + const close = event.target; + const img = close.previousSibling + img.parentElement.classList.remove('zoomed') + close.classList.remove('img_close') + } } + MyCustomWidget.template = "sf_plan.MyCustomWidget" // MyCustomWidget.supportedTypes = ['many2many']; diff --git a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml index 91eaff59..dedcfb11 100644 --- a/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml +++ b/jikimo_frontend/static/src/fields/custom_many2many_checkboxes/custom_many2many_checkboxes.xml @@ -2,24 +2,25 @@ -
+
- -
-
+
- + +
×
+
+
diff --git a/sf_base/__manifest__.py b/sf_base/__manifest__.py index 5f4c6906..bcb25c81 100644 --- a/sf_base/__manifest__.py +++ b/sf_base/__manifest__.py @@ -18,7 +18,6 @@ 'views/common_view.xml', 'views/fixture_view.xml', 'views/functional_fixture_view.xml', - 'views/tool_other_features_view.xml', 'views/menu_view.xml', "views/tool_views.xml", "views/tool_menu.xml", diff --git a/sf_base/models/__init__.py b/sf_base/models/__init__.py index 93961162..483787eb 100644 --- a/sf_base/models/__init__.py +++ b/sf_base/models/__init__.py @@ -3,7 +3,6 @@ from . import common from . import tool_base_new from . import fixture from . import functional_fixture -from . import tool_other_features diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index 73661ae8..fefaeb1b 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -24,12 +24,7 @@ access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user, access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1 access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,1 access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,1 -access_sf_suitable_machining_method,sf_suitable_machining_method,model_sf_suitable_machining_method,base.group_user,1,1,1,1 -access_sf_blade_tip_characteristics,sf_blade_tip_characteristics,model_sf_blade_tip_characteristics,base.group_user,1,1,1,1 -access_sf_handle_type,sf_handle_type,model_sf_handle_type,base.group_user,1,1,1,1 -access_sf_cutting_direction,sf_cutting_direction,model_sf_cutting_direction,base.group_user,1,1,1,1 -access_sf_suitable_coolant,sf_suitable_coolant,model_sf_suitable_coolant,base.group_user,1,1,1,1 -access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1 + diff --git a/sf_base/static/src/scss/test.scss b/sf_base/static/src/scss/test.scss index 39c5250f..a54eb808 100644 --- a/sf_base/static/src/scss/test.scss +++ b/sf_base/static/src/scss/test.scss @@ -146,4 +146,19 @@ td.o_required_modifier { display: flex; flex-direction: row-reverse; justify-content: flex-start; +} + +.diameter:before { + content:"Ф"; + display:inline; +} +.diameter{ + display: flex !important; + justify-content: flex-start !important; + align-items: center !important; +} +.o_address_format { + display: flex !important; + justify-content: flex-start !important; + align-items: center !important; } \ No newline at end of file diff --git a/sf_dlm/views/product_template_view.xml b/sf_dlm/views/product_template_view.xml index 9a2f3b4f..19327a82 100644 --- a/sf_dlm/views/product_template_view.xml +++ b/sf_dlm/views/product_template_view.xml @@ -1,47 +1,68 @@ + + product.template.only.form.inherit.sf + product.template + + + + + + + + + + + product.template.form.inherit.sf product.template - + + + + + + + + - + - - - - + - - + - - - +
- - - - - + attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片','刀杆','刀盘'))]}"/> - + - - - - - - - - - +
+
+ + + + + + + + + - - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index be18f685..b7fa686a 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -22,6 +22,7 @@ 'views/mrp_workcenter_views.xml', 'views/mrp_workorder_view.xml', 'views/production_line_view.xml', + 'views/tool_other_features_view.xml', # 'views/tray_view.xml', 'views/model_type_view.xml', # 'views/kanban_change.xml' diff --git a/sf_manufacturing/models/__init__.py b/sf_manufacturing/models/__init__.py index 2d7d2f1e..96accf78 100644 --- a/sf_manufacturing/models/__init__.py +++ b/sf_manufacturing/models/__init__.py @@ -9,6 +9,7 @@ from . import mrp_routing_workcenter from . import stock from . import res_user from . import production_line_base +from . import tool_other_features diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 98e4247a..6f50425f 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -25,7 +25,6 @@ class ResProductMo(models.Model): # if record: # record.categ_type = record.categ_id.type - categ_type = fields.Selection(string='产品的类别', related='categ_id.type', store=True) model_name = fields.Char('模型名称') @@ -63,123 +62,132 @@ class ResProductMo(models.Model): cutting_tool_model_id = fields.Many2one('sf.cutting.tool.model', string='型号', ) - cutting_tool_type_id = fields.Many2one('sf.cutting.tool.type', string='刀具类型', + cutting_tool_type_id = fields.Many2one('sf.cutting.tool.type', string='类型', domain="[('cutting_tool_material_id.name', '=', cutting_tool_type)]") brand_id = fields.Many2one('sf.machine.brand', '品牌') - tool_length = fields.Integer('长度(mm)') - tool_width = fields.Integer('宽度(mm)') - tool_height = fields.Integer('高度(mm)') + tool_length = fields.Float('长度(mm)') + tool_width = fields.Float('宽度(mm)') + tool_height = fields.Float('高度(mm)') tool_thickness = fields.Integer('厚度(mm)') tool_weight = fields.Float('重量(kg)') + tool_hardness = fields.Integer('硬度(hrc)') coating_material = fields.Char('涂层材质') # 整体式刀具特有字段 cutting_tool_total_length = fields.Float('总长度(mm)', digits=(6, 1)) cutting_tool_shank_length = fields.Float('柄部长度(mm)', digits=(6, 1)) cutting_tool_blade_length = fields.Float('刃部长度(mm)', digits=(6, 1)) - cutting_tool_blade_number = fields.Integer('刃数(个)') + cutting_tool_blade_number = fields.Selection( + [('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')], '刃数(个)') # 整体式刀具新增字段 - integral_neck_length = fields.Float('整体式刀具颈部长度(mm)', digits=(6, 1)) - integral_shank_diameter = fields.Float('整体式刀具柄部直径(mm)', digits=(6, 1)) - integral_blade_diameter = fields.Float('整体式刀具刃部直径(mm)', digits=(6, 1)) - integral_neck_diameter = fields.Float('整体式刀具颈部直径(mm)', digits=(6, 1)) - integral_blade_tip_diameter = fields.Float('整体式刀具刀尖直径(mm)', digits=(6, 1)) - integral_blade_tip_taper = fields.Float('整体式刀具刀尖锥度(°)', digits=(6, 1)) - integral_blade_helix_angle = fields.Float('整体式刀具刃部螺旋角(°)', digits=(6, 1)) - integral_blade_type = fields.Char('整体式刀具刃部类型') - integral_coarse_medium_fine = fields.Selection([('粗', '粗'), ('中', '中'), ('精', '精')], '整体式刀具粗/中/精') - integral_hardness = fields.Integer('整体式刀具硬度(HRC)') - integral_run_out_accuracy_max = fields.Float('整体式刀具端跳精度max', digits=(6, 1)) - integral_run_out_accuracy_min = fields.Float('整体式刀具端跳精度min', digits=(6, 1)) + cutting_tool_neck_length = fields.Float('颈部长度(mm)', digits=(6, 1)) + cutting_tool_neck_diameter = fields.Float('颈部直径(mm)', digits=(6, 1)) + cutting_tool_shank_diameter = fields.Float('柄部直径(mm)', digits=(6, 1)) + cutting_tool_blade_tip_diameter = fields.Float('刀尖直径(mm)', digits=(6, 1)) + cutting_tool_blade_tip_taper = fields.Integer('刀尖锥度(°)') + cutting_tool_blade_helix_angle = fields.Integer('刃部螺旋角(°)') + cutting_tool_blade_type = fields.Char('刃部类型') + cutting_tool_coarse_medium_fine = fields.Selection([('粗', '粗'), ('中', '中'), ('精', '精')], '粗/中/精') + cutting_tool_run_out_accuracy_max = fields.Float('端跳精度max', digits=(6, 1)) + cutting_tool_run_out_accuracy_min = fields.Float('端跳精度min', digits=(6, 1)) suitable_machining_method_ids = fields.Many2many('sf.suitable.machining.method', 'rel_suitable_machining_method_product_template', '适合加工方式') blade_tip_characteristics_ids = fields.Many2many('sf.blade.tip.characteristics', 'rel_blade_tip_characteristics_product_template', '刀尖特征') handle_type_ids = fields.Many2many('sf.handle.type', 'rel_handle_type_product_template', '柄部类型') - cutting_direction_ids = fields.Many2many('sf.cutting.direction', 'rel_cutting_direction_product_template', '走刀方向') - suitable_coolant_ids = fields.Many2many('sf.suitable.coolant', 'rel_suitable_coolant_product_template', '适合冷却液') + cutting_direction_ids = fields.Many2many('sf.cutting.direction', 'rel_cutting_direction_product_template', + '走刀方向') + suitable_coolant_ids = fields.Many2many('sf.suitable.coolant', 'rel_suitable_coolant_product_template', + '适合冷却液') - cutting_speed_ids = fields.Many2many('sf.cutting.speed', 'rel_sf_cutting_speed', '切削速度Vc') + # @api.constrains('suitable_machining_method_ids') + # def _check_suitable_machining_method_ids(self): + # for record in self: + # if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("适合加工方式不能为空!") + # + # @api.constrains('blade_tip_characteristics_ids') + # def _check_blade_tip_characteristics_ids(self): + # for record in self: + # if len(record.blade_tip_characteristics_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刀尖特征不能为空!") + # if len(record.blade_tip_characteristics_ids) > 1 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刀尖特征只能单选!") + # + # @api.constrains('handle_type_ids') + # def _check_handle_type_ids(self): + # for record in self: + # if len(record.handle_type_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部类型不能为空!") + # if len(record.handle_type_ids) > 1 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部类型只能单选!") + # + # @api.constrains('cutting_direction_ids') + # def _check_cutting_direction_ids(self): + # for record in self: + # if len(record.cutting_direction_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("走刀方向不能为空!") + # + # @api.constrains('suitable_coolant_ids') + # def _check_suitable_coolant_ids(self): + # for record in self: + # if not record.suitable_coolant_ids and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("适合冷却液不能为空!") + # + # @api.constrains('cutting_tool_total_length') + # def _check_cutting_tool_total_length(self): + # if self.cutting_tool_total_length <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("总长度不能为0") + # + # @api.constrains('cutting_tool_shank_length') + # def _check_cutting_tool_shank_length(self): + # if self.cutting_tool_shank_length <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部长度不能为0") + # + # @api.constrains('cutting_tool_blade_length') + # def _check_cutting_tool_blade_length(self): + # if self.cutting_tool_blade_length <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刃部长度不能为0") + # + # @api.constrains('cutting_tool_blade_number') + # def _check_cutting_tool_blade_number(self): + # if self.cutting_tool_blade_number <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刃数不能为0") + # + # @api.constrains('integral_shank_diameter') + # def _check_integral_shank_diameter(self): + # if self.integral_shank_diameter <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("柄部直径不能为0") + # + # @api.constrains('integral_blade_diameter') + # def _check_integral_blade_diameter(self): + # if self.integral_blade_diameter <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("刃部直径不能为0") + # + # @api.constrains('integral_run_out_accuracy_min') + # def _check_integral_blade_diameter(self): + # if self.integral_run_out_accuracy_min <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("端跳精度最小(min)不能为0") - @api.constrains('suitable_machining_method_ids') - def _check_suitable_machining_method_ids(self): - for record in self: - if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("适合加工方式不能为空!") + cutting_speed_ids = fields.One2many('sf.cutting.speed', 'product_template_id', string='切削速度Vc') + feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'product_template_id', string='每齿走刀量fz') - @api.constrains('blade_tip_characteristics_ids') - def _check_blade_tip_characteristics_ids(self): - for record in self: - if len(record.blade_tip_characteristics_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刀尖特征不能为空!") - if len(record.blade_tip_characteristics_ids) > 1 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刀尖特征只能单选!") + # @api.constrains('suitable_machining_method_ids') + # def _check_suitable_machining_method_ids(self): + # for record in self: + # if len(record.suitable_machining_method_ids) == 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("适合加工方式不能为空!") - @api.constrains('handle_type_ids') - def _check_handle_type_ids(self): - for record in self: - if len(record.handle_type_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部类型不能为空!") - if len(record.handle_type_ids) > 1 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部类型只能单选!") - - @api.constrains('cutting_direction_ids') - def _check_cutting_direction_ids(self): - for record in self: - if len(record.cutting_direction_ids) == 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("走刀方向不能为空!") - - @api.constrains('suitable_coolant_ids') - def _check_suitable_coolant_ids(self): - for record in self: - if not record.suitable_coolant_ids and self.cutting_tool_type == '整体式刀具': - raise ValidationError("适合冷却液不能为空!") - - @api.constrains('cutting_tool_total_length') - def _check_cutting_tool_total_length(self): - if self.cutting_tool_total_length <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("总长度不能为0") - - @api.constrains('cutting_tool_shank_length') - def _check_cutting_tool_shank_length(self): - if self.cutting_tool_shank_length <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部长度不能为0") - - @api.constrains('cutting_tool_blade_length') - def _check_cutting_tool_blade_length(self): - if self.cutting_tool_blade_length <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刃部长度不能为0") - - @api.constrains('cutting_tool_blade_number') - def _check_cutting_tool_blade_number(self): - if self.cutting_tool_blade_number <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刃数不能为0") - - @api.constrains('integral_shank_diameter') - def _check_integral_shank_diameter(self): - if self.integral_shank_diameter <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("柄部直径不能为0") - - @api.constrains('integral_blade_diameter') - def _check_integral_blade_diameter(self): - if self.integral_blade_diameter <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("刃部直径不能为0") - - @api.constrains('integral_run_out_accuracy_min') - def _check_integral_blade_diameter(self): - if self.integral_run_out_accuracy_min <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("端跳精度最小(min)不能为0") - - @api.constrains('integral_run_out_accuracy_max') - def _check_integral_run_out_accuracy_max(self): - if self.integral_run_out_accuracy_max <= 0 and self.cutting_tool_type == '整体式刀具': - raise ValidationError("端跳精度最大(max)不能为0") + # @api.constrains('integral_run_out_accuracy_max') + # def _check_integral_run_out_accuracy_max(self): + # if self.integral_run_out_accuracy_max <= 0 and self.cutting_tool_type == '整体式刀具': + # raise ValidationError("端跳精度最大(max)不能为0") cutting_tool_diameter = fields.Float('直径(mm)') - cutting_tool_front_angle = fields.Float('前角(°)') - cutting_tool_rear_angle = fields.Float('后角(°)') - cutting_tool_main_included_angle = fields.Float('主偏角(°)') + cutting_tool_front_angle = fields.Integer('前角(°)') + cutting_tool_rear_angle = fields.Integer('后角(°)') + cutting_tool_main_included_angle = fields.Integer('主偏角(°)') # cutting_tool_material_model_id = fields.Many2one('sf.materials.model', '材料型号') cutting_tool_nut = fields.Float('配对螺母(mm)') # 适用夹头型号可以多选 @@ -191,8 +199,8 @@ class ResProductMo(models.Model): domain="[('cutting_tool_type', '=', '夹头')]", string='适用夹头型号') # 刀片参数 - cutting_tool_top_angle = fields.Float('顶角(°)') - cutting_tool_jump_accuracy = fields.Float('径跳精度(um)') + cutting_tool_top_angle = fields.Integer('顶角(°)') + cutting_tool_jump_accuracy = fields.Float('径跳精度(mm)') cutting_tool_working_hardness = fields.Char('加工硬度(hrc)') cutting_tool_cutter_bar_ids = fields.Many2many( 'sf.cutting.tool.model', @@ -211,7 +219,7 @@ class ResProductMo(models.Model): string='适用刀盘型号' # 使用空列表作为默认值 ) # 刀杆/参数 - cutting_tool_blade_diameter = fields.Float('刃径(mm)') + cutting_tool_blade_diameter = fields.Float('刃径/刃部直径(mm)') cutting_tool_blade_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_pad_blade_rel', @@ -221,16 +229,41 @@ class ResProductMo(models.Model): string='适用刀片型号' # 使用空列表作为默认值 ) cutting_tool_wrench = fields.Float('配对扳手(mm)') - cutting_tool_screw = fields.Float('配备螺丝(mm)') + # cutting_tool_screw = fields.Float('配备螺丝(mm)') cutting_tool_accuracy_level = fields.Char('精度等级') # 刀柄参数 + cutting_tool_head_diameter = fields.Float('头部直径') cutting_tool_diameter_max = fields.Float('最大直径(mm)') cutting_tool_clamping_diameter = fields.Float('夹持直径(mm)') - cutting_tool_flange_length = fields.Float('法兰柄长度(mm)') + cutting_tool_clamping_length = fields.Float('夹持长度(mm)') + cutting_tool_clamping_tolerance = fields.Float('夹持公差(mm)') + cutting_tool_clamping_diameter_max = fields.Float('最大夹持直径') + cutting_tool_clamping_diameter_min = fields.Float('最小夹持直径') + cutting_tool_flange_length = fields.Float('法兰柄长(mm)') cutting_tool_flange_diameter = fields.Float('法兰直径(mm)') + cutting_tool_is_rough_finish = fields.Boolean('可粗加工', default=False) + cutting_tool_is_finish = fields.Boolean('可精加工', default=False) + cutting_tool_is_drill_hole = fields.Boolean('可钻孔', default=False) + cutting_tool_is_safety_lock = fields.Boolean('安全锁', default=False) + cutting_tool_is_high_speed_cutting = fields.Boolean('可高速切削', default=False) + cutting_tool_dynamic_balance_class = fields.Char('动平衡等级') + cutting_tool_change_time = fields.Integer('换刀时间(s)') + cutting_tool_clamping_way = fields.Char('夹持方式') + cutting_tool_standard_speed = fields.Integer('标准转速(n/min)') + cutting_tool_speed_max = fields.Integer('最大转速(n/min)') + cutting_tool_cooling_type = fields.Char('冷却类型') + cutting_tool_body_accuracy = fields.Float('本体精度(mm)') + apply_lock_nut_model = fields.Char('适用锁紧螺母型号') + apply_lock_wrench_model = fields.Char('适用锁紧扳手型号') + cutting_tool_detection_accuracy_max = fields.Float('最大检测精度(mm)') + cutting_tool_detection_accuracy_min = fields.Float('最小检测精度(mm)') # 夹头参数 + cutting_tool_taper = fields.Integer('锥度(°)') cutting_tool_outer_diameter = fields.Float('外径(mm)') cutting_tool_inner_diameter = fields.Float('内径(mm)') + cooling_suit_type_ids = fields.Char('适用冷却套型号') + # cooling_suit_type_ids = fields.Many2many('冷却类型') + cutting_tool_er_size_model = fields.Char('ER尺寸型号') cutting_tool_handle_ids = fields.Many2many( 'sf.cutting.tool.model', relation='product_cutting_tool_model_chuck_handle_rel', @@ -409,83 +442,119 @@ class ResProductMo(models.Model): item.fixture_apply_machine_tool_type_ids = self._get_ids( item.fixture_model_id.apply_machine_tool_type_ids) - @api.onchange('cutting_tool_model_id') - def _onchange_cutting_tool_model_id(self): - for item in self: - if self.cutting_tool_type is not False: - item.brand_id = item.cutting_tool_model_id.brand_id.id - item.cutting_tool_type_id = item.cutting_tool_model_id.cutting_tool_type_id.id - item.tool_length = item.cutting_tool_model_id.tool_length - item.tool_width = item.cutting_tool_model_id.tool_width - item.tool_height = item.cutting_tool_model_id.tool_height - item.tool_thickness = item.cutting_tool_model_id.tool_thickness - item.tool_weight = item.cutting_tool_model_id.tool_weight - item.coating_material = item.cutting_tool_model_id.coating_material - item.cutting_tool_total_length = item.cutting_tool_model_id.total_length - item.cutting_tool_shank_length = item.cutting_tool_model_id.shank_length - item.cutting_tool_diameter = item.cutting_tool_model_id.diameter - item.cutting_tool_blade_number = item.cutting_tool_model_id.blade_number - item.cutting_tool_front_angle = item.cutting_tool_model_id.front_angle - item.cutting_tool_rear_angle = item.cutting_tool_model_id.rear_angle - item.cutting_tool_main_included_angle = item.cutting_tool_model_id.main_included_angle - item.materials_type_id = item.cutting_tool_model_id.material_model_id.id - item.cutting_tool_nut = item.cutting_tool_model_id.nut - item.cutting_tool_top_angle = item.cutting_tool_model_id.top_angle - item.cutting_tool_jump_accuracy = item.cutting_tool_model_id.jump_accuracy - item.cutting_tool_working_hardness = item.cutting_tool_model_id.working_hardness - item.cutting_tool_blade_diameter = item.cutting_tool_model_id.blade_diameter - item.cutting_tool_wrench = item.cutting_tool_model_id.wrench - item.cutting_tool_screw = item.cutting_tool_model_id.screw - item.cutting_tool_accuracy_level = item.cutting_tool_model_id.accuracy_level - item.cutting_tool_diameter_max = item.cutting_tool_model_id.diameter_max - item.cutting_tool_clamping_diameter = item.cutting_tool_model_id.clamping_diameter - item.cutting_tool_flange_length = item.cutting_tool_model_id.flange_length - item.cutting_tool_flange_diameter = item.cutting_tool_model_id.flange_diameter - item.cutting_tool_outer_diameter = item.cutting_tool_model_id.outer_diameter - item.cutting_tool_inner_diameter = item.cutting_tool_model_id.inner_diameter - item.cutting_tool_chuck_ids = self._get_ids(item.cutting_tool_model_id.chuck_ids) - item.cutting_tool_cutter_bar_ids = self._get_ids(item.cutting_tool_model_id.cutter_bar_ids) - item.cutting_tool_cutter_pad_ids = self._get_ids(item.cutting_tool_model_id.cutter_pad_ids) - item.cutting_tool_blade_ids = self._get_ids(item.cutting_tool_model_id.blade_ids) - item.cutting_tool_handle_ids = self._get_ids(item.cutting_tool_model_id.handle_ids) - else: - item.brand_id = False - item.cutting_tool_type_id = False - item.brand_id = False - item.tool_length = False - item.tool_width = False - item.tool_height = False - item.tool_thickness = False - item.tool_weight = False - item.coating_material = False - item.cutting_tool_total_length = False - item.cutting_tool_shank_length = False - item.cutting_tool_blade_length = False - item.cutting_tool_diameter = False - item.cutting_tool_blade_number = False - item.cutting_tool_front_angle = False - item.cutting_tool_rear_angle = False - item.cutting_tool_main_included_angle = False - item.materials_type_id = False - item.cutting_tool_nut = False - item.cutting_tool_top_angle = False - item.cutting_tool_jump_accuracy = False - item.cutting_tool_working_hardness = False - item.cutting_tool_blade_diameter = False - item.cutting_tool_wrench = False - item.cutting_tool_screw = False - item.cutting_tool_accuracy_level = False - item.cutting_tool_diameter_max = False - item.cutting_tool_clamping_diameter = False - item.cutting_tool_flange_length = False - item.cutting_tool_flange_diameter = False - item.cutting_tool_outer_diameter = False - item.cutting_tool_inner_diameter = False - item.cutting_tool_chuck_ids = False - item.cutting_tool_cutter_bar_ids = False - item.cutting_tool_cutter_pad_ids = False - item.cutting_tool_blade_ids = False - item.cutting_tool_handle_ids = False + # @api.onchange('cutting_tool_model_id') + # def _onchange_cutting_tool_model_id(self): + # for item in self: + # if self.cutting_tool_type is not False: + # item.brand_id = item.cutting_tool_model_id.brand_id.id + # item.cutting_tool_type_id = item.cutting_tool_model_id.cutting_tool_type_id.id + # item.tool_length = item.cutting_tool_model_id.tool_length + # item.tool_width = item.cutting_tool_model_id.tool_width + # item.tool_height = item.cutting_tool_model_id.tool_height + # item.tool_thickness = item.cutting_tool_model_id.tool_thickness + # item.tool_weight = item.cutting_tool_model_id.tool_weight + # item.coating_material = item.cutting_tool_model_id.coating_material + # item.cutting_tool_total_length = item.cutting_tool_model_id.total_length + # item.cutting_tool_shank_length = item.cutting_tool_model_id.shank_length + # item.cutting_tool_neck_length = item.cutting_tool_model_id.cutting_tool_neck_length + # item.cutting_tool_shank_diameter = item.cutting_tool_model_id.cutting_tool_shank_diameter + # item.cutting_tool_blade_diameter = item.cutting_tool_model_id.cutting_tool_blade_diameter + # item.cutting_tool_neck_diameter = item.cutting_tool_model_id.cutting_tool_neck_diameter + # item.cutting_tool_blade_tip_diameter = item.cutting_tool_model_id.cutting_tool_blade_tip_diameter + # item.cutting_tool_blade_tip_taper = item.cutting_tool_model_id.cutting_tool_blade_tip_taper + # item.cutting_tool_blade_helix_angle = item.cutting_tool_model_id.cutting_tool_blade_helix_angle + # item.cutting_tool_blade_type = item.cutting_tool_model_id.cutting_tool_blade_type + # item.cutting_tool_coarse_medium_fine = item.cutting_tool_model_id.cutting_tool_coarse_medium_fine + # item.tool_hardness = item.cutting_tool_model_id.tool_hardness + # item.cutting_tool_run_out_accuracy_max = item.cutting_tool_model_id.cutting_tool_run_out_accuracy_max + # item.cutting_tool_run_out_accuracy_min = item.cutting_tool_model_id.cutting_tool_run_out_accuracy_min + # item.suitable_machining_method_ids = self._get_ids( + # item.cutting_tool_model_id.suitable_machining_method_ids) + # item.blade_tip_characteristics_ids = self._get_ids( + # item.cutting_tool_model_id.blade_tip_characteristics_ids) + # item.handle_type_ids = self._get_ids(item.cutting_tool_model_id.handle_type_ids) + # item.cutting_direction_ids = self._get_ids(item.cutting_tool_model_id.cutting_direction_ids) + # item.suitable_coolant_ids = self._get_ids(item.cutting_tool_model_id.suitable_coolant_ids) + # item.cutting_tool_diameter = item.cutting_tool_model_id.diameter + # item.cutting_tool_blade_number = item.cutting_tool_model_id.blade_number + # item.cutting_tool_front_angle = item.cutting_tool_model_id.front_angle + # item.cutting_tool_rear_angle = item.cutting_tool_model_id.rear_angle + # item.cutting_tool_main_included_angle = item.cutting_tool_model_id.main_included_angle + # item.materials_type_id = item.cutting_tool_model_id.material_model_id.id + # item.cutting_tool_nut = item.cutting_tool_model_id.nut + # item.cutting_tool_top_angle = item.cutting_tool_model_id.top_angle + # item.cutting_tool_jump_accuracy = item.cutting_tool_model_id.jump_accuracy + # item.cutting_tool_working_hardness = item.cutting_tool_model_id.working_hardness + # item.cutting_tool_blade_diameter = item.cutting_tool_model_id.blade_diameter + # item.cutting_tool_wrench = item.cutting_tool_model_id.wrench + # # item.cutting_tool_screw = item.cutting_tool_model_id.screw + # item.cutting_tool_accuracy_level = item.cutting_tool_model_id.accuracy_level + # item.cutting_tool_diameter_max = item.cutting_tool_model_id.diameter_max + # item.cutting_tool_clamping_diameter = item.cutting_tool_model_id.clamping_diameter + # item.cutting_tool_flange_length = item.cutting_tool_model_id.flange_length + # item.cutting_tool_flange_diameter = item.cutting_tool_model_id.flange_diameter + # item.cutting_tool_outer_diameter = item.cutting_tool_model_id.outer_diameter + # item.cutting_tool_inner_diameter = item.cutting_tool_model_id.inner_diameter + # item.cutting_tool_chuck_ids = self._get_ids(item.cutting_tool_model_id.chuck_ids) + # item.cutting_tool_cutter_bar_ids = self._get_ids(item.cutting_tool_model_id.cutter_bar_ids) + # item.cutting_tool_cutter_pad_ids = self._get_ids(item.cutting_tool_model_id.cutter_pad_ids) + # item.cutting_tool_blade_ids = self._get_ids(item.cutting_tool_model_id.blade_ids) + # item.cutting_tool_handle_ids = self._get_ids(item.cutting_tool_model_id.handle_ids) + # else: + # item.brand_id = False + # item.cutting_tool_type_id = False + # item.brand_id = False + # item.tool_length = False + # item.tool_width = False + # item.tool_height = False + # item.tool_thickness = False + # item.tool_weight = False + # item.coating_material = False + # item.cutting_tool_total_length = False + # item.cutting_tool_shank_length = False + # item.cutting_tool_blade_length = False + # item.cutting_tool_neck_length = False + # item.cutting_tool_shank_diameter = False + # item.cutting_tool_blade_diameter = False + # item.cutting_tool_neck_diameter = False + # item.cutting_tool_blade_tip_diameter = False + # item.cutting_tool_blade_tip_taper = False + # item.cutting_tool_blade_helix_angle = False + # item.cutting_tool_blade_type = False + # item.cutting_tool_coarse_medium_fine = False + # item.tool_hardness = False + # item.cutting_tool_run_out_accuracy_max = False + # item.cutting_tool_run_out_accuracy_min = False + # item.suitable_machining_method_ids = False + # item.blade_tip_characteristics_ids = False + # item.handle_type_ids = False + # item.cutting_direction_ids = False + # item.suitable_coolant_ids = False + # item.cutting_tool_diameter = False + # item.cutting_tool_blade_number = False + # item.cutting_tool_front_angle = False + # item.cutting_tool_rear_angle = False + # item.cutting_tool_main_included_angle = False + # item.materials_type_id = False + # item.cutting_tool_nut = False + # item.cutting_tool_top_angle = False + # item.cutting_tool_jump_accuracy = False + # item.cutting_tool_working_hardness = False + # item.cutting_tool_blade_diameter = False + # item.cutting_tool_wrench = False + # # item.cutting_tool_screw = False + # item.cutting_tool_accuracy_level = False + # item.cutting_tool_diameter_max = False + # item.cutting_tool_clamping_diameter = False + # item.cutting_tool_flange_length = False + # item.cutting_tool_flange_diameter = False + # item.cutting_tool_outer_diameter = False + # item.cutting_tool_inner_diameter = False + # item.cutting_tool_chuck_ids = False + # item.cutting_tool_cutter_bar_ids = False + # item.cutting_tool_cutter_pad_ids = False + # item.cutting_tool_blade_ids = False + # item.cutting_tool_handle_ids = False 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') @@ -693,8 +762,7 @@ class ResMrpBomMo(models.Model): } return self.env['mrp.bom.line'].create(vals) - # 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建bom - + # 业务平台分配工厂后在智能工厂先创建销售订单再创建该产品后再次进行创建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, @@ -711,16 +779,18 @@ class ResMrpBomMo(models.Model): # 坯料BOM组件:选取当前坯料原材料, # 然后根据当前的坯料的体积得出需要的原材料重量(立方米m³) *材料密度 * 1000 = 所需原材料重量KG(公斤) # 坯料所需原材料公式:当前的坯料的体积(立方米m³) *材料密度 * 1000 = 所需原材料重量KG(公斤) - def bom_create_line(self, embryo): # 选取当前坯料原材料 raw_bom_line = self.get_raw_bom(embryo) if raw_bom_line: + qty = 1 + if round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000) > 1: + qty = round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000) bom_line = self.env['mrp.bom.line'].create({ 'bom_id': self.id, 'product_id': raw_bom_line.id, 'product_tmpl_id': raw_bom_line.product_tmpl_id.id, - 'product_qty': round(embryo.volume * raw_bom_line.materials_type_id.density / 1000000), + 'product_qty': qty, 'product_uom_id': raw_bom_line.uom_id.id, }) return bom_line @@ -755,8 +825,7 @@ class ResMrpBomMo(models.Model): else: return - # 查bom的原材料 - + # 查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)]) diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 68e45759..fd014941 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -197,21 +197,19 @@ class StockRule(models.Model): for workorder in production.workorder_ids: workorder_duration += workorder.duration_expected - sale_order = self.env['sale.order'].sudo().search([('name', '=', production.origin)]) if sale_order: bb = sale_order.deadline_of_delivery - productions = self.env['sf.production.plan'].with_user(SUPERUSER_ID).sudo().with_company(company_id).\ + productions = self.env['sf.production.plan'].with_user(SUPERUSER_ID).sudo().with_company(company_id). \ create({ - 'name': production.name, - 'production_id': production.id, - 'date_planned_start': production.date_planned_start, - 'origin': production.origin, - 'product_qty': production.product_qty, - 'product_id': production.product_id.id, - 'state': 'draft', - }) - + 'name': production.name, + 'production_id': production.id, + 'date_planned_start': production.date_planned_start, + 'origin': production.origin, + 'product_qty': production.product_qty, + 'product_id': production.product_id.id, + 'state': 'draft', + }) return True @@ -450,6 +448,7 @@ class ReStockMove(models.Model): 'tool_height': item.product_id.tool_height, 'tool_thickness': item.product_id.tool_thickness, 'tool_weight': item.product_id.tool_weight, + 'tool_hardness': item.product_id.tool_hardness, 'coating_material': item.product_id.coating_material, 'amount': int(item.quantity_done), # 'model_file': '' if not item.product_id.fixture_model_file else base64.b64encode( @@ -458,8 +457,19 @@ class ReStockMove(models.Model): 'total_length': item.product_id.cutting_tool_total_length, 'shank_length': item.product_id.cutting_tool_shank_length, 'blade_length': item.product_id.cutting_tool_blade_length, + 'neck_length': item.product_id.cutting_tool_neck_length, + 'neck_diameter': item.product_id.cutting_tool_neck_diameter, + 'shank_diameter': item.product_id.cutting_tool_shank_diameter, + 'blade_tip_diameter': item.product_id.cutting_tool_blade_tip_diameter, + 'blade_tip_taper': item.product_id.cutting_tool_blade_tip_taper, + 'blade_helix_angle': item.product_id.cutting_tool_blade_helix_angle, + 'blade_type': item.product_id.cutting_tool_blade_type, + 'coarse_medium_fine': '' if item.product_id.cutting_tool_coarse_medium_fine is False else item.product_id.cutting_tool_coarse_medium_fine, + 'run_out_accuracy_max': item.product_id.cutting_tool_run_out_accuracy_max, + 'run_out_accuracy_min': item.product_id.cutting_tool_run_out_accuracy_min, + 'head_diameter': item.product_id.cutting_tool_head_diameter, 'diameter': item.product_id.cutting_tool_diameter, - 'blade_number': item.product_id.cutting_tool_blade_number, + 'blade_number': '' if item.product_id.cutting_tool_blade_number is False else item.product_id.cutting_tool_blade_number, 'front_angle': item.product_id.cutting_tool_front_angle, 'rear_angle': item.product_id.cutting_tool_rear_angle, 'main_included_angle': item.product_id.cutting_tool_main_included_angle, @@ -474,14 +484,36 @@ class ReStockMove(models.Model): 'working_hardness': item.product_id.cutting_tool_working_hardness, 'blade_diameter': item.product_id.cutting_tool_blade_diameter, 'wrench': item.product_id.cutting_tool_wrench, - 'screw': item.product_id.cutting_tool_screw, 'accuracy_level': item.product_id.cutting_tool_accuracy_level, + 'clamping_way': item.product_id.cutting_tool_clamping_way, + 'clamping_length': item.product_id.cutting_tool_clamping_length, + 'clamping_tolerance': item.product_id.cutting_tool_clamping_tolerance, 'diameter_max': item.product_id.cutting_tool_diameter_max, - 'clamping_diameter': item.product_id.cutting_tool_clamping_diameter, + 'clamping_diameter_min': item.product_id.cutting_tool_clamping_diameter_min, + 'clamping_diameter_max': item.product_id.cutting_tool_clamping_diameter_max, + 'detection_accuracy_max': item.product_id.cutting_tool_detection_accuracy_max, + 'detection_accuracy_min': item.product_id.cutting_tool_detection_accuracy_min, + 'is_rough_finish': item.product_id.cutting_tool_is_rough_finish, + 'is_finish': item.product_id.cutting_tool_is_finish, + 'is_drill_hole': item.product_id.cutting_tool_is_drill_hole, + 'is_safety_lock': item.product_id.cutting_tool_is_safety_lock, + 'is_high_speed_cutting': item.product_id.cutting_tool_is_high_speed_cutting, + 'dynamic_balance_class': item.product_id.cutting_tool_dynamic_balance_class, + 'change_time': item.product_id.cutting_tool_change_time, + 'standard_speed': item.product_id.cutting_tool_standard_speed, + 'speed_max': item.product_id.cutting_tool_speed_max, + 'cooling_type': item.product_id.cutting_tool_cooling_type, + 'body_accuracy': item.product_id.cutting_tool_body_accuracy, + 'apply_lock_nut_model': item.product_id.apply_lock_nut_model, + 'apply_lock_wrench_model': item.product_id.apply_lock_wrench_model, + 'tool_taper': item.product_id.cutting_tool_taper, 'flange_length': item.product_id.cutting_tool_flange_length, 'flange_diameter': item.product_id.cutting_tool_flange_diameter, 'outer_diameter': item.product_id.cutting_tool_outer_diameter, 'inner_diameter': item.product_id.cutting_tool_inner_diameter, + 'cooling_suit_type_ids': item.product_id.cooling_suit_type_ids, + 'er_size_model': item.product_id.cutting_tool_er_size_model, + 'image': '' if not item.product_id.image_1920 else base64.b64encode(item.product_id.image_1920).decode('utf-8'), } try: if item.product_id.industry_code: @@ -514,5 +546,3 @@ class ReStockQuant(models.Model): elif self.product_id.categ_type == '刀具': stock._register_cutting_tool() return True - - diff --git a/sf_base/models/tool_other_features.py b/sf_manufacturing/models/tool_other_features.py similarity index 65% rename from sf_base/models/tool_other_features.py rename to sf_manufacturing/models/tool_other_features.py index 129b0199..7e8f04b7 100644 --- a/sf_base/models/tool_other_features.py +++ b/sf_manufacturing/models/tool_other_features.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import fields, models, api class SuitableMachiningMethod(models.Model): @@ -56,12 +56,14 @@ class CuttingSpeed(models.Model): # # order = fields.Char('序', default=_get_order, readonly=True) + product_template_id = fields.Many2one('product.template', string='产品') + execution_standard_id = fields.Char('执行标准') material_code = fields.Char('材料代号') material_name = fields.Char('材料名称') material_grade = fields.Char('材料牌号') - tensile_strength = fields.Char('拉伸强度 (N/mm²)') - hardness = fields.Char('硬度(HRC)') + tensile_strength = fields.Float('拉伸强度 (N/mm²)') + hardness = fields.Float('硬度(HRC)') cutting_speed_n1 = fields.Char('径向切宽 ae=100%D1 ap=1*D1 切削速度Vc') cutting_speed_n2 = fields.Char('径向切宽 ae=50%D1 ap=1.5*D1 切削速度Vc') @@ -70,4 +72,23 @@ class CuttingSpeed(models.Model): cutting_speed_n5 = fields.Char('径向切宽 ae=5%D1 ap=L1max 切削速度Vc') rough_machining = fields.Char('粗加工 Vc(m/min)') precision_machining = fields.Char('精加工 Vc(m/min)') - application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用') \ No newline at end of file + application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用') + + +class FeedPerTooth(models.Model): + _name = 'sf.feed.per.tooth' + _description = '每齿走刀量fz' + + product_template_id = fields.Many2one('product.template', string='产品') + + cutting_speed = fields.Char('径向切宽 ae(mm)') + machining_method = fields.Selection([('直铣', '直铣'), ('坡铣', '坡铣')], string='加工方式') + materials_type_id = fields.Many2one('sf.materials.model', string='材料型号') + blade_diameter = fields.Float('刃部直径D1(mm)', readonly=True, compute='_compute_product_template_id') + feed_per_tooth = fields.Char('每齿走刀量 (mm/z)') + unit = fields.Char('单位', default='fz') + + @api.depends('product_template_id') + def _compute_product_template_id(self): + if self.product_template_id is not None: + self.blade_diameter = self.product_template_id.cutting_tool_blade_diameter diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index e0a78bb6..76812adb 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -7,6 +7,12 @@ access_sf_surface_technics_model_type_routing_sort,sf_surface_technics_model_typ access_sf_production_line,sf.production.line,model_sf_production_line,base.group_user,1,1,1,1 - +access_sf_suitable_machining_method,sf_suitable_machining_method,model_sf_suitable_machining_method,base.group_user,1,1,1,1 +access_sf_blade_tip_characteristics,sf_blade_tip_characteristics,model_sf_blade_tip_characteristics,base.group_user,1,1,1,1 +access_sf_handle_type,sf_handle_type,model_sf_handle_type,base.group_user,1,1,1,1 +access_sf_cutting_direction,sf_cutting_direction,model_sf_cutting_direction,base.group_user,1,1,1,1 +access_sf_suitable_coolant,sf_suitable_coolant,model_sf_suitable_coolant,base.group_user,1,1,1,1 +access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1 +access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1 diff --git a/sf_base/views/tool_other_features_view.xml b/sf_manufacturing/views/tool_other_features_view.xml similarity index 81% rename from sf_base/views/tool_other_features_view.xml rename to sf_manufacturing/views/tool_other_features_view.xml index df614171..3af6d0e8 100644 --- a/sf_base/views/tool_other_features_view.xml +++ b/sf_manufacturing/views/tool_other_features_view.xml @@ -105,7 +105,7 @@ 切削速度Vc sf.cutting.speed - + @@ -131,4 +131,28 @@ sf.cutting.speed tree + + + + + 每齿走刀量fz + sf.feed.per.tooth + + + + + + + + + + + + + + 每齿走刀量fz + ir.actions.act_window + sf.feed.per.tooth + tree + \ No newline at end of file diff --git a/sf_plan_management/models/calendar_base.py b/sf_plan_management/models/calendar_base.py index 6ac7772c..95fb6342 100644 --- a/sf_plan_management/models/calendar_base.py +++ b/sf_plan_management/models/calendar_base.py @@ -135,8 +135,10 @@ class WorkLogSetting(models.Model): # 获取本年第一天和最后一天 start_date = datetime.now().replace(month=1, day=1).date() end_date = datetime.now().replace(month=12, day=31).date() + print(self.day_off_ids.mapped('name')) # 休息日列表 rest_days = self.chinese_weekdays_to_english(self.day_off_ids.mapped('name')) + print(rest_days) for single_date in self.daterange(start_date, end_date): is_workday = self.chinese_weekday_to_english(single_date.strftime("%A")) logging.info(f"每天的星期:{is_workday}") @@ -155,13 +157,13 @@ class WorkLogSetting(models.Model): :return: """ weekdays = { - '星期一': 'Monday', - '星期二': 'Tuesday', - '星期三': 'Wednesday', - '星期四': 'Thursday', - '星期五': 'Friday', - '星期六': 'Saturday', - '星期日': 'Sunday' + '星期一': 'Monday', 'Monday': 'Monday', + '星期二': 'Tuesday', 'Tuesday': 'Tuesday', + '星期三': 'Wednesday', 'Wednesday': 'Wednesday', + '星期四': 'Thursday', 'Thursday': 'Thursday', + '星期五': 'Friday', 'Friday': 'Friday', + '星期六': 'Saturday', 'Saturday': 'Saturday', + '星期日': 'Sunday', 'Sunday': 'Sunday', } english_weekdays = [] for chinese_weekday in chinese_weekdays: @@ -177,13 +179,13 @@ class WorkLogSetting(models.Model): :return: """ weekdays = { - '星期一': 'Monday', - '星期二': 'Tuesday', - '星期三': 'Wednesday', - '星期四': 'Thursday', - '星期五': 'Friday', - '星期六': 'Saturday', - '星期日': 'Sunday' + '星期一': 'Monday', 'Monday': 'Monday', + '星期二': 'Tuesday', 'Tuesday': 'Tuesday', + '星期三': 'Wednesday', 'Wednesday': 'Wednesday', + '星期四': 'Thursday', 'Thursday': 'Thursday', + '星期五': 'Friday', 'Friday': 'Friday', + '星期六': 'Saturday', 'Saturday': 'Saturday', + '星期日': 'Sunday', 'Sunday': 'Sunday', } weekday = weekdays.get(chinese_weekday) if weekday: diff --git a/sf_sale/models/auto_quatotion_common.py b/sf_sale/models/auto_quatotion_common.py index 09ea3f0f..d1bdb65a 100644 --- a/sf_sale/models/auto_quatotion_common.py +++ b/sf_sale/models/auto_quatotion_common.py @@ -2,7 +2,7 @@ import logging from odoo.modules import get_resource_path from odoo import fields, models, api -from quatotion import readSql, feature_recognize, auto_quatotion +# from quatotion import readSql, feature_recognize, auto_quatotion __author__ = 'jinling.yang' _logger = logging.getLogger(__name__) @@ -24,14 +24,14 @@ class AutoQuatotion(models.Model): def get_process_time_db_path(self): return get_resource_path('sf_sale', 'models', 'process_time.db') - def get_auto_quatotion(self, stp_url, feature_full_path, process_time_db_path, model_code): - ''' - 通过打包好的.so库, - 以调用autoQuatotion库中Quatotion类, - 初始化后调用类的analyseShape方法对模型文件进行价格预测 - ''' - # 初始化自动报价类(输入特征数据库和加工时间数据库) - reader = auto_quatotion.Quatotion(feature_full_path, process_time_db_path) - # 获取价格、加工时间、尺寸、XYZ、翻面次数 - feature_info = reader.analyseShape(stp_url, InfoJson={}) - return feature_info + # def get_auto_quatotion(self, stp_url, feature_full_path, process_time_db_path, model_code): + # ''' + # 通过打包好的.so库, + # 以调用autoQuatotion库中Quatotion类, + # 初始化后调用类的analyseShape方法对模型文件进行价格预测 + # ''' + # # 初始化自动报价类(输入特征数据库和加工时间数据库) + # reader = auto_quatotion.Quatotion(feature_full_path, process_time_db_path) + # # 获取价格、加工时间、尺寸、XYZ、翻面次数 + # feature_info = reader.analyseShape(stp_url, InfoJson={}) + # return feature_info diff --git a/sf_tool_management/models/tool_material_search.py b/sf_tool_management/models/tool_material_search.py index c58d0e6f..ab9c24f7 100644 --- a/sf_tool_management/models/tool_material_search.py +++ b/sf_tool_management/models/tool_material_search.py @@ -102,6 +102,9 @@ class SfToolMaterialSearch(models.Model): cutting_direction_ids = fields.Many2many('sf.cutting.direction', 'rel_cutting_direction', '走刀方向') suitable_coolant_ids = fields.Many2many('sf.suitable.coolant', 'rel_suitable_coolant', '适合冷却液') + cutting_speed_ids = fields.Many2many('sf.cutting.speed', string='切削速度Vc') + feed_per_tooth_ids = fields.Many2many('sf.feed.per.tooth', 'rel_feed_per_tooth_ids', '每齿走刀量fz') + @api.constrains('suitable_machining_method_ids') def _check_suitable_machining_method_ids(self): for record in self: diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index 35338eac..7192c8f0 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -1080,7 +1080,7 @@ 功能刀具组装 sf.functional.tool.assembly - + @@ -1133,7 +1133,7 @@ 功能刀具组装 sf.functional.tool.assembly -
+