From 826d5b1d584e006796d1350598f8f0b64defebca Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Thu, 6 Mar 2025 13:37:52 +0800
Subject: [PATCH 1/2] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=B7=A5?=
=?UTF-8?q?=E5=8D=95=E5=AD=90=E9=A1=B5=E7=AD=BE=E5=8F=AF=E5=85=A8=E9=87=8F?=
=?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=A4=84=E7=90=86=E6=96=B9=E6=B3=95=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/models/mrp_production.py | 2 +-
sf_manufacturing/models/mrp_workorder.py | 44 +++++++++----------
sf_manufacturing/views/mrp_workorder_view.xml | 8 ----
sf_quality/__init__.py | 1 +
sf_quality/models/__init__.py | 1 +
sf_quality/models/quality.py | 3 +-
sf_quality/models/stock.py | 21 +++++++++
sf_quality/wizard/__init__.py | 0
8 files changed, 48 insertions(+), 32 deletions(-)
create mode 100644 sf_quality/models/stock.py
create mode 100644 sf_quality/wizard/__init__.py
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index 4f9571c8..f8a22b28 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -365,7 +365,7 @@ class MrpProduction(models.Model):
and production.schedule_state == '已排' and production.is_rework is False):
production.state = 'pending_cam'
if any((wo.test_results == '返工' and wo.state == 'done' and
- (production.programming_state in ['已编程'] or 'PTD' in wo.individuation_page_list))
+ (production.programming_state in ['已编程'] or(wo.individuation_page_list and 'PTD' in wo.individuation_page_list)))
or (wo.is_rework is True and wo.state == 'done' and production.programming_state in ['编程中', '已编程'])
for wo in production.workorder_ids) or production.is_rework is True:
production.state = 'rework'
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index 728123e0..c0c45ac8 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -1442,7 +1442,8 @@ class ResMrpWorkOrder(models.Model):
record.production_id.process_state = '待加工'
# 生成工件配送单
record.workpiece_delivery_ids = record._json_workpiece_delivery_list()
- if record.routing_type == 'CNC加工' or 'PTD' in record.individuation_page_list:
+ if (record.routing_type == 'CNC加工' or
+ (record.individuation_page_list and 'PTD' in record.individuation_page_list)):
if record.routing_type == 'CNC加工':
record.process_state = '待解除装夹'
# record.write({'process_state': '待加工'})
@@ -1675,32 +1676,31 @@ class ResMrpWorkOrder(models.Model):
move_subcontract_workorder_ids = fields.One2many('stock.move', 'subcontract_workorder_id', string='组件')
# ==============================配置化页签--个性化记录===================================
- routing_workcenter_id = fields.Many2one('mrp.routing.workcenter', compute='_compute_routing_workcenter_id',
- store=True, string='工序作业')
- individuation_page_ids = fields.Many2many('sf.work.individuation.page', string='个性化记录', store=True,
- compute='_compute_individuation_page_ids')
- individuation_page_list = fields.Char('个性化记录', default=None)
+ routing_work_center_id = fields.Many2one('mrp.routing.workcenter', compute='_compute_routing_work_center_id',
+ store=True, string='工序作业')
+ individuation_page_ids = fields.Many2many('sf.work.individuation.page', string='个性化记录',
+ related='routing_work_center_id.individuation_page_ids')
+ individuation_page_list = fields.Char('个性化记录', default='', compute='_compute_individuation_page_ids', store=True)
@api.depends('name')
- def _compute_routing_workcenter_id(self):
+ def _compute_routing_work_center_id(self):
for mw in self:
- routing_workcenter_id = self.env['mrp.routing.workcenter'].sudo().search(
- [('name', '=', mw.name), ('routing_type', '=', mw.routing_type)])
- if routing_workcenter_id:
- mw.routing_workcenter_id = routing_workcenter_id.id
+ if not mw.routing_work_center_id and mw.name:
+ routing_work_center_id = self.env['mrp.routing.workcenter'].sudo().search(
+ [('name', 'in', mw.name.split('-')), ('routing_type', '=', mw.routing_type)])
+ if routing_work_center_id:
+ mw.routing_work_center_id = routing_work_center_id.id
- @api.depends('routing_workcenter_id.individuation_page_ids')
+ @api.depends('individuation_page_ids')
def _compute_individuation_page_ids(self):
for mw in self:
- if mw.routing_workcenter_id:
- mw.individuation_page_ids = mw.routing_workcenter_id.individuation_page_ids.ids
- # 初始化页签配置
- mw.individuation_page_list = None
- # 根据工单对应的【作业_个性化记录】配置页签
- individuation_page_list = [item.code for item in mw.routing_workcenter_id.individuation_page_ids]
- if individuation_page_list:
- mw.individuation_page_list = list(set(individuation_page_list))
-
+ mw.individuation_page_list = '[]'
+ if mw.routing_work_center_id:
+ if mw.individuation_page_ids:
+ # 根据工单对应的【作业_个性化记录】配置页签
+ individuation_page_list = [item.code for item in mw.individuation_page_ids]
+ if individuation_page_list:
+ mw.individuation_page_list = list(set(individuation_page_list))
# =============================================================================================
is_inspect = fields.Boolean('需送检', compute='_compute_is_inspect', store=True, default=False)
@@ -2010,7 +2010,7 @@ class WorkPieceDelivery(models.Model):
feeder_station_destination_id = fields.Many2one('sf.agv.site', '目的接驳站')
task_delivery_time = fields.Datetime('任务下发时间')
task_completion_time = fields.Datetime('任务完成时间')
-
+
def _get_agv_route_type_selection(self):
return self.env['sf.agv.task.route'].fields_get(['route_type'])['route_type']['selection']
type = fields.Selection(selection=_get_agv_route_type_selection, string='类型')
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 23c67c71..64c1c7a8 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -503,14 +503,6 @@
-
-
-
-
-
-
-
-
diff --git a/sf_quality/__init__.py b/sf_quality/__init__.py
index 8134f974..52497701 100644
--- a/sf_quality/__init__.py
+++ b/sf_quality/__init__.py
@@ -2,3 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
+from . import wizard
diff --git a/sf_quality/models/__init__.py b/sf_quality/models/__init__.py
index 60081c7b..4fcdb16f 100644
--- a/sf_quality/models/__init__.py
+++ b/sf_quality/models/__init__.py
@@ -5,3 +5,4 @@ from . import custom_quality
from . import quality
from . import quality_cnc_test
from . import mrp_workorder
+# from . import stock
diff --git a/sf_quality/models/quality.py b/sf_quality/models/quality.py
index 498ec402..970292b7 100644
--- a/sf_quality/models/quality.py
+++ b/sf_quality/models/quality.py
@@ -93,7 +93,8 @@ class QualityCheck(models.Model):
raise ValidationError('请填写【判定结果】里的信息')
if self.test_results == '合格':
raise ValidationError('请重新选择【判定结果】-【检测结果】')
- if self.workorder_id.routing_type != 'CNC加工' and 'PTD' not in self.workorder_id.individuation_page_list:
+ if (self.workorder_id.routing_type != 'CNC加工' and self.workorder_id.individuation_page_list
+ and 'PTD' not in self.workorder_id.individuation_page_list):
self.workorder_id.production_id.write({'detection_result_ids': [(0, 0, {
'rework_reason': self.reason,
'detailed_reason': self.detailed_reason,
diff --git a/sf_quality/models/stock.py b/sf_quality/models/stock.py
new file mode 100644
index 00000000..c2eefa68
--- /dev/null
+++ b/sf_quality/models/stock.py
@@ -0,0 +1,21 @@
+from odoo import api, models
+
+
+class StockPicking(models.Model):
+ _inherit = 'stock.picking'
+
+ def button_validate(self):
+ """
+ 调拨单若关联了质量检查单,验证调拨单时,应校验是否有不合格品,若存在,应弹窗提示:
+ “警告:存在不合格产品XXXX n 件、YYYYY m件,继续调拨请点“确认”,否则请取消?”
+ """
+ if self.quality_check_ids.filtered(lambda qc: qc.quality_state == 'fail'):
+ return {
+ 'type': 'ir.actions.act_window',
+ 'res_model': 'sf.functional.tool.assembly.order',
+ 'name': ' ',
+ 'view_mode': 'form',
+ 'target': 'new',
+ 'context': {'': True}
+ }
+ return super(StockPicking, self).button_validate()
diff --git a/sf_quality/wizard/__init__.py b/sf_quality/wizard/__init__.py
new file mode 100644
index 00000000..e69de29b
From 674af1d11d34c5f2fe2415bf8c3bfa2b1f9d5191 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?=
Date: Thu, 6 Mar 2025 16:02:19 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=88=90=E5=93=81=EF=BC=8C=E5=9D=AF?=
=?UTF-8?q?=E6=96=99=E5=A4=8D=E5=88=B6=E6=A8=A1=E6=9D=BF=E4=B8=AD=E7=9A=84?=
=?UTF-8?q?=E9=87=87=E8=B4=AD=E7=94=B3=E8=AF=B7=E5=AD=97=E6=AE=B5=E6=A8=A1?=
=?UTF-8?q?=E6=9D=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
jikimo_purchase_request/__init__.py | 2 ++
jikimo_purchase_request/__manifest__.py | 22 +++++++++++++++++++
jikimo_purchase_request/models/__init__.py | 2 ++
.../models/product_template.py | 17 ++++++++++++++
4 files changed, 43 insertions(+)
create mode 100644 jikimo_purchase_request/__init__.py
create mode 100644 jikimo_purchase_request/__manifest__.py
create mode 100644 jikimo_purchase_request/models/__init__.py
create mode 100644 jikimo_purchase_request/models/product_template.py
diff --git a/jikimo_purchase_request/__init__.py b/jikimo_purchase_request/__init__.py
new file mode 100644
index 00000000..a0fdc10f
--- /dev/null
+++ b/jikimo_purchase_request/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import models
diff --git a/jikimo_purchase_request/__manifest__.py b/jikimo_purchase_request/__manifest__.py
new file mode 100644
index 00000000..f2054556
--- /dev/null
+++ b/jikimo_purchase_request/__manifest__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': '机企猫 采购申请',
+ 'version': '16.0.1.0.0',
+ 'summary': """ 机企猫 采购申请 """,
+ 'author': '机企猫',
+ 'website': 'https://bfw.jikimo.com',
+ 'category': 'purchase',
+ 'depends': ['sf_manufacturing', 'purchase_request'],
+ 'data': [
+
+ ],
+ # 'assets': {
+ # 'web.assets_backend': [
+ # 'jikimo_purchase_request/static/src/**/*'
+ # ],
+ # },
+ 'application': True,
+ 'installable': True,
+ 'auto_install': False,
+ 'license': 'LGPL-3',
+}
diff --git a/jikimo_purchase_request/models/__init__.py b/jikimo_purchase_request/models/__init__.py
new file mode 100644
index 00000000..1c32c33a
--- /dev/null
+++ b/jikimo_purchase_request/models/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import product_template
\ No newline at end of file
diff --git a/jikimo_purchase_request/models/product_template.py b/jikimo_purchase_request/models/product_template.py
new file mode 100644
index 00000000..e6e96f10
--- /dev/null
+++ b/jikimo_purchase_request/models/product_template.py
@@ -0,0 +1,17 @@
+from odoo import models, fields
+
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
+ purchase_request_id = fields.Many2one('purchase.request', string='采购申请')
+
+ def no_bom_product_create(self, product_id, item, order_id, route_type, i, finish_product):
+ """ 创建坯料时,复制采购申请 """
+ template_id = super(ProductTemplate, self).no_bom_product_create(product_id, item, order_id, route_type, i, finish_product)
+ template_id.purchase_request = product_id.purchase_request
+ return template_id
+
+ def copy_template(self, product_template_id):
+ """ 复制成品模板时,复制采购申请 """
+ super(ProductTemplate, self).copy_template(product_template_id)
+ self.purchase_request = product_template_id.purchase_request
\ No newline at end of file