From 436adc5ff60abf5a33533c4146cb65742f087a4a Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Wed, 11 Sep 2024 10:39:27 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7?= =?UTF-8?q?=E6=B8=85=E5=8D=95=20bom=E6=B7=BB=E5=8A=A0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E4=B8=8E=E6=B8=85=E5=8D=95=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E8=A1=8C=E5=88=A0=E9=99=A4=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/jikimo_bom.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sf_tool_management/models/jikimo_bom.py b/sf_tool_management/models/jikimo_bom.py index 29ef1605..73f63173 100644 --- a/sf_tool_management/models/jikimo_bom.py +++ b/sf_tool_management/models/jikimo_bom.py @@ -47,6 +47,7 @@ class jikimo_bom(models.Model): return True else: raise UserError('每种物料最少要有一个') + return True return super(jikimo_bom, self).write(vals) def bom_product_domains(self, assembly_options): From d5c82e4a28bbb80e7f5524aa5e82b654b27e8ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Wed, 11 Sep 2024 10:40:26 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/agv_scheduling.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sf_manufacturing/models/agv_scheduling.py b/sf_manufacturing/models/agv_scheduling.py index f758abd9..a18dc5ef 100644 --- a/sf_manufacturing/models/agv_scheduling.py +++ b/sf_manufacturing/models/agv_scheduling.py @@ -1,10 +1,10 @@ + +import logging import requests from odoo import models, fields, api, _ from odoo.exceptions import UserError -import logging - _logger = logging.getLogger(__name__) @@ -54,7 +54,7 @@ class AgvScheduling(models.Model): def web_search_read(self, domain=None, fields=None, offset=0, limit=None, order=None, count_limit=None): domain = domain or [] new_domain = [] - for index, item in enumerate(domain): + for item in domain: if isinstance(item, list): if item[0] == 'delivery_workpieces': new_domain.append('&') @@ -63,7 +63,7 @@ class AgvScheduling(models.Model): continue new_domain.append(item) - return super(AgvScheduling, self).web_search_read(new_domain, fields, limit=limit, offset=offset) + return super(AgvScheduling, self).web_search_read(new_domain, fields, offset, limit, order, count_limit) @api.depends('task_completion_time', 'task_delivery_time') def _compute_task_duration(self): From 2808005ce9da2a2bc517cd65b5c4b3bc41e12d8f Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 12 Sep 2024 15:17:09 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/models/process_status.py | 12 ++++++++---- sf_manufacturing/models/mrp_production.py | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py index 111254c7..3bbdb5fc 100644 --- a/sf_bf_connect/models/process_status.py +++ b/sf_bf_connect/models/process_status.py @@ -1,3 +1,4 @@ +import traceback from datetime import datetime import logging import requests @@ -53,11 +54,14 @@ class StatusChange(models.Model): if not ret.get('error'): logging.info('接口已经执行=============') else: - logging.error('工厂加工同步订单状态失败 {}'.format(ret)) - raise UserError('工厂加工同步订单状态失败') + traceback_error = traceback.format_exc() + logging.error("bfm订单状态同步失败:%s request info %s" % traceback_error) + logging.error('/api/get/state/get_order 请求失败{}'.format(ret)) + raise UserError('工厂加工同步订单状态到bfm失败') except UserError as e: - logging.error('工厂加工同步订单状态失败 {}'.format(e)) - raise UserError('工厂加工同步订单状态失败') + traceback_error = traceback.format_exc() + logging.error("工厂加工同步订单状态失败:%s " % traceback_error) + raise UserError(e) return res def action_cancel(self): diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 405baf38..0ab2be6b 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -318,8 +318,10 @@ class MrpProduction(models.Model): # cnc程序获取 def fetchCNC(self, production_names): cnc = self.env['mrp.production'].search([('id', '=', self.id)]) - quick_order = self.env['quick.easy.order'].search( - [('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])]) + quick_order = False + if cnc.product_id.default_code: + quick_order = self.env['quick.easy.order'].search( + [('name', '=', cnc.product_id.default_code.rsplit('-', 1)[0])]) programme_way = False if cnc.manual_quotation is True: programme_way = 'manual operation' From 01c57a86912a5d811862a51ad771157a133c7c7c Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 12 Sep 2024 15:17:47 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B7=BB=E5=8A=A0=E6=8F=8F=E8=BF=B0=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/jikimo_bom.py | 42 +++++++++++++------ sf_tool_management/models/tool_inventory.py | 6 +-- .../wizard/jikimo_bom_wizard.py | 1 - 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/sf_tool_management/models/jikimo_bom.py b/sf_tool_management/models/jikimo_bom.py index 73f63173..8453eb48 100644 --- a/sf_tool_management/models/jikimo_bom.py +++ b/sf_tool_management/models/jikimo_bom.py @@ -30,9 +30,23 @@ class jikimo_bom(models.Model): return result def check_types_in_list(self): - # 统计每个元素的类型 - type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids) - return all(count > 0 for count in type_counts.values()) and len(type_counts) == self.options.split('+') + """ + 检查产品列表中的元素是否包含了所有指定的类型,并且每种类型至少出现一次。 + :return: 如果条件满足返回True,否则返回False + """ + if not self.product_ids: + return False + try: + # 统计每个类型的出现次数 + type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids) + + # 检查是否每种类型的出现次数都大于0,并且类型的数量与选项字符串中的数量相等 + return all(count > 0 for count in type_counts.values()) and len(type_counts) == len(self.options.split('+')) + except AttributeError: + # 如果出现属性错误,说明产品列表中的元素可能缺少必要的属性 + return False + # type_counts = Counter(item.cutting_tool_material_id.name for item in self.product_ids) + # return all(count > 0 for count in type_counts.values()) and len(type_counts) == self.options.split('+') def write(self, vals): # 在更新模型时记录旧的 Many2many ID 列表 @@ -51,6 +65,11 @@ class jikimo_bom(models.Model): return super(jikimo_bom, self).write(vals) def bom_product_domains(self, assembly_options): + """ + 根据装配选项生成产品域列表 + :param assembly_options: 装配选项字符串,各选项以'+'分隔 + :return: 动态生成的产品搜索条件 + """ self.options = assembly_options cutting_tool_materials = self.env['sf.cutting.tool.material'].search( [('name', 'in', assembly_options.split('+'))]) @@ -83,23 +102,22 @@ class jikimo_bom(models.Model): domains = domains + domain if index != 0: domains = ['|'] + domains - # wqwqwe = self.env['product.product'].search(ddd) - # product = self.env['product.product'].search(domain) - # if product: - # products = products + product domains = domains + [('stock_move_count', '>', 0)] return domains def generate_bill_materials(self, assembly_options): + """ + 生成物料清单 + + 根据装配选项生成物料清单,首先获取产品领域,然后搜索相关产品,并设置产品ID。 + + :param assembly_options: 组装方式 + :type assembly_options: 装配选项字符串,各选项以'+'分隔 + """ domains = self.bom_product_domains(assembly_options) products = self.env['product.product'].search(domains) if products: self.product_ids = [Command.set(products.ids)] - # if option.name == '刀盘': - # hilt = self.env['product.product'].search( - # [('cutting_tool_blade_diameter', '=', self.tool_inventory_id.diameter), - # ('cutting_tool_material_id', '=', option.id)]) - # self.product_ids = [Command.set(hilt.ids)]k class jikimo_bom_line(models.Model): diff --git a/sf_tool_management/models/tool_inventory.py b/sf_tool_management/models/tool_inventory.py index 5b27c9aa..7eb83aff 100644 --- a/sf_tool_management/models/tool_inventory.py +++ b/sf_tool_management/models/tool_inventory.py @@ -14,10 +14,7 @@ class ToolInventory(models.Model): self._bom_mainfest() return self.bom_mainfest() request.session['jikimo_bom_product'] = {'bom_id': int(self.jikimo_bom_ids)} - # context = dict(self.env.context) - # context.update({'jikimo_bom_product': self.jikimo_bom_ids.options}) - # if self.functional_cutting_tool_model_id.cutting_tool_type_ids: - # context.update({'jikimo_bom_product_cutting_tool_type': self.functional_cutting_tool_model_id.cutting_tool_type_ids.ids}) + return { 'type': 'ir.actions.act_window', 'name': '刀具组装清单', @@ -26,7 +23,6 @@ class ToolInventory(models.Model): 'view_id': self.env.ref('sf_tool_management.view_jikimo_bom_form').id, 'res_id': int(self.jikimo_bom_ids), 'target': 'current', # Use 'new' to open in a new window/tab - # {'jikimo_bom_product': self.jikimo_bom_ids.options} } # 创建bom单 diff --git a/sf_tool_management/wizard/jikimo_bom_wizard.py b/sf_tool_management/wizard/jikimo_bom_wizard.py index f86a7a09..ed6fe790 100644 --- a/sf_tool_management/wizard/jikimo_bom_wizard.py +++ b/sf_tool_management/wizard/jikimo_bom_wizard.py @@ -15,7 +15,6 @@ class JikimoBomWizard(models.TransientModel): ('刀柄+刀杆+刀片', '刀柄+刀杆+刀片'), ('刀柄+刀盘+刀片', '刀柄+刀盘+刀片') ], string='组装方式', required=True) - # assembly_options_ids = fields.Many2many('sf.cutting.tool.material', string="组装方式") is_ok = fields.Boolean('确认上述信息正确无误。') def submit(self): From 4c58f4d7f30be1c6d29c4cef110ff7f977050405 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Fri, 13 Sep 2024 10:22:14 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=BF=AB=E9=80=9F=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=A1=AB=E5=86=99=E7=9A=84=E9=9B=B6=E4=BB=B6=E5=9B=BE=E5=8F=B7?= =?UTF-8?q?=E5=92=8C=E9=9B=B6=E4=BB=B6=E5=9B=BE=E7=BA=B8=E4=BC=A0=E7=BB=99?= =?UTF-8?q?=E5=88=B6=E9=80=A0=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 2 +- sf_manufacturing/models/stock.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 8934711f..970cab6e 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -222,7 +222,7 @@ class ResMrpWorkOrder(models.Model): material_width = fields.Float(string='宽') material_height = fields.Float(string='高') # 零件图号 - part_number = fields.Char(string='零件图号') + part_number = fields.Char(related='production_id.part_number', string='零件图号') # 工序状态 process_state = fields.Selection([ ('待装夹', '待装夹'), diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 9d4e3161..9f6206cb 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -267,6 +267,10 @@ class StockRule(models.Model): workorder_duration += workorder.duration_expected sale_order = self.env['sale.order'].sudo().search([('name', '=', production.origin)]) + # 根据销售订单号查询快速订单 + quick_easy_order = self.env['quick.easy.order'].sudo().search([('sale_order_id', '=', sale_order.id)]) + production.write({'part_number': quick_easy_order.part_drawing_number, + 'part_drawing': quick_easy_order.machining_drawings}) if sale_order: # sale_order.write({'schedule_status': 'to schedule'}) self.env['sf.production.plan'].sudo().with_company(company_id).create({ @@ -288,6 +292,7 @@ class StockRule(models.Model): # 为同一个product_id创建一个生产订单名称列表 product_id_to_production_names[product_id] = [production.name for production in all_production] for production_item in productions: + production_programming = self.env['mrp.production'].search( [('product_id.id', '=', production_item.product_id.id), ('origin', '=', production_item.origin)], From 722f6257ae02bf443d0c4bba2a1000589bbea69f Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Fri, 13 Sep 2024 17:37:20 +0800 Subject: [PATCH 6/9] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=88=80?= =?UTF-8?q?=E5=85=B7=E6=8B=86=E8=A7=A3=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/base.py | 31 +++++++++----------- sf_tool_management/views/tool_base_views.xml | 3 +- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 76fb20ff..d9ab1536 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1505,29 +1505,26 @@ class FunctionalToolDismantle(models.Model): 'handle_code_id': self.handle_lot_id.id, 'handle_product_id': self.handle_product_id.id, 'loading_task_source': '3', + 'use_tool_time': fields.Datetime.now() + timedelta(hours=4), 'reason_for_applying': '刀具寿命到期' }) - action = self.env.ref('sf_tool_management.sf_functional_tool_assembly_form') return { - 'type': 'ir.actions.client', - 'tag': 'display_notification', - 'params': { - 'title': '组装单创建完成', - 'message': '请组装同名称的功能刀具', - 'type': 'info', - 'links': [{ - 'label': '组装单', - 'url': f'#action={action.id}&id={assembly_id.id}&model=sf.functional.tool.assembly', - }], - }, + 'type': 'ir.actions.act_window', + 'res_model': 'sf.functional.tool.assembly', + 'view_type': 'form', + 'view_mode': 'form', + 'res_id': assembly_id.id, + # 'target': 'new' } # { - # 'type': 'ir.actions.act_window', - # 'res_model': 'sf.functional.tool.assembly', - # 'view_type': 'form', - # 'view_mode': 'form', - # 'res_id': assembly_id.id, + # 'type': 'ir.actions.client', + # 'tag': 'display_notification', + # 'params': { + # 'title': '组装单创建完成', + # 'message': '请组装同名称的功能刀具', + # 'type': 'info' + # } # } # 'params': { diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index ab4912ce..2a68ce8e 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -891,7 +891,8 @@ - + From f8a12b1fe3ee88255b627853cfd076f7a8640fde Mon Sep 17 00:00:00 2001 From: hujiaying Date: Fri, 13 Sep 2024 17:37:57 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E5=BC=80=E5=A7=8B=E6=97=B6=E9=97=B4=E9=BB=98=E8=AE=A4=E5=BE=80?= =?UTF-8?q?=E5=90=8E=E5=BB=B6=E8=BF=9F10=E5=88=86=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_plan/wizard/action_plan_some.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sf_plan/wizard/action_plan_some.py b/sf_plan/wizard/action_plan_some.py index 9410efd5..a508dfb2 100644 --- a/sf_plan/wizard/action_plan_some.py +++ b/sf_plan/wizard/action_plan_some.py @@ -6,6 +6,7 @@ from datetime import datetime from odoo import fields, models # from odoo.exceptions import ValidationError from odoo.exceptions import UserError +from datetime import datetime, timedelta _logger = logging.getLogger(__name__) @@ -17,7 +18,7 @@ class Action_Plan_All_Wizard(models.TransientModel): # 选择生产线 production_line_id = fields.Many2one('sf.production.line', string=u'生产线', required=True) date_planned_start = fields.Datetime(string='计划开始时间', index=True, copy=False, - default=fields.Datetime.now) + default=datetime.now() + timedelta(minutes=10)) # 接收传递过来的计划ID plan_ids = fields.Many2many('sf.production.plan', string=u'计划ID') From e1093a3c696fd1205edf2fd190b8ec2545fb6f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Sat, 14 Sep 2024 13:42:38 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84js=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/__manifest__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py index 8cf16106..35501367 100644 --- a/sf_manufacturing/__manifest__.py +++ b/sf_manufacturing/__manifest__.py @@ -45,7 +45,6 @@ 'sf_manufacturing/static/src/scss/kanban_change.scss', 'sf_manufacturing/static/src/xml/button_show_on_tree.xml', 'sf_manufacturing/static/src/js/workpiece_delivery_wizard_confirm.js', - 'sf_manufacturing/static/src/js/custom_barcode_handlers.js', ] }, From cc3289c834e27e8445ff46039a260d8a0aadef7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Sat, 14 Sep 2024 13:49:46 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E5=B0=86=E5=B7=A5=E4=BB=B6=E9=85=8D?= =?UTF-8?q?=E9=80=81=E9=A1=B5=E9=9D=A2=E8=B5=B7=E7=82=B9=E6=8E=A5=E9=A9=B3?= =?UTF-8?q?=E7=AB=99=E4=BF=AE=E6=94=B9=E4=B8=BA=E5=BD=93=E5=89=8D=E6=8E=A5?= =?UTF-8?q?=E9=A9=B3=E7=AB=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/wizard/workpiece_delivery_views.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sf_manufacturing/wizard/workpiece_delivery_views.xml b/sf_manufacturing/wizard/workpiece_delivery_views.xml index e895d39e..a83a371a 100644 --- a/sf_manufacturing/wizard/workpiece_delivery_views.xml +++ b/sf_manufacturing/wizard/workpiece_delivery_views.xml @@ -14,7 +14,7 @@ - +