From a9b4c5d91babcac43594341795b6712698d8f091 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Tue, 21 Jan 2025 16:04:16 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E4=BF=9D=E6=8C=81=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E5=88=80=E5=85=B7=E6=A0=87=E5=87=86=E5=BA=93?= =?UTF-8?q?=E4=B8=8Ecloud=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_mrs_connect/models/sync_common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index 835183b3..ddd7c3c4 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -2302,7 +2302,7 @@ class Cutting_tool_standard_library(models.Model): if result['status'] == 1: for item in result['cutting_tool_standard_library_all_list']: cutting_tool_standard_library = self.search( - [("code", '=', item['code'].replace("JKM", result['factory_short_name'])), + [("code", '=', item['code']), ("active", 'in', [True, False])]) cutting_tool_type = self.env['sf.cutting.tool.type'].search( [("code", '=', item['cutting_tool_type_code'])]) @@ -2313,7 +2313,7 @@ class Cutting_tool_standard_library(models.Model): brand = self.env['sf.machine.brand'].search([("code", '=', item['brand_code'])]) if not cutting_tool_standard_library: self.create({ - "code": item['code'].replace("JKM", result['factory_short_name']), + "code": item['code'], "name": item['name'], "cutting_tool_material_id": cutting_tool_material.id, "cutting_tool_type_id": cutting_tool_type.id, From b604209df4e5ba1b1346f1bb26c3b948c62727fe Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Tue, 21 Jan 2025 16:23:34 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E5=88=80=E5=85=B7=E6=A0=87=E5=87=86?= =?UTF-8?q?=E5=BA=93=E5=88=97=E8=A1=A8=E8=A7=86=E5=9B=BE=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E4=B8=8E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/views/tool_views.xml | 2 ++ sf_mrs_connect/models/sync_common.py | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index b2d53392..82365a9e 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -112,6 +112,8 @@ + + diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index ddd7c3c4..d4aa3f36 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -2335,9 +2335,9 @@ class Cutting_tool_standard_library(models.Model): 'maintenance.equipment.image'].search( [('name', '=', item['fit_blade_shape'])]).id, "chuck_id": False if not item['chuck_code'] else self.search( - [('code', '=', item['chuck_code'].replace("JKM", result['factory_short_name']))]).id, + [('code', '=', item['chuck_code'])]).id, "handle_id": False if not item['handle_code'] else self.search( - [('code', '=', item['handle_code'].replace("JKM", result['factory_short_name']))]).id, + [('code', '=', item['handle_code'])]).id, "suitable_machining_method_ids": [(6, 0, [])] if not item.get( 'suitable_machining_method') else self.env['maintenance.equipment.image']._get_ids( item['suitable_machining_method']), @@ -2377,9 +2377,9 @@ class Cutting_tool_standard_library(models.Model): 'maintenance.equipment.image'].search( [('name', '=', item['fit_blade_shape'])]).id, "chuck_id": False if not item['chuck_code'] else self.search( - [('code', '=', item['chuck_code'].replace("JKM", result['factory_short_name']))]).id, + [('code', '=', item['chuck_code'])]).id, "handle_id": False if not item['handle_code'] else self.search( - [('code', '=', item['handle_code'].replace("JKM", result['factory_short_name']))]).id, + [('code', '=', item['handle_code'])]).id, "suitable_machining_method_ids": [(6, 0, [])] if not item.get( 'suitable_machining_methods') else self.env['maintenance.equipment.image']._get_ids( item['suitable_machining_methods']), From cddcec4225f0ed5a0e10b21d64c1277419a3b7b9 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Wed, 19 Feb 2025 16:22:00 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B0=83=E6=8B=A8?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E8=B4=A8=E6=A3=80=E5=AE=8C=E6=88=90=E7=9A=84?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_message/data/bussiness_node.xml | 5 +++++ sf_message/data/template_data.xml | 12 ++++++++++++ sf_message/models/sf_message_stock_picking.py | 12 +++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/sf_message/data/bussiness_node.xml b/sf_message/data/bussiness_node.xml index 4003df45..14115e27 100644 --- a/sf_message/data/bussiness_node.xml +++ b/sf_message/data/bussiness_node.xml @@ -68,6 +68,11 @@ stock.picking + + 调拨单质检完成提醒 + stock.picking + + 装夹预调工单逾期预警 mrp.workorder diff --git a/sf_message/data/template_data.xml b/sf_message/data/template_data.xml index c0e96d99..4d580127 100644 --- a/sf_message/data/template_data.xml +++ b/sf_message/data/template_data.xml @@ -252,6 +252,18 @@ ### 订单发货提醒: 单号:发料出库单[{{name}}]({{request_url}}) 事项:销售订单{{sale_order_name}}已全部产出并入库,请及时发货 + + + + 调拨单质检完成提醒 + + stock.picking + + markdown + normal + ### {{picking_type_name}}待处理提醒: +单号:{{name}} +事项:质量检查已完成 diff --git a/sf_message/models/sf_message_stock_picking.py b/sf_message/models/sf_message_stock_picking.py index a2c17407..10304cf3 100644 --- a/sf_message/models/sf_message_stock_picking.py +++ b/sf_message/models/sf_message_stock_picking.py @@ -9,6 +9,8 @@ class SFMessageStockPicking(models.Model): _description = "库存调拨" _inherit = ['stock.picking', 'jikimo.message.dispatch'] + quality_check_ids = fields.One2many('quality.check', 'picking_id', '质量检测单') + @api.model_create_multi def create(self, vals): result = super(SFMessageStockPicking, self).create(vals) @@ -20,7 +22,8 @@ class SFMessageStockPicking(models.Model): logging.info('add_queue调拨入库 error:%s' % e) return result - @api.depends('move_type', 'immediate_transfer', 'move_ids.state', 'move_ids.picking_id') + @api.depends('move_type', 'immediate_transfer', 'move_ids.state', 'move_ids.picking_id', + 'quality_check_ids.quality_state') def _compute_state(self): super(SFMessageStockPicking, self)._compute_state() try: @@ -48,6 +51,8 @@ class SFMessageStockPicking(models.Model): all_ready_or_done = all(picking.state in ['assigned', 'done'] for picking in stock_picking_list) if all_ready_or_done: mrp_production.add_queue('工序外协发料通知') + if all(qc.quality_state in ['pass', 'fail'] for qc in record.quality_check_ids): + record.add_queue('调拨单质检完成提醒') except Exception as e: logging.info('add_queue_compute_state error:%s' % e) @@ -83,6 +88,11 @@ class SFMessageStockPicking(models.Model): content = self.deal_stock_picking_sfp(message_queue_id) if content: contents.append(content) + elif message_queue_id.message_template_id.name == '调拨单质检完成提醒': + content = message_queue_id.message_template_id.content + content = content.replace('{{picking_type_name}}', self.picking_type_id.name).replace( + '{{name}}', self.name) + contents.append(content) return contents, message_queue_ids def get_special_url(self, id, tmplate_name, special_name, model_id): From 7ff1fed4b6b4a252727180a3cefdfaab5b45055c Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 20 Feb 2025 10:04:22 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=8D=95=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E8=B0=83=E6=8B=A8=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=B0=83=E6=8B=A8=E5=8D=95=E7=9A=84=E8=B4=A8=E6=A3=80?= =?UTF-8?q?=E5=8D=95=E6=98=AF=E5=90=A6=E5=AE=8C=E6=88=90=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_warehouse/models/model.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py index 582d7a59..581ef114 100644 --- a/sf_warehouse/models/model.py +++ b/sf_warehouse/models/model.py @@ -951,6 +951,12 @@ class SfStockPicking(models.Model): """ 批量调拨,非就绪状态的会被忽略,完成后有通知提示 """ + # 对所以调拨单的质检单进行是否完成校验 + sp_ids = [sp.id for sp in self] + qc_ids = self.env['quality.check'].sudo().search( + [('picking_id', 'in', sp_ids), ('quality_state', 'in', ['waiting', 'none'])]) + if qc_ids: + raise ValidationError(f'单据{[qc.picking_id.name for qc in qc_ids]}未完成质量检查,完成后再试。') for record in self: if record.state != 'assigned': continue From 8e27ee24347d241abdb1e11a0ea9410e28b115cb Mon Sep 17 00:00:00 2001 From: guanhuan Date: Thu, 20 Feb 2025 10:25:56 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=8A=B6=E6=80=81=E5=B7=B2=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/sale_order.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sf_manufacturing/models/sale_order.py b/sf_manufacturing/models/sale_order.py index e31faf1c..0865c4a8 100644 --- a/sf_manufacturing/models/sale_order.py +++ b/sf_manufacturing/models/sale_order.py @@ -1,6 +1,6 @@ import logging import json -from odoo import models, fields, api +from odoo import models, fields, api, _ from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -24,6 +24,8 @@ class SaleOrder(models.Model): self.state = 'supply method' def action_confirm(self): + if self._get_forbidden_state_confirm() & set(self.mapped('state')): + raise UserError(_('订单状态已发生变化,请刷新当前页面')) # 判断是否所有产品都选择了供货方式 filter_line = self.order_line.filtered(lambda line: not line.supply_method) if filter_line: From e6ab17ca0df86c2ca488767606fedc08d83cb9fa Mon Sep 17 00:00:00 2001 From: hyyy <123@qq.com> Date: Thu, 20 Feb 2025 11:34:19 +0800 Subject: [PATCH 06/16] =?UTF-8?q?sf-=E5=88=B6=E9=80=A0-=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=88=80=E5=85=B7=E6=A0=87=E5=87=86=E5=BA=93=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/static/src/scss/format_img.scss | 14 ++++++++++++++ sf_base/views/tool_views.xml | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sf_base/static/src/scss/format_img.scss b/sf_base/static/src/scss/format_img.scss index fc6f02dc..940e3a68 100644 --- a/sf_base/static/src/scss/format_img.scss +++ b/sf_base/static/src/scss/format_img.scss @@ -24,4 +24,18 @@ .o_search_panel.account_root { flex: unset !important; +} + +.multi-line { + display: flex; + flex-wrap: nowrap; + > label.o_form_label { + width: 52px; + } + > span { + flex: 1; + } + > div { + flex: 2 + } } \ No newline at end of file diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index e9d672e5..6ce80937 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -138,7 +138,7 @@