From 186dca46180e0fef8bd107b188ee599777f7a395 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Mon, 13 Jan 2025 15:07:08 +0800
Subject: [PATCH 1/4] =?UTF-8?q?1=E3=80=81=E5=8F=96=E6=B6=88=E8=B4=A8?=
=?UTF-8?q?=E9=87=8F=E6=A3=80=E6=9F=A5=E9=A1=B5=E9=9D=A2=E6=A0=B9=E6=8D=AE?=
=?UTF-8?q?=E6=8C=87=E4=BB=A4=E6=A3=80=E6=9F=A5=E8=87=AA=E5=8A=A8=E7=AD=9B?=
=?UTF-8?q?=E9=80=89=EF=BC=9B2=E3=80=81=E4=BF=AE=E6=94=B9=E9=80=81?=
=?UTF-8?q?=E6=A3=80=E6=8C=89=E9=92=AE=E9=9A=90=E8=97=8F=E6=9D=A1=E4=BB=B6?=
=?UTF-8?q?=EF=BC=9B3=E3=80=81=E4=BC=98=E5=8C=96=E5=B7=A5=E5=8D=95?=
=?UTF-8?q?=E5=90=8E=E7=BD=AE=E4=B8=89=E5=85=83=E6=A3=80=E6=B5=8Bpage?=
=?UTF-8?q?=E9=A1=B5=E6=98=BE=E7=A4=BA=E6=97=B6=EF=BC=8C=E6=A3=80=E6=B5=8B?=
=?UTF-8?q?=E7=BB=93=E6=9E=9C=E9=80=89=E6=8B=A9=E8=BF=94=E5=B7=A5=E6=97=B6?=
=?UTF-8?q?=E5=88=B6=E9=80=A0=E8=AE=A2=E5=8D=95=E6=B2=A1=E6=9C=89=E7=94=9F?=
=?UTF-8?q?=E6=88=90=E6=A3=80=E6=B5=8B=E7=BB=93=E6=9E=9C=E8=AE=B0=E5=BD=95?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
quality_mrp_workorder/views/quality_views.xml | 3 ---
sf_manufacturing/models/mrp_production.py | 7 ++++++-
sf_manufacturing/models/mrp_workorder.py | 13 +++++++------
sf_manufacturing/views/mrp_workorder_view.xml | 5 +++--
sf_manufacturing/wizard/rework_wizard.py | 7 ++++++-
5 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/quality_mrp_workorder/views/quality_views.xml b/quality_mrp_workorder/views/quality_views.xml
index ce592e0b..09cc66fe 100644
--- a/quality_mrp_workorder/views/quality_views.xml
+++ b/quality_mrp_workorder/views/quality_views.xml
@@ -140,7 +140,4 @@
-
- {'search_default_quality_checks': 1}
-
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index 9bc9d3cf..aab1389d 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -1597,7 +1597,12 @@ class sf_detection_result(models.Model):
processing_panel = fields.Char('加工面')
routing_type = fields.Selection([
('装夹预调', '装夹预调'),
- ('CNC加工', 'CNC加工')], string="工序类型")
+ ('CNC加工', 'CNC加工'),
+ ('解除装夹', '解除装夹'),
+ ('切割', '切割'),
+ ('表面工艺', '表面工艺'),
+ ('线切割', '线切割'),
+ ('人工线下加工', '人工线下加工')], string="工序类型")
rework_reason = fields.Selection(
[("programming", "编程"), ("cutter", "刀具"), ("clamping", "装夹"),
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index 63e049cd..4d789256 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -1254,7 +1254,7 @@ class ResMrpWorkOrder(models.Model):
record.production_id.process_state = '待加工'
# 生成工件配送单
record.workpiece_delivery_ids = record._json_workpiece_delivery_list()
- if record.routing_type == 'CNC加工':
+ if record.routing_type == 'CNC加工' or record.individuation_page_PTD is True:
record.process_state = '待解除装夹'
# record.write({'process_state': '待加工'})
record.production_id.process_state = '待解除装夹'
@@ -1345,17 +1345,18 @@ class ResMrpWorkOrder(models.Model):
# record.production_id.state = 'done'
# ============工单完成,修改对应[质检单]的值=====================
- if record.check_ids:
+ if record.check_ids.filtered(lambda qc: qc.quality_state in ('waiting', 'none')):
+ check_ids = record.check_ids.filtered(lambda qc: qc.quality_state in ('waiting', 'none'))
if record.test_results == '合格':
- record.check_ids.write({'test_results': None})
- for check_id in record.check_ids:
+ check_ids.write({'test_results': None})
+ for check_id in check_ids:
check_id.do_pass()
elif record.test_results in ('返工', '报废'):
- record.check_ids.write({
+ check_ids.write({
'test_results': record.test_results,
'reason': record.reason,
'detailed_reason': record.detailed_reason})
- for check_id in record.check_ids:
+ for check_id in check_ids:
check_id.do_fail()
# ======================================================
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 18164796..ad2e7fe4 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -187,7 +187,7 @@
context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
attrs="{'invisible': ['|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked')]}"/>
+ attrs="{'invisible': ['|', '|', ('state', 'not in', ('progress')), ('is_inspect', '=', False), ('routing_type','=','CNC加工')]}"/>
@@ -529,7 +529,8 @@
+ attrs='{"readonly":[("state","!=","to be detected"), "|",("routing_type","=","CNC加工"),("is_inspect", "=", True)],
+ "invisible":[("results","!=",False)]}'/>
diff --git a/sf_manufacturing/wizard/rework_wizard.py b/sf_manufacturing/wizard/rework_wizard.py
index 148967be..8e8ec7bc 100644
--- a/sf_manufacturing/wizard/rework_wizard.py
+++ b/sf_manufacturing/wizard/rework_wizard.py
@@ -24,7 +24,12 @@ class ReworkWizard(models.TransientModel):
detailed_reason = fields.Text('详细原因')
routing_type = fields.Selection([
('装夹预调', '装夹预调'),
- ('CNC加工', 'CNC加工')], string="工序类型")
+ ('CNC加工', 'CNC加工'),
+ ('解除装夹', '解除装夹'),
+ ('切割', '切割'),
+ ('表面工艺', '表面工艺'),
+ ('线切割', '线切割'),
+ ('人工线下加工', '人工线下加工')], string="工序类型")
# 根据工单的加工面来显示
processing_panel_id = fields.Many2many('sf.processing.panel', string="加工面")
is_reprogramming = fields.Boolean(string='申请重新编程', default=False)
From bf4d06e22b301bd8adec046c634a024fff629b34 Mon Sep 17 00:00:00 2001
From: liaodanlong
Date: Mon, 13 Jan 2025 16:08:51 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=B6=E9=80=A0=E8=AE=A2=E5=8D=95?=
=?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=8D=95=E5=90=88=E5=B9=B6=E6=8E=92=E9=99=A4?=
=?UTF-8?q?=E8=87=AA=E5=8A=A0=E5=B7=A5=E4=BA=A7=E5=93=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/mrp_production.py | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index d3417c1f..c3175ade 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -1495,23 +1495,25 @@ class MrpProduction(models.Model):
picking_type_id = self._get_default_picking_type_id(vals.get('company_id', self.env.company.id))
vals['picking_type_id'] = picking_type_id
vals['name'] = self.env['stock.picking.type'].browse(picking_type_id).sequence_id.next_by_id()
- if not is_first:
+ 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 != '自加工'
+ if not is_first and is_self_process:
is_first = True
group_id = self.env["procurement.group"].create({'name': vals.get('name')}).id
if not vals.get('procurement_group_id'):
- product_id = self.env['product.product'].browse(vals['product_id'])
if product_id.product_tmpl_id.single_manufacturing:
- if product_id.categ_id.name =='成品':
+ if product_id.categ_id.name == '成品' and is_self_process:
vals['procurement_group_id'] = group_id
continue
if product_id.id not in product_group_id.keys():
procurement_group_vals = self._prepare_procurement_group_vals(vals)
- group_id = self.env["procurement.group"].create(procurement_group_vals).id
- vals['procurement_group_id'] = group_id
- product_group_id[product_id.id] = group_id
+ procurement_group_id = self.env["procurement.group"].create(procurement_group_vals).id
+ vals['procurement_group_id'] = procurement_group_id
+ product_group_id[product_id.id] = procurement_group_id
else:
vals['procurement_group_id'] = product_group_id[product_id.id]
- vals['procurement_group_id'] = group_id
+ else:
+ vals['procurement_group_id'] = group_id
return super(MrpProduction, self).create(vals_list)
@api.depends('procurement_group_id.stock_move_ids.created_purchase_line_id.order_id',
From a8271d851df31e11a95ca281c50ea1db03d6050f Mon Sep 17 00:00:00 2001
From: liaodanlong
Date: Mon, 13 Jan 2025 16:09:51 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E9=87=87=E8=B4=AD=E5=8D=95=E5=8F=82?=
=?UTF-8?q?=E8=80=83=E9=94=80=E5=94=AE=E8=AE=A2=E5=8D=95=E5=8F=AF=E8=A7=81?=
=?UTF-8?q?=E6=80=A7=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/views/purchase_order_view.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sf_manufacturing/views/purchase_order_view.xml b/sf_manufacturing/views/purchase_order_view.xml
index 3b1518fb..2b008b56 100644
--- a/sf_manufacturing/views/purchase_order_view.xml
+++ b/sf_manufacturing/views/purchase_order_view.xml
@@ -25,9 +25,9 @@
+ attrs="{'invisible': [('origin_sale_ids' , '!=', False)]}"/>
+ attrs="{'invisible': [('origin_sale_ids' , '=', False)]}"/>
From b398d1236ec0eed2add83b865cd34354c3bd365e Mon Sep 17 00:00:00 2001
From: liaodanlong
Date: Mon, 13 Jan 2025 16:46:13 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E5=B7=A5=E8=89=BA=E7=A1=AE=E8=AE=A4?=
=?UTF-8?q?=E5=90=8E=E7=9A=84=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/mrp_production.py | 9 +--------
sf_manufacturing/models/purchase_order.py | 15 +++++++++++++++
2 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index c3175ade..611dc795 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -432,7 +432,6 @@ class MrpProduction(models.Model):
# 工艺确认
def technology_confirm(self):
process_parameters = []
- account_moves = []
purchase_orders = []
parameters_not = []
# 获取原有的工单对应的工序
@@ -443,10 +442,6 @@ class MrpProduction(models.Model):
for deleted_design in deleted_designs:
workorder = self.env['mrp.workorder'].search([('technology_design_id', '=', deleted_design.id)])
purchase = workorder._get_surface_technics_purchase_ids()
- account = self.env['account.move'].search([('id', 'in', purchase.invoice_ids.ids)])
- if account.state not in ['cancel', False]:
- if account.name not in account_moves:
- account_moves.append(account.name)
if purchase.state not in ['cancel','draft', False]:
purchase_orders.append(purchase.name)
special_design = self.technology_design_ids.filtered(
@@ -460,9 +455,7 @@ class MrpProduction(models.Model):
if not product_production_process:
if special.process_parameters_id not in process_parameters:
process_parameters.append(special.process_parameters_id.display_name)
-
- if account_moves:
- raise UserError(_("请联系工厂生产经理对该(%s)账单进行取消", ", ".join(account_moves)))
+
if purchase_orders:
raise UserError(_("请联系工厂生产经理对该(%s)采购订单进行取消", ", ".join(purchase_orders)))
if parameters_not:
diff --git a/sf_manufacturing/models/purchase_order.py b/sf_manufacturing/models/purchase_order.py
index c1f7cea8..313d2e73 100644
--- a/sf_manufacturing/models/purchase_order.py
+++ b/sf_manufacturing/models/purchase_order.py
@@ -4,6 +4,7 @@
from collections import defaultdict
from odoo import api, fields, models, _
+from odoo.exceptions import UserError
from odoo.tools import OrderedSet
@@ -16,6 +17,20 @@ class PurchaseOrder(models.Model):
compute='_compute_workorder_count',
)
+ def button_cancel(self):
+ account_moves = set() # 使用集合以避免重复,并提高查找速度
+ accounts = self.env['account.move'].search(
+ [('id', 'in', self.invoice_ids.ids), ('state', 'not in', ['cancel', False])])
+
+ # 直接筛选掉状态为'cancel'或False的记录,避免多次迭代
+ for account in accounts:
+ account_moves.add(account.name) # 使用set的add方法避免重复添加
+
+ # 如果你需要list形式的结果,可以将set转换为list
+ account_moves = list(account_moves)
+ if account_moves:
+ raise UserError(_("请联系工厂生产经理对该采购单的账单进行取消"))
+ return super(PurchaseOrder, self).button_cancel()
def action_view_production(self):
origins = [order.name for order in self.picking_ids]
production_id = self.env['mrp.production'].search([('origin', 'in', origins)])