From 329d7b6464b2c146991a0f4210ae98f5d158c0c5 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 16 Nov 2023 17:36:09 +0800 Subject: [PATCH 01/15] =?UTF-8?q?1=E3=80=81=E6=9C=BA=E5=BA=8A=E6=8D=A2?= =?UTF-8?q?=E5=88=80=E7=94=B3=E8=AF=B7=E7=95=8C=E9=9D=A2=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=9D=A2=E6=9D=BF=E5=92=8C=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=A0=B9=E6=8D=AE=E8=AE=BE=E5=A4=87=E7=9A=84?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=B1=BB=E5=9E=8B=E7=AD=89=E4=BA=8E=E6=9C=BA?= =?UTF-8?q?=E5=BA=8A=E7=9A=84=E8=BF=87=E6=BB=A4=E6=9D=A1=E4=BB=B6=EF=BC=9B?= =?UTF-8?q?2=E3=80=81=E9=9A=90=E8=97=8F=E5=8A=9F=E8=83=BD=E5=88=80?= =?UTF-8?q?=E5=85=B7=E5=87=BA=E5=85=A5=E5=BA=93=E8=AE=B0=E5=BD=95=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=EF=BC=9B3=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80?= =?UTF-8?q?=E5=85=B7=E5=88=97=E8=A1=A8form=E8=A7=86=E5=9B=BE=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=A2=84=E8=AD=A6=E8=B7=B3=E8=BD=AC=E6=8C=89=E9=94=AE?= =?UTF-8?q?=EF=BC=88=E8=B7=B3=E8=BD=AC=E5=8A=9F=E8=83=BD=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=89=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/base.py | 7 +- sf_tool_management/views/menu_view.xml | 14 +-- sf_tool_management/views/tool_base_views.xml | 13 +++ sf_tool_management/wizard/wizard.py | 113 +++++++++++-------- 4 files changed, 92 insertions(+), 55 deletions(-) diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 1fb775c3..31633de3 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -94,6 +94,9 @@ class FunctionalCuttingToolEntity(models.Model): functional_tool_model_ids.append(functional_tool_model.id) return [(6, 0, functional_tool_model_ids)] + def open_functional_tool_warning(self): + pass + class FunctionalToolWarning(models.Model): _name = 'sf.functional.tool.warning' @@ -438,7 +441,7 @@ class MachineTableToolChangingApply(models.Model): _description = '机床换刀申请' name = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, - group_expand='_read_group_names') + group_expand='_read_group_names', domain=[('category_id.equipment_type', '=', '机床')]) machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True, compute='_compute_machine_table_type_id') machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) @@ -489,7 +492,7 @@ class MachineTableToolChangingApply(models.Model): @api.model def _read_group_names(self, categories, domain, order): - names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) + names = categories._search([('category_id.equipment_type', '=', '机床')], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(names) @api.onchange('functional_tool_status') diff --git a/sf_tool_management/views/menu_view.xml b/sf_tool_management/views/menu_view.xml index 301233c4..5b1ed7e9 100644 --- a/sf_tool_management/views/menu_view.xml +++ b/sf_tool_management/views/menu_view.xml @@ -32,13 +32,13 @@ parent="menu_sf_tool_manage" /> - + + + + + + + + + + + + 预警 + + + + + diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index 53d7f28a..b5a5b5d0 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -166,14 +166,14 @@ class FunctionalToolAssemblyOrder(models.TransientModel): sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True) # 刀柄型号 - handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', + handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', required=True, domain=[('product_id.cutting_tool_material_id.name', '=', '刀柄')]) cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True) handle_name = fields.Char('刀柄名称', readonly=True) sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True) # 夹头型号 - chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', + chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', required=True, domain=[('product_id.cutting_tool_material_id.name', '=', '夹头')]) cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True) chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill') @@ -269,58 +269,25 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 功能刀具组装 :return: """ + # 对物料做必填判断 + self.materials_must_be_judged() + # 创建组装入库单 # 创建功能刀具批次/序列号记录 stock_lot = self.create_assemble_warehouse_receipt() # 创建刀具组装入库单 self.create_stocking_picking(stock_lot) - desc_1 = { - 'barcode_id': stock_lot.id, - 'integral_code_id': self.integral_code_id.id, - 'blade_code_id': self.blade_code_id.id, - 'bar_code_id': self.bar_code_id.id, - 'pad_code_id': self.pad_code_id.id, - 'handle_code_id': self.handle_code_id.id, - 'chuck_code_id': self.chuck_code_id.id, - 'coarse_middle_thin': self.coarse_middle_thin, - 'tool_loading_length': self.tool_loading_length, - 'new_former': self.new_former, - 'reference_length': self.reference_length, - 'cut_time': self.cut_time, - 'cut_length': self.cut_length, - 'cut_number': self.cut_number, - 'assemble_status': '1', - 'tool_loading_person': self.env.user.name, - 'tool_loading_time': fields.Datetime.now() - } + # 封装功能刀具数据 + desc_1 = self.get_desc_1(stock_lot) functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([ ('machine_tool_name_id', '=', self.machine_tool_name_id.id), ('cutter_spacing_code', '=', self.cutter_spacing_code), ('assemble_status', '=', '0'), ]) + + # 创建功能刀具列表记录 # 封装功能刀具数据 - desc_2 = { - 'barcode_id': stock_lot.id, - 'functional_tool_name_id': self.functional_tool_name_id.id, - 'mrs_cutting_tool_type_id': self.functional_tool_type_id.id, - 'cutting_tool_integral_model_id': self.integral_code_id.product_id.id, - 'cutting_tool_blade_model_id': self.blade_code_id.product_id.id, - 'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id, - 'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id, - 'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id, - 'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id, - 'diameter': self.functional_tool_diameter, - 'tool_grade': None, - 'machining_accuracy': None, - 'tool_length': self.tool_loading_length, - 'blade_number': None, - 'integral_blade_length': None, - 'effective_blade_length': self.effective_length, - 'max_life': None, - 'is_standard': self.whether_standard_tool, - 'applicable_range': None, - 'image': None, - } + desc_2 = self.get_desc_2(stock_lot) # 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录 record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) self.env['sf.functional.tool.warning'].create({ @@ -335,7 +302,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 'functional_cutting_tool_id': record_1.id }) - # 修改功能刀具组装信息 + # 修改功能刀具组装单信息 functional_tool_assembly.write(desc_1) if functional_tool_assembly.sf_machine_table_tool_changing_apply_id: @@ -352,6 +319,16 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 关闭弹出窗口 return {'type': 'ir.actions.act_window_close'} + def materials_must_be_judged(self): + """ + 功能刀具组装物料必填判断 + """ + if not self.integral_code_id and not self.blade_code_id: + raise ValidationError('【整体式刀具】和【刀片】必须填写一个!') + if self.blade_code_id: + if not self.bar_code_id and not self.pad_code_id: + raise ValidationError('【刀盘】和【刀杆】必须填写一个!') + def create_stocking_picking(self, stock_lot): """ 创建刀具组装入库单 @@ -413,7 +390,6 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 'qty_done': 1.0, 'state': 'done' }) - return stock_move_id, stock_move_line_id def get_stock_lot_name(self): @@ -433,4 +409,49 @@ class FunctionalToolAssemblyOrder(models.TransientModel): else: m = int(stock_lot_id.name[-3:]) + 1 num = "%03d" % m - return code + str(num) \ No newline at end of file + return code + str(num) + + def get_desc_1(self, stock_lot): + return { + 'barcode_id': stock_lot.id, + 'integral_code_id': self.integral_code_id.id, + 'blade_code_id': self.blade_code_id.id, + 'bar_code_id': self.bar_code_id.id, + 'pad_code_id': self.pad_code_id.id, + 'handle_code_id': self.handle_code_id.id, + 'chuck_code_id': self.chuck_code_id.id, + 'coarse_middle_thin': self.coarse_middle_thin, + 'tool_loading_length': self.tool_loading_length, + 'new_former': self.new_former, + 'reference_length': self.reference_length, + 'cut_time': self.cut_time, + 'cut_length': self.cut_length, + 'cut_number': self.cut_number, + 'assemble_status': '1', + 'tool_loading_person': self.env.user.name, + 'tool_loading_time': fields.Datetime.now() + } + + def get_desc_2(self, stock_lot): + return { + 'barcode_id': stock_lot.id, + 'functional_tool_name_id': self.functional_tool_name_id.id, + 'mrs_cutting_tool_type_id': self.functional_tool_type_id.id, + 'cutting_tool_integral_model_id': self.integral_code_id.product_id.id, + 'cutting_tool_blade_model_id': self.blade_code_id.product_id.id, + 'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id, + 'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id, + 'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id, + 'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id, + 'diameter': self.functional_tool_diameter, + 'tool_grade': None, + 'machining_accuracy': None, + 'tool_length': self.tool_loading_length, + 'blade_number': None, + 'integral_blade_length': None, + 'effective_blade_length': self.effective_length, + 'max_life': None, + 'is_standard': self.whether_standard_tool, + 'applicable_range': None, + 'image': None, + } \ No newline at end of file From c885f3ce8c320a08f663231e6c8eba724a2f6e52 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Fri, 17 Nov 2023 17:30:37 +0800 Subject: [PATCH 02/15] =?UTF-8?q?1=E3=80=81=E8=AE=BE=E5=A4=87=E6=9C=BA?= =?UTF-8?q?=E5=BA=8A=E7=9A=84=E5=88=80=E4=BD=8D=E5=AF=B9=E8=B1=A1=E6=96=B0?= =?UTF-8?q?=E5=A2=9Ename=E5=AD=97=E6=AE=B5=EF=BC=8C=E5=B9=B6=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=B7=BB=E5=8A=A0=E5=80=BC=EF=BC=9B2=E3=80=81?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E9=9C=80=E6=B1=82=E9=87=8D=E6=9E=84=E4=BA=86?= =?UTF-8?q?=E6=9C=BA=E5=BA=8A=E6=8D=A2=E5=88=80=E7=94=B3=E8=AF=B7=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E9=87=8D=E6=9E=84=E6=9C=BA=E5=BA=8A=E6=8D=A2?= =?UTF-8?q?=E5=88=80=E5=BC=B9=E7=AA=97=E5=AF=B9=E8=B1=A1=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 7 + sf_tool_management/models/base.py | 142 +++++++++------- sf_tool_management/views/tool_base_views.xml | 166 ++++++++++--------- sf_tool_management/wizard/wizard.py | 102 ++++++------ sf_tool_management/wizard/wizard_view.xml | 52 ++++-- 5 files changed, 262 insertions(+), 207 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index b6961fda..4e3da687 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -911,5 +911,12 @@ class SfMaintenanceEquipmentTool(models.Model): alarm_value = fields.Char('报警值') used_value = fields.Char('已使用值') code = fields.Char('机床刀位号') + name = fields.Char('', compute='_compute_name') + + @api.depends('code') + def _compute_name(self): + for record in self: + if record.code: + record.name = record.code diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 31633de3..5f275253 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from odoo import fields, models, api from odoo import SUPERUSER_ID +from odoo.exceptions import ValidationError # class FunctionalCuttingToolEntity(models.Model): @@ -68,9 +69,9 @@ class FunctionalCuttingToolEntity(models.Model): related='cutting_tool_integral_model_id.suitable_machining_method_ids') blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image', - 'rel_blade_tip_product_template_tool_entity', '刀尖特征', - domain=[('type', '=', '刀尖特征')], - related='cutting_tool_integral_model_id.blade_tip_characteristics_id') + 'rel_blade_tip_product_template_tool_entity', '刀尖特征', + domain=[('type', '=', '刀尖特征')], + related='cutting_tool_integral_model_id.blade_tip_characteristics_id') handle_type_ids = fields.Many2many('maintenance.equipment.image', 'rel_handle_product_template_tool_entity', '柄部类型', @@ -185,7 +186,7 @@ class FunctionalToolWarning(models.Model): return categories.browse(machine_table_name_ids) machine_tool_code = fields.Char('机台号', readonly=True, related='functional_tool_assembly_id.machine_tool_code') - cutting_tool_code = fields.Char('刀位号', readonly=True, related='functional_tool_assembly_id.cutter_spacing_code') + cutting_tool_code = fields.Char('刀位号', readonly=True) # idle_time = fields.Char('闲置时长', readonly=False) idle_time = fields.Char('闲置时长(h)', readonly=False) alarm_value = fields.Char('报警值', readonly=False) @@ -439,60 +440,73 @@ class InboundAndOutboundRecords(models.Model): class MachineTableToolChangingApply(models.Model): _name = 'sf.machine.table.tool.changing.apply' _description = '机床换刀申请' + _order = 'cutter_spacing_code_id' - name = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, - group_expand='_read_group_names', domain=[('category_id.equipment_type', '=', '机床')]) + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, + group_expand='_read_group_names', + domain=[('category_id.equipment_type', '=', '机床')]) machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True, compute='_compute_machine_table_type_id') machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=False, required=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=False, + required=True, + domain="[('equipment_id', '=', name)]") + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', + domain=[('product_id.name', '=', '功能刀具')]) + functional_tool_name = fields.Char(string='功能刀具名称') + functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', + domain=[('name', '=', '功能刀具')]) + tool_position_interface_type = fields.Selection( + [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), + ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), + ('直装固定式', '直装固定式')], string='刀位接口型号') + diameter = fields.Integer(string='刀具直径(mm)', requried=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', requried=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', requried=True) + alarm_value = fields.Integer(string='报警值(min)', requried=True) + used_value = fields.Integer(string='已使用值(min)', requried=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True) + extension__length = fields.Float(string='伸出长(mm)', requried=True) + effective_length = fields.Float(string='有效长(mm)', requried=True) - @api.depends('name') + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', + default='正常') + + assembly_order_code = fields.Char(string='组装单编码', readonly=True) + applicant = fields.Char(string='申请人', readonly=True) + reason_for_applying = fields.Char(string='申请原因', readonly=True) + remark = fields.Char(string='备注说明', readonly=False) + + status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')], + string='操作状态', default='0') + + sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装单', readonly=True) + + @api.depends('maintenance_equipment_id') def _compute_machine_table_type_id(self): for record in self: if record: - record.machine_table_type_id = record.name.category_id.id - record.machine_tool_code = record.name.code + record.machine_table_type_id = record.maintenance_equipment_id.category_id.id + record.machine_tool_code = record.maintenance_equipment_id.code else: record.machine_table_type_id = None record.machine_tool_code = None - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', - domain=[('product_id.name', '=', '功能刀具')]) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', - domain=[('name', '=', '功能刀具')]) - functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') - - diameter = fields.Char(string='直径(mm)', readonly=False) - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=False) - hilt_name = fields.Char(string='刀柄名称', readonly=False) - hilt_code = fields.Char(string='刀柄编号', readonly=False) - max_lifetime_value = fields.Char(string='最大寿命值', readonly=False) - alarm_value = fields.Char(string='报警值', readonly=False) - used_value = fields.Char(string='已使用值', readonly=False) - functional_tool_status = fields.Selection([('正常', '正常'), ('异常', '异常')], string='功能刀具状态', - default='正常', readonly=False) - - # replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True) - assembly_order_code = fields.Char(string='组装单编码', readonly=True) - replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称', readonly=True) - replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型', - readonly=True) - replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], - string='粗/中/精(待换)', readonly=True) - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) - applicant = fields.Char(string='申请人', readonly=True) - used_tool_time = fields.Datetime(string='用刀时间', readonly=True) - reason_for_applying = fields.Char(string='申请原因', readonly=True) - remark = fields.Char(string='备注说明', readonly=False) - - status = fields.Selection([('0', '未操作'), ('1', '已换刀申请'), ('2', '已转移'), ('3', '已组装')], string='操作状态', default='0') - - sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True) + @api.constrains("cutter_spacing_code_id") + def _check_cutter_spacing_code_id(self): + for obj in self: + records = self.env['sf.machine.table.tool.changing.apply'].search([ + ('maintenance_equipment_id', '=', obj.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', obj.cutter_spacing_code_id.id)]) + if len(records) > 1: + raise ValidationError('该刀位号已存在,请重新选择!!!') @api.model def _read_group_names(self, categories, domain, order): - names = categories._search([('category_id.equipment_type', '=', '机床')], order=order, access_rights_uid=SUPERUSER_ID) + names = categories._search([('category_id.equipment_type', '=', '机床')], order=order, + access_rights_uid=SUPERUSER_ID) return categories.browse(names) @api.onchange('functional_tool_status') @@ -503,7 +517,7 @@ class MachineTableToolChangingApply(models.Model): """ # 更新数据到机台换刀申请界面 # todo 自动换刀申请条件需补充完善 - if self.functional_tool_status == '异常': + if self.functional_tool_status == '报警': self.env['sf.machine.table.tool.changing.apply'].search([ ('name', '=', self.name.id)]).write({ 'replacement_tool_name_id': self.functional_tool_name_id.id, @@ -528,7 +542,7 @@ class MachineTableToolChangingApply(models.Model): 'use_tool_time': self.used_tool_time, 'machine_tool_name': self.CNC_machine_table, 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code': self.cutter_spacing_code, + 'cutter_spacing_code_id': self.cutter_spacing_code_id, }) def new_assembly_task(self, vals): @@ -646,8 +660,8 @@ class CAMWorkOrderProgramKnifePlan(models.Model): # 将计划执行状态改为执行中 self.env['sf.cam.work.order.program.knife.plan'].search( [('barcode_id', '=', self.barcode_id.id)]).write({ - 'plan_execute_status': '1', - 'applicant': self.env.user.name}) + 'plan_execute_status': '1', + 'applicant': self.env.user.name}) def revocation(self): """ @@ -661,10 +675,10 @@ class CAMWorkOrderProgramKnifePlan(models.Model): # 将计划执行状态改为待执行,同时清除申请人、功能刀具组装字段数据 self.env['sf.cam.work.order.program.knife.plan'].search( [('barcode_id', '=', self.barcode_id.id)]).write({ - 'plan_execute_status': '0', - 'applicant': None, - 'sf_functional_tool_assembly_id': None, - }) + 'plan_execute_status': '0', + 'applicant': None, + 'sf_functional_tool_assembly_id': None, + }) class FunctionalToolAssembly(models.Model): @@ -674,7 +688,8 @@ class FunctionalToolAssembly(models.Model): assembly_order_code = fields.Char(string='编码', readonly=True) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', requried=True) name = fields.Char(string='名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, group_expand='_read_group_functional_tool_type_ids') @@ -691,7 +706,8 @@ class FunctionalToolAssembly(models.Model): # 整体式刀具型号 integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', readonly=True) - cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True) + cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', + readonly=True) integral_name = fields.Char('整体式刀具名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True) @@ -703,25 +719,29 @@ class FunctionalToolAssembly(models.Model): # 刀杆型号 bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', readonly=True) - cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True) + cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', + readonly=True) bar_name = fields.Char('刀杆名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True) # 刀盘型号 pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', readonly=True) - cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True) + cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', + readonly=True) pad_name = fields.Char('刀盘名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True) # 刀柄型号 handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', readonly=True) - cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True) + cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', + readonly=True) handle_name = fields.Char('刀柄名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True) # 夹头型号 chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', readonly=True) - cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True) + cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', + readonly=True) chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True) @@ -797,7 +817,8 @@ class FunctionalToolAssembly(models.Model): production_line_name_id = fields.Many2one('sf.production.line', string='产线名称', readonly=False) machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True) machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) + # cutter_spacing_code = fields.Char(string='刀位号', readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) tool_loading_person = fields.Char(string='装刀人', readonly=True) tool_loading_time = fields.Datetime(string='装刀时间', readonly=True) @@ -806,7 +827,8 @@ class FunctionalToolAssembly(models.Model): remark = fields.Char(string='备注说明', readonly=True) check_box_1 = fields.Boolean(string='复选框', default=False, readonly=False) - sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请', readonly=True) + sf_machine_table_tool_changing_apply_id = fields.Many2one('sf.machine.table.tool.changing.apply', '机床换刀申请', + readonly=True) sf_cam_work_order_program_knife_plan_id = fields.Many2one('sf.cam.work.order.program.knife.plan', 'CAM工单程序用刀计划', readonly=True, ) @@ -859,4 +881,4 @@ class FunctionalToolAssembly(models.Model): code = self._get_code(obj.loading_task_source) obj.assembly_order_code = code obj.name = code - return obj \ No newline at end of file + return obj diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index 6b8e7982..b9dd679b 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -707,43 +707,58 @@ sf.machine.table.tool.changing.apply - - + + + - - - - - - + + + + + + + + + + - - - + + + + + + + + @@ -763,26 +778,31 @@ name="%(sf_tool_management.sf_tool_change_requirement_information_act)d" type="action" context="{ 'default_name':name, + 'default_maintenance_equipment_id': maintenance_equipment_id, + 'default_machine_table_type_id': machine_table_type_id, 'default_machine_tool_code': machine_tool_code, + 'default_cutter_spacing_code_id': cutter_spacing_code_id, 'default_barcode_id': barcode_id, + 'default_functional_tool_name': functional_tool_name, 'default_functional_tool_name_id': functional_tool_name_id, 'default_functional_tool_type_id': functional_tool_type_id, - 'default_cutter_spacing_code': cutter_spacing_code, - 'default_replacement_tool_name_id': functional_tool_name_id, - 'default_replacement_tool_type_id': functional_tool_type_id, - 'default_replacement_tool_coarse_middle_thin': coarse_middle_thin}" + 'default_tool_position_interface_type': tool_position_interface_type, + 'default_diameter': diameter, + 'default_knife_tip_r_angle': knife_tip_r_angle, + 'default_max_lifetime_value': max_lifetime_value, + 'default_alarm_value': alarm_value, + 'default_used_value': used_value, + 'default_whether_standard_knife': whether_standard_knife, + 'default_extension__length': extension__length, + 'default_effective_length': effective_length, + }" attrs="{'invisible': [('status', '!=', '0')]}" class="btn-primary" /> @@ -791,60 +811,39 @@ - + - - + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - + - + + + - - + - - - - - - - - + + + @@ -858,17 +857,22 @@ sf.machine.table.tool.changing.apply - - + + + - - - - - - + + + + + + + + + + - + @@ -1017,7 +1021,7 @@ - + @@ -1029,7 +1033,7 @@ 'default_machine_tool_name_id': machine_tool_name_id, 'default_machine_tool_code': machine_tool_code, 'default_barcode_id': barcode_id, - 'default_cutter_spacing_code': cutter_spacing_code, + 'default_cutter_spacing_code_id': cutter_spacing_code_id, 'default_functional_tool_name_id': functional_tool_name_id, 'default_functional_tool_type_id': functional_tool_type_id, 'default_functional_tool_length': functional_tool_length, @@ -1060,7 +1064,7 @@ 'default_machine_tool_name_id': machine_tool_name_id, 'default_machine_tool_code': machine_tool_code, 'default_barcode_id': barcode_id, - 'default_cutter_spacing_code': cutter_spacing_code, + 'default_cutter_spacing_code_id': cutter_spacing_code_id, 'default_functional_tool_name_id': functional_tool_name_id, 'default_functional_tool_type_id': functional_tool_type_id, 'default_functional_tool_length': functional_tool_length, @@ -1212,7 +1216,7 @@ - + diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index b5a5b5d0..3e55ad8b 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -6,28 +6,47 @@ 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='机床换刀申请') + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) + machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True) + machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) - name = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) - machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - # functional_tool_code = fields.Char(string='功能刀具编码', readonly=True) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True) + tool_position_interface_type = fields.Selection( + [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), + ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), + ('直装固定式', '直装固定式')], string='刀位接口型号', readonly=True) + diameter = fields.Integer(string='刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + extension__length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) - # replacement_tool_code = fields.Char(string='待换功能刀具编码', readonly=True) - replacement_tool_name_id = fields.Many2one('product.product', string='待换功能刀具名称', - domain=[('name', '=', '功能刀具')]) + # 待换功能刀具信息 + replacement_tool_name = fields.Char(string='待换功能刀具名称') replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型') + replacement_diameter = fields.Integer(string='待换刀具直径(mm)', requried=True) + replacement_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)', requried=True) + replacement_tool_setting_length = fields.Float(string='待换刀具装刀长(mm)', requried=True) + replacement_extension__length = fields.Float(string='待换刀具伸出长(mm)', requried=True) + replacement_effective_length = fields.Float(string='待换刀具有效长(mm)', requried=True) replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], - string='粗/中/精') - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧') - applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True) - used_tool_time = fields.Datetime(string='用刀时间') - reason_for_applying = fields.Char(string='申请原因') - remark = fields.Char(string='备注说明') + string='待换刀具粗/中/精') + replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)', requried=True) + replacement_alarm_value = fields.Integer(string='待换刀具报警值(min)', requried=True) + replacement_used_value = fields.Integer(string='待换刀具已使用值(min)', requried=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧') + replacement_whether_standard_knife = fields.Boolean(string='待换刀具是否标准刀', default=True, requried=True) + used_tool_time = fields.Datetime(string='用刀时间') + applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True) + reason_for_applying = fields.Char(string='申请原因') def tool_changing_apply(self): """ @@ -37,44 +56,27 @@ class ToolChangeRequirementInformation(models.TransientModel): # 将数据更新到机台换刀申请界面 print('已运行') record = self.env['sf.machine.table.tool.changing.apply'].search( - [('name', '=', self.name.id), - ('machine_tool_code', '=', self.machine_tool_code), - ('cutter_spacing_code', '=', self.cutter_spacing_code), + [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id) ]) print('运行record_1') # 功能刀具组装创建新任务(new_assembly_task) - record_1 = self.env['sf.functional.tool.assembly'].sudo().create({ - 'functional_tool_name_id': self.replacement_tool_name_id.id, - 'functional_tool_type_id': self.replacement_tool_type_id.id, - 'loading_task_source': '1', - 'applicant': self.applicant, - 'reason_for_applying': self.reason_for_applying, - 'use_tool_time': self.used_tool_time, - 'machine_tool_name_id': self.name.id, - 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code': self.cutter_spacing_code, - 'sf_machine_table_tool_changing_apply_id': record.id, - }) - print('record_1:', record_1) - # 封装数据 - desc = { - 'name': self.name.id, - 'assembly_order_code': record_1.assembly_order_code, - 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code': self.cutter_spacing_code, - 'replacement_tool_name_id': self.replacement_tool_name_id.id, - 'replacement_tool_type_id': self.replacement_tool_type_id.id, - 'replacement_tool_coarse_middle_thin': self.replacement_tool_coarse_middle_thin, - 'new_former': self.new_former, - 'applicant': self.applicant, - 'used_tool_time': self.used_tool_time, - 'reason_for_applying': self.reason_for_applying, - 'remark': self.new_former, - 'status': '1', - 'sf_functional_tool_assembly_id': record_1.id, - } - print('运行record.write(desc):') - record.write(desc) + # todo + # record_1 = self.env['sf.functional.tool.assembly'].sudo().create({ + # 'functional_tool_name_id': self.replacement_tool_name_id.id, + # 'functional_tool_type_id': self.replacement_tool_type_id.id, + # 'loading_task_source': '1', + # 'applicant': self.applicant, + # 'reason_for_applying': self.reason_for_applying, + # 'use_tool_time': self.used_tool_time, + # 'machine_tool_name_id': self.name.id, + # 'machine_tool_code': self.machine_tool_code, + # 'cutter_spacing_code': self.cutter_spacing_code, + # 'sf_machine_table_tool_changing_apply_id': record.id, + # }) + # print('record_1:', record_1) + + # record.write(desc) print('运行成功') # 关闭弹出窗口 diff --git a/sf_tool_management/wizard/wizard_view.xml b/sf_tool_management/wizard/wizard_view.xml index a6c6ec7b..a569b6f2 100644 --- a/sf_tool_management/wizard/wizard_view.xml +++ b/sf_tool_management/wizard/wizard_view.xml @@ -7,30 +7,50 @@ - + + + + + + + + + + + + + + + - - - - - - - - + + + + + - + - - - - + + + + + + + + - - + + + + + + + From 49f021ed7a9c68ab9f848d22e2be7050e423d6d0 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Fri, 17 Nov 2023 17:45:41 +0800 Subject: [PATCH 03/15] =?UTF-8?q?=E4=BA=A7=E5=93=81=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=88=80=E7=89=87=E5=BD=A2=E7=8A=B6=EF=BC=8C?= =?UTF-8?q?=E9=80=82=E5=90=88=E5=8A=A0=E5=B7=A5=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E5=88=80=E5=B0=96=E7=89=B9=E5=BE=81=EF=BC=8C=E8=B5=B0=E5=88=80?= =?UTF-8?q?=E6=96=B9=E5=90=91=EF=BC=8C=E6=9F=84=E9=83=A8=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E5=86=B7=E5=8D=B4=E6=B6=B2=EF=BC=8C=E5=8E=8B=E7=B4=A7?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 131 ++++---------------- 1 file changed, 25 insertions(+), 106 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 73d3d4aa..f2e69239 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -204,16 +204,6 @@ class ResProductMo(models.Model): self.cutting_tool_blade_depth = self.specification_id.blade_depth self.cutting_tool_cut_depth = self.specification_id.cutting_depth self.cutting_speed_ids = self.cutting_tool_model_id.cutting_speed_ids - # # self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids. - # for tooth in self.cutting_tool_model_id.feed_per_tooth_ids: - # print(int(tooth.blade_diameter)) - # print(int(self.specification_id.blade_diameter)) - # if int(tooth.blade_diameter) == int(self.specification_id.blade_diameter): - # self.feed_per_tooth_ids = [(0, 0, { - # 'cutting_speed': tooth.cutting_speed, - # 'machining_method': tooth.machining_method, - # 'blade_diameter': tooth.blade_diameter, - # 'materials_type_id': tooth.materials_type_id.id})] self.feed_per_tooth_ids = self.cutting_tool_model_id.feed_per_tooth_ids.filtered( lambda r: int(r.blade_diameter) == int(self.specification_id.blade_diameter)) elif self.cutting_tool_type == '夹头': @@ -358,89 +348,33 @@ class ResProductMo(models.Model): self.cutting_speed_ids = False self.feed_per_tooth_ids = False - # @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('fit_blade_shape_id', 'suitable_machining_method_ids', 'blade_tip_characteristics_id', + 'handle_type_ids', 'cutting_direction_ids', 'suitable_coolant_ids', 'compaction_way_ids') + def _check_cutting_tool_ability(self): + if self.cutting_tool_type in ['整体式刀具', '刀片', '刀杆', '刀盘']: + if self.cutting_tool_type in ['刀片', '刀杆', '刀盘']: + if not self.fit_blade_shape_id: + raise ValidationError("请选择适配刀片形状") + if self.cutting_tool_type in ['刀杆', '刀盘']: + if not self.compaction_way_ids: + raise ValidationError("请选择压紧方式") + if self.cutting_tool_type == '刀片': + if not self.suitable_coolant_ids: + raise ValidationError("请选择适合冷却液") + elif self.cutting_tool_type == '整体式刀具': + if not self.handle_type_ids: + raise ValidationError("请选择柄部类型") + if not self.suitable_coolant_ids: + raise ValidationError("请选择适合冷却液") + if not self.suitable_machining_method_ids: + raise ValidationError("请选择适合加工方式") + if not self.blade_tip_characteristics_id: + raise ValidationError("请选择刀尖特征") + if not self.cutting_direction_ids: + 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('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('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_rear_angle = fields.Integer('后角(°)') cutting_tool_main_included_angle = fields.Integer('主偏角(°)') @@ -758,26 +692,19 @@ class ResProductMo(models.Model): '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': [(6, 0, [])] if not item.get( 'process_parameters_code') else 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 + product_id.product_tmpl_id.active = False return copy_product_id def _get_ids(self, param): @@ -833,12 +760,6 @@ class ResProductMo(models.Model): '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 } # 外协和采购生成的坯料需要根据材料型号绑定供应商 @@ -850,8 +771,6 @@ class ResProductMo(models.Model): 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 From 7ceaadb9c40880a6849a34c34d2f119eed775504 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 20 Nov 2023 15:04:39 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=95=E5=85=A5?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/models/functional_fixture.py | 5 +++-- sf_manufacturing/models/product_template.py | 15 ++++++------- sf_manufacturing/models/stock.py | 13 +++++------ sf_sale/models/quick_easy_order.py | 17 ++++++++------ sf_sale/models/sale_order.py | 3 +-- sf_wxwork_approval/controllers/controllers.py | 22 +++---------------- sf_wxwork_approval/models/model.py | 14 +----------- 7 files changed, 30 insertions(+), 59 deletions(-) diff --git a/sf_base/models/functional_fixture.py b/sf_base/models/functional_fixture.py index c96466c1..854ba53e 100644 --- a/sf_base/models/functional_fixture.py +++ b/sf_base/models/functional_fixture.py @@ -1,8 +1,9 @@ +import requests +import json from odoo import models, fields, api from odoo.addons.sf_base.commons.common import Common from odoo.exceptions import ValidationError -import requests -import json + class FunctionalFixtureType(models.Model): diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index f2e69239..59ae7f6a 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -1,16 +1,15 @@ # -*- coding: utf-8 -*- -from odoo import models, fields, api, _ -from odoo.exceptions import ValidationError -from odoo.modules import get_resource_path -from odoo.addons.sf_base.commons.common import Common -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file import logging import base64 import hashlib import os -import requests -import json +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 + + class ResProductMo(models.Model): diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index bad89ac0..aaf261e8 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -1,18 +1,15 @@ # -*- coding: utf-8 -*- +from datetime import datetime +import requests +import logging import base64 from collections import defaultdict, namedtuple +from re import findall as regex_findall +from re import split as regex_split from odoo.addons.stock.models.stock_rule import ProcurementException from odoo.addons.sf_base.commons.common import Common -from odoo.exceptions import ValidationError, UserError -import requests -import json -from re import findall as regex_findall -from datetime import datetime, timedelta -from re import split as regex_split from odoo import SUPERUSER_ID, _, api, fields, models from odoo.tools import float_compare -import logging - from odoo.exceptions import UserError diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index e9f152a8..2fc95d62 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -1,16 +1,19 @@ -from odoo import models, fields, api -from odoo.modules import get_resource_path -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file -from odoo.exceptions import ValidationError, UserError -from odoo.addons.sf_base.commons.common import Common -from datetime import datetime import logging import base64 import hashlib import os import json +from datetime import datetime import requests +from OCC.Extend.DataExchange import read_step_file +from OCC.Extend.DataExchange import write_stl_file +from odoo import models, fields, api +from odoo.modules import get_resource_path +from odoo.exceptions import ValidationError, UserError +from odoo.addons.sf_base.commons.common import Common + + + class QuickEasyOrder(models.Model): diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index 35d877fe..ee799cab 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -1,7 +1,7 @@ -from odoo import models, fields import datetime import base64 import logging +from odoo import models, fields class ReSaleOrder(models.Model): @@ -17,7 +17,6 @@ class ReSaleOrder(models.Model): # 业务平台分配工厂后在智能工厂先创建销售订单 def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address, deadline_of_delivery, payments_way, pay_way): - logging.info('---------sale_order_create------') now_time = datetime.datetime.now() partner = self.get_customer() order_id = self.env['sale.order'].sudo().create({ diff --git a/sf_wxwork_approval/controllers/controllers.py b/sf_wxwork_approval/controllers/controllers.py index e52058d4..bc981b49 100644 --- a/sf_wxwork_approval/controllers/controllers.py +++ b/sf_wxwork_approval/controllers/controllers.py @@ -1,25 +1,9 @@ # -*- coding: utf-8 -*- -import ast -import base64 -import io -import json -import os -import random -import time - -import re - -from stl import mesh -from werkzeug import urls - -import odoo -from odoo.exceptions import ValidationError import requests -from odoo import http -from odoo.http import request, Response -from odoo.modules import get_resource_path -from odoo.tools.translate import _ import logging +from odoo import http +from odoo.http import request + _logger = logging.getLogger(__name__) diff --git a/sf_wxwork_approval/models/model.py b/sf_wxwork_approval/models/model.py index ba1cf15a..8fb3f516 100644 --- a/sf_wxwork_approval/models/model.py +++ b/sf_wxwork_approval/models/model.py @@ -1,19 +1,7 @@ # -*- coding: utf-8 -*- import re import logging -import time -import requests -from datetime import datetime -import base64 -import hashlib -from odoo import fields, models, api -import json -import requests -from odoo.http import request -from odoo.exceptions import ValidationError -from odoo.exceptions import UserError - - +from odoo import fields, models _logger = logging.getLogger(__name__) From 04e63dcc599299726094f27823c65a4c00134708 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 20 Nov 2023 15:10:01 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/controllers/controllers.py | 4 ++-- sf_manufacturing/models/mrp_production.py | 2 +- sf_sale/models/quick_easy_order.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sf_bf_connect/controllers/controllers.py b/sf_bf_connect/controllers/controllers.py index 69fb8f30..de974b05 100644 --- a/sf_bf_connect/controllers/controllers.py +++ b/sf_bf_connect/controllers/controllers.py @@ -59,7 +59,7 @@ class Sf_Bf_Connect(http.Controller): self_machining_bom_line = self_machining_bom.with_user( request.env.ref("base.user_admin")).bom_create_line( self_machining_embryo) - if self_machining_bom_line == False: + if self_machining_bom_line is False: res['status'] = 2 res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配' request.cr.rollback() @@ -84,7 +84,7 @@ class Sf_Bf_Connect(http.Controller): # 创建坯料的bom的组件 outsource_bom_line = outsource_bom.with_user( request.env.ref("base.user_admin")).bom_create_line(outsource_embryo) - if outsource_bom_line == False: + if outsource_bom_line is False: res['status'] = 2 res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配' request.cr.rollback() diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index b6d774a3..42e70d14 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -120,7 +120,7 @@ class MrpProduction(models.Model): if i == 1 and route.routing_type == '获取CNC加工程序': workorders_values.append( self.env['mrp.workorder'].json_workorder_str('', production, route)) - if route.is_repeat == True: + if route.is_repeat is True: workorders_values.append( self.env['mrp.workorder'].json_workorder_str(k, production, route)) if i == processing_panel_len and route.routing_type == '解除装夹': diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index 2fc95d62..1e5f274c 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -212,7 +212,7 @@ class QuickEasyOrder(models.Model): self_machining_bom = self.env['mrp.bom'].bom_create(self_machining_embryo, 'normal', False) # 创建坯料里bom的组件 self_machining_bom_line = self_machining_bom.bom_create_line(self_machining_embryo) - if self_machining_bom_line == False: + if self_machining_bom_line is False: self.cr.rollback() return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配') # 产品配置bom @@ -228,7 +228,7 @@ class QuickEasyOrder(models.Model): # 创建坯料的bom的组件 outsource_bom_line = outsource_bom.with_user( self.env.ref("base.user_admin")).bom_create_line(outsource_embryo) - if outsource_bom_line == False: + if outsource_bom_line is False: self.cr.rollback() return UserError('该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配') # 产品配置bom From b49b5890a0cfb2e1e04a96976eb5681a97d56230 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Mon, 20 Nov 2023 17:36:13 +0800 Subject: [PATCH 06/15] =?UTF-8?q?1=E3=80=81=E6=9C=BA=E5=8F=B0=E6=8D=A2?= =?UTF-8?q?=E5=88=80=E7=94=B3=E8=AF=B7=E5=8F=8A=E5=85=B6=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=9F=E4=BA=A7=E7=BA=BF=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=8C2=E3=80=81=E6=9C=BA=E5=8F=B0=E6=8D=A2=E5=88=80?= =?UTF-8?q?=E7=94=B3=E8=AF=B7tree=E8=A7=86=E5=9B=BE=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E6=94=B9=E4=B8=BA=E6=8C=89=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=BA=BF=E5=92=8C=E7=8A=B6=E6=80=81=E6=90=9C=E7=B4=A2=EF=BC=8C?= =?UTF-8?q?3=E3=80=81=E4=BC=98=E5=8C=96=E5=8A=9F=E8=83=BD=E5=88=80?= =?UTF-8?q?=E5=85=B7=E7=BB=84=E8=A3=85=E5=8D=95=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=A4=A7=E9=87=8F=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?tree=E8=AF=95=E5=9B=BE=E5=B8=83=E5=B1=80=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96form=E8=A7=86=E5=9B=BE=E5=B8=83=E5=B1=80=EF=BC=8Ctree?= =?UTF-8?q?=E8=A7=86=E5=9B=BE=E6=90=9C=E7=B4=A2=E9=9D=A2=E6=9D=BF=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=8C=89=E7=8A=B6=E6=80=81=E6=90=9C=E7=B4=A2=EF=BC=8C?= =?UTF-8?q?4=E3=80=81=E9=87=8D=E6=9E=84=E4=BA=86=E6=9C=BA=E5=8F=B0?= =?UTF-8?q?=E6=8D=A2=E5=88=80=E7=94=B3=E8=AF=B7=E6=A8=A1=E5=9E=8B=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=8D=A2=E5=88=80=E5=8A=9F=E8=83=BD=EF=BC=9B5?= =?UTF-8?q?=E3=80=81=E9=87=8D=E6=9E=84=E5=88=80=E5=85=B7=E8=BD=AC=E7=A7=BB?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/base.py | 92 ++-- sf_tool_management/views/tool_base_views.xml | 487 +++++++++++-------- sf_tool_management/wizard/wizard.py | 104 ++-- sf_tool_management/wizard/wizard_view.xml | 46 +- 4 files changed, 436 insertions(+), 293 deletions(-) diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 5f275253..4cbfbe06 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -444,8 +444,9 @@ class MachineTableToolChangingApply(models.Model): name = fields.Char('名称', related='maintenance_equipment_id.name', store=True) maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', required=True, readonly=False, - group_expand='_read_group_names', domain=[('category_id.equipment_type', '=', '机床')]) + production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True, + group_expand='_read_group_names') machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True, compute='_compute_machine_table_type_id') machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) @@ -461,14 +462,14 @@ class MachineTableToolChangingApply(models.Model): tool_position_interface_type = fields.Selection( [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), - ('直装固定式', '直装固定式')], string='刀位接口型号') + ('直装固定式', '直装固定式')], string='刀位接口型号', requried=True) diameter = fields.Integer(string='刀具直径(mm)', requried=True) knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', requried=True) max_lifetime_value = fields.Integer(string='最大寿命值(min)', requried=True) alarm_value = fields.Integer(string='报警值(min)', requried=True) used_value = fields.Integer(string='已使用值(min)', requried=True) whether_standard_knife = fields.Boolean(string='是否标准刀', default=True) - extension__length = fields.Float(string='伸出长(mm)', requried=True) + extension_length = fields.Float(string='伸出长(mm)', requried=True) effective_length = fields.Float(string='有效长(mm)', requried=True) functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', @@ -488,9 +489,11 @@ class MachineTableToolChangingApply(models.Model): def _compute_machine_table_type_id(self): for record in self: if record: + record.production_line_id = record.maintenance_equipment_id.production_line_id.id record.machine_table_type_id = record.maintenance_equipment_id.category_id.id record.machine_tool_code = record.maintenance_equipment_id.code else: + record.production_line_id = None record.machine_table_type_id = None record.machine_tool_code = None @@ -505,8 +508,7 @@ class MachineTableToolChangingApply(models.Model): @api.model def _read_group_names(self, categories, domain, order): - names = categories._search([('category_id.equipment_type', '=', '机床')], order=order, - access_rights_uid=SUPERUSER_ID) + names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(names) @api.onchange('functional_tool_status') @@ -686,13 +688,36 @@ class FunctionalToolAssembly(models.Model): _description = '功能刀具组装单' _order = 'use_tool_time asc' - assembly_order_code = fields.Char(string='编码', readonly=True) - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) - functional_tool_name = fields.Char(string='功能刀具名称', requried=True) name = fields.Char(string='名称', readonly=True) + assembly_order_code = fields.Char(string='编码', readonly=True) + + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, group_expand='_read_group_functional_tool_type_ids') + functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) + tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], + string='装刀任务来源', readonly=True) + use_tool_time = fields.Datetime(string='用刀时间', readonly=True) + production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=False) + machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True) + machine_tool_code = fields.Char(string='机台号', readonly=True) + applicant = fields.Char(string='申请人', readonly=True) + apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) + assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', + default='0', readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + reason_for_applying = fields.Char(string='申请原因', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) @api.model def _read_group_functional_tool_type_ids(self, categories, domain, order): @@ -700,44 +725,36 @@ class FunctionalToolAssembly(models.Model): functional_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(functional_tool_type_ids) - functional_tool_diameter = fields.Char(string='功能刀具直径(mm)', readonly=True) - functional_tool_length = fields.Char(string='功能刀具伸出长(mm)', readonly=True) - functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) - + # 刀具物料信息 # 整体式刀具型号 integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', readonly=True) cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True) integral_name = fields.Char('整体式刀具名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True) - # 刀片型号 blade_code_id = fields.Many2one('stock.lot', '刀片序列号', readonly=True) cutting_tool_blade_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀片型号', readonly=True) blade_name = fields.Char('刀片名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_2 = fields.Many2one('sf.machine.brand', '刀片品牌', readonly=True) - # 刀杆型号 bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', readonly=True) cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True) bar_name = fields.Char('刀杆名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True) - # 刀盘型号 pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', readonly=True) cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True) pad_name = fields.Char('刀盘名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True) - # 刀柄型号 handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', readonly=True) cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True) handle_name = fields.Char('刀柄名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True) - # 夹头型号 chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', readonly=True) cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', @@ -798,28 +815,33 @@ class FunctionalToolAssembly(models.Model): record.chuck_name = None record.sf_tool_brand_id_6 = None - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) - tool_loading_length = fields.Char(string='装刀长(mm)', readonly=True) - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) - reference_length = fields.Char(string='参考伸出长(mm)', readonly=True) + # 组装功能刀具参数信息 + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) + after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', readonly=True) + after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', + string='组装后功能刀具类型', readonly=True, + group_expand='_read_group_functional_tool_type_ids') + after_assembly_functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True) + after_assembly_knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) cut_time = fields.Char(string='已切削时间', readonly=True) cut_length = fields.Char(string='已切削长度(mm)', readonly=True) cut_number = fields.Char(string='已切削次数', readonly=True) - loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], - string='装刀任务来源', readonly=True) - applicant = fields.Char(string='申请人', readonly=True) - reason_for_applying = fields.Char(string='申请原因', readonly=True) - apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) - assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', - default='0', readonly=True) - use_tool_time = fields.Datetime(string='用刀时间', readonly=True) - production_line_name_id = fields.Many2one('sf.production.line', string='产线名称', readonly=False) - machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True) - machine_tool_code = fields.Char(string='机台号', readonly=True) - # cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + after_assembly_whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], + string='粗/中/精', readonly=True) + after_assembly_max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + after_assembly_alarm_value = fields.Integer(string='报警值(min)', readonly=True) + after_assembly_used_value = fields.Integer(string='已使用值(min)', readonly=True) + after_assembly_tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + after_assembly_functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + after_assembly_effective_length = fields.Float(string='有效长(mm)', readonly=True) + L_D_number = fields.Float(string='L/D值(mm)', readonly=True) + hiding_length = fields.Float(string='避空长(mm)', readonly=True) + functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) + # cutter_spacing_code = fields.Char(string='刀位号', readonly=True) tool_loading_person = fields.Char(string='装刀人', readonly=True) tool_loading_time = fields.Datetime(string='装刀时间', readonly=True) receive_person = fields.Char(string='领用人', readonly=True) diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index b9dd679b..217400b9 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -1,15 +1,15 @@ - + sf.functional.cutting.tool.entity.list.tree sf.functional.cutting.tool.entity - - - + + + @@ -25,20 +25,21 @@ sf.functional.cutting.tool.entity.list.form sf.functional.cutting.tool.entity - + - - - 预警 - - + name="open_functional_tool_warning" + icon="fa-list-ul" + type="object"> + + + 预警 + + - + @@ -47,7 +48,8 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - @@ -161,8 +165,8 @@ sf.functional.cutting.tool.entity - - + + @@ -177,7 +181,7 @@ - + 功能刀具列表 ir.actions.act_window sf.functional.cutting.tool.entity @@ -185,13 +189,13 @@ - + sf.functional.tool.warning.tree sf.functional.tool.warning - - + + @@ -217,7 +221,7 @@ sf.functional.tool.warning.form sf.functional.tool.warning - + @@ -311,9 +315,9 @@ sf.functional.tool.warning - - - + + + @@ -330,7 +334,8 @@ - + @@ -344,12 +349,12 @@ - + 功能刀具实时分布 sf.real.time.distribution.of.functional.tools - + @@ -378,7 +383,7 @@ 功能刀具实时分布 sf.real.time.distribution.of.functional.tools - + @@ -500,7 +505,7 @@ - + 功能刀具出入库记录 @@ -519,7 +524,7 @@ - + @@ -601,7 +606,7 @@ - + @@ -631,7 +636,7 @@ - + @@ -647,7 +652,7 @@ - + 出入库记录 sf.inbound.and.outbound.records @@ -701,18 +706,17 @@ - + 机床换刀申请 sf.machine.table.tool.changing.apply + - - - + @@ -722,18 +726,21 @@ + + - + + - - - + class="btn-primary" + attrs="{'invisible': [('status', '!=', '0')]}" + /> + + @@ -773,11 +812,12 @@ sf.machine.table.tool.changing.apply - + - - - + + + @@ -816,9 +888,10 @@ + - + @@ -841,7 +914,7 @@ - + @@ -853,11 +926,12 @@ - + sf.machine.table.tool.changing.apply + @@ -872,7 +946,8 @@ - + + @@ -887,7 +962,7 @@ - + CAM工单程序用刀计划 sf.cam.work.order.program.knife.plan @@ -903,8 +978,10 @@ - - + + @@ -915,8 +992,10 @@ - - + + @@ -973,7 +1052,7 @@ - + sf.cam.work.order.program.knife.plan @@ -1000,7 +1079,7 @@ - + 功能刀具组装 sf.functional.tool.assembly @@ -1008,17 +1087,32 @@ - - - - + + + + + + + + + + + + + - - - - + + + + + + + + + + @@ -1027,26 +1121,14 @@ + name="%(sf_tool_management.sf_functional_tool_assembly_order_act)d" + type="action" + context="{}" + attrs="{'invisible': [('assemble_status', '!=', '0')]}" + class="btn-primary"/> + attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" + confirm="是否确认打印组装单"/> @@ -1058,30 +1140,19 @@ + name="%(sf_tool_management.sf_functional_tool_assembly_order_act)d" + type="action" + context="{}" + attrs="{'invisible': [('assemble_status', '!=', '0')]}" + class="btn-primary"/> + attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" + confirm="是否确认打印二维码"/> - + attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" + confirm="是否确认打印组装单"/> + @@ -1091,45 +1162,39 @@ - - - + + + - - - - - - - + - + + - - - - - - - - - - - + + + + + + + + + + - + - + - + - + @@ -1181,7 +1246,7 @@ - + @@ -1195,7 +1260,7 @@ - + @@ -1208,24 +1273,27 @@ - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + 、 + + @@ -1253,24 +1321,31 @@ - + sf.functional.tool.assembly - - - - - - - + + + + + + + + + + - - - + + + + + + + diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index 3e55ad8b..053ba39a 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -1,3 +1,5 @@ +from datetime import timedelta + from odoo import fields, models, api from odoo.exceptions import ValidationError @@ -8,6 +10,7 @@ class ToolChangeRequirementInformation(models.TransientModel): name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True) maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) + production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True) machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True) machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) @@ -25,7 +28,7 @@ class ToolChangeRequirementInformation(models.TransientModel): alarm_value = fields.Integer(string='报警值(min)', readonly=True) used_value = fields.Integer(string='已使用值(min)', readonly=True) whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) - extension__length = fields.Float(string='伸出长(mm)', readonly=True) + extension_length = fields.Float(string='伸出长(mm)', readonly=True) effective_length = fields.Float(string='有效长(mm)', readonly=True) # 待换功能刀具信息 @@ -34,17 +37,18 @@ class ToolChangeRequirementInformation(models.TransientModel): replacement_diameter = fields.Integer(string='待换刀具直径(mm)', requried=True) replacement_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)', requried=True) replacement_tool_setting_length = fields.Float(string='待换刀具装刀长(mm)', requried=True) - replacement_extension__length = fields.Float(string='待换刀具伸出长(mm)', requried=True) + replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)', requried=True) replacement_effective_length = fields.Float(string='待换刀具有效长(mm)', requried=True) replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], - string='待换刀具粗/中/精') + string='待换刀具粗/中/精', default='3') replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)', requried=True) replacement_alarm_value = fields.Integer(string='待换刀具报警值(min)', requried=True) replacement_used_value = fields.Integer(string='待换刀具已使用值(min)', requried=True) - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧') + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', default='0') replacement_whether_standard_knife = fields.Boolean(string='待换刀具是否标准刀', default=True, requried=True) - used_tool_time = fields.Datetime(string='用刀时间') + used_tool_time = fields.Datetime(string='用刀时间', + default=lambda self: fields.Datetime.now() + timedelta(hours=4)) applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True) reason_for_applying = fields.Char(string='申请原因') @@ -53,30 +57,40 @@ class ToolChangeRequirementInformation(models.TransientModel): 确认换刀申请(按键) :return: """ - # 将数据更新到机台换刀申请界面 print('已运行') record = self.env['sf.machine.table.tool.changing.apply'].search( [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id) ]) print('运行record_1') - # 功能刀具组装创建新任务(new_assembly_task) - # todo - # record_1 = self.env['sf.functional.tool.assembly'].sudo().create({ - # 'functional_tool_name_id': self.replacement_tool_name_id.id, - # 'functional_tool_type_id': self.replacement_tool_type_id.id, - # 'loading_task_source': '1', - # 'applicant': self.applicant, - # 'reason_for_applying': self.reason_for_applying, - # 'use_tool_time': self.used_tool_time, - # 'machine_tool_name_id': self.name.id, - # 'machine_tool_code': self.machine_tool_code, - # 'cutter_spacing_code': self.cutter_spacing_code, - # 'sf_machine_table_tool_changing_apply_id': record.id, - # }) - # print('record_1:', record_1) - # record.write(desc) + # 功能刀具组装创建新任务(new_assembly_task) + sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().create({ + 'functional_tool_name': self.replacement_tool_name, + 'functional_tool_type_id': self.replacement_tool_type_id.id, + 'functional_tool_diameter': self.replacement_diameter, + 'knife_tip_r_angle': self.replacement_knife_tip_r_angle, + 'coarse_middle_thin': self.replacement_tool_coarse_middle_thin, + 'new_former': self.new_former, + 'tool_loading_length': self.replacement_tool_setting_length, + 'functional_tool_length': self.replacement_extension_length, + 'effective_length': self.replacement_effective_length, + 'loading_task_source': '1', + 'use_tool_time': self.used_tool_time, + 'production_line_name_id': self.production_line_id.id, + 'machine_tool_name_id': self.maintenance_equipment_id.id, + 'applicant': self.applicant, + 'apply_time': fields.Datetime.now(), + 'cutter_spacing_code_id': self.cutter_spacing_code_id.id, + 'whether_standard_knife': self.whether_standard_knife, + 'reason_for_applying': self.reason_for_applying + }) + print('sf_functional_tool_assembly:', sf_functional_tool_assembly) + # 修改机床换刀申请状态 + record.write({ + 'status': '1', + 'sf_functional_tool_assembly_id': sf_functional_tool_assembly + }) print('运行成功') # 关闭弹出窗口 @@ -87,18 +101,35 @@ class ToolTransferRequestInformation(models.TransientModel): _name = 'sf.tool.transfer.request.information' _description = '刀具转移申请信息' - CNC_machine_table_id = fields.Many2one('sf.machine_tool', string='CNC机床', readonly=True) - machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - # functional_tool_code = fields.Char(string='功能刀具编码', readonly=True) + name = fields.Char('名称', related='maintenance_equipment_id.name', store=True, readonly=True) + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床', readonly=True) + production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=True) + machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型', readonly=True) + machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True) + tool_position_interface_type = fields.Selection( + [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), + ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), + ('直装固定式', '直装固定式')], string='刀位接口型号', readonly=True) + diameter = fields.Integer(string='刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + extension_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + + # 转移刀具信息 transfer_target = fields.Selection([('机台', '机台'), ('线边刀库', '线边刀库'), ('刀具房', '刀具房')], string='转移到:', default='线边刀库') - new_cnc_machine_table_id = fields.Many2one('sf.machine_tool', string='机床名称') + new_production_line_id = fields.Many2one('sf.production.line', string='生产线') new_machine_tool_code = fields.Char(string='机床号') new_cutter_spacing_code = fields.Char(string='目标刀位号') @@ -142,7 +173,8 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 整体式刀具型号 integral_code_id = fields.Many2one('stock.lot', string='整体式刀具序列号', domain=[('product_id.cutting_tool_material_id.name', '=', '整体式刀具')]) - cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', readonly=True) + cutting_tool_integral_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='整体式刀具型号', + readonly=True) integral_name = fields.Char('整体式刀具名称', readonly=True) sf_tool_brand_id_1 = fields.Many2one('sf.machine.brand', string='整体式刀具品牌', readonly=True) @@ -156,28 +188,32 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 刀杆型号 bar_code_id = fields.Many2one('stock.lot', '刀杆序列号', domain=[('product_id.cutting_tool_material_id.name', '=', '刀杆')]) - cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', readonly=True) + cutting_tool_cutterbar_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀杆型号', + readonly=True) bar_name = fields.Char('刀杆名称', readonly=True) sf_tool_brand_id_3 = fields.Many2one('sf.machine.brand', '刀杆品牌', readonly=True) # 刀盘型号 pad_code_id = fields.Many2one('stock.lot', '刀盘序列号', domain=[('product_id.cutting_tool_material_id.name', '=', '刀盘')]) - cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', readonly=True) + cutting_tool_cutterpad_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀盘型号', + readonly=True) pad_name = fields.Char('刀盘名称', readonly=True) sf_tool_brand_id_4 = fields.Many2one('sf.machine.brand', '刀盘品牌', readonly=True) # 刀柄型号 handle_code_id = fields.Many2one('stock.lot', '刀柄序列号', required=True, domain=[('product_id.cutting_tool_material_id.name', '=', '刀柄')]) - cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', readonly=True) + cutting_tool_cutterhandle_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀柄型号', + readonly=True) handle_name = fields.Char('刀柄名称', readonly=True) sf_tool_brand_id_5 = fields.Many2one('sf.machine.brand', '刀柄品牌', readonly=True) # 夹头型号 chuck_code_id = fields.Many2one('stock.lot', '夹头序列号', required=True, domain=[('product_id.cutting_tool_material_id.name', '=', '夹头')]) - cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', readonly=True) + cutting_tool_cutterhead_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='夹头型号', + readonly=True) chuck_name = fields.Char('夹头名称', readonly=True, compute='_compute_auto_fill') sf_tool_brand_id_6 = fields.Many2one('sf.machine.brand', '夹头品牌', readonly=True) @@ -456,4 +492,4 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 'is_standard': self.whether_standard_tool, 'applicable_range': None, 'image': None, - } \ No newline at end of file + } diff --git a/sf_tool_management/wizard/wizard_view.xml b/sf_tool_management/wizard/wizard_view.xml index a569b6f2..caba3017 100644 --- a/sf_tool_management/wizard/wizard_view.xml +++ b/sf_tool_management/wizard/wizard_view.xml @@ -14,6 +14,7 @@ + @@ -28,8 +29,8 @@ - - + + @@ -39,14 +40,14 @@ - + - + @@ -80,22 +81,30 @@ - + + + + + + - - + + + + + + + + - - - - - - - - - - + + + + + + + @@ -105,7 +114,8 @@ - + + From d53e6648819457caa747d54528ae1dd77eeece0f Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Mon, 20 Nov 2023 17:38:03 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=8C=E4=BC=98=E5=8C=96=E4=B8=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/models/process_status.py | 2 +- sf_manufacturing/models/stock.py | 4 ++-- web_widget_model_viewer/static/src/js/3d_viewer.js | 14 ++++---------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py index 069ef2d4..ceb566c5 100644 --- a/sf_bf_connect/models/process_status.py +++ b/sf_bf_connect/models/process_status.py @@ -1,10 +1,10 @@ from datetime import datetime +from collections import defaultdict, namedtuple import logging import requests from odoo import api, fields, models, SUPERUSER_ID, _ from odoo.exceptions import UserError from odoo.exceptions import ValidationError -from collections import defaultdict, namedtuple _logger = logging.getLogger(__name__) diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 49d6f140..27cb69f9 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- import base64 +from collections import defaultdict, namedtuple import logging import json +from re import split as regex_split from re import findall as regex_findall from datetime import datetime, timedelta -from re import split as regex_split import requests from odoo import SUPERUSER_ID, _, api, fields, models from odoo.tools import float_compare -from collections import defaultdict, namedtuple from odoo.addons.stock.models.stock_rule import ProcurementException from odoo.addons.sf_base.commons.common import Common from odoo.exceptions import ValidationError, UserError diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.js b/web_widget_model_viewer/static/src/js/3d_viewer.js index 0f8ef168..9d3afd50 100644 --- a/web_widget_model_viewer/static/src/js/3d_viewer.js +++ b/web_widget_model_viewer/static/src/js/3d_viewer.js @@ -3,20 +3,14 @@ import {registry} from "@web/core/registry"; import {_lt} from "@web/core/l10n/translation"; import {standardFieldProps} from "@web/views/fields/standard_field_props"; -import {useInputField} from "@web/views/fields/input_field_hook"; -import {FileUploader} from "@web/views/fields/file_handler"; import {session} from "@web/session"; -import {useService} from "@web/core/utils/hooks"; -import {isBinarySize} from "@web/core/utils/binary"; -import {download} from "@web/core/network/download"; -import utils from 'web.utils'; import core from 'web.core'; -import rpc from 'web.rpc'; + var QWeb = core.qweb; -import {Component, onWillUpdateProps, useState, useRef, useEffect} from "@odoo/owl"; +import {Component} from "@odoo/owl"; export class StepViewer extends Component { setup() { @@ -35,11 +29,11 @@ export class StepViewer extends Component { } url = url_props['base_url'].replace('http://', 'https://') + '/web/content/' + url_props['model'] + '/' + url_props['id'] + '/' + url_props['field'] + '?download=true' // url = 'http://localhost:8069'+'/web/content/'+url_props['model']+'/'+url_props['id']+'/'+url_props['field']+'?download=true' - console.log('url111111', url) + // console.log('url111111', url) return url } else { url = "data:model/gltf-binary;base64," + this.props.value; - console.log('url2', url) + // console.log('url2', url) return url // localStorage.setItem('url',url) // let new_url = localStorage.getItem(('url')) From 890b73e108e5fdb4f53fc0641fcc0acc3a6a6a00 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Tue, 21 Nov 2023 14:18:01 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E4=BC=98=E5=8C=96js=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=BF=87=E9=95=BF=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9C=AA=E7=94=A8=E5=88=B0=E7=9A=84=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/src/list/custom_width.js | 17 +++-- .../static/src/js/barcode_button.js | 72 +++++++++---------- .../static/src/js/kanban_change.js | 3 +- sf_warehouse/__init__.py | 1 - 4 files changed, 49 insertions(+), 44 deletions(-) diff --git a/jikimo_frontend/static/src/list/custom_width.js b/jikimo_frontend/static/src/list/custom_width.js index 63da7fdd..ba35c605 100644 --- a/jikimo_frontend/static/src/list/custom_width.js +++ b/jikimo_frontend/static/src/list/custom_width.js @@ -45,7 +45,8 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { setDefaultColumnWidths(column_num) { // const bbb = this.state.columns[0].name - const widths = this.state.columns.map((col) => this.calculateColumnWidth(col)); + const widths = this.state.columns.map((col) => + this.calculateColumnWidth(col)); // const sumOfRelativeWidths = (widths // .filter(({ type }) => type === "relative") // .reduce((sum, { value }) => sum + value, 0)); @@ -65,16 +66,19 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { // } // 判断 this.state.columns 是否存在且长度大于零 - if (this.state.columns && this.state.columns.length > 0 && this.state.columns[0].name === "sequence") { + if (this.state.columns && this.state.columns.length > 0 && + this.state.columns[0].name === "sequence") { widths[1] = { type: "relative", value: 0.1 }; } - // 1 because nth-child selectors are 1-indexed, 2 when the first column contains + // 1 because nth-child selectors are 1-indexed, + // 2 when the first column contains // the checkboxes to select records. const columnOffset = this.hasSelectors ? 2 : 1; - widths.forEach(({ type, value }, i) => { - const headerEl = this.tableRef.el.querySelector(`th:nth-child(${i + columnOffset})`); + widths.forEach(({ type, value }, width) => { + const headerEl = this.tableRef.el.querySelector( + `th:nth-child(${width + columnOffset})`); if (type === "absolute") { if (this.isEmpty) { headerEl.style.width = value; @@ -82,7 +86,8 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { headerEl.style.minWidth = value; } } else if (type === "relative" && this.isEmpty) { - headerEl.style.width = `${((value / column_num) * 100).toFixed(2)}%`; + headerEl.style.width = `${((value / column_num) * 100 + ).toFixed(2)}%`; } }); }, diff --git a/sf_machine_connect/static/src/js/barcode_button.js b/sf_machine_connect/static/src/js/barcode_button.js index a050b35a..e7d9f879 100644 --- a/sf_machine_connect/static/src/js/barcode_button.js +++ b/sf_machine_connect/static/src/js/barcode_button.js @@ -1,7 +1,7 @@ /** @odoo-module **/ -import { browser } from "@web/core/browser/browser"; -import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; +// import { browser } from "@web/core/browser/browser"; +// import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; const { Component } = owl; import { standardFieldProps } from "@web/views/fields/standard_field_props"; import {registry} from "@web/core/registry"; @@ -23,19 +23,19 @@ export class CodeField extends Component { this.record = this.props.record; } - async onBarcodeBtnClick() { - const barcode = await BarcodeScanner.scanBarcode(); - if (barcode) { - await this.onBarcodeScanned(barcode); - if ("vibrate" in browser.navigator) { - browser.navigator.vibrate(100); - } - } else { - this.notification.add(this.env._t("Please, scan again !"), { - type: "warning", - }); - } - } + // async onBarcodeBtnClick() { + // const barcode = await BarcodeScanner.scanBarcode(); + // if (barcode) { + // await this.onBarcodeScanned(barcode); + // if ("vibrate" in browser.navigator) { + // browser.navigator.vibrate(100); + // } + // } else { + // this.notification.add(this.env._t("Please, scan again !"), { + // type: "warning", + // }); + // } + // } async search(barcode) { // alert('我是search') const domain = [["code", "=", barcode]]; @@ -65,33 +65,33 @@ export class CodeField extends Component { // console.log('currentModel',this) // console.log('this.record.data',this.record.data) // console.log('this.record.data.id', this.record.data.id) - const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]); + // const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]); // console.log('workorder', workorder[0]) - const updatedRecord = await this.orm.call("sf.tray", "write", [ - [records[0].id], - { - state: "占用", - workorder_id: workorder[0].id, - production_id: workorder[0].product_id[0], - // workorder_id: workorder.id, - }]); + // const updatedRecord = await this.orm.call("sf.tray", "write", [ + // [records[0].id], + // { + // state: "占用", + // workorder_id: workorder[0].id, + // production_id: workorder[0].product_id[0], + // // workorder_id: workorder.id, + // }]); // console.log(workorder[0].routing_type); // console.log(workorder[0].production_id); // const productionIDS = await this.orm.call('mrp.production', 'search', [[['id', '=', workorder[0].production_id[0]]]]); - const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]); + // const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]); // console.log('prooooooo', productionIDS); // console.log('values', records[0].values[0]); - productionIDS.forEach(async (data) => { - // 处理每一个数据 - // console.log(data); - const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [ - [data], - { - tray_id: records[0].values[0].id, - // tray_id: false, - }]); - // console.log(updatetrayRecord) - }); + // productionIDS.forEach(async (data) => { + // // 处理每一个数据 + // // console.log(data); + // const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [ + // [data], + // { + // tray_id: records[0].values[0].id, + // // tray_id: false, + // }]); + // // console.log(updatetrayRecord) + // }); this.props.update(records[0].code); $('.o_form_button_save').click(); } else { diff --git a/sf_manufacturing/static/src/js/kanban_change.js b/sf_manufacturing/static/src/js/kanban_change.js index 1f25caf4..bc0fd418 100644 --- a/sf_manufacturing/static/src/js/kanban_change.js +++ b/sf_manufacturing/static/src/js/kanban_change.js @@ -21,7 +21,8 @@ class CustomKanbanController extends KanbanController { // console.log(typeof this.workOrders); // console.log(Array.isArray(this.workOrders)); // - // console.log(this.workOrders.every(order => typeof order === 'object' && order.id !== undefined)); + // console.log(this.workOrders.every(order => + // typeof order === 'object' && order.id !== undefined)); diff --git a/sf_warehouse/__init__.py b/sf_warehouse/__init__.py index 815c355c..c081ee06 100644 --- a/sf_warehouse/__init__.py +++ b/sf_warehouse/__init__.py @@ -1,3 +1,2 @@ # -*-coding:utf-8-*- from . import models - From 6ec6094c5e6ca2e1696c52637ac53079b46ff3c3 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Tue, 21 Nov 2023 16:10:05 +0800 Subject: [PATCH 09/15] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E9=94=80=E5=94=AE?= =?UTF-8?q?=E5=92=8C=E8=AE=A1=E5=88=92=E6=9D=83=E9=99=90=E7=BB=842.?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/models/functional_fixture.py | 4 +- sf_base/models/tool_base_new.py | 56 ------------------- sf_base/models/tool_other_features.py | 11 ++-- sf_base/security/group_security.xml | 28 ++++++++++ sf_bf_connect/controllers/__init__.py | 1 + sf_bf_connect/controllers/controllers.py | 4 +- sf_bf_connect/models/process_status.py | 20 +++---- sf_dlm/__init__.py | 1 + sf_manufacturing/__init__.py | 2 - sf_manufacturing/__manifest__.py | 3 - .../models/mrp_routing_workcenter.py | 2 +- sf_manufacturing/models/mrp_workcenter.py | 4 +- sf_manufacturing/models/mrp_workorder.py | 7 +-- sf_manufacturing/models/product_template.py | 12 ++-- sf_manufacturing/models/stock.py | 13 +++-- sf_mrs_connect/models/__init__.py | 1 + sf_mrs_connect/models/ftp_operate.py | 4 +- sf_sale/models/sale_order.py | 13 +++-- sf_wxwork_approval/controllers/controllers.py | 5 +- sf_wxwork_approval/models/__init__.py | 3 +- .../models/wxwork_approval_template.py | 2 - 21 files changed, 85 insertions(+), 111 deletions(-) diff --git a/sf_base/models/functional_fixture.py b/sf_base/models/functional_fixture.py index 854ba53e..b0659da9 100644 --- a/sf_base/models/functional_fixture.py +++ b/sf_base/models/functional_fixture.py @@ -5,7 +5,6 @@ from odoo.addons.sf_base.commons.common import Common from odoo.exceptions import ValidationError - class FunctionalFixtureType(models.Model): _name = 'sf.functional.fixture.type' _description = "功能夹具类型" @@ -63,7 +62,8 @@ class FunctionalFixture(models.Model): def _get_name(self): for record in self: if record.type: - if not record.transfer_tray_model_ids and not record.pneumatic_tray_model_ids and not record.magnetic_tray_model_ids and not record.vice_tray_model_ids: + if not record.transfer_tray_model_ids and not record.pneumatic_tray_model_ids and \ + not record.magnetic_tray_model_ids and not record.vice_tray_model_ids: record.name = '' if record.transfer_tray_model_ids: for i in record.transfer_tray_model_ids: diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py index 4d4c702a..11af399c 100644 --- a/sf_base/models/tool_base_new.py +++ b/sf_base/models/tool_base_new.py @@ -2,11 +2,6 @@ from odoo import fields, models, api -# from datetime import datetime -# from odoo.exceptions import ValidationError - - -# 刀具物料 class CuttingToolMaterial(models.Model): _name = 'sf.cutting.tool.material' _description = '刀具物料' @@ -28,57 +23,6 @@ class FunctionalCuttingTool(models.Model): mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') - # # 整体式刀具型号 - # mrs_cutting_tool_integral_model_ids = fields.Many2many('sf.cutting.tool.model', 'rel_integral_model_functional_sf', - # string='整体式刀具型号', domain= - # [('cutting_tool_type', '=', '整体式刀具')]) - # # 刀片型号 - # mrs_cutting_tool_blade_model_ids = fields.Many2many('sf.cutting.tool.model', 'rel_blade_model_functional_sf', - # string='刀片型号', domain= - # [('cutting_tool_type', '=', '刀片')]) - # # 刀杆型号 - # mrs_cutting_tool_cutterbar_model_ids = fields.Many2many('sf.cutting.tool.model', - # 'rel_cutterbar_model_functional_sf', - # string='刀杆型号', domain= - # [('cutting_tool_type', '=', '刀杆')]) - # # 刀盘型号 - # mrs_cutting_tool_cutterpad_model_ids = fields.Many2many('sf.cutting.tool.model', - # 'rel_cutterpad_model_functional_sf', - # string='刀盘型号', domain= - # [('cutting_tool_type', '=', '刀盘')]) - # # 刀柄型号 - # mrs_cutting_tool_cutterhandle_model_ids = fields.Many2many('sf.cutting.tool.model', - # 'rel_cutterhandle_model_functional_sf', - # string='刀柄型号', - # domain= - # [('cutting_tool_type', '=', '刀柄')]) - # # 夹头型号 - # mrs_cutting_tool_cutterhead_model_ids = fields.Many2many('sf.cutting.tool.model', - # 'rel_cutterhead_model_functional_sf', - # string='夹头型号', domain= - # [('cutting_tool_type', '=', '夹头')]) - # - # diameter = fields.Float('直径(mm)') - # tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - # string='刀具等级') - # machining_accuracy = fields.Float('加工精度(mm)') - # tool_length = fields.Float('装刀长') - # blade_number = fields.Integer('刃数') - # integral_blade_length = fields.Float('整体刃长(mm)') - # effective_blade_length = fields.Float('有效刃长(mm)') - # max_life = fields.Float('最大寿命值') - # is_standard = fields.Boolean('是否标准刀') - # applicable_range = fields.Char('适用范围') - # image = fields.Binary('图片') - # active = fields.Boolean('有效', default=True) - # - # def _get_functional_tool_model_ids(self, functional_tool_model_code): - # functional_tool_model_ids = [] - # for item in functional_tool_model_code: - # functional_tool_model = self.env['sf.cutting.tool.model'].search([('code', '=', item)]) - # functional_tool_model_ids.append(functional_tool_model.id) - # return [(6, 0, functional_tool_model_ids)] - # 功能刀具类型 class FunctionalCuttingToolModel(models.Model): diff --git a/sf_base/models/tool_other_features.py b/sf_base/models/tool_other_features.py index 84846c29..acbb569d 100644 --- a/sf_base/models/tool_other_features.py +++ b/sf_base/models/tool_other_features.py @@ -53,7 +53,8 @@ class ToolMaterialsBasicParameters(models.Model): top_angle = fields.Integer('顶角(°)') blade_tip_dip_angle = fields.Integer('刀尖倾角(°)') side_cutting_edge_angle = fields.Integer('侧切削角(°)') - thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型', default='无') + thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型', + default='无') thread_num = fields.Float('每英寸螺纹数(tpi)') blade_tip_height_tolerance = fields.Char('刀尖高度公差(mm)', size=20) inscribed_circle_tolerance = fields.Char('内接圆公差(mm)', size=20) @@ -199,8 +200,8 @@ class ToolMaterialsBasicParameters(models.Model): 'is_cooling_hole': obj['is_cooling_hole'], 'locating_slot_code': obj['locating_slot_code'], 'installing_structure': obj['installing_structure'], - 'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids( - obj['blade_codes']), + 'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else + self.evn['sf.cutting_tool.standard.library']._get_ids(obj['blade_codes']), 'tool_shim': obj['tool_shim'], 'cotter_pin': obj['cotter_pin'], 'pressing_plate': obj['pressing_plate'], @@ -222,8 +223,8 @@ class ToolMaterialsBasicParameters(models.Model): 'cutting_depth': obj['cutting_depth'], 'main_included_angle': obj['main_included_angle'], 'installing_structure': obj['installing_structure'], - 'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids( - obj['blade_codes']), + 'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else + self.evn['sf.cutting_tool.standard.library']._get_ids(obj['blade_codes']), 'screw': obj['screw'], 'spanner': obj['spanner'], 'cutting_blade_model': obj['cutting_blade_model'], diff --git a/sf_base/security/group_security.xml b/sf_base/security/group_security.xml index b8668782..cfe816dd 100644 --- a/sf_base/security/group_security.xml +++ b/sf_base/security/group_security.xml @@ -1,4 +1,32 @@ + + 计划 + 20 + + + + 销售经理 + + + + + + + + + + + + 计划调度岗 + + + + + + 计划总监 + + + \ No newline at end of file diff --git a/sf_bf_connect/controllers/__init__.py b/sf_bf_connect/controllers/__init__.py index 6d07f482..b2809a39 100644 --- a/sf_bf_connect/controllers/__init__.py +++ b/sf_bf_connect/controllers/__init__.py @@ -1,2 +1,3 @@ from .import controllers + diff --git a/sf_bf_connect/controllers/controllers.py b/sf_bf_connect/controllers/controllers.py index de974b05..1a5f3fa5 100644 --- a/sf_bf_connect/controllers/controllers.py +++ b/sf_bf_connect/controllers/controllers.py @@ -59,7 +59,7 @@ class Sf_Bf_Connect(http.Controller): self_machining_bom_line = self_machining_bom.with_user( request.env.ref("base.user_admin")).bom_create_line( self_machining_embryo) - if self_machining_bom_line is False: + if not self_machining_bom_line: res['status'] = 2 res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配' request.cr.rollback() @@ -84,7 +84,7 @@ class Sf_Bf_Connect(http.Controller): # 创建坯料的bom的组件 outsource_bom_line = outsource_bom.with_user( request.env.ref("base.user_admin")).bom_create_line(outsource_embryo) - if outsource_bom_line is False: + if not outsource_bom_line: res['status'] = 2 res['message'] = '该订单模型的材料型号在您分配的工厂里暂未有原材料,请先配置再进行分配' request.cr.rollback() diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py index 069ef2d4..a912d939 100644 --- a/sf_bf_connect/models/process_status.py +++ b/sf_bf_connect/models/process_status.py @@ -1,10 +1,7 @@ from datetime import datetime import logging import requests -from odoo import api, fields, models, SUPERUSER_ID, _ -from odoo.exceptions import UserError -from odoo.exceptions import ValidationError -from collections import defaultdict, namedtuple +from odoo import fields, models _logger = logging.getLogger(__name__) @@ -197,19 +194,20 @@ class FinishStatusChange(models.Model): if self.user_has_groups('stock.group_reception_report') \ and self.picking_type_id.auto_show_reception_report: lines = self.move_ids.filtered(lambda - m: m.product_id.type == 'product' and m.state != 'cancel' and m.quantity_done and not m.move_dest_ids) + m: m.product_id.type == 'product' and m.state != 'cancel' + and m.quantity_done and not m.move_dest_ids) if lines: # don't show reception report if all already assigned/nothing to assign wh_location_ids = self.env['stock.location']._search( [('id', 'child_of', self.picking_type_id.warehouse_id.view_location_id.id), ('usage', '!=', 'supplier')]) if self.env['stock.move'].search([ - ('state', 'in', ['confirmed', 'partially_available', 'waiting', 'assigned']), - ('product_qty', '>', 0), - ('location_id', 'in', wh_location_ids), - ('move_orig_ids', '=', False), - ('picking_id', 'not in', self.ids), - ('product_id', 'in', lines.product_id.ids)], limit=1): + ('state', 'in', ['confirmed', 'partially_available', 'waiting', 'assigned']), + ('product_qty', '>', 0), + ('location_id', 'in', wh_location_ids), + ('move_orig_ids', '=', False), + ('picking_id', 'not in', self.ids), + ('product_id', 'in', lines.product_id.ids)], limit=1): action = self.action_view_reception_report() action['context'] = {'default_picking_ids': self.ids} return action diff --git a/sf_dlm/__init__.py b/sf_dlm/__init__.py index 0650744f..899bcc97 100644 --- a/sf_dlm/__init__.py +++ b/sf_dlm/__init__.py @@ -1 +1,2 @@ from . import models + diff --git a/sf_manufacturing/__init__.py b/sf_manufacturing/__init__.py index 7c378d64..0650744f 100644 --- a/sf_manufacturing/__init__.py +++ b/sf_manufacturing/__init__.py @@ -1,3 +1 @@ from . import models - - diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index 9800bf5d..a9a2226a 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -16,15 +16,12 @@ 'security/group_security.xml', 'security/ir.model.access.csv', 'views/mrp_production_addional_change.xml', - # 'views/mrp_maintenance_views.xml', 'views/mrp_routing_workcenter_view.xml', 'views/production_line_view.xml', 'views/mrp_workcenter_views.xml', 'views/mrp_workorder_view.xml', 'views/model_type_view.xml', 'views/sf_maintenance_equipment.xml', - # 'views/kanban_change.xml' - ], 'assets': { diff --git a/sf_manufacturing/models/mrp_routing_workcenter.py b/sf_manufacturing/models/mrp_routing_workcenter.py index 27324e40..807dfbb5 100644 --- a/sf_manufacturing/models/mrp_routing_workcenter.py +++ b/sf_manufacturing/models/mrp_routing_workcenter.py @@ -1,5 +1,5 @@ -from odoo import fields, models import logging +from odoo import fields, models class ResMrpRoutingWorkcenter(models.Model): diff --git a/sf_manufacturing/models/mrp_workcenter.py b/sf_manufacturing/models/mrp_workcenter.py index 54d5e9a0..1aa8ae5e 100644 --- a/sf_manufacturing/models/mrp_workcenter.py +++ b/sf_manufacturing/models/mrp_workcenter.py @@ -1,6 +1,6 @@ -from odoo import api, fields, models -from datetime import datetime +import datetime from collections import defaultdict +from odoo import fields, models from odoo.addons.resource.models.resource import Intervals diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index a2d81e68..06c2b293 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1,9 +1,8 @@ import os -import json +import base64 import math import requests import logging -import base64 # import subprocess from datetime import datetime from dateutil.relativedelta import relativedelta @@ -304,7 +303,7 @@ class ResMrpWorkOrder(models.Model): # 验证坯料序列号是否正确 def pro_code_is_ok(self, barcode): - if barcode != False: + if barcode is not False: if barcode != self.pro_code: raise UserError('坯料序列号错误') return False @@ -623,7 +622,7 @@ class CNCprocessing(models.Model): if os.path.splitext(f)[1] == ".pdf": full_path = os.path.join(serverdir, root, f) logging.info('pdf:%s' % full_path) - if full_path != False: + if full_path is not False: if not cnc_processing.workorder_id.cnc_worksheet: cnc_processing.workorder_id.cnc_worksheet = base64.b64encode( open(full_path, 'rb').read()) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 59ae7f6a..f262d13c 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -287,12 +287,12 @@ class ResProductMo(models.Model): self.cutting_tool_flange_length = self.specification_id.flange_shank_length self.cutting_tool_shank_outer_diameter = self.specification_id.handle_external_diameter self.cutting_tool_shank_inner_diameter = self.specification_id.handle_inside_diameter - self.suitable_machining_method_ids = [(6, 0, - [])] if not self.cutting_tool_model_id.suitable_machining_method_ids else [ - (6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)] - self.blade_tip_characteristics_id = [(6, 0, - [])] if not self.cutting_tool_model_id.blade_tip_characteristics_id else [ - (6, 0, self.cutting_tool_model_id.blade_tip_characteristics_id.ids)] + self.suitable_machining_method_ids = [(6, 0, [])] if not \ + self.cutting_tool_model_id.suitable_machining_method_ids \ + else [(6, 0, self.cutting_tool_model_id.suitable_machining_method_ids.ids)] + self.blade_tip_characteristics_id = [(6, 0,[])] if not \ + self.cutting_tool_model_id.blade_tip_characteristics_id \ + else [(6, 0, self.cutting_tool_model_id.blade_tip_characteristics_id.ids)] self.handle_type_ids = [(6, 0, [])] if not self.cutting_tool_model_id.handle_type_ids else [ diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 8e5567eb..1fe97ede 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -187,7 +187,6 @@ class StockRule(models.Model): values={'self': production, 'origin': origin_production}, subtype_id=self.env.ref('mail.mt_note').id) - ''' 创建生产计划 ''' @@ -404,7 +403,8 @@ class ReStockMove(models.Model): 'fixture_clamp_workpiece_diameter_max': item.product_id.fixture_clamp_workpiece_diameter_max, 'fixture_maximum_carrying_weight': item.product_id.fixture_maximum_carrying_weight, 'fixture_maximum_clamping_force': item.product_id.fixture_maximum_clamping_force, - 'fixture_driving_way': '' if not item.product_id.fixture_driving_way else item.product_id.fixture_driving_way, + 'fixture_driving_way': '' if not item.product_id.fixture_driving_way else + item.product_id.fixture_driving_way, 'fixture_apply_machine_tool_type_codes': self.env[ 'product.template']._json_apply_machine_tool_type_item_code(item), 'fixture_through_hole_size': item.product_id.fixture_through_hole_size, @@ -463,12 +463,14 @@ class ReStockMove(models.Model): '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, + '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': '' if item.product_id.cutting_tool_blade_number is False else 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, @@ -512,7 +514,8 @@ class ReStockMove(models.Model): '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'), + '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: diff --git a/sf_mrs_connect/models/__init__.py b/sf_mrs_connect/models/__init__.py index 0d47aefc..cfaee631 100644 --- a/sf_mrs_connect/models/__init__.py +++ b/sf_mrs_connect/models/__init__.py @@ -3,3 +3,4 @@ from . import res_config_setting from . import sync_common + diff --git a/sf_mrs_connect/models/ftp_operate.py b/sf_mrs_connect/models/ftp_operate.py index 4bd1200c..2ef43467 100644 --- a/sf_mrs_connect/models/ftp_operate.py +++ b/sf_mrs_connect/models/ftp_operate.py @@ -18,7 +18,7 @@ class FtpController(): self.ftp.connect(host, port) self.ftp.login(username, password) logging.info("ftp连接成功") - except: + except Exception: logging.info("ftp连接失败") # 下载目录下的文件 @@ -35,7 +35,7 @@ class FtpController(): server = os.path.join(serverdir, file) if file.find(".") != -1: self.download_file(server, file) - except: + except Exception: return False # 下载指定目录下的指定文件 diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index ee799cab..93d67e37 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -1,19 +1,25 @@ import datetime import base64 -import logging from odoo import models, fields class ReSaleOrder(models.Model): _inherit = 'sale.order' - deadline_of_delivery = fields.Date('订单交期') + deadline_of_delivery = fields.Date('订单交期', tracking=True) person_of_delivery = fields.Char('交货人') telephone_of_delivery = fields.Char('交货人电话号码') address_of_delivery = fields.Char('交货人地址') - payments_way = fields.Selection([('现结', '现结'), ('月结', '月结')], '结算方式', default='现结') + payments_way = fields.Selection([('现结', '现结'), ('月结', '月结')], '结算方式', default='现结', tracking=True) pay_way = fields.Selection([('转账', '转账'), ('微信', '微信'), ('支付宝', '支付宝')], '支付方式') + payment_term_id = fields.Many2one( + comodel_name='account.payment.term', + string="交付条件", + compute='_compute_payment_term_id', + store=True, readonly=False, precompute=True, check_company=True, tracking=True, + domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") + # 业务平台分配工厂后在智能工厂先创建销售订单 def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address, deadline_of_delivery, payments_way, pay_way): @@ -62,4 +68,3 @@ class ResaleOrderLine(models.Model): _inherit = 'sale.order.line' model_glb_file = fields.Binary('模型的glb文件') - diff --git a/sf_wxwork_approval/controllers/controllers.py b/sf_wxwork_approval/controllers/controllers.py index bc981b49..95c4d2d3 100644 --- a/sf_wxwork_approval/controllers/controllers.py +++ b/sf_wxwork_approval/controllers/controllers.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -import requests import logging +import requests from odoo import http from odoo.http import request @@ -36,7 +36,8 @@ class WechatAuthController(http.Controller): if not user: # 获取企业微信用户详细信息 - user_detail_url = f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={user_id}' + user_detail_url = \ + f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&userid={user_id}' user_detail_response = requests.get(user_detail_url).json() # 创建 Odoo 用户 diff --git a/sf_wxwork_approval/models/__init__.py b/sf_wxwork_approval/models/__init__.py index 795635d9..b4285bdc 100644 --- a/sf_wxwork_approval/models/__init__.py +++ b/sf_wxwork_approval/models/__init__.py @@ -6,6 +6,5 @@ from . import wxwork_settings from . import wxwork_approval_template_summary from . import we_approval_record from . import wx_work_api - from . import wxwork_approval -# from . import res_config_setting + diff --git a/sf_wxwork_approval/models/wxwork_approval_template.py b/sf_wxwork_approval/models/wxwork_approval_template.py index 2757188b..1620ccd8 100644 --- a/sf_wxwork_approval/models/wxwork_approval_template.py +++ b/sf_wxwork_approval/models/wxwork_approval_template.py @@ -39,5 +39,3 @@ class WxWorkApprovalTemplate(models.Model): def _compute_related_records_count(self): for record in self: record.related_records_count = len(record.summary_info_ids) - - From 8a1dfe14e6cb49d4526265ee12519403f250ae5c Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Tue, 21 Nov 2023 17:26:18 +0800 Subject: [PATCH 10/15] =?UTF-8?q?1=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80?= =?UTF-8?q?=E5=85=B7=E5=88=97=E8=A1=A8=E6=A8=A1=E5=9E=8B=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=AD=97=E6=AE=B5=EF=BC=9B2=E3=80=81?= =?UTF-8?q?=E6=9C=BA=E5=8F=B0=E6=8D=A2=E5=88=80=E7=94=B3=E8=AF=B7=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=A0=B9=E6=8D=AE=E6=8A=A5=E8=AD=A6=E5=80=BC=E5=92=8C?= =?UTF-8?q?=E6=9C=89=E6=95=88=E5=80=BC=E8=AE=A1=E7=AE=97=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=8A=B6=E6=80=81=EF=BC=8C=E9=87=8D=E6=9E=84=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E8=87=AA=E5=8A=A8=E6=8D=A2=E5=88=80=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=92=A4=E9=94=80=E6=8D=A2=E5=88=80=E7=94=B3=E8=AF=B7=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=9B3=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80?= =?UTF-8?q?=E5=85=B7=E7=BB=84=E8=A3=85=E5=8D=95=E6=A8=A1=E5=9E=8B=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=A4=A7=E9=87=8F=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96tree=E8=A7=86=E5=9B=BE=E5=92=8Cform=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E5=B8=83=E5=B1=80=EF=BC=9B4=E3=80=81=E7=BB=84?= =?UTF-8?q?=E8=A3=85=E5=8D=95=E5=BC=B9=E7=AA=97=E6=A8=A1=E5=9E=8B=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=A4=A7=E9=87=8F=E5=AD=97=E6=AE=B5=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=A1=AE=E8=AE=A4=E7=BB=84=E8=A3=85=E6=8C=89=E9=94=AE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/base.py | 195 ++++--- sf_tool_management/views/tool_base_views.xml | 90 ++- sf_tool_management/wizard/wizard.py | 146 +++-- sf_tool_management/wizard/wizard_view.xml | 563 ++++++++++--------- 4 files changed, 568 insertions(+), 426 deletions(-) diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 4cbfbe06..1a7067cb 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from datetime import timedelta + from odoo import fields, models, api from odoo import SUPERUSER_ID from odoo.exceptions import ValidationError @@ -14,13 +16,29 @@ class FunctionalCuttingToolEntity(models.Model): _description = '功能刀具列表' # code = fields.Char('序列号') + name = fields.Char(related='functional_tool_name_id.name') + functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称', readonly=True) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - name = fields.Char(related='barcode_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True) + functional_tool_diameter = fields.Integer(string='刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) + tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + tool_room_num = fields.Integer(string='刀具房数量') + line_edge_knife_library_num = fields.Integer(string='线边刀库数量') + machine_knife_library_num = fields.Integer(string='机内刀库数量') + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], + string='状态', store=True, default='正常') + @api.model def _read_group_mrs_cutting_tool_type_id(self, categories, domain, order): mrs_cutting_tool_type_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) @@ -175,7 +193,7 @@ class FunctionalToolWarning(models.Model): self.is_standard = self.functional_cutting_tool_id.is_standard # 功能刀具预警 特有字段 - outbound_time = fields.Datetime('出库时间', readonly=True, related='functional_tool_assembly_id.receive_time') + outbound_time = fields.Datetime('出库时间', readonly=True) on_board_time = fields.Datetime('上机时间', readonly=False) machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True, group_expand='_read_group_machine_table_name_ids') @@ -462,18 +480,18 @@ class MachineTableToolChangingApply(models.Model): tool_position_interface_type = fields.Selection( [('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'), ('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'), - ('直装固定式', '直装固定式')], string='刀位接口型号', requried=True) - diameter = fields.Integer(string='刀具直径(mm)', requried=True) - knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', requried=True) - max_lifetime_value = fields.Integer(string='最大寿命值(min)', requried=True) - alarm_value = fields.Integer(string='报警值(min)', requried=True) - used_value = fields.Integer(string='已使用值(min)', requried=True) + ('直装固定式', '直装固定式')], string='刀位接口型号', required=True) + diameter = fields.Integer(string='刀具直径(mm)', ) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)') + max_lifetime_value = fields.Integer(string='最大寿命值(min)') + alarm_value = fields.Integer(string='报警值(min)') + used_value = fields.Integer(string='已使用值(min)') whether_standard_knife = fields.Boolean(string='是否标准刀', default=True) - extension_length = fields.Float(string='伸出长(mm)', requried=True) - effective_length = fields.Float(string='有效长(mm)', requried=True) + extension_length = fields.Float(string='伸出长(mm)') + effective_length = fields.Float(string='有效长(mm)') - functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', - default='正常') + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警')], string='功能刀具状态', store=True, + default='正常', compute='_compute_functional_tool_status') assembly_order_code = fields.Char(string='组装单编码', readonly=True) applicant = fields.Char(string='申请人', readonly=True) @@ -485,6 +503,14 @@ class MachineTableToolChangingApply(models.Model): sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装单', readonly=True) + @api.depends('alarm_value', 'used_value') + def _compute_functional_tool_status(self): + for record in self: + if record.alarm_value <= record.used_value: + record.functional_tool_status = '报警' + else: + record.functional_tool_status = '正常' + @api.depends('maintenance_equipment_id') def _compute_machine_table_type_id(self): for record in self: @@ -511,54 +537,57 @@ class MachineTableToolChangingApply(models.Model): names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(names) - @api.onchange('functional_tool_status') + @api.constrains('functional_tool_status') def automation_apply_for_tool_change(self): """ 自动申请换刀 :return: """ # 更新数据到机台换刀申请界面 - # todo 自动换刀申请条件需补充完善 - if self.functional_tool_status == '报警': - self.env['sf.machine.table.tool.changing.apply'].search([ - ('name', '=', self.name.id)]).write({ - 'replacement_tool_name_id': self.functional_tool_name_id.id, - 'replacement_tool_type_id': self.functional_tool_type_id.id, - 'replacement_tool_coarse_middle_thin': self.coarse_middle_thin, - 'new_former': '0', - 'applicant': '自动申请', - 'used_tool_time': fields.Datetime.now(), - 'reason_for_applying': '功能刀具状态异常', - 'remark': None, - 'status': '1' - }) + if self.functional_tool_status == '报警' and self.sf_functional_tool_assembly_id == False: + machine_table_tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search( + [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id) + ]) # 新建组装任务 - self.env['sf.functional.tool.assembly'].create({ - 'name': self.functional_tool_name_id, + sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].create({ + 'functional_tool_name': self.functional_tool_name, 'functional_tool_type_id': self.functional_tool_type_id.id, 'functional_tool_diameter': self.diameter, + 'knife_tip_r_angle': self.knife_tip_r_angle, + 'coarse_middle_thin': '3', + 'new_former': '0', + 'functional_tool_length': self.extension_length, + 'effective_length': self.effective_length, 'loading_task_source': '1', - 'applicant': '自动申请', - 'reason_for_applying': '功能刀具状态异常', - 'use_tool_time': self.used_tool_time, - 'machine_tool_name': self.CNC_machine_table, - 'machine_tool_code': self.machine_tool_code, - 'cutter_spacing_code_id': self.cutter_spacing_code_id, + 'use_tool_time': fields.Datetime.now() + timedelta(hours=4), + 'production_line_name_id': self.production_line_id.id, + 'machine_tool_name_id': self.maintenance_equipment_id.id, + 'applicant': self.applicant, + 'apply_time': fields.Datetime.now(), + 'cutter_spacing_code_id': self.cutter_spacing_code_id.id, + 'whether_standard_knife': self.whether_standard_knife, + 'reason_for_applying': '机台报警自动换刀', + 'sf_machine_table_tool_changing_apply_id': self.id }) - def new_assembly_task(self, vals): - """ - 新建组装任务 - :param vals: - :return: - """ - # 增加设置直径的值 - tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search( - [('name', '=', vals['name'])]) - vals['functional_tool_diameter'] = tool_changing_apply.diameter + machine_table_tool_changing_apply.write( + {'status': '1', + 'sf_functional_tool_assembly_id': sf_functional_tool_assembly}) - self.env['sf.functional.tool.assembly'].create(vals) + # def new_assembly_task(self, vals): + # """ + # 新建组装任务 + # :param vals: + # :return: + # """ + # # 增加设置直径的值 + # tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search( + # [('name', '=', vals['name'])]) + # vals['functional_tool_diameter'] = tool_changing_apply.diameter + # + # self.env['sf.functional.tool.assembly'].create(vals) def revocation_1(self): """ @@ -567,22 +596,16 @@ class MachineTableToolChangingApply(models.Model): """ # 撤回功能刀具组装创建的任务 self.env['sf.functional.tool.assembly'].search( - [('assembly_order_code', '=', self.assembly_order_code), + [('id', '=', self.sf_functional_tool_assembly_id.id), ('loading_task_source', '=', '1')]).unlink() # 撤回数据更新 - self.env['sf.machine.table.tool.changing.apply'].search([('name', '=', self.name.id)]).write({ - 'replacement_tool_name_id': None, - 'replacement_tool_type_id': None, - 'replacement_tool_coarse_middle_thin': None, - 'new_former': None, - 'applicant': None, - 'used_tool_time': None, - 'reason_for_applying': None, - 'remark': None, - 'status': '0', - 'sf_functional_tool_assembly_id': None, - }) + self.env['sf.machine.table.tool.changing.apply'].search( + [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)]).write( + {'status': '0', + 'sf_functional_tool_assembly_id': None + }) def revocation_2(self): """ @@ -590,9 +613,7 @@ class MachineTableToolChangingApply(models.Model): :return: """ self.env['sf.machine.table.tool.changing.apply'].search( - [('name', '=', self.name.id)]).write({ - 'status': '0' - }) + [('name', '=', self.name.id)]).write({'status': '0'}) class CAMWorkOrderProgramKnifePlan(models.Model): @@ -688,7 +709,12 @@ class FunctionalToolAssembly(models.Model): _description = '功能刀具组装单' _order = 'use_tool_time asc' - name = fields.Char(string='名称', readonly=True) + @api.depends('functional_tool_name') + def _compute_name(self): + for obj in self: + obj.name = obj.functional_tool_name + + name = fields.Char(string='名称', readonly=True, compute='_compute_name') assembly_order_code = fields.Char(string='编码', readonly=True) functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) @@ -705,13 +731,13 @@ class FunctionalToolAssembly(models.Model): loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], string='装刀任务来源', readonly=True) use_tool_time = fields.Datetime(string='用刀时间', readonly=True) - production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=False) + production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=True) machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True) machine_tool_code = fields.Char(string='机台号', readonly=True) applicant = fields.Char(string='申请人', readonly=True) apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) - assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', - default='0', readonly=True) + assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', default='0', + readonly=True) cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) reason_for_applying = fields.Char(string='申请原因', readonly=True) @@ -819,33 +845,29 @@ class FunctionalToolAssembly(models.Model): barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', readonly=True) after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', - string='组装后功能刀具类型', readonly=True, - group_expand='_read_group_functional_tool_type_ids') - after_assembly_functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True) - after_assembly_knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) - after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) - cut_time = fields.Char(string='已切削时间', readonly=True) - cut_length = fields.Char(string='已切削长度(mm)', readonly=True) - cut_number = fields.Char(string='已切削次数', readonly=True) + string='组装后功能刀具类型', readonly=True) + after_assembly_functional_tool_diameter = fields.Integer(string='组装后功能刀具直径(mm)', readonly=True) + after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', readonly=True) + after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧', readonly=True) + cut_time = fields.Integer(string='已切削时间(min)', readonly=True) + cut_length = fields.Float(string='已切削长度(mm)', readonly=True) + cut_number = fields.Integer(string='已切削次数', readonly=True) - after_assembly_whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True, readonly=True) after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], - string='粗/中/精', readonly=True) - after_assembly_max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) - after_assembly_alarm_value = fields.Integer(string='报警值(min)', readonly=True) - after_assembly_used_value = fields.Integer(string='已使用值(min)', readonly=True) - after_assembly_tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) - after_assembly_functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) - after_assembly_effective_length = fields.Float(string='有效长(mm)', readonly=True) + string='组装后粗/中/精', readonly=True) + after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)', readonly=True) + after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)', readonly=True) + after_assembly_used_value = fields.Integer(string='组装后已使用值(min)', readonly=True) + after_assembly_tool_loading_length = fields.Float(string='组装后装刀长(mm)', readonly=True) + after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', readonly=True) + after_assembly_effective_length = fields.Float(string='组装后有效长(mm)', readonly=True) L_D_number = fields.Float(string='L/D值(mm)', readonly=True) hiding_length = fields.Float(string='避空长(mm)', readonly=True) functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) - # cutter_spacing_code = fields.Char(string='刀位号', readonly=True) tool_loading_person = fields.Char(string='装刀人', readonly=True) tool_loading_time = fields.Datetime(string='装刀时间', readonly=True) - receive_person = fields.Char(string='领用人', readonly=True) - receive_time = fields.Datetime(string='领用出库时间', readonly=True) remark = fields.Char(string='备注说明', readonly=True) check_box_1 = fields.Boolean(string='复选框', default=False, readonly=False) @@ -902,5 +924,4 @@ class FunctionalToolAssembly(models.Model): if obj.loading_task_source: code = self._get_code(obj.loading_task_source) obj.assembly_order_code = code - obj.name = code return obj diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index 217400b9..b07fe225 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -765,7 +765,6 @@ 'default_replacement_knife_tip_r_angle': knife_tip_r_angle, 'default_replacement_max_lifetime_value': max_lifetime_value, 'default_replacement_alarm_value': alarm_value, - 'default_replacement_used_value': used_value, 'default_replacement_whether_standard_knife': whether_standard_knife, 'default_replacement_extension_length': extension_length, 'default_replacement_effective_length': effective_length, @@ -842,7 +841,6 @@ 'default_replacement_knife_tip_r_angle': knife_tip_r_angle, 'default_replacement_max_lifetime_value': max_lifetime_value, 'default_replacement_alarm_value': alarm_value, - 'default_replacement_used_value': used_value, 'default_replacement_whether_standard_knife': whether_standard_knife, 'default_replacement_extension_length': extension_length, 'default_replacement_effective_length': effective_length, @@ -880,6 +878,7 @@ + @@ -962,7 +961,7 @@ - + CAM工单程序用刀计划 sf.cam.work.order.program.knife.plan @@ -1103,27 +1102,35 @@ + - - - - - - - - - - @@ -1160,6 +1184,7 @@ + @@ -1177,16 +1202,34 @@ - - - - - - + + + + + + + + + + + + + + + + + + @@ -1291,7 +1334,8 @@ - 、 + + @@ -1299,11 +1343,9 @@ - - diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index 053ba39a..3c17bf47 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -32,21 +32,21 @@ class ToolChangeRequirementInformation(models.TransientModel): effective_length = fields.Float(string='有效长(mm)', readonly=True) # 待换功能刀具信息 - replacement_tool_name = fields.Char(string='待换功能刀具名称') + replacement_tool_name = fields.Char(string='待换功能刀具名称', required=True) replacement_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='待换功能刀具类型') - replacement_diameter = fields.Integer(string='待换刀具直径(mm)', requried=True) - replacement_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)', requried=True) - replacement_tool_setting_length = fields.Float(string='待换刀具装刀长(mm)', requried=True) - replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)', requried=True) - replacement_effective_length = fields.Float(string='待换刀具有效长(mm)', requried=True) + replacement_diameter = fields.Integer(string='待换刀具直径(mm)') + replacement_knife_tip_r_angle = fields.Float(string='待换刀具刀尖R角(mm)') + replacement_tool_setting_length = fields.Float(string='待换刀具装刀长(mm)') + replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)') + replacement_effective_length = fields.Float(string='待换刀具有效长(mm)') replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='待换刀具粗/中/精', default='3') - replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)', requried=True) - replacement_alarm_value = fields.Integer(string='待换刀具报警值(min)', requried=True) - replacement_used_value = fields.Integer(string='待换刀具已使用值(min)', requried=True) + replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)') + replacement_alarm_value = fields.Integer(string='待换刀具报警值(min)') + replacement_used_value = fields.Integer(string='待换刀具已使用值(min)') new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', default='0') - replacement_whether_standard_knife = fields.Boolean(string='待换刀具是否标准刀', default=True, requried=True) + replacement_whether_standard_knife = fields.Boolean(string='待换刀具是否标准刀', default=True) used_tool_time = fields.Datetime(string='用刀时间', default=lambda self: fields.Datetime.now() + timedelta(hours=4)) applicant = fields.Char(string='申请人', default=lambda self: self.env.user.name, readonly=True) @@ -83,7 +83,8 @@ class ToolChangeRequirementInformation(models.TransientModel): 'apply_time': fields.Datetime.now(), 'cutter_spacing_code_id': self.cutter_spacing_code_id.id, 'whether_standard_knife': self.whether_standard_knife, - 'reason_for_applying': self.reason_for_applying + 'reason_for_applying': self.reason_for_applying, + 'sf_machine_table_tool_changing_apply_id': record.id }) print('sf_functional_tool_assembly:', sf_functional_tool_assembly) # 修改机床换刀申请状态 @@ -129,7 +130,7 @@ class ToolTransferRequestInformation(models.TransientModel): ('线边刀库', '线边刀库'), ('刀具房', '刀具房')], string='转移到:', default='线边刀库') new_cnc_machine_table_id = fields.Many2one('sf.machine_tool', string='机床名称') - new_production_line_id = fields.Many2one('sf.production.line', string='生产线') + new_production_line_id = fields.Many2one('sf.production.line', string='目标生产线') new_machine_tool_code = fields.Char(string='机床号') new_cutter_spacing_code = fields.Char(string='目标刀位号') @@ -153,21 +154,33 @@ class FunctionalToolAssemblyOrder(models.TransientModel): _inherit = ["barcodes.barcode_events_mixin"] _description = '功能刀具组装单' - # 功能刀具申请信息 - machine_tool_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) + functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) + functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, + group_expand='_read_group_functional_tool_type_ids') + functional_tool_diameter = fields.Integer(string='功能刀具直径(mm)', readonly=True) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) + new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) + tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + effective_length = fields.Float(string='有效长(mm)', readonly=True) + loading_task_source = fields.Selection([('0', 'CAM装刀'), ('1', '机台换刀'), ('2', '按库存组装')], + string='装刀任务来源', readonly=True) + use_tool_time = fields.Datetime(string='用刀时间', readonly=True) + production_line_name_id = fields.Many2one('sf.production.line', string='申请产线', readonly=True) + machine_tool_name_id = fields.Many2one('maintenance.equipment', string='申请机台', readonly=True) machine_tool_code = fields.Char(string='机台号', readonly=True) - cutter_spacing_code = fields.Char(string='刀位号', readonly=True) - # code = fields.Char(string='功能刀具编码', readonly=True) - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) - functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True) - functional_tool_length = fields.Char(string='功能刀具伸出长(mm)', readonly=True) - effective_length = fields.Char(string='有效长(mm)', readonly=True) - functional_tool_diameter = fields.Char(string='功能刀具直径(mm)', readonly=True) - tool_included_angle = fields.Char(string='刀尖角(R角)', readonly=True) - functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=True) - required_cutting_time = fields.Char(string='需切削时长', readonly=True) - whether_standard_tool = fields.Boolean(string='是否标准刀', readonly=True) + applicant = fields.Char(string='申请人', readonly=True) + apply_time = fields.Datetime(string='申请时间', default=fields.Datetime.now(), readonly=True) + assemble_status = fields.Selection([('0', '待组装'), ('1', '已组装')], string='组装状态', default='0', + readonly=True) + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=True) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + reason_for_applying = fields.Char(string='申请原因', readonly=True) + max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) + alarm_value = fields.Integer(string='报警值(min)', readonly=True) + used_value = fields.Integer(string='已使用值(min)', readonly=True) # 功能刀具组装信息 # 整体式刀具型号 @@ -294,13 +307,30 @@ class FunctionalToolAssemblyOrder(models.TransientModel): record.chuck_name = None record.sf_tool_brand_id_6 = None - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', default='1') - tool_loading_length = fields.Char(string='装刀长') - new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', required=True, default='0') - reference_length = fields.Char(string='参考伸出长') - cut_time = fields.Char(string='已切削时间') - cut_length = fields.Char(string='已切削长度') - cut_number = fields.Char(string='已切削次数') + # 组装功能刀具参数信息 + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号') + after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', required=True) + after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', + string='组装后功能刀具类型') + after_assembly_functional_tool_diameter = fields.Integer(string='组装后功能刀具直径(mm)') + after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)') + after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧') + cut_time = fields.Integer(string='已切削时间(min)') + cut_length = fields.Float(string='已切削长度(mm)') + cut_number = fields.Integer(string='已切削次数') + + after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True) + after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='组装后粗/中/精') + after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)') + after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)') + after_assembly_used_value = fields.Integer(string='组装后已使用值(min)') + after_assembly_tool_loading_length = fields.Float(string='组装后装刀长(mm)') + after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)') + after_assembly_effective_length = fields.Float(string='组装后有效长(mm)') + L_D_number = fields.Float(string='L/D值(mm)') + hiding_length = fields.Float(string='避空长(mm)') + + functional_tool_cutting_type = fields.Char(string='功能刀具切削类型', readonly=False) def functional_tool_assembly(self): """ @@ -319,26 +349,26 @@ class FunctionalToolAssemblyOrder(models.TransientModel): desc_1 = self.get_desc_1(stock_lot) functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([ ('machine_tool_name_id', '=', self.machine_tool_name_id.id), - ('cutter_spacing_code', '=', self.cutter_spacing_code), + ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id), ('assemble_status', '=', '0'), ]) # 创建功能刀具列表记录 # 封装功能刀具数据 - desc_2 = self.get_desc_2(stock_lot) - # 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录 - record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) - self.env['sf.functional.tool.warning'].create({ - 'functional_cutting_tool_id': record_1.id, - 'functional_tool_assembly_id': functional_tool_assembly.id, - 'machine_table_name_id': self.machine_tool_name_id.id, - }) - self.env['sf.real.time.distribution.of.functional.tools'].create({ - 'functional_cutting_tool_id': record_1.id - }) - self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({ - 'functional_cutting_tool_id': record_1.id - }) + # desc_2 = self.get_desc_2(stock_lot) + # # 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录 + # record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) + # self.env['sf.functional.tool.warning'].create({ + # 'functional_cutting_tool_id': record_1.id, + # 'functional_tool_assembly_id': functional_tool_assembly.id, + # 'machine_table_name_id': self.machine_tool_name_id.id, + # }) + # self.env['sf.real.time.distribution.of.functional.tools'].create({ + # 'functional_cutting_tool_id': record_1.id + # }) + # self.env['sf.inbound.and.outbound.records.of.functional.tools'].create({ + # 'functional_cutting_tool_id': record_1.id + # }) # 修改功能刀具组装单信息 functional_tool_assembly.write(desc_1) @@ -458,13 +488,25 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 'pad_code_id': self.pad_code_id.id, 'handle_code_id': self.handle_code_id.id, 'chuck_code_id': self.chuck_code_id.id, - 'coarse_middle_thin': self.coarse_middle_thin, - 'tool_loading_length': self.tool_loading_length, - 'new_former': self.new_former, - 'reference_length': self.reference_length, + + 'after_assembly_functional_tool_name': self.after_assembly_functional_tool_name, + 'after_assembly_functional_tool_type_id': self.after_assembly_functional_tool_type_id.id, + 'after_assembly_functional_tool_diameter': self.after_assembly_functional_tool_diameter, + 'after_assembly_knife_tip_r_angle': self.after_assembly_knife_tip_r_angle, + 'after_assembly_new_former': self.after_assembly_new_former, 'cut_time': self.cut_time, 'cut_length': self.cut_length, 'cut_number': self.cut_number, + 'after_assembly_whether_standard_knife': self.after_assembly_whether_standard_knife, + 'after_assembly_coarse_middle_thin': self.after_assembly_coarse_middle_thin, + 'after_assembly_max_lifetime_value': self.after_assembly_max_lifetime_value, + 'after_assembly_alarm_value': self.after_assembly_alarm_value, + 'after_assembly_used_value': self.after_assembly_used_value, + 'after_assembly_tool_loading_length': self.after_assembly_tool_loading_length, + 'after_assembly_functional_tool_length': self.after_assembly_functional_tool_length, + 'after_assembly_effective_length': self.after_assembly_effective_length, + 'L_D_number': self.L_D_number, + 'hiding_length': self.hiding_length, 'assemble_status': '1', 'tool_loading_person': self.env.user.name, 'tool_loading_time': fields.Datetime.now() diff --git a/sf_tool_management/wizard/wizard_view.xml b/sf_tool_management/wizard/wizard_view.xml index caba3017..35db780f 100644 --- a/sf_tool_management/wizard/wizard_view.xml +++ b/sf_tool_management/wizard/wizard_view.xml @@ -1,67 +1,68 @@ - + - 换刀需求信息 - sf.tool.change.requirement.information - - - - - - - - + 换刀需求信息 + sf.tool.change.requirement.information + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -74,63 +75,71 @@ - + - 刀具转移申请信息 - sf.tool.transfer.request.information - - - - - - - - + 刀具转移申请信息 + sf.tool.transfer.request.information + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -143,187 +152,215 @@ - + - 功能刀具组装单 - sf.functional.tool.assembly.order - - - - + 功能刀具组装单 + sf.functional.tool.assembly.order + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + - - - - - - - + + + + + + + + + + - - - - - - + + + + + - - - - - - - - - - - - - - + - - - - + - - - + - - - - - - - - - - + + + + + - - - - + + + + + + - - - - - - - - - - - - - - + - - - - + - - - + - - - - - - - - - - + + + + + - - - - + + + + + + - - - - - - - - - - - - - - + - - - - + - - - + - - - - - - - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + From 423d5cec8e4c6d24e169f05079182035aa53dff9 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Tue, 21 Nov 2023 17:49:58 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E4=BC=98=E5=8C=96sf=5Fmachine=5Fconnect?= =?UTF-8?q?=E7=9A=84manifest=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_machine_connect/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sf_machine_connect/__manifest__.py b/sf_machine_connect/__manifest__.py index 6ee1a20a..abc524f1 100644 --- a/sf_machine_connect/__manifest__.py +++ b/sf_machine_connect/__manifest__.py @@ -39,7 +39,7 @@ ], }, - 'external_dependencies': {'python': ['opcua(使用pip install opcua -i https://pypi.tuna.tsinghua.edu.cn/simple)']}, + # 'external_dependencies': {'python': ['opcua(使用pip install opcua -i https://pypi.tuna.tsinghua.edu.cn/simple)']}, 'installable': True, 'application': True, From d6dcb6bf559b2bb3e79b643d1bd21e3b7229d1db Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Wed, 22 Nov 2023 09:54:31 +0800 Subject: [PATCH 12/15] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../static/src/js/custom_form_status_indicator.js | 5 +++-- jikimo_frontend/static/src/list/custom_width.js | 2 +- sf_bf_connect/models/jd_eclp.py | 2 +- sf_machine_connect/static/src/js/barcode_form.js | 4 ++-- sf_machine_connect/static/src/js/barcode_handler_field.js | 2 +- sf_warehouse/static/src/js/cust_char.js | 2 +- sf_warehouse/static/src/js/custom_many2one.js | 4 ++-- web_widget_model_viewer/static/src/js/3d_viewer.js | 6 +++--- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/jikimo_frontend/static/src/js/custom_form_status_indicator.js b/jikimo_frontend/static/src/js/custom_form_status_indicator.js index fd06fe75..a5f68479 100644 --- a/jikimo_frontend/static/src/js/custom_form_status_indicator.js +++ b/jikimo_frontend/static/src/js/custom_form_status_indicator.js @@ -11,7 +11,7 @@ var Dialog = require('web.Dialog'); patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', { // 你可以重写或者添加一些方法和属性 async _onDiscardChanges() { - var self = this; + // var self = this; Dialog.confirm(this, _t("Are you sure you want to discard changes?"), { title: _t("Discard Changes"), @@ -25,7 +25,8 @@ patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', { // if (window.confirm("Are you sure you want to discard changes?")) { // await this.props.discard(); // } - const result = await this._confirmDiscardChange(); + // const result = await this._confirmDiscardChange(); + await this._confirmDiscardChange(); await this.props.discard(); }, diff --git a/jikimo_frontend/static/src/list/custom_width.js b/jikimo_frontend/static/src/list/custom_width.js index ba35c605..31fd23ca 100644 --- a/jikimo_frontend/static/src/list/custom_width.js +++ b/jikimo_frontend/static/src/list/custom_width.js @@ -10,7 +10,7 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { // The following code manipulates the DOM directly to avoid having to wait for a // render + patch which would occur on the next frame and cause flickering. freezeColumnWidths() { - console.log('ccccccccccccccccccccccccccc') + // console.log('ccccccccccccccccccccccccccc') if (!this.keepColumnWidths) { this.columnWidths = null; } diff --git a/sf_bf_connect/models/jd_eclp.py b/sf_bf_connect/models/jd_eclp.py index 6f6b4ab6..a73a9bd0 100644 --- a/sf_bf_connect/models/jd_eclp.py +++ b/sf_bf_connect/models/jd_eclp.py @@ -1,4 +1,4 @@ -# import cpca +import cpca import base64 import logging from datetime import datetime diff --git a/sf_machine_connect/static/src/js/barcode_form.js b/sf_machine_connect/static/src/js/barcode_form.js index d8c898ae..f6190918 100644 --- a/sf_machine_connect/static/src/js/barcode_form.js +++ b/sf_machine_connect/static/src/js/barcode_form.js @@ -1,12 +1,12 @@ odoo.define('my_module.barcode_handler', function (require) { "use strict"; - var core = require('web.core'); + // var core = require('web.core'); var registry = require('web.field_registry'); var session = require('web.session'); var FieldChar = require('web.basic_fields').FieldChar; - var _t = core._t; + // var _t = core._t; var BarcodeHandlerField = FieldChar.extend({ init: function () { diff --git a/sf_machine_connect/static/src/js/barcode_handler_field.js b/sf_machine_connect/static/src/js/barcode_handler_field.js index 6d24d4c6..526f28d7 100644 --- a/sf_machine_connect/static/src/js/barcode_handler_field.js +++ b/sf_machine_connect/static/src/js/barcode_handler_field.js @@ -56,7 +56,7 @@ export class BarcodeHandlerField extends Component { // }); await this.actionService.doAction(response.result); } else { - console.error("Barcode not found or RPC call failed."); + // console.error("Barcode not found or RPC call failed."); } } diff --git a/sf_warehouse/static/src/js/cust_char.js b/sf_warehouse/static/src/js/cust_char.js index 5aa43927..3757bfb8 100644 --- a/sf_warehouse/static/src/js/cust_char.js +++ b/sf_warehouse/static/src/js/cust_char.js @@ -16,7 +16,7 @@ class CustomChar extends CharField { onMounted() { super.onMounted(); - console.log('CustomChar.onMounted1'); + // console.log('CustomChar.onMounted1'); // 当光标聚焦于输入框时,选中输入框内容 this.input.el.addEventListener('focus', function () { this.select(); diff --git a/sf_warehouse/static/src/js/custom_many2one.js b/sf_warehouse/static/src/js/custom_many2one.js index beb4783e..c6a86af5 100644 --- a/sf_warehouse/static/src/js/custom_many2one.js +++ b/sf_warehouse/static/src/js/custom_many2one.js @@ -14,11 +14,11 @@ class CustomMany2One extends Many2OneField { * @returns {Promise} */ setup() { - console.log('CustomMany2One.setup11111111111111'); + // console.log('CustomMany2One.setup11111111111111'); super.setup(); } onMounted() { - console.log('CustomMany2One.onMounted1'); + // console.log('CustomMany2One.onMounted1'); // 当光标聚焦于输入框时,选中输入框内容 this.input.el.addEventListener('focus', function () { this.select(); diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.js b/web_widget_model_viewer/static/src/js/3d_viewer.js index 9d3afd50..18b80052 100644 --- a/web_widget_model_viewer/static/src/js/3d_viewer.js +++ b/web_widget_model_viewer/static/src/js/3d_viewer.js @@ -5,10 +5,10 @@ import {_lt} from "@web/core/l10n/translation"; import {standardFieldProps} from "@web/views/fields/standard_field_props"; import {session} from "@web/session"; -import core from 'web.core'; +// import core from 'web.core'; -var QWeb = core.qweb; +// var QWeb = core.qweb; import {Component} from "@odoo/owl"; @@ -43,7 +43,7 @@ export class StepViewer extends Component { } } else { var oImg = document.getElementsByClassName('test')[0] - console.log(oImg) + // console.log(oImg) } } } From cc58425f50bb61b16ef4202e54dd7fed0e01a383 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Wed, 22 Nov 2023 10:29:04 +0800 Subject: [PATCH 13/15] =?UTF-8?q?=E8=A7=84=E8=8C=83=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/models/jd_eclp.py | 2 +- sf_manufacturing/static/src/js/kanban_change.js | 12 ++++++------ web_widget_model_viewer/static/src/js/3d_viewer.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sf_bf_connect/models/jd_eclp.py b/sf_bf_connect/models/jd_eclp.py index a73a9bd0..dfcb20f8 100644 --- a/sf_bf_connect/models/jd_eclp.py +++ b/sf_bf_connect/models/jd_eclp.py @@ -1,8 +1,8 @@ -import cpca import base64 import logging from datetime import datetime import requests +import cpca from odoo.exceptions import UserError from odoo.exceptions import ValidationError from odoo import api, fields, models, SUPERUSER_ID, _ diff --git a/sf_manufacturing/static/src/js/kanban_change.js b/sf_manufacturing/static/src/js/kanban_change.js index bc0fd418..72e7abbe 100644 --- a/sf_manufacturing/static/src/js/kanban_change.js +++ b/sf_manufacturing/static/src/js/kanban_change.js @@ -13,9 +13,9 @@ class CustomKanbanController extends KanbanController { async setup() { super.setup(); - console.log('99999999111'); + // console.log('99999999111'); this.workOrders = await this.getAllWorkOrders(); - this.workOrdersNew = this.workOrders; + // this.workOrdersNew = this.workOrders; // console.log('lines222222222', this.workOrders); // // console.log(typeof this.workOrders); @@ -39,14 +39,14 @@ class CustomKanbanController extends KanbanController { const id = button.getAttribute('data-id'); console.log('true_id', id); - const context = {production_line_show: 'shengchanxian1'} + // const context = {production_line_show: 'shengchanxian1'} this.env.services.rpc('/web/dataset/call_kw', { model: 'mrp.workcenter', method: 'search_read', args: [[], ['id']], kwargs: {} }).then((records) => { - console.log(records) + // console.log(records) const ids = records.map(record => record.id); const context = {production_line_show: id}; this.env.services.rpc('/web/dataset/call_kw', { @@ -55,7 +55,7 @@ class CustomKanbanController extends KanbanController { args: [ids, context], kwargs: {} }).then((response) => { - console.log('response', response); + // console.log('response', response); location.reload(); window.onload = function () { button.classList.add('choose') @@ -77,7 +77,7 @@ class CustomKanbanController extends KanbanController { // args: [], // kwargs: {}, // }); - console.log('response', response); + // console.log('response', response); // console.log('response1', response1); // 你可以在这里处理响应,例如将其存储在控制器的状态中 return response; diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.js b/web_widget_model_viewer/static/src/js/3d_viewer.js index 18b80052..3c66b142 100644 --- a/web_widget_model_viewer/static/src/js/3d_viewer.js +++ b/web_widget_model_viewer/static/src/js/3d_viewer.js @@ -42,7 +42,7 @@ export class StepViewer extends Component { // url = "web_widget_model_viewer/static/src/images/not_model.png"; } } else { - var oImg = document.getElementsByClassName('test')[0] + // var oImg = document.getElementsByClassName('test')[0] // console.log(oImg) } } From ae6ec7183e8dc4261c3a3fe0257bd2aa9bbb8771 Mon Sep 17 00:00:00 2001 From: mgw <1392924357@qq.com> Date: Wed, 22 Nov 2023 14:22:41 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9sf=5Fmachine=5Fconnect?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BB=A5=E9=80=82=E9=85=8D=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=9E=84=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_machine_connect/__manifest__.py | 11 +-- sf_machine_connect/models/ftp_client.py | 68 +++++++++---------- sf_machine_connect/models/ftp_operate.py | 1 - sf_machine_connect/models/py2opcua.py | 6 +- .../models/res_config_setting.py | 2 +- sf_machine_connect/views/machine_monitor.xml | 68 ++++++++++--------- 6 files changed, 79 insertions(+), 77 deletions(-) diff --git a/sf_machine_connect/__manifest__.py b/sf_machine_connect/__manifest__.py index abc524f1..db7ae467 100644 --- a/sf_machine_connect/__manifest__.py +++ b/sf_machine_connect/__manifest__.py @@ -22,20 +22,21 @@ 'views/ftp_button.xml', 'views/compensation.xml', + # 只有它被屏蔽了 # 'views/SfWorkOrderBarcodes.xml', 'views/WorkCenterBarcodes.xml', 'views/Stock_picking_Barcodes.xml', - # 'views/machine_monitor.xml', + 'views/machine_monitor.xml', 'views/machine_info_present.xml', 'views/delivery_record.xml', 'views/res_config_settings_views.xml', ], 'assets': { - 'web.assets_backend': [ - # 'sf_machine_connect/static/src/xml/barcode_button.xml', - # 'sf_machine_connect/static/src/js/barcode_button.js', - # 'sf_machine_connect/static/src/css/barcode_button.css', + 'web.assets_backend': [ + # 'sf_machine_connect/static/src/xml/barcode_button.xml', + # 'sf_machine_connect/static/src/js/barcode_button.js', + # 'sf_machine_connect/static/src/css/barcode_button.css', ], }, diff --git a/sf_machine_connect/models/ftp_client.py b/sf_machine_connect/models/ftp_client.py index d1295217..7ca0ad06 100644 --- a/sf_machine_connect/models/ftp_client.py +++ b/sf_machine_connect/models/ftp_client.py @@ -60,11 +60,11 @@ class FtpButton(models.Model): raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态") # host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC" - host = self.workorder_id.workcenter_id.machine_tool_id.ftp_host - port = self.workorder_id.workcenter_id.machine_tool_id.ftp_port - username = self.workorder_id.workcenter_id.machine_tool_id.ftp_num - pwd = self.workorder_id.workcenter_id.machine_tool_id.ftp_pwd - remote_path = self.workorder_id.workcenter_id.machine_tool_id.ftp_remote_path + host = self.workorder_id.equipment_id.ftp_host + port = self.workorder_id.equipment_id.ftp_port + username = self.workorder_id.equipment_id.ftp_num + pwd = self.workorder_id.equipment_id.ftp_pwd + remote_path = self.workorder_id.equipment_id.ftp_remote_path print(host, port, username, pwd, remote_path) ftp = ftp_operate.FtpController(host, port, username, pwd) # ftp.delAllfile('C://Users//马广威//Desktop//ftp') @@ -107,8 +107,8 @@ class FtpButton(models.Model): 下发NC代码前自动补偿三元检测偏差值 :return: """ - hongbianliang550 = self.workorder_id.workcenter_id.machine_tool_id.x_compensation_node - hongbianliang551 = self.workorder_id.workcenter_id.machine_tool_id.y_compensation_node + hongbianliang550 = self.workorder_id.equipment_id.x_compensation_node + hongbianliang551 = self.workorder_id.equipment_id.y_compensation_node try: temp_dict = {} temp_dict[hongbianliang550] = self.workorder_id.compensation_value_x @@ -124,9 +124,9 @@ class Machine_ftp(models.Model): """ 数据采集类 """ - _inherit = 'sf.machine_tool' + _inherit = 'maintenance.equipment' - workorder_ids = fields.One2many('mrp.workorder', 'machine_tool_id', string='工单') + # workorder_ids = fields.One2many('mrp.workorder', 'machine_tool_id', string='工单') # 机床配置项目 # ftp相关 @@ -263,7 +263,7 @@ class WorkCenterBarcode(models.Model): compensation_value_y = fields.Float(string='Y轴补偿值') button_compensation_state = fields.Boolean(string='是否已经补偿', readonly=True) button_up_all_state = fields.Boolean(string='是否已经全部下发', readonly=True) - machine_tool_id = fields.Many2one('sf.machine_tool', string='机床') + machine_tool_id = fields.Many2one('sf.machine_tool.type', string='机床') machine_tool_name = fields.Char(string='机床名称', default='未知机床', compute='_run_info', readonly=True) machine_tool_type_id = fields.Char(string='机床型号', default='未知型号', compute='_run_info', readonly=True) machine_tool_status = fields.Boolean(string='在线状态', compute='_run_info', readonly=True) @@ -281,27 +281,27 @@ class WorkCenterBarcode(models.Model): machine_tool_compensation_value_y = fields.Char('y补偿值', compute='_run_info', readonly=True) delivery_records = fields.One2many('delivery.record', 'workorder_id', string="下发记录") - @api.depends('workcenter_id.machine_tool_id.timestamp') + @api.depends('equipment_id.timestamp') def _run_info(self): # self.machine_tool_name = '1号机床' - self.machine_tool_name = self.workcenter_id.machine_tool_id.name - self.machine_tool_type_id = self.workcenter_id.machine_tool_id.type_id.name - self.machine_tool_status = self.workcenter_id.machine_tool_id.status - self.machine_tool_run_status = self.workcenter_id.machine_tool_id.run_status - self.machine_tool_timestamp = self.workcenter_id.machine_tool_id.timestamp - self.machine_tool_time_on = self.workcenter_id.machine_tool_id.time_on - self.machine_tool_time_on_now = self.workcenter_id.machine_tool_id.time_on_now - self.machine_tool_tool_num = self.workcenter_id.machine_tool_id.tool_num - self.machine_tool_program = self.workcenter_id.machine_tool_id.program - self.machine_tool_machine_ip = self.workcenter_id.machine_tool_id.machine_ip - self.machine_tool_cut_status = self.workcenter_id.machine_tool_id.cut_status + self.machine_tool_name = self.equipment_id.name + self.machine_tool_type_id = self.equipment_id.type_id.name + self.machine_tool_status = self.equipment_id.status + self.machine_tool_run_status = self.equipment_id.run_status + self.machine_tool_timestamp = self.equipment_id.timestamp + self.machine_tool_time_on = self.equipment_id.time_on + self.machine_tool_time_on_now = self.equipment_id.time_on_now + self.machine_tool_tool_num = self.equipment_id.tool_num + self.machine_tool_program = self.equipment_id.program + self.machine_tool_machine_ip = self.equipment_id.machine_ip + self.machine_tool_cut_status = self.equipment_id.cut_status self.machine_tool_compensation_value_x = self.compensation_value_x self.machine_tool_compensation_value_y = self.compensation_value_y def compensation(self): - hongbianliang550 = self.workcenter_id.machine_tool_id.x_compensation_node - hongbianliang551 = self.workcenter_id.machine_tool_id.y_compensation_node + hongbianliang550 = self.equipment_id.x_compensation_node + hongbianliang551 = self.equipment_id.y_compensation_node try: temp_dict = {} temp_dict[hongbianliang550] = self.compensation_value_x @@ -339,11 +339,11 @@ class WorkCenterBarcode(models.Model): except Exception: raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态") sequence_collect = [] - host = self.workcenter_id.machine_tool_id.ftp_host - port = self.workcenter_id.machine_tool_id.ftp_port - username = self.workcenter_id.machine_tool_id.ftp_num - pwd = self.workcenter_id.machine_tool_id.ftp_pwd - remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path + host = self.equipment_id.ftp_host + port = self.equipment_id.ftp_port + username = self.equipment_id.ftp_num + pwd = self.equipment_id.ftp_pwd + remote_path = self.equipment_id.ftp_remote_path _logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd)) ftp = ftp_operate.FtpController(host, port, username, pwd) _logger.info("=====================1777777777111================") @@ -403,11 +403,11 @@ class WorkCenterBarcode(models.Model): except Exception: raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态") sequence_collect = [] - host = self.workcenter_id.machine_tool_id.ftp_host - port = self.workcenter_id.machine_tool_id.ftp_port - username = self.workcenter_id.machine_tool_id.ftp_num - pwd = self.workcenter_id.machine_tool_id.ftp_pwd - remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path + host = self.equipment_id.ftp_host + port = self.equipment_id.ftp_port + username = self.equipment_id.ftp_num + pwd = self.equipment_id.ftp_pwd + remote_path = self.equipment_id.ftp_remote_path _logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd)) ftp = ftp_operate.FtpController(host, port, username, pwd) _logger.info("=====================1777777777111================") diff --git a/sf_machine_connect/models/ftp_operate.py b/sf_machine_connect/models/ftp_operate.py index a94824f2..457ef6ed 100644 --- a/sf_machine_connect/models/ftp_operate.py +++ b/sf_machine_connect/models/ftp_operate.py @@ -91,7 +91,6 @@ class FtpController: """ self.ftp.close() - def delAllfile(self, ftppath): """ 删除ftp服务器端全部文件 diff --git a/sf_machine_connect/models/py2opcua.py b/sf_machine_connect/models/py2opcua.py index 2b00f394..e7ca2fad 100644 --- a/sf_machine_connect/models/py2opcua.py +++ b/sf_machine_connect/models/py2opcua.py @@ -26,11 +26,11 @@ class Py2opcua: """ # try: self.client.connect() - # print("opcua服务器连接成功,可以写入") - # return self.client + # print("opcua服务器连接成功,可以写入") + # return self.client # except Exception as e: # print("opcua服务器连接失败,请检查" + str(e)) - # temp_dict = temp_dict + # temp_dict = temp_dict temp_list = list(temp_dict.items()) for i in range(len(temp_list)): # 寻找节点上的变量 diff --git a/sf_machine_connect/models/res_config_setting.py b/sf_machine_connect/models/res_config_setting.py index c8257bf8..6d9a6c84 100644 --- a/sf_machine_connect/models/res_config_setting.py +++ b/sf_machine_connect/models/res_config_setting.py @@ -10,7 +10,7 @@ class ResBFMConfigSettings(models.TransientModel): bfm_url = fields.Selection( [("https://bfm.cs.jikimo.com", "开发环境(https://bfm.cs.jikimo.com)"), - ("https://bfm.r.jikimo.com", "测试环境(https://bfm.r.jikimo.com)"), + ("https://bfm.t.jikimo.com", "测试环境(https://bfm.t.jikimo.com)"), # ("正式环境", "https://bfm.jikimo.com")], string='bfm环境', store=True) ("https://bfm.jikimo.com", "正式环境(https://bfm.jikimo.com)")], string='bfm环境', store=True) diff --git a/sf_machine_connect/views/machine_monitor.xml b/sf_machine_connect/views/machine_monitor.xml index f07d784a..83b89598 100644 --- a/sf_machine_connect/views/machine_monitor.xml +++ b/sf_machine_connect/views/machine_monitor.xml @@ -2,14 +2,14 @@ sf_base_extension - sf.machine_tool - + maintenance.equipment + - + - + @@ -256,49 +256,51 @@ - + - - sf_cutting_tool_extension - sf.cutting_tool.type - - - - - - - - - - + + + + + + + + + + + - + + + - + - - - + + + + + + - - + + + - + - - - - - + + + + + From 83da8f58e26e018df33a31d9b774fece9a5d8889 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Wed, 22 Nov 2023 17:19:25 +0800 Subject: [PATCH 15/15] =?UTF-8?q?1=E3=80=81=E5=8A=9F=E8=83=BD=E5=88=80?= =?UTF-8?q?=E5=85=B7=E5=88=97=E8=A1=A8=E6=A8=A1=E5=9E=8B=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=A4=A7=E9=87=8F=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=BA=93=E5=AD=98=E6=95=B0=E9=87=8F=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=9F=A5=E7=9C=8B=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E7=9A=84=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E8=AE=B0=E5=BD=95=E6=8C=89=E9=94=AE=EF=BC=9B2?= =?UTF-8?q?=E3=80=81=E9=87=8D=E6=9E=84=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7?= =?UTF-8?q?=E9=A2=84=E8=AD=A6=E6=A8=A1=E5=9E=8B=EF=BC=88=E5=B7=B2=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=89=EF=BC=9B3=E3=80=81=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=88=80=E5=85=B7=E7=BB=84=E8=A3=85=E6=A8=A1=E5=9E=8Bname?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=B1=95=E7=A4=BA=E5=86=85=E5=AE=B9=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/__init__.py | 1 - sf_tool_management/models/base.py | 339 +++++++------------ sf_tool_management/views/menu_view.xml | 31 +- sf_tool_management/views/tool_base_views.xml | 283 ++++++---------- sf_tool_management/wizard/__init__.py | 2 +- sf_tool_management/wizard/wizard.py | 47 ++- 6 files changed, 270 insertions(+), 433 deletions(-) diff --git a/sf_tool_management/models/__init__.py b/sf_tool_management/models/__init__.py index 67b36bda..3ab6007e 100644 --- a/sf_tool_management/models/__init__.py +++ b/sf_tool_management/models/__init__.py @@ -1,3 +1,2 @@ from . import base from . import tool_material_search - diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 1a7067cb..14f463a0 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -19,9 +19,9 @@ class FunctionalCuttingToolEntity(models.Model): name = fields.Char(related='functional_tool_name_id.name') functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称', readonly=True) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) - mrs_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') - mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', - group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True) + sf_cutting_tool_model_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具型号') + sf_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', + group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True) functional_tool_diameter = fields.Integer(string='刀具直径(mm)', readonly=True) knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) @@ -30,14 +30,27 @@ class FunctionalCuttingToolEntity(models.Model): tool_loading_length = fields.Float(string='装刀长(mm)', readonly=True) functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) effective_length = fields.Float(string='有效长(mm)', readonly=True) - tool_room_num = fields.Integer(string='刀具房数量') - line_edge_knife_library_num = fields.Integer(string='线边刀库数量') - machine_knife_library_num = fields.Integer(string='机内刀库数量') + tool_room_num = fields.Integer(string='刀具房数量', readonly=True, ) + line_edge_knife_library_num = fields.Integer(string='线边刀库数量', readonly=True) + machine_knife_library_num = fields.Integer(string='机内刀库数量', readonly=True) max_lifetime_value = fields.Integer(string='最大寿命值(min)', readonly=True) alarm_value = fields.Integer(string='报警值(min)', readonly=True) used_value = fields.Integer(string='已使用值(min)', readonly=True) functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态', store=True, default='正常') + current_location_id = fields.Many2one('stock.location', string='当前位置', readonly=True) + image = fields.Binary('图片', readonly=True) + + @api.depends('current_location_id') + def _compute_location_num(self): + """ + 计算库存位置数量 + """ + for obj in self: + if obj.current_location_id.name in ('组装后', '刀具房'): + obj.tool_room_num = 1 + obj.line_edge_knife_library_num = 0 + obj.machine_knife_library_num = 0 @api.model def _read_group_mrs_cutting_tool_type_id(self, categories, domain, order): @@ -47,64 +60,44 @@ class FunctionalCuttingToolEntity(models.Model): # 整体式刀具型号 cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, domain=[('cutting_tool_material_id', '=', '整体式刀具')]) - # 刀片型号 cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀片')]) - # 刀杆型号 cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀杆')]) - # 刀盘型号 cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀盘')]) - # 刀柄型号 cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, domain=[('cutting_tool_material_id', '=', '刀柄')]) - # 夹头型号 cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, domain=[('cutting_tool_material_id', '=', '夹头')]) - diameter = fields.Float('直径(mm)') - tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - string='刀具等级') - machining_accuracy = fields.Float('加工精度(mm)') - tool_length = fields.Float('装刀长(mm)') - blade_number = fields.Integer('刃数') - integral_blade_length = fields.Float('整体刃长(mm)') - effective_blade_length = fields.Float('有效刃长(mm)') - max_life = fields.Float('最大寿命值') - is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀') - applicable_range = fields.Char('适用范围') - image = fields.Binary('图片') + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=True) + L_D_number = fields.Float(string='L/D值(mm)', readonly=True) + hiding_length = fields.Float(string='避空长(mm)', readonly=True) + cut_time = fields.Integer(string='已切削时间(min)', readonly=True) + cut_length = fields.Float(string='已切削长度(mm)', readonly=True) + cut_number = fields.Integer(string='已切削次数', readonly=True) - suitable_machining_method_ids = fields.Many2many('maintenance.equipment.image', - 'rel_machining_product_template_tool_entity', '适合加工方式', - domain=[('type', '=', '加工能力')], - related='cutting_tool_integral_model_id.suitable_machining_method_ids') - - blade_tip_characteristics_id = fields.Many2many('maintenance.equipment.image', - 'rel_blade_tip_product_template_tool_entity', '刀尖特征', - domain=[('type', '=', '刀尖特征')], - related='cutting_tool_integral_model_id.blade_tip_characteristics_id') - - handle_type_ids = fields.Many2many('maintenance.equipment.image', - 'rel_handle_product_template_tool_entity', '柄部类型', - domain=[('type', '=', '柄部类型')], - related='cutting_tool_integral_model_id.handle_type_ids') - - cutting_direction_ids = fields.Many2many('maintenance.equipment.image', - 'rel_cutting_product_template_tool_entity', '走刀方向', - domain=[('type', '=', '走刀方向')], - related='cutting_tool_integral_model_id.cutting_direction_ids') - - suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', - 'rel_coolant_product_template_tool_entity', '适合冷却液', - domain=[('type', '=', '冷却液')], - related='cutting_tool_integral_model_id.suitable_coolant_ids') + suitable_machining_method_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_machining_product_template_tool_entity', '适合加工方式', + domain=[('type', '=', '加工能力')], related='cutting_tool_integral_model_id.suitable_machining_method_ids') + blade_tip_characteristics_id = fields.Many2many( + 'maintenance.equipment.image', 'rel_blade_tip_product_template_tool_entity', '刀尖特征', + domain=[('type', '=', '刀尖特征')], related='cutting_tool_integral_model_id.blade_tip_characteristics_id') + handle_type_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_handle_product_template_tool_entity', '柄部类型', + domain=[('type', '=', '柄部类型')], related='cutting_tool_integral_model_id.handle_type_ids') + cutting_direction_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_cutting_product_template_tool_entity', '走刀方向', + domain=[('type', '=', '走刀方向')], related='cutting_tool_integral_model_id.cutting_direction_ids') + suitable_coolant_ids = fields.Many2many( + 'maintenance.equipment.image', 'rel_coolant_product_template_tool_entity', '适合冷却液', + domain=[('type', '=', '冷却液')], related='cutting_tool_integral_model_id.suitable_coolant_ids') def _get_functional_tool_model_ids(self, functional_tool_model_code): functional_tool_model_ids = [] @@ -114,112 +107,48 @@ class FunctionalCuttingToolEntity(models.Model): return [(6, 0, functional_tool_model_ids)] def open_functional_tool_warning(self): - pass + action = self.env.ref('sf_tool_management.action_sf_functional_tool_warning') + result = action.read()[0] + result['domain'] = [('functional_tool_name_id', '=', self.functional_tool_name_id.id)] + return result class FunctionalToolWarning(models.Model): _name = 'sf.functional.tool.warning' _description = '功能刀具预警' - functional_cutting_tool_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具', readonly=True) - functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True) - - # code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code') - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True, - related='functional_cutting_tool_id.barcode_id') - name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True, - related='functional_cutting_tool_id.functional_tool_name_id') - mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, - related='functional_cutting_tool_id.mrs_cutting_tool_type_id') - - # 整体式刀具型号 - cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '整体式刀具')], - related='functional_cutting_tool_id.cutting_tool_integral_model_id') - - # 刀片型号 - cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀片')], - related='functional_cutting_tool_id.cutting_tool_blade_model_id') - - # 刀杆型号 - cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀杆')], - related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') - - # 刀盘型号 - cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀盘')], - related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') - - # 刀柄型号 - cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀柄')], - related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') - - # 夹头型号 - cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '夹头')], - related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') - - diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter') - tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id') - machining_accuracy = fields.Float('加工精度(mm)', readonly=True, - related='functional_cutting_tool_id.machining_accuracy') - - # tool_length = fields.Float('装刀长', readonly=True, related='functional_cutting_tool_id.tool_length') - - tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length') - blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number') - integral_blade_length = fields.Float('整体刃长(mm)', readonly=True, - related='functional_cutting_tool_id.integral_blade_length') - effective_blade_length = fields.Float('有效刃长(mm)', readonly=True, - related='functional_cutting_tool_id.effective_blade_length') - max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life') - is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True, - compute='_compute_functional_cutting_tool_id') - applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range') - - image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image') - install_tool_time = fields.Datetime("装刀时间", readonly=True, - related='functional_tool_assembly_id.tool_loading_time') - - @api.depends('functional_cutting_tool_id') - def _compute_functional_cutting_tool_id(self): - if self.functional_cutting_tool_id: - self.tool_grade = self.functional_cutting_tool_id.tool_grade - self.is_standard = self.functional_cutting_tool_id.is_standard - - # 功能刀具预警 特有字段 - outbound_time = fields.Datetime('出库时间', readonly=True) - on_board_time = fields.Datetime('上机时间', readonly=False) - machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=True, - group_expand='_read_group_machine_table_name_ids') + name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_name_id.name') + # 机床信息 + production_line_id = fields.Many2one('sf.production.line', string='生产线', + group_expand='_read_group_machine_table_name_ids') + maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='CNC机床') + machine_tool_code = fields.Char(string='机台号') + machine_table_type_id = fields.Many2one('maintenance.equipment.category', string='机床类型') + cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', + domain="[('equipment_id', '=', maintenance_equipment_id)]") + # 功能刀具信息 + functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称') + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', related='functional_tool_name_id.barcode_id') + mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型') + diameter = fields.Integer(string='刀具直径(mm)') + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)') + # 其他信息 + install_tool_time = fields.Datetime("刀具组装时间") + on_board_time = fields.Datetime('上机装刀时间') + max_lifetime_value = fields.Integer(string='最大寿命值(min)') + alarm_value = fields.Integer(string='报警值(min)') + used_value = fields.Integer(string='已使用值(min)') + functional_tool_status = fields.Selection([('正常', '正常'), ('报警', '报警'), ('已拆除', '已拆除')], string='状态') + alarm_time = fields.Char('报警时间') + dispose_user = fields.Char('处理人') + dispose_time = fields.Char('处理时间') + dispose_func = fields.Char('处理方法/措施', readonly=False) @api.model def _read_group_machine_table_name_ids(self, categories, domain, order): machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(machine_table_name_ids) - machine_tool_code = fields.Char('机台号', readonly=True, related='functional_tool_assembly_id.machine_tool_code') - cutting_tool_code = fields.Char('刀位号', readonly=True) - # idle_time = fields.Char('闲置时长', readonly=False) - idle_time = fields.Char('闲置时长(h)', readonly=False) - alarm_value = fields.Char('报警值', readonly=False) - used_value = fields.Char('已使用值', readonly=False) - alarm_type = fields.Char('报警类型', readonly=False) - dispose_user = fields.Char('处理人', readonly=False) - alarm_time = fields.Char('报警时间', readonly=False) - dispose_time = fields.Char('处理时间', readonly=False) - dispose_func = fields.Char('处理方法/措施', readonly=False) - remark = fields.Char('备注', readonly=False) - - @api.onchange('functional_cutting_tool_id') - def onchange_functional_cutting_tool_id(self): - print(self.functional_cutting_tool_id.name) - class RealTimeDistributionOfFunctionalTools(models.Model): _name = 'sf.real.time.distribution.of.functional.tools' @@ -243,60 +172,61 @@ class RealTimeDistributionOfFunctionalTools(models.Model): record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id # code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code') - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True, - related='functional_cutting_tool_id.barcode_id') - name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True, - related='functional_cutting_tool_id.functional_tool_name_id') + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) + name = fields.Char('名称', invisible=True, readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) # mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, # related='functional_cutting_tool_id.mrs_cutting_tool_type_id') # 整体式刀具型号 - cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '整体式刀具')], - related='functional_cutting_tool_id.cutting_tool_integral_model_id') + cutting_tool_integral_model_id = fields.Many2one( + 'product.product', string='整体式刀具型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '整体式刀具')], + related='functional_cutting_tool_id.cutting_tool_integral_model_id') # 刀片型号 - cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀片')], - related='functional_cutting_tool_id.cutting_tool_blade_model_id') + cutting_tool_blade_model_id = fields.Many2one( + 'product.product', string='刀片型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀片')], + related='functional_cutting_tool_id.cutting_tool_blade_model_id') # 刀杆型号 - cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀杆')], - related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') + cutting_tool_cutterbar_model_id = fields.Many2one( + 'product.product', string='刀杆型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀杆')], + related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') # 刀盘型号 - cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀盘')], - related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') + cutting_tool_cutterpad_model_id = fields.Many2one( + 'product.product', string='刀盘型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀盘')], + related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') # 刀柄型号 - cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀柄')], - related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') + cutting_tool_cutterhandle_model_id = fields.Many2one( + 'product.product', string='刀柄型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '刀柄')], + related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') # 夹头型号 - cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '夹头')], - related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') + cutting_tool_cutterhead_model_id = fields.Many2one( + 'product.product', string='夹头型号', readonly=True, + domain=[('cutting_tool_material_id', '=', '夹头')], + related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') - diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter') + diameter = fields.Float('直径(mm)', readonly=True) tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], - string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id') - machining_accuracy = fields.Float('加工精度(mm)', readonly=True, - related='functional_cutting_tool_id.machining_accuracy') - tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length') - blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number') - integral_blade_length = fields.Float('整体刃长(mm)', readonly=True, - related='functional_cutting_tool_id.integral_blade_length') - effective_blade_length = fields.Float('有效刃长(mm)', readonly=True, - related='functional_cutting_tool_id.effective_blade_length') - max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life') + string='刀具等级', readonly=True) + machining_accuracy = fields.Float('加工精度(mm)', readonly=True) + tool_length = fields.Float('装刀长(mm)', readonly=True) + blade_number = fields.Integer('刃数', readonly=True) + integral_blade_length = fields.Float('整体刃长(mm)', readonly=True) + effective_blade_length = fields.Float('有效刃长(mm)', readonly=True) + max_life = fields.Float('最大寿命值', readonly=True) is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True, compute='_compute_functional_cutting_tool_id') - applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range') - image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image') + applicable_range = fields.Char('适用范围', readonly=True) + image = fields.Binary('图片', readonly=True) @api.depends('functional_cutting_tool_id') def _compute_functional_cutting_tool_id(self): @@ -326,7 +256,8 @@ class RealTimeDistributionOfFunctionalTools(models.Model): def _compute_return_total(self): for record in self: if record: - self.return_total = record.return_reuse_num_re + record.return_reuse_num_co + record.return_processing_num + self.return_total = (record.return_reuse_num_re + record.return_reuse_num_co + + record.return_processing_num) @api.depends('tool_stock_total', 'return_total') def _compute_total(self): @@ -357,58 +288,47 @@ class InboundAndOutboundRecordsOfFunctionalTools(models.Model): record.mrs_cutting_tool_type_id = record.functional_cutting_tool_id.mrs_cutting_tool_type_id.id # code = fields.Char('编码', readonly=True, related='functional_cutting_tool_id.code') - barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True, - related='functional_cutting_tool_id.barcode_id') - name = fields.Char('名称', invisible=True, readonly=True, related='functional_cutting_tool_id.name') - functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True, - related='functional_cutting_tool_id.functional_tool_name_id') + barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) + name = fields.Char('名称', invisible=True, readonly=True) + functional_tool_name_id = fields.Many2one('product.product', string='功能刀具名称', readonly=True) # 整体式刀具型号 cutting_tool_integral_model_id = fields.Many2one('product.product', string='整体式刀具型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '整体式刀具')], - related='functional_cutting_tool_id.cutting_tool_integral_model_id') + domain=[('cutting_tool_material_id', '=', '整体式刀具')]) # 刀片型号 cutting_tool_blade_model_id = fields.Many2one('product.product', string='刀片型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀片')], - related='functional_cutting_tool_id.cutting_tool_blade_model_id') + domain=[('cutting_tool_material_id', '=', '刀片')]) # 刀杆型号 cutting_tool_cutterbar_model_id = fields.Many2one('product.product', string='刀杆型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀杆')], - related='functional_cutting_tool_id.cutting_tool_cutterbar_model_id') + domain=[('cutting_tool_material_id', '=', '刀杆')]) # 刀盘型号 cutting_tool_cutterpad_model_id = fields.Many2one('product.product', string='刀盘型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀盘')], - related='functional_cutting_tool_id.cutting_tool_cutterpad_model_id') + domain=[('cutting_tool_material_id', '=', '刀盘')]) # 刀柄型号 cutting_tool_cutterhandle_model_id = fields.Many2one('product.product', string='刀柄型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '刀柄')], - related='functional_cutting_tool_id.cutting_tool_cutterhandle_model_id') + domain=[('cutting_tool_material_id', '=', '刀柄')]) # 夹头型号 cutting_tool_cutterhead_model_id = fields.Many2one('product.product', string='夹头型号', readonly=True, - domain=[('cutting_tool_material_id', '=', '夹头')], - related='functional_cutting_tool_id.cutting_tool_cutterhead_model_id') + domain=[('cutting_tool_material_id', '=', '夹头')]) - diameter = fields.Float('直径(mm)', readonly=True, related='functional_cutting_tool_id.diameter') + diameter = fields.Float('直径(mm)', readonly=True) tool_grade = fields.Selection([('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'P4'), ('5', 'P5'), ('6', 'P6')], string='刀具等级', readonly=True, compute='_compute_functional_cutting_tool_id') - machining_accuracy = fields.Float('加工精度(mm)', readonly=True, - related='functional_cutting_tool_id.machining_accuracy') - tool_length = fields.Float('装刀长(mm)', readonly=True, related='functional_cutting_tool_id.tool_length') - blade_number = fields.Integer('刃数', readonly=True, related='functional_cutting_tool_id.blade_number') - integral_blade_length = fields.Float('整体刃长(mm)', readonly=True, - related='functional_cutting_tool_id.integral_blade_length') - effective_blade_length = fields.Float('有效刃长(mm)', readonly=True, - related='functional_cutting_tool_id.effective_blade_length') - max_life = fields.Float('最大寿命值', readonly=True, related='functional_cutting_tool_id.max_life') + machining_accuracy = fields.Float('加工精度(mm)', readonly=True) + tool_length = fields.Float('装刀长(mm)', readonly=True) + blade_number = fields.Integer('刃数', readonly=True) + integral_blade_length = fields.Float('整体刃长(mm)', readonly=True) + effective_blade_length = fields.Float('有效刃长(mm)', readonly=True) + max_life = fields.Float('最大寿命值', readonly=True) is_standard = fields.Selection([('1', '是'), ('0', '否')], '是否标准刀', readonly=True, compute='_compute_functional_cutting_tool_id') - applicable_range = fields.Char('适用范围', readonly=True, related='functional_cutting_tool_id.applicable_range') - image = fields.Binary('图片', readonly=True, related='functional_cutting_tool_id.image') + applicable_range = fields.Char('适用范围', readonly=True) + image = fields.Binary('图片', readonly=True) @api.depends('functional_cutting_tool_id') def _compute_functional_cutting_tool_id(self): @@ -469,8 +389,7 @@ class MachineTableToolChangingApply(models.Model): compute='_compute_machine_table_type_id') machine_tool_code = fields.Char(string='机台号', store=True, invisible=True, readonly=True) cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', readonly=False, - required=True, - domain="[('equipment_id', '=', name)]") + required=True, domain="[('equipment_id', '=', maintenance_equipment_id)]") barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', domain=[('product_id.name', '=', '功能刀具')]) functional_tool_name = fields.Char(string='功能刀具名称') @@ -712,7 +631,7 @@ class FunctionalToolAssembly(models.Model): @api.depends('functional_tool_name') def _compute_name(self): for obj in self: - obj.name = obj.functional_tool_name + obj.name = obj.after_assembly_functional_tool_name name = fields.Char(string='名称', readonly=True, compute='_compute_name') assembly_order_code = fields.Char(string='编码', readonly=True) diff --git a/sf_tool_management/views/menu_view.xml b/sf_tool_management/views/menu_view.xml index 5b1ed7e9..efa4feee 100644 --- a/sf_tool_management/views/menu_view.xml +++ b/sf_tool_management/views/menu_view.xml @@ -13,7 +13,7 @@ name="功能刀具列表" sequence="4" action="sf_function_tool_entry_list_view_act" - /> + /> + /> + /> - - - - - - - + + /> + /> + /> - + /> - \ No newline at end of file + diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index b07fe225..1cac4820 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -9,14 +9,24 @@ - - - - - - - + + + + + + + + + + + + + + + + + @@ -26,6 +36,9 @@ sf.functional.cutting.tool.entity + + + - 预警 + 预警记录 @@ -50,7 +63,7 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - + + + + + + + + @@ -167,15 +155,28 @@ - - - - - - - + + + + + + + + + + + + + + + + + + - + + + @@ -194,148 +195,54 @@ sf.functional.tool.warning.tree sf.functional.tool.warning - + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + - - sf.functional.tool.warning.form - sf.functional.tool.warning - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sf.functional.tool.warning.search sf.functional.tool.warning + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - + + @@ -345,7 +252,7 @@ 功能刀具预警 ir.actions.act_window sf.functional.tool.warning - tree,form,search + tree,search @@ -1114,6 +1021,7 @@ name="%(sf_tool_management.sf_functional_tool_assembly_order_act)d" type="action" context="{'default_name':name, + 'default_assembly_order_code':assembly_order_code, 'default_production_line_name_id':production_line_name_id, 'default_machine_tool_name_id':machine_tool_name_id, 'default_cutter_spacing_code_id':cutter_spacing_code_id, @@ -1150,6 +1058,7 @@ name="%(sf_tool_management.sf_functional_tool_assembly_order_act)d" type="action" context="{'default_name':name, + 'default_assembly_order_code':assembly_order_code, 'default_production_line_name_id':production_line_name_id, 'default_machine_tool_name_id':machine_tool_name_id, 'default_cutter_spacing_code_id':cutter_spacing_code_id, diff --git a/sf_tool_management/wizard/__init__.py b/sf_tool_management/wizard/__init__.py index 20a7f5c4..40272379 100644 --- a/sf_tool_management/wizard/__init__.py +++ b/sf_tool_management/wizard/__init__.py @@ -1 +1 @@ -from . import wizard \ No newline at end of file +from . import wizard diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index 3c17bf47..990addf1 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -154,6 +154,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel): _inherit = ["barcodes.barcode_events_mixin"] _description = '功能刀具组装单' + assembly_order_code = fields.Char(string='编码', readonly=True) functional_tool_name_id = fields.Many2one('product.product', string='功能刀具', readonly=True) functional_tool_name = fields.Char(string='功能刀具名称', readonly=True) functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=True, @@ -320,7 +321,8 @@ class FunctionalToolAssemblyOrder(models.TransientModel): cut_number = fields.Integer(string='已切削次数') after_assembly_whether_standard_knife = fields.Boolean(string='组装后是否标准刀', default=True) - after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='组装后粗/中/精') + after_assembly_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], + string='组装后粗/中/精') after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)') after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)') after_assembly_used_value = fields.Integer(string='组装后已使用值(min)') @@ -348,6 +350,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 封装功能刀具数据 desc_1 = self.get_desc_1(stock_lot) functional_tool_assembly = self.env['sf.functional.tool.assembly'].search([ + ('assembly_order_code', '=', self.assembly_order_code), ('machine_tool_name_id', '=', self.machine_tool_name_id.id), ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id), ('assemble_status', '=', '0'), @@ -355,9 +358,9 @@ class FunctionalToolAssemblyOrder(models.TransientModel): # 创建功能刀具列表记录 # 封装功能刀具数据 - # desc_2 = self.get_desc_2(stock_lot) - # # 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录 - # record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) + desc_2 = self.get_desc_2(stock_lot, functional_tool_assembly) + # 创建功能刀具列表、功能刀具预警、功能刀具实时分布、功能刀具出入库记录 + record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) # self.env['sf.functional.tool.warning'].create({ # 'functional_cutting_tool_id': record_1.id, # 'functional_tool_assembly_id': functional_tool_assembly.id, @@ -512,26 +515,34 @@ class FunctionalToolAssemblyOrder(models.TransientModel): 'tool_loading_time': fields.Datetime.now() } - def get_desc_2(self, stock_lot): + def get_desc_2(self, stock_lot, functional_tool_assembly_id): return { 'barcode_id': stock_lot.id, - 'functional_tool_name_id': self.functional_tool_name_id.id, - 'mrs_cutting_tool_type_id': self.functional_tool_type_id.id, + 'functional_tool_name_id': functional_tool_assembly_id.id, + 'sf_cutting_tool_type_id': self.after_assembly_functional_tool_type_id.id, 'cutting_tool_integral_model_id': self.integral_code_id.product_id.id, 'cutting_tool_blade_model_id': self.blade_code_id.product_id.id, 'cutting_tool_cutterbar_model_id': self.bar_code_id.product_id.id, 'cutting_tool_cutterpad_model_id': self.pad_code_id.product_id.id, 'cutting_tool_cutterhandle_model_id': self.handle_code_id.product_id.id, 'cutting_tool_cutterhead_model_id': self.chuck_code_id.product_id.id, - 'diameter': self.functional_tool_diameter, - 'tool_grade': None, - 'machining_accuracy': None, - 'tool_length': self.tool_loading_length, - 'blade_number': None, - 'integral_blade_length': None, - 'effective_blade_length': self.effective_length, - 'max_life': None, - 'is_standard': self.whether_standard_tool, - 'applicable_range': None, - 'image': None, + + 'functional_tool_diameter': self.after_assembly_functional_tool_diameter, + 'knife_tip_r_angle': self.after_assembly_knife_tip_r_angle, + 'coarse_middle_thin': self.after_assembly_coarse_middle_thin, + 'new_former': self.after_assembly_new_former, + 'tool_loading_length': self.after_assembly_tool_loading_length, + 'functional_tool_length': self.after_assembly_functional_tool_length, + 'effective_length': self.after_assembly_effective_length, + + 'max_lifetime_value': self.after_assembly_max_lifetime_value, + 'alarm_value': self.after_assembly_alarm_value, + 'used_value': self.after_assembly_used_value, + 'whether_standard_knife': self.after_assembly_whether_standard_knife, + 'L_D_number': self.L_D_number, + 'hiding_length': self.hiding_length, + 'cut_time': self.cut_time, + 'cut_length': self.cut_length, + 'cut_number': self.cut_number, + 'current_location_id': stock_lot.quant_ids.location_id.ids[-1], }