From 0a65c292860500a8177d07c167bc1daeae46ba98 Mon Sep 17 00:00:00 2001 From: hyyy <123@qq.com> Date: Wed, 5 Mar 2025 17:24:42 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E5=8F=96=E6=B6=88=E9=94=80=E5=94=AE?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9A=84=E4=B8=8B=E6=B8=B8=E6=B8=85=E5=8D=95?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/js/custom_form_status_indicator.js | 94 +++++++++++++------ .../wizard/sale_order_cancel_views.xml | 8 +- 2 files changed, 67 insertions(+), 35 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 5d8b2fbf..3296b127 100644 --- a/jikimo_frontend/static/src/js/custom_form_status_indicator.js +++ b/jikimo_frontend/static/src/js/custom_form_status_indicator.js @@ -115,9 +115,20 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { this.setRequired() this.listherHeaderBodyNum() }) - owl.onPatched(() => { + owl.onPatched(() => { this.listherHeaderBodyNum() }) + const treeModifiers = this.getFieldModifiers(this.props.archInfo.__rawArch); + // console.log('treeModifiers', treeModifiers); + if(treeModifiers) { + this.props.merge_key = treeModifiers.merge_key; + this.props.merge_fields = treeModifiers.merge_fields.split(','); + const data = this.setColumns(this.props.merge_key); + console.log('data', data); + owl.onMounted(() => { + this.mergeColumns(this.props.merge_fields, data) + }) + } return this._super(...arguments); }, setRequired() { @@ -163,7 +174,58 @@ patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', { } catch (e) { console.log(e) } + }, + setColumns( merge_key) { + const data = this.props.list.records + let sourceIndex = 0; + let sourceValue = '' + data.forEach((item, index) => { + if(!item.colspan) { + item.colspan = 1; + } + if(item.data[merge_key] === sourceValue) { + data[sourceIndex].colspan ++ ; + item.colspan = 0; + } else { + sourceIndex = index; + sourceValue = item.data[merge_key]; + } + }) + return data + }, + getFieldModifiers(xmlString) { + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(xmlString, "text/xml"); + + // 提取 的 modifiers + const treeElement = xmlDoc.querySelector("tree"); + const treeModifiers = treeElement.getAttribute("modifiers"); + if (treeModifiers) { + const parsedTreeModifiers = JSON.parse(treeModifiers); + console.log("Tree Modifiers:", parsedTreeModifiers); + return parsedTreeModifiers; + } + return null; + }, + mergeColumns(merge_fields, data) { + const dom = this.tableRef.el + const thead = $(dom).children('thead') + const tbody = $(dom).children('tbody') + tbody.children('tr.o_data_row').each(function () { + const tr = $(this) + const td = tr.children('td') + const index = $(this).index() + td.each(function () { + if(merge_fields.indexOf($(this).attr('name')) >= 0) { + $(this).attr('rowspan', data[index].colspan) + if(data[index].colspan == 0) { + $(this).remove() + } + } + }) + }) } + }) patch(FormLabel.prototype, 'jikimo_frontend.FormLabel', { get className() { @@ -176,7 +238,6 @@ patch(FormLabel.prototype, 'jikimo_frontend.FormLabel', { ); const classes = this.props.className ? [this.props.className] : []; const otherRequired = filedRequiredList[this.props.fieldName] - if(this.props.fieldInfo?.rawAttrs?.class?.indexOf('custom_required') >= 0 || otherRequired) { classes.push('custom_required_add') } @@ -193,35 +254,6 @@ patch(FormLabel.prototype, 'jikimo_frontend.FormLabel', { } }) -// 根据进度条设置水印 -// const statusbar_params = { -// '已完工': 'bg-primary', -// '完成': 'bg-primary', -// '采购订单': 'bg-primary', -// '作废': 'bg-danger', -// '封存(报废)': 'bg-danger', -// } -// patch(StatusBarField.prototype, 'jikimo_frontend.StatusBarField', { -// setup() { -// owl.onMounted(this.ribbons); -// return this._super(...arguments); -// }, -// ribbons() { -// try { -// const dom = $('.o_form_sheet.position-relative') -// const status = statusbar_params[this.currentName] -// if(status && dom.length) { -// dom.prepend(`
-//
-// ${this.currentName} -//
-//
`) -// } -// } catch (e) { -// console.log(e) -// } -// } -// }) $(function () { diff --git a/sf_manufacturing/wizard/sale_order_cancel_views.xml b/sf_manufacturing/wizard/sale_order_cancel_views.xml index 134c524b..6848faf6 100644 --- a/sf_manufacturing/wizard/sale_order_cancel_views.xml +++ b/sf_manufacturing/wizard/sale_order_cancel_views.xml @@ -12,18 +12,18 @@ - - + + + + - -
From 9c5ecdfe76718fe1469eaa59f1aab21b694edc8c Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 6 Mar 2025 10:25:56 +0800 Subject: [PATCH 02/18] =?UTF-8?q?sf=20=E6=9D=90=E6=96=99=E5=9E=8B=E5=8F=B7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5=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_base/models/common.py | 21 +++++++++++++++------ sf_base/views/common_view.xml | 8 ++++---- sf_mrs_connect/models/res_config_setting.py | 4 +++- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/sf_base/models/common.py b/sf_base/models/common.py index 4152c119..25c79f72 100644 --- a/sf_base/models/common.py +++ b/sf_base/models/common.py @@ -57,15 +57,24 @@ class MrsMaterialModel(models.Model): remark = fields.Text("备注") gain_way = fields.Selection( [("自加工", "自加工"), ("外协", "委外加工"), ("采购", "采购")], - default="", string="获取方式") + default="采购", string="获取方式") supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商') active = fields.Boolean('有效', default=True) - @api.constrains("gain_way") - def _check_supplier_ids(self): - for item in self: - if item.gain_way in ('外协', '采购') and not item.supplier_ids: - raise UserError("请添加供应商") + @api.model + def create(self, vals): + res = super(MrsMaterialModel, self).create(vals) + if not vals.get('supplier_ids'): + supplier_id = self.env['res.partner'].search([('name', '=', '湖南傲派自动化设备有限公司')], limit=1) + res.supplier_ids = [(0, 0, {'materials_model_id': res.id, 'partner_id': supplier_id.id or False})] + return res + else: + return res + # @api.constrains("gain_way") + # def _check_supplier_ids(self): + # for item in self: + # if item.gain_way in ('外协', '采购') and not item.supplier_ids: + # raise UserError("请添加供应商") class MrsProductionProcessCategory(models.Model): diff --git a/sf_base/views/common_view.xml b/sf_base/views/common_view.xml index e49e25ba..74b8f177 100644 --- a/sf_base/views/common_view.xml +++ b/sf_base/views/common_view.xml @@ -262,13 +262,13 @@ - - - + + + @@ -297,7 +297,7 @@ sf.materials.model - + diff --git a/sf_mrs_connect/models/res_config_setting.py b/sf_mrs_connect/models/res_config_setting.py index eb853186..c387f765 100644 --- a/sf_mrs_connect/models/res_config_setting.py +++ b/sf_mrs_connect/models/res_config_setting.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # Part of SmartGo. See LICENSE file for full copyright and licensing details. import logging +import traceback import requests @@ -90,7 +91,8 @@ class ResConfigSettings(models.TransientModel): _logger.info("同步坯料冗余完成") except Exception as e: - _logger.info("sf_all_sync error: %s" % e) + traceback_error = traceback.format_exc() + _logger.error("sf_all_sync error:%s" % traceback_error) raise ValidationError("数据错误导致同步失败,请联系管理员") @api.model From e12755783c31addf5f9675c0f9fa760db1105fd2 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Thu, 6 Mar 2025 13:46:18 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E5=AE=A1=E6=89=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jikimo_purchase_tier_validation/models/models.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/jikimo_purchase_tier_validation/models/models.py b/jikimo_purchase_tier_validation/models/models.py index 018766eb..4462e962 100644 --- a/jikimo_purchase_tier_validation/models/models.py +++ b/jikimo_purchase_tier_validation/models/models.py @@ -9,6 +9,8 @@ class jikimo_purchase_tier_validation(models.Model): _name = 'purchase.order' _inherit = ['purchase.order', 'tier.validation'] _description = "采购订单" + _state_from = ["draft", "to approve", "rejected"] + _state_to = ["approved"] _tier_validation_buttons_xpath = "/form/header/button[@id='draft_confirm'][1]" @@ -68,11 +70,6 @@ class jikimo_purchase_tier_validation(models.Model): return res - def _rejected_tier(self, tiers=False): - res = super(jikimo_purchase_tier_validation, self)._rejected_tier(tiers) - self.state = 'draft' - return res - @api.model def _get_under_validation_exceptions(self): res = super(jikimo_purchase_tier_validation, self)._get_under_validation_exceptions() From 0d7f34819461e9b583ea5fb912673d426705fd6d Mon Sep 17 00:00:00 2001 From: guanhuan Date: Fri, 7 Mar 2025 11:29:32 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95=E8=AF=A2=E4=BB=B7=E5=8D=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/models.py | 2 +- sf_manufacturing/views/stock_picking_view.xml | 10 +++++++ sf_sale/views/purchase_order_view.xml | 28 +++++++++++-------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/jikimo_purchase_tier_validation/models/models.py b/jikimo_purchase_tier_validation/models/models.py index 4462e962..ecb7ed73 100644 --- a/jikimo_purchase_tier_validation/models/models.py +++ b/jikimo_purchase_tier_validation/models/models.py @@ -23,7 +23,7 @@ class jikimo_purchase_tier_validation(models.Model): def button_confirm(self): for record in self: - if record.state in ['to approve']: + if record.need_validation and not record.validation_status == 'validated': raise ValidationError(_('请先完成审批。')) res = super(jikimo_purchase_tier_validation, self).button_confirm() for record in self: diff --git a/sf_manufacturing/views/stock_picking_view.xml b/sf_manufacturing/views/stock_picking_view.xml index 458494b9..3cb877a9 100644 --- a/sf_manufacturing/views/stock_picking_view.xml +++ b/sf_manufacturing/views/stock_picking_view.xml @@ -67,6 +67,16 @@ + + + + diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml index 209fd4fa..6624c7fa 100644 --- a/sf_sale/views/purchase_order_view.xml +++ b/sf_sale/views/purchase_order_view.xml @@ -42,20 +42,20 @@ - -
+ +
+ From 34456c3506e54f8f1fff6f2d10088ba8052583e6 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Mon, 10 Mar 2025 16:54:15 +0800 Subject: [PATCH 06/18] =?UTF-8?q?=E5=AE=8C=E6=88=90=20=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=8D=95=E6=97=B6=EF=BC=8C=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=8D=E5=90=88=E6=A0=BC=E4=BA=A7=E5=93=81=EF=BC=8C=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E5=AD=98=E5=9C=A8=E4=B8=8D=E5=90=88=E6=A0=BC=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E5=8D=95=E5=88=99=E7=BB=99=E4=B8=8E=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_quality/__manifest__.py | 3 ++- sf_quality/models/__init__.py | 2 +- sf_quality/models/stock.py | 26 ++++++++++++++++--- sf_quality/security/ir.model.access.csv | 2 +- sf_quality/wizard/__init__.py | 1 + sf_quality/wizard/check_picking_wizard.py | 17 ++++++++++++ .../wizard/check_picking_wizard_view.xml | 15 +++++++++++ 7 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 sf_quality/wizard/check_picking_wizard.py create mode 100644 sf_quality/wizard/check_picking_wizard_view.xml diff --git a/sf_quality/__manifest__.py b/sf_quality/__manifest__.py index 9c2c3138..e44a6f68 100644 --- a/sf_quality/__manifest__.py +++ b/sf_quality/__manifest__.py @@ -19,7 +19,8 @@ 'views/view.xml', 'views/quality_cnc_test_view.xml', 'views/mrp_workorder.xml', - 'views/quality_check_view.xml' + 'views/quality_check_view.xml', + 'wizard/check_picking_wizard_view.xml', ], 'assets': { diff --git a/sf_quality/models/__init__.py b/sf_quality/models/__init__.py index 4fcdb16f..17ad5fab 100644 --- a/sf_quality/models/__init__.py +++ b/sf_quality/models/__init__.py @@ -5,4 +5,4 @@ from . import custom_quality from . import quality from . import quality_cnc_test from . import mrp_workorder -# from . import stock +from . import stock diff --git a/sf_quality/models/stock.py b/sf_quality/models/stock.py index c2eefa68..c9788a51 100644 --- a/sf_quality/models/stock.py +++ b/sf_quality/models/stock.py @@ -9,13 +9,31 @@ class StockPicking(models.Model): 调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示: “警告:存在不合格产品XXXX n 件、YYYYY m件,继续调拨请点“确认”,否则请取消?” """ - if self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'): + context = self.env.context + if not context.get('again_validate') and self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'): + # 回滚事务,为二次确认/取消做准备 + self.env.cr.rollback() + quality_check_ids = self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail') + product_list = list(set([quality_check_id.product_id for quality_check_id in quality_check_ids])) + fail_check_text = '' + for product_id in product_list: + check_ids = quality_check_ids.filtered(lambda qc: qc.product_id == product_id) + number = sum(check_ids.mapped('qty_line')) + if number != 0: + fail_check_text = (f'{fail_check_text}、{product_id.name} {number}件' + if fail_check_text != '' else f'{product_id.name} {number}件') + else: + fail_check_text = (f'{fail_check_text}、{product_id.name}' + if fail_check_text != '' else f'{product_id.name}') return { 'type': 'ir.actions.act_window', - 'res_model': 'sf.functional.tool.assembly.order', - 'name': ' ', + 'res_model': 'picking.validate.check.wizard', + 'name': '质检不合格提示', 'view_mode': 'form', 'target': 'new', - 'context': {'': True} + 'context': { + 'default_picking_id': self.id, + 'default_fail_check_text': f'警告:存在不合格产品{fail_check_text},继续调拨请点“确认”,否则请取消?', + 'again_validate': True} } return super(StockPicking, self).button_validate() diff --git a/sf_quality/security/ir.model.access.csv b/sf_quality/security/ir.model.access.csv index 907c115b..fa1ec3fa 100644 --- a/sf_quality/security/ir.model.access.csv +++ b/sf_quality/security/ir.model.access.csv @@ -73,6 +73,6 @@ access_quality_cnc_test_group_quality_director,quality_cnc_test_group_quality_di access_quality_cnc_test_group_sf_equipment_user,quality_cnc_test_group_sf_equipment_user,model_quality_cnc_test,sf_base.group_sf_equipment_user,1,1,0,0 - +access_picking_validate_check_wizard,access.picking_validate_check_wizard,model_picking_validate_check_wizard,quality.group_quality_user,1,1,1,0 diff --git a/sf_quality/wizard/__init__.py b/sf_quality/wizard/__init__.py index e69de29b..2c90d07b 100644 --- a/sf_quality/wizard/__init__.py +++ b/sf_quality/wizard/__init__.py @@ -0,0 +1 @@ +from . import check_picking_wizard diff --git a/sf_quality/wizard/check_picking_wizard.py b/sf_quality/wizard/check_picking_wizard.py new file mode 100644 index 00000000..1cb25756 --- /dev/null +++ b/sf_quality/wizard/check_picking_wizard.py @@ -0,0 +1,17 @@ +from odoo import api, models,fields + + +class PickingValidateCheckWizard(models.TransientModel): + _name = 'picking.validate.check.wizard' + _description = '调拨质检不合格二次验证' + + picking_id = fields.Many2one('stock.picking', '调拨单') + fail_check_text = fields.Text('提示信息') + + def confirm_picking_validate_check(self): + self.picking_id.button_validate() + return {'type': 'ir.actions.act_window_close'} + + def cancel_picking_validate_check(self): + # 这里是取消后的逻辑 + return {'type': 'ir.actions.act_window_close'} diff --git a/sf_quality/wizard/check_picking_wizard_view.xml b/sf_quality/wizard/check_picking_wizard_view.xml new file mode 100644 index 00000000..702b2578 --- /dev/null +++ b/sf_quality/wizard/check_picking_wizard_view.xml @@ -0,0 +1,15 @@ + + + picking.validate.check.wizard + picking.validate.check.wizard + +
+ +
+
+ +
+
+
\ No newline at end of file From 8237d04f32a723a9ee08c015f81102b9e1ab4dba Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Tue, 11 Mar 2025 16:12:04 +0800 Subject: [PATCH 07/18] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=88=80=E5=85=B7?= =?UTF-8?q?=E7=BB=84=E8=A3=85=E6=89=AB=E7=A0=81=E9=AA=8C=E8=AF=81=E7=89=A9?= =?UTF-8?q?=E6=96=99=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_tool_management/models/base.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 237d5b91..40100a93 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -983,19 +983,19 @@ class FunctionalToolAssembly(models.Model): # 物料必填校验 if not self.handle_code_id: - raise ValidationError('缺少【刀柄】物料信息!') + raise ValidationError('请扫【刀柄】RFID,录入【刀柄】物料信息!') if self.integral_lot_id: if not self.integral_verify: - raise ValidationError('【整体式刀具】未进行验证!') + raise ValidationError('请扫【整体式刀具】的货位编码进行验证!') elif self.blade_lot_id: if not self.blade_verify: - raise ValidationError('【刀片】未进行验证!') + raise ValidationError('请扫【刀片】的货位编码进行验证!') if self.bar_lot_id: if not self.bar_verify: - raise ValidationError('【刀杆】未进行验证!') + raise ValidationError('请扫【刀杆】的货位编码进行验证!') elif self.pad_lot_id: if not self.pad_verify: - raise ValidationError('【刀盘】未进行验证!') + raise ValidationError('请扫【刀盘】的货位编码进行验证!') # 组装参数必填校验 if self.after_assembly_max_lifetime_value == 0: raise ValidationError('组装参数信息【最大寿命值】不能为0!') From 5b084624dfd9ff10701ae0bab80fa275369e5bf4 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Wed, 12 Mar 2025 13:46:07 +0800 Subject: [PATCH 08/18] =?UTF-8?q?=E4=B8=8D=E9=80=81=E6=A3=80=E7=9A=84?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E5=8D=95=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=E7=AD=89=E5=BE=85=E3=80=81=E5=BE=85?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index c0c45ac8..4a5d0c0f 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1198,11 +1198,7 @@ class ResMrpWorkOrder(models.Model): 'cmm_ids': production.workorder_ids.filtered(lambda t: t.routing_type == 'CNC加工').cmm_ids, }] return workorders_values_str - - @api.depends('production_availability', 'blocked_by_workorder_ids', 'blocked_by_workorder_ids.state', - 'production_id.tool_state', 'production_id.schedule_state', 'sequence', - 'production_id.programming_state') - def _compute_state(self): + def _process_compute_state(self): for workorder in self: # 如果工单的工序没有进行排序则跳出循环 if workorder.production_id.workorder_ids.filtered(lambda wk: wk.sequence == 0): @@ -1289,7 +1285,20 @@ class ResMrpWorkOrder(models.Model): mo.get_move_line(workorder.production_id, workorder)) else: workorder.state = 'waiting' - + @api.depends('production_availability', 'blocked_by_workorder_ids', 'blocked_by_workorder_ids.state', + 'production_id.tool_state', 'production_id.schedule_state', 'sequence', + 'production_id.programming_state') + def _compute_state(self): + self._process_compute_state() + for workorder in self: + if workorder.state == 'waiting' or workorder.state == 'pending': + for check_id in workorder.check_ids: + if not check_id.is_inspect: + check_id.quality_state = 'waiting' + if workorder.state == 'ready': + for check_id in workorder.check_ids: + if not check_id.is_inspect: + check_id.quality_state = 'none' # 重写工单开始按钮方法 def button_start(self): # 判断工单状态是否为等待组件 From 0d8445e444744054da0e731a0e7d85fbd79ae0fc Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 13 Mar 2025 08:36:10 +0800 Subject: [PATCH 09/18] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=B7=A5=E5=8D=95?= =?UTF-8?q?=E7=9A=84Rfid=E6=89=AB=E7=A0=81=E7=BB=91=E5=AE=9A=E8=A7=A3?= =?UTF-8?q?=E7=BB=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 7 ++++--- sf_manufacturing/wizard/production_wizard.py | 7 +++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index c0c45ac8..4b877aa7 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1510,8 +1510,8 @@ class ResMrpWorkOrder(models.Model): for workorder in record.production_id.workorder_ids: if workorder.processing_panel == record.processing_panel: rfid_code = workorder.rfid_code - workorder.write({'rfid_code_old': rfid_code, - 'rfid_code': False}) + workorder.filtered(lambda wo: wo.state != 'rework' or wo.rfid_code is not False).write( + {'rfid_code_old': rfid_code, 'rfid_code': False}) self.env['stock.lot'].sudo().search([('rfid', '=', rfid_code)]).write( {'tool_material_status': '可用'}) if workorder.rfid_code: @@ -1928,7 +1928,8 @@ class SfWorkOrderBarcodes(models.Model): self.write(val) workorder_rfid = self.env['mrp.workorder'].search( [('production_id', '=', workorder.production_id.id), - ('processing_panel', '=', workorder.processing_panel)]) + ('processing_panel', '=', workorder.processing_panel), + ('state', '!=', 'rework')]) if workorder_rfid: for item in workorder_rfid: item.write({'rfid_code': barcode}) diff --git a/sf_manufacturing/wizard/production_wizard.py b/sf_manufacturing/wizard/production_wizard.py index aa2a4075..fb835818 100644 --- a/sf_manufacturing/wizard/production_wizard.py +++ b/sf_manufacturing/wizard/production_wizard.py @@ -46,8 +46,11 @@ class ProductionWizard(models.TransientModel): mrp_workorder_list = self.mrp_production_id.workorder_ids.filtered(lambda kw: kw.rfid_code) for workorder in mrp_workorder_list: rfid_code = workorder.rfid_code - workorder.write({'rfid_code_old': rfid_code, - 'rfid_code': False}) + workorder.filtered(lambda wo: wo.routing_type == '装夹预调' and wo.rfid_code is not False).write( + {'rfid_code_old': rfid_code, 'rfid_code': False}) + workorder.filtered(lambda wo: wo.routing_type != '装夹预调' and wo.rfid_code is not False).write( + {'rfid_code_old': False, 'rfid_code': False}) + if self.is_remanufacture is True: ret = {'programming_list': [], 'is_reprogramming': self.is_reprogramming} if self.is_reprogramming is True: From 7c48e6b186147cac62946c15584b1ed02eb2eae5 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 13 Mar 2025 09:49:17 +0800 Subject: [PATCH 10/18] =?UTF-8?q?=E5=90=8C=E4=B8=80=E4=B8=AA=E9=94=80?= =?UTF-8?q?=E5=94=AE=E8=AE=A2=E5=8D=95=E7=9A=84=E4=B8=8D=E5=90=8C=E4=BA=A7?= =?UTF-8?q?=E5=93=81=E7=9A=84=E5=9D=AF=E6=96=99=E8=8E=B7=E5=8F=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E4=B8=8D=E4=B8=80=E6=A0=B7=EF=BC=8C=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=9A=84=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_production.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index f8a22b28..433feccc 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -1574,7 +1574,7 @@ class MrpProduction(models.Model): vals['picking_type_id'] = picking_type_id vals['name'] = self.env['stock.picking.type'].browse(picking_type_id).sequence_id.next_by_id() product_id = self.env['product.product'].browse(vals['product_id']) - is_self_process = product_id.materials_type_id and product_id.materials_type_id.gain_way and product_id.materials_type_id.gain_way != '自加工' + is_self_process = product_id.materials_type_id.gain_way if product_id.materials_type_id else None is_customer_provided = product_id.is_customer_provided key = f"{is_self_process}_{is_customer_provided}" if not is_custemer_group_id.get(key): From 83699fcae625f37f433625cb43a9ca1b5f572994 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 13 Mar 2025 11:11:22 +0800 Subject: [PATCH 11/18] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E6=8F=90=E7=A4=BA=E7=BF=BB=E8=AF=91=EF=BC=9B2?= =?UTF-8?q?=E3=80=81=E5=A4=84=E7=90=86=E5=8D=95=E6=8D=AE=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8E=9F=E5=8D=95=E6=8D=AE=E6=95=B0=E6=8D=AE=E4=B8=8D=E5=85=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B3=E3=80=81=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=88=B6=E9=80=A0=E8=AE=A2=E5=8D=95=E8=BF=94=E5=B7=A5=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quality_control/wizard/quality_check_wizard.py | 3 ++- sf_manufacturing/models/stock.py | 2 ++ sf_manufacturing/wizard/rework_wizard.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/quality_control/wizard/quality_check_wizard.py b/quality_control/wizard/quality_check_wizard.py index 1317236d..3c67eb87 100644 --- a/quality_control/wizard/quality_check_wizard.py +++ b/quality_control/wizard/quality_check_wizard.py @@ -62,7 +62,8 @@ class QualityCheckWizard(models.TransientModel): def do_pass(self): if self.test_type == 'picture' and not self.picture: - raise UserError('You must provide a picture before validating') + raise UserError('请先上传照片') + # raise UserError('You must provide a picture before validating') self.current_check_id.do_pass() return self.action_generate_next_window() diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 30485988..02018a11 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -1032,6 +1032,8 @@ class ReStockMove(models.Model): productions = self.env['mrp.production'].search( [('origin', '=', production.origin), ('product_id', '=', production.product_id.id)]) res['origin'] = ','.join(productions.mapped('name')) + if self.picking_type_id.name == '客供料入库': + self.picking_id.sudo().write({'origin': res['origin'] if res.get('origin') else self[0].picking_id.origin}) return res def _get_new_picking_values(self): diff --git a/sf_manufacturing/wizard/rework_wizard.py b/sf_manufacturing/wizard/rework_wizard.py index 11827819..6061dda8 100644 --- a/sf_manufacturing/wizard/rework_wizard.py +++ b/sf_manufacturing/wizard/rework_wizard.py @@ -140,7 +140,7 @@ class ReworkWizard(models.TransientModel): and item.process_parameters_id == work.surface_technics_parameters_id) or (item.route_id.name == work.name and item.panel and item.panel == work.processing_panel) or - (item.route_id == work.routing_workcenter_id + (item.route_id == work.routing_work_center_id and not work.processing_panel and not work.surface_technics_parameters_id)) if route: From 9d042dc61e7bae7b081f7ff77c917fbb7ca11dcb Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 13 Mar 2025 13:02:22 +0800 Subject: [PATCH 12/18] =?UTF-8?q?1=E3=80=81=E5=A4=84=E7=90=86=E8=B0=83?= =?UTF-8?q?=E6=8B=A8=E5=8D=95=E4=BA=8C=E6=AC=A1=E9=AA=8C=E8=AF=81=E6=97=B6?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E7=9B=B4=E6=8E=A5=E5=85=B3=E9=97=AD=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B2=E3=80=81=E5=A4=84=E7=90=86=E7=89=B9=E6=AE=8A?= =?UTF-8?q?=E9=80=94=E5=BE=84-=E5=88=B6=E9=80=A0=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=86=85=E5=A4=96=E5=8D=8F=E8=B0=83=E6=8B=A8=E5=8D=95=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E6=A3=80=E6=9F=A5=E4=B8=8D=E9=80=9A=E8=BF=87=EF=BC=8C?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E8=B7=B3=E8=BD=AC=E8=B4=A8=E9=87=8F=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E9=A1=B5=E9=9D=A2=E6=8A=A5=E9=94=99=20=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mrp_workorder/models/quality.py | 1 + quality_control/wizard/quality_check_wizard.py | 4 ++-- sf_quality/wizard/check_picking_wizard.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mrp_workorder/models/quality.py b/mrp_workorder/models/quality.py index a0797b61..2b8ca118 100644 --- a/mrp_workorder/models/quality.py +++ b/mrp_workorder/models/quality.py @@ -190,6 +190,7 @@ class QualityCheck(models.Model): # doubly linked chain for tablet view navigation next_check_id = fields.Many2one('quality.check') previous_check_id = fields.Many2one('quality.check') + is_produced = fields.Boolean(string="Has Been Produced") # For components registration move_id = fields.Many2one( diff --git a/quality_control/wizard/quality_check_wizard.py b/quality_control/wizard/quality_check_wizard.py index 3c67eb87..3a6b6639 100644 --- a/quality_control/wizard/quality_check_wizard.py +++ b/quality_control/wizard/quality_check_wizard.py @@ -122,8 +122,8 @@ class PickingCheckCancelWizard(models.TransientModel): picking_id = fields.Many2one('stock.picking', 'stock picking') def confirm_picking_check(self): - self.picking_id.action_cancel() - return {'type': 'ir.actions.act_window_close'} + res = self.picking_id.action_cancel() + return res def cancel_picking_check(self): # 这里是取消后的逻辑 diff --git a/sf_quality/wizard/check_picking_wizard.py b/sf_quality/wizard/check_picking_wizard.py index 1cb25756..1b9bcf3c 100644 --- a/sf_quality/wizard/check_picking_wizard.py +++ b/sf_quality/wizard/check_picking_wizard.py @@ -9,8 +9,8 @@ class PickingValidateCheckWizard(models.TransientModel): fail_check_text = fields.Text('提示信息') def confirm_picking_validate_check(self): - self.picking_id.button_validate() - return {'type': 'ir.actions.act_window_close'} + res = self.picking_id.button_validate() + return res def cancel_picking_validate_check(self): # 这里是取消后的逻辑 From 3543531f61d14d1717df000729890a9ea677e398 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 13 Mar 2025 14:13:28 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E8=A1=A8=E9=9D=A2=E5=B7=A5=E8=89=BA?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9B=B6=E4=BB=B6=E5=9B=BE=E5=8F=B7=E9=9B=B6?= =?UTF-8?q?=E4=BB=B6=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/purchase_order.py | 13 +++++++++++++ sf_sale/models/sale_order.py | 2 ++ 2 files changed, 15 insertions(+) diff --git a/sf_manufacturing/models/purchase_order.py b/sf_manufacturing/models/purchase_order.py index 398db85b..de802d66 100644 --- a/sf_manufacturing/models/purchase_order.py +++ b/sf_manufacturing/models/purchase_order.py @@ -117,6 +117,8 @@ class PurchaseOrderLine(models.Model): @api.depends('product_id') def _compute_related_product(self): for record in self: + if record.part_number or record.part_name: + continue if record.product_id.categ_id.name == '坯料': product_name = '' match = re.search(r'(S\d{5}-\d)', record.product_id.name) @@ -135,6 +137,17 @@ class PurchaseOrderLine(models.Model): ) record.part_number = filtered_order_line.product_id.part_number if filtered_order_line else None record.part_name = filtered_order_line.product_id.part_name if filtered_order_line else None + elif record.product_id.categ_id.name == '表面工艺': + domain = [('name', '=', self.production_id.name), + ('purchase_type', '=', 'consignment')] + purchase_orders = self.env['purchase.order'].search(domain) + purchase_orders_id = self.env['purchase.order'] + for po in purchase_orders: + for line in po.order_line: + if line.product_id.server_product_process_parameters_id == self.surface_technics_parameters_id: + if line.product_qty == 1: + purchase_orders_id = line.order_id + return purchase_orders_id else: record.part_number = record.product_id.part_number record.part_name = record.product_id.part_name diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index b719ffd1..2b0380c4 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -374,6 +374,8 @@ class RePurchaseOrder(models.Model): 'product_qty': 1, 'product_uom': server_template.uom_id.id, 'related_product': production.product_id.id, + 'part_number': pp.part_number, + 'part_name': pp.part_name, })) # 获取服务商品最后一个供应商的采购员 purchase_user_id = server_template.seller_ids[-1].partner_id.purchase_user_id From 7ddcfc6226832f7be446a926df6f7cd3be352b8b Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 13 Mar 2025 14:39:04 +0800 Subject: [PATCH 14/18] =?UTF-8?q?1=E3=80=81=E5=A4=84=E7=90=86=20=E5=88=B6?= =?UTF-8?q?=E9=80=A0=E8=AE=A2=E5=8D=95=E5=86=85=E5=A4=96=E5=8D=8F=E8=B0=83?= =?UTF-8?q?=E6=8B=A8=E5=8D=95=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E4=B8=8D?= =?UTF-8?q?=E9=80=9A=E8=BF=87=EF=BC=8C=E7=82=B9=E5=87=BB=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E9=A1=B5=E9=9D=A2=E6=8A=A5?= =?UTF-8?q?=E9=94=99=20=EF=BC=9B2=E3=80=81=E5=A4=84=E7=90=86=20=E5=B7=A5?= =?UTF-8?q?=E5=8D=95Rfid=E7=BB=91=E5=AE=9A=E8=A7=A3=E7=BB=91=E6=98=AF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8D=E6=AD=A3=E7=A1=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mrp_workorder/models/quality.py | 2 +- quality_control/models/stock_picking.py | 3 +++ sf_manufacturing/models/mrp_workorder.py | 8 ++++++-- sf_manufacturing/wizard/production_wizard.py | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/mrp_workorder/models/quality.py b/mrp_workorder/models/quality.py index 2b8ca118..7867c029 100644 --- a/mrp_workorder/models/quality.py +++ b/mrp_workorder/models/quality.py @@ -190,7 +190,7 @@ class QualityCheck(models.Model): # doubly linked chain for tablet view navigation next_check_id = fields.Many2one('quality.check') previous_check_id = fields.Many2one('quality.check') - is_produced = fields.Boolean(string="Has Been Produced") + # is_produced = fields.Boolean(string="Has Been Produced") # For components registration move_id = fields.Many2one( diff --git a/quality_control/models/stock_picking.py b/quality_control/models/stock_picking.py index 0f92edde..bc8638d7 100644 --- a/quality_control/models/stock_picking.py +++ b/quality_control/models/stock_picking.py @@ -109,6 +109,9 @@ class StockPicking(models.Model): def action_open_quality_check_picking(self): action = self.env["ir.actions.actions"]._for_xml_id("quality_control.quality_check_action_picking") action['context'] = self.env.context.copy() + keys_to_remove = [key for key in action['context'] if key.startswith('default_')] + for key in keys_to_remove: + del action['context'][key] action['context'].update({ 'search_default_picking_id': [self.id], 'default_picking_id': self.id, diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 9c43db92..d8d69f37 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1519,8 +1519,12 @@ class ResMrpWorkOrder(models.Model): for workorder in record.production_id.workorder_ids: if workorder.processing_panel == record.processing_panel: rfid_code = workorder.rfid_code - workorder.filtered(lambda wo: wo.state != 'rework' or wo.rfid_code is not False).write( - {'rfid_code_old': rfid_code, 'rfid_code': False}) + if record.is_rework is not True: + workorder.write({'rfid_code_old': rfid_code, 'rfid_code': False}) + elif workorder.routing_type != '装夹预调' and workorder.state != 'rework': + workorder.write({'rfid_code_old': False, 'rfid_code': False}) + elif workorder.routing_type == '装夹预调' and workorder.state != 'rework': + workorder.write({'rfid_code_old': rfid_code, 'rfid_code': False}) self.env['stock.lot'].sudo().search([('rfid', '=', rfid_code)]).write( {'tool_material_status': '可用'}) if workorder.rfid_code: diff --git a/sf_manufacturing/wizard/production_wizard.py b/sf_manufacturing/wizard/production_wizard.py index fb835818..abd8b6cc 100644 --- a/sf_manufacturing/wizard/production_wizard.py +++ b/sf_manufacturing/wizard/production_wizard.py @@ -48,7 +48,8 @@ class ProductionWizard(models.TransientModel): rfid_code = workorder.rfid_code workorder.filtered(lambda wo: wo.routing_type == '装夹预调' and wo.rfid_code is not False).write( {'rfid_code_old': rfid_code, 'rfid_code': False}) - workorder.filtered(lambda wo: wo.routing_type != '装夹预调' and wo.rfid_code is not False).write( + workorder.filtered(lambda wo: (wo.routing_type != '装夹预调' and + (wo.rfid_code_old is not False or wo.rfid_code is not False))).write( {'rfid_code_old': False, 'rfid_code': False}) if self.is_remanufacture is True: From 359eae14cc355bbda5619ed83d88d1da2917a0d6 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 13 Mar 2025 15:32:12 +0800 Subject: [PATCH 15/18] =?UTF-8?q?1=E3=80=81=E5=AE=8C=E6=88=90=20=E5=88=B6?= =?UTF-8?q?=E9=80=A0=E8=AE=A2=E5=8D=95=E5=86=85=E5=A4=96=E5=8D=8F=E8=B0=83?= =?UTF-8?q?=E6=8B=A8=E5=8D=95=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E4=B8=8D?= =?UTF-8?q?=E9=80=9A=E8=BF=87=EF=BC=8C=E7=82=B9=E5=87=BB=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5=E9=A1=B5=E9=9D=A2=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mrp_workorder/models/quality.py | 1 - quality_control/models/stock_picking.py | 8 ++------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/mrp_workorder/models/quality.py b/mrp_workorder/models/quality.py index 7867c029..a0797b61 100644 --- a/mrp_workorder/models/quality.py +++ b/mrp_workorder/models/quality.py @@ -190,7 +190,6 @@ class QualityCheck(models.Model): # doubly linked chain for tablet view navigation next_check_id = fields.Many2one('quality.check') previous_check_id = fields.Many2one('quality.check') - # is_produced = fields.Boolean(string="Has Been Produced") # For components registration move_id = fields.Many2one( diff --git a/quality_control/models/stock_picking.py b/quality_control/models/stock_picking.py index bc8638d7..243ffd18 100644 --- a/quality_control/models/stock_picking.py +++ b/quality_control/models/stock_picking.py @@ -108,15 +108,11 @@ class StockPicking(models.Model): def action_open_quality_check_picking(self): action = self.env["ir.actions.actions"]._for_xml_id("quality_control.quality_check_action_picking") - action['context'] = self.env.context.copy() - keys_to_remove = [key for key in action['context'] if key.startswith('default_')] - for key in keys_to_remove: - del action['context'][key] - action['context'].update({ + action['context'] = { 'search_default_picking_id': [self.id], 'default_picking_id': self.id, 'show_lots_text': self.show_lots_text, - }) + } return action def button_quality_alert(self): From ef5eea18457e8fff9908aa705afacfae73ef2123 Mon Sep 17 00:00:00 2001 From: liaodanlong Date: Thu, 13 Mar 2025 15:32:54 +0800 Subject: [PATCH 16/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/purchase_order.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/sf_manufacturing/models/purchase_order.py b/sf_manufacturing/models/purchase_order.py index de802d66..39e8f23d 100644 --- a/sf_manufacturing/models/purchase_order.py +++ b/sf_manufacturing/models/purchase_order.py @@ -137,17 +137,6 @@ class PurchaseOrderLine(models.Model): ) record.part_number = filtered_order_line.product_id.part_number if filtered_order_line else None record.part_name = filtered_order_line.product_id.part_name if filtered_order_line else None - elif record.product_id.categ_id.name == '表面工艺': - domain = [('name', '=', self.production_id.name), - ('purchase_type', '=', 'consignment')] - purchase_orders = self.env['purchase.order'].search(domain) - purchase_orders_id = self.env['purchase.order'] - for po in purchase_orders: - for line in po.order_line: - if line.product_id.server_product_process_parameters_id == self.surface_technics_parameters_id: - if line.product_qty == 1: - purchase_orders_id = line.order_id - return purchase_orders_id else: record.part_number = record.product_id.part_number record.part_name = record.product_id.part_name From cd114d183b78614f15b185cf111f973d75cd59ea Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Thu, 13 Mar 2025 16:45:09 +0800 Subject: [PATCH 17/18] =?UTF-8?q?=E5=A4=84=E7=90=86=E8=B4=A8=E6=A3=80?= =?UTF-8?q?=E5=8D=95=E6=8E=A7=E5=88=B6=E6=96=B9=E5=BC=8F=E4=B8=BA=E9=9D=9E?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E6=97=B6=EF=BC=8C=E8=B0=83=E6=8B=A8=E5=8D=95?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E6=97=B6=E5=AD=98=E5=9C=A8=E4=B8=8D=E5=90=88?= =?UTF-8?q?=E6=A0=BC=E8=B4=A8=E6=A3=80=E5=8D=95=E7=9A=84=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=95=B0=E9=87=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_quality/models/stock.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sf_quality/models/stock.py b/sf_quality/models/stock.py index c9788a51..fa5003e7 100644 --- a/sf_quality/models/stock.py +++ b/sf_quality/models/stock.py @@ -18,13 +18,13 @@ class StockPicking(models.Model): fail_check_text = '' for product_id in product_list: check_ids = quality_check_ids.filtered(lambda qc: qc.product_id == product_id) - number = sum(check_ids.mapped('qty_line')) - if number != 0: - fail_check_text = (f'{fail_check_text}、{product_id.name} {number}件' - if fail_check_text != '' else f'{product_id.name} {number}件') + if all(check_id.measure_on == 'move_line' for check_id in check_ids): + number = sum(check_ids.mapped('qty_line')) else: - fail_check_text = (f'{fail_check_text}、{product_id.name}' - if fail_check_text != '' else f'{product_id.name}') + number = sum(self.move_ids_without_package.filtered( + lambda ml: ml.product_id == product_id).mapped('quantity_done')) + fail_check_text = (f'{fail_check_text}、{product_id.name} {number}件' + if fail_check_text != '' else f'{product_id.name} {number}件') return { 'type': 'ir.actions.act_window', 'res_model': 'picking.validate.check.wizard', From 3baf3e60e8879d09d21f3e05df185665ff662aa3 Mon Sep 17 00:00:00 2001 From: guanhuan Date: Thu, 13 Mar 2025 17:21:05 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=96=E5=8D=8F?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=8D=95=E6=A0=B9=E6=8D=AE=E5=9B=BE=E5=8F=B7?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 28 +++++++++++++++++++-- sf_warehouse/models/model.py | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 307fbbc2..fbea675c 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -4,6 +4,7 @@ import requests import base64 import hashlib import os +import re from odoo import models, fields, api, _ from odoo.exceptions import ValidationError, UserError from odoo.modules import get_resource_path @@ -776,10 +777,33 @@ class ResProductMo(models.Model): manual_quotation = fields.Boolean('人工编程', default=False, readonly=True) machining_drawings = fields.Binary('2D加工图纸', readonly=True) quality_standard = fields.Binary('质检标准', readonly=True) - part_name = fields.Char(string='零件名称', readonly=True) - part_number = fields.Char(string='零件图号', readonly=True) + part_name = fields.Char(string='零件名称', compute='_compute_related_product', readonly=True, store=True) + part_number = fields.Char(string='零件图号', compute='_compute_related_product', readonly=True, store=True) machining_drawings_name = fields.Char(string='零件图号名称', readonly=True) machining_drawings_mimetype = fields.Char(string='零件图号类型', readonly=True) + + @api.depends('name') + def _compute_related_product(self): + for record in self: + if record.categ_id.name == '坯料': + product_name = '' + match = re.search(r'(S\d{5}-\d)', record.name) + # 如果匹配成功,提取结果 + if match: + product_name = match.group(0) + sale_order_name = '' + match_sale = re.search(r'S(\d+)', record.name) + if match_sale: + sale_order_name = match_sale.group(0) + sale_order = self.env['sale.order'].sudo().search( + [('name', '=', sale_order_name)]) + if sale_order: + filtered_order_line = sale_order.order_line.filtered( + lambda order_line: re.search(f'{product_name}$', order_line.product_id.name) + ) + record.part_number = filtered_order_line.product_id.part_number if filtered_order_line else None + record.part_name = filtered_order_line.product_id.part_name if filtered_order_line else None + @api.constrains('tool_length') def _check_tool_length_size(self): if self.tool_length > 1000000: diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py index 848b1f66..65cca601 100644 --- a/sf_warehouse/models/model.py +++ b/sf_warehouse/models/model.py @@ -1140,7 +1140,7 @@ class SfPickingType(models.Model): action = super(SfPickingType, self)._get_action(action_xmlid) if not self.env.user.has_group('base.group_system'): action['context']['create'] = False - if self.sequence_code in ['DL', 'INT', 'PC']: + if self.sequence_code in ['INT', 'PC']: action['context']['search_default_retrospect'] = 1 return action