From 1a384b990207e724fdadf7e15320c3d4abc38513 Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Wed, 8 Jan 2025 17:24:58 +0800
Subject: [PATCH 1/2] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=88=B6?=
=?UTF-8?q?=E9=80=A0-=E5=B7=A5=E5=BA=8F=E6=A8=A1=E5=9D=97=EF=BC=9B2?=
=?UTF-8?q?=E3=80=81=E6=96=B0=E5=A2=9E=E5=B7=A5=E5=BA=8F=E4=B8=AA=E6=80=A7?=
=?UTF-8?q?=E5=8C=96=E8=AE=B0=E5=BD=95=E6=A8=A1=E5=9E=8B=EF=BC=8C=E5=B9=B6?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=9F=E6=88=90=E5=88=9D=E5=A7=8B=E5=8C=96?=
=?UTF-8?q?=E5=80=BC=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/__manifest__.py | 1 +
sf_manufacturing/data/sf_work_individuation_page.xml | 8 ++++++++
sf_manufacturing/models/mrp_routing_workcenter.py | 9 +++++++++
sf_manufacturing/security/ir.model.access.csv | 5 ++++-
sf_manufacturing/views/mrp_routing_workcenter_view.xml | 2 ++
5 files changed, 24 insertions(+), 1 deletion(-)
create mode 100644 sf_manufacturing/data/sf_work_individuation_page.xml
diff --git a/sf_manufacturing/__manifest__.py b/sf_manufacturing/__manifest__.py
index 936afaaf..cffc789a 100644
--- a/sf_manufacturing/__manifest__.py
+++ b/sf_manufacturing/__manifest__.py
@@ -16,6 +16,7 @@
'data/stock_data.xml',
'data/empty_racks_data.xml',
'data/panel_data.xml',
+ 'data/sf_work_individuation_page.xml',
'data/agv_scheduling_data.xml',
'security/group_security.xml',
'security/ir.model.access.csv',
diff --git a/sf_manufacturing/data/sf_work_individuation_page.xml b/sf_manufacturing/data/sf_work_individuation_page.xml
new file mode 100644
index 00000000..89bf333b
--- /dev/null
+++ b/sf_manufacturing/data/sf_work_individuation_page.xml
@@ -0,0 +1,8 @@
+
+
+
+ PTD
+ 后置三元检测
+
+
+
\ No newline at end of file
diff --git a/sf_manufacturing/models/mrp_routing_workcenter.py b/sf_manufacturing/models/mrp_routing_workcenter.py
index 27c8e9d2..a2a884c9 100644
--- a/sf_manufacturing/models/mrp_routing_workcenter.py
+++ b/sf_manufacturing/models/mrp_routing_workcenter.py
@@ -25,6 +25,8 @@ class ResMrpRoutingWorkcenter(models.Model):
bom_id = fields.Many2one('mrp.bom', required=False)
surface_technics_id = fields.Many2one('sf.production.process', string="表面工艺")
reserved_duration = fields.Float('预留时长', default=30, tracking=True)
+ is_outsource = fields.Boolean('外协', default=False)
+ individuation_page = fields.Many2many('sf.work.individuation.page', string='个性化记录')
def get_no(self):
international_standards = self.search(
@@ -101,3 +103,10 @@ class ResMrpRoutingWorkcenter(models.Model):
domain = args + [('id', 'not in', route_workcenter_ids)]
return self._search(domain, limit=limit, access_rights_uid=name_get_uid)
return super()._name_search(name, args, operator, limit, name_get_uid)
+
+
+class WorkIndividuationPage(models.Model):
+ _name = 'sf.work.individuation.page'
+
+ code = fields.Char('编号')
+ name = fields.Char('名称')
diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv
index b8862b8d..4626e3ca 100644
--- a/sf_manufacturing/security/ir.model.access.csv
+++ b/sf_manufacturing/security/ir.model.access.csv
@@ -186,4 +186,7 @@ access_sf_detection_result_manager,sf_detection_result_manager,model_sf_detectio
access_mrp_workorder_batch_replan_wizard_group_plan_dispatch,mrp_workorder_batch_replan_wizard_group_plan_dispatch,model_mrp_workorder_batch_replan_wizard,sf_base.group_plan_dispatch,1,1,1,0
access_mrp_workorder_group_purchase_director,mrp_workorder,model_mrp_workorder,sf_base.group_purchase_director,1,1,0,0
-access_mrp_workorder_group_purchase,mrp_workorder,model_mrp_workorder,sf_base.group_purchase,1,1,0,0
\ No newline at end of file
+access_mrp_workorder_group_purchase,mrp_workorder,model_mrp_workorder,sf_base.group_purchase,1,1,0,0
+
+access_sf_work_individuation_page,sf_work_individuation_page,model_sf_work_individuation_page,sf_base.group_sf_mrp_user,1,1,1,0
+access_sf_work_individuation_page_group_plan_dispatch,sf_work_individuation_page_group_plan_dispatch,model_sf_work_individuation_page,sf_base.group_plan_dispatch,1,1,0,0
\ No newline at end of file
diff --git a/sf_manufacturing/views/mrp_routing_workcenter_view.xml b/sf_manufacturing/views/mrp_routing_workcenter_view.xml
index ddb9558c..b6646dfa 100644
--- a/sf_manufacturing/views/mrp_routing_workcenter_view.xml
+++ b/sf_manufacturing/views/mrp_routing_workcenter_view.xml
@@ -17,6 +17,8 @@
+
+
From 8d0e993d1ab55a6fa1428b54d7abb41bd655ec8f Mon Sep 17 00:00:00 2001
From: yuxianghui <3437689193@qq.com>
Date: Thu, 9 Jan 2025 17:20:18 +0800
Subject: [PATCH 2/2] =?UTF-8?q?1=E3=80=81=E5=8F=96=E6=B6=88=E5=B7=A5?=
=?UTF-8?q?=E5=8D=95=E7=82=B9=E5=87=BB=E5=BC=80=E5=A7=8B=E6=8C=89=E9=92=AE?=
=?UTF-8?q?=E4=BA=8C=E6=AC=A1=E7=A1=AE=E8=AE=A4=EF=BC=9B2=E3=80=81?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B4=A8=E9=87=8F=E6=8E=A7=E5=88=B6=E6=A0=87?=
=?UTF-8?q?=E5=87=86=E6=A8=A1=E5=9E=8B=EF=BC=9B3=E3=80=81=E5=AE=8C?=
=?UTF-8?q?=E6=88=90<=E8=B4=A8=E9=87=8F=5F=E8=B4=A8=E9=87=8F=E6=A3=80?=
=?UTF-8?q?=E6=9F=A5>=E9=80=9A=E7=94=A8=E8=B0=83=E6=95=B4=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=EF=BC=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_manufacturing/views/mrp_workorder_view.xml | 2 +-
sf_quality/__manifest__.py | 3 +-
sf_quality/models/custom_quality.py | 5 ++
sf_quality/models/quality.py | 81 +++++++++++++++++--
sf_quality/views/quality_check_view.xml | 71 ++++++++++++++++
sf_quality/views/view.xml | 4 +
6 files changed, 157 insertions(+), 9 deletions(-)
create mode 100644 sf_quality/views/quality_check_view.xml
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 1e47b873..d5cba300 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -172,7 +172,7 @@
-
diff --git a/sf_quality/__manifest__.py b/sf_quality/__manifest__.py
index 582e306a..94d005ec 100644
--- a/sf_quality/__manifest__.py
+++ b/sf_quality/__manifest__.py
@@ -17,7 +17,8 @@
'data': [
'security/ir.model.access.csv',
'views/view.xml',
- 'views/quality_cnc_test_view.xml'
+ 'views/quality_cnc_test_view.xml',
+ 'views/quality_check_view.xml'
],
'assets': {
diff --git a/sf_quality/models/custom_quality.py b/sf_quality/models/custom_quality.py
index f80dd92e..8bf10c3e 100644
--- a/sf_quality/models/custom_quality.py
+++ b/sf_quality/models/custom_quality.py
@@ -11,3 +11,8 @@ class SfQualityPoint(models.Model):
"('product', 'consu')), '|', ('company_id', '=', False), ('company_id', '=', company_id)]", help=
"Quality Point will apply to every selected Products.")
+ is_inspect = fields.Boolean('需送检', default=False)
+ operation_id = fields.Many2one(
+ 'mrp.routing.workcenter', 'Step', check_company=True,
+ domain="[('is_outsource', '=', False),('company_id', 'in', (company_id, False))]")
+
diff --git a/sf_quality/models/quality.py b/sf_quality/models/quality.py
index 6fc04154..489d2953 100644
--- a/sf_quality/models/quality.py
+++ b/sf_quality/models/quality.py
@@ -10,6 +10,80 @@ from odoo.addons.sf_base.commons.common import Common
class QualityCheck(models.Model):
_inherit = "quality.check"
+ quality_state = fields.Selection([
+ ('waiting', '等待'),
+ ('none', '待处理'),
+ ('pass', '通过的'),
+ ('fail', '失败的')], string='状态', tracking=True, store=True,
+ default='none', copy=False, compute='_compute_quality_state')
+
+ processing_panel = fields.Char(related='workorder_id.processing_panel', string='加工面')
+
+ production_line_id = fields.Many2one(related='workorder_id.production_line_id',
+ string='生产线')
+ equipment_id = fields.Many2one(related='workorder_id.equipment_id', string='加工设备')
+ model_file = fields.Binary(related='workorder_id.glb_file', string='加工模型')
+
+ detection_report = fields.Binary(related='workorder_id.detection_report', readonly=True, string='检测报告')
+ test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], string="检测结果",
+ default='合格')
+ reason = fields.Selection(
+ [("programming", "编程"), ("cutter", "刀具"), ("clamping", "装夹"), ("operate computer", "操机"),
+ ("technology", "工艺"), ("customer redrawing", "客户改图")], string="原因")
+ detailed_reason = fields.Text('详细原因')
+ machining_drawings = fields.Binary('2D加工图纸', related='workorder_id.machining_drawings')
+ quality_standard = fields.Binary('质检标准', related='workorder_id.quality_standard')
+
+ operation_id = fields.Many2one('mrp.routing.workcenter', '作业', store=True, compute='_compute_operation_id')
+ is_inspect = fields.Boolean('需送检', related='point_id.is_inspect')
+
+ @api.depends('point_id.operation_id')
+ def _compute_operation_id(self):
+ for qc in self:
+ if qc.point_id.operation_id:
+ qc.operation_id = qc.point_id.operation_id.id
+
+ @api.depends('point_id.is_inspect')
+ def _compute_quality_state(self):
+ for qc in self:
+ if qc.point_id.is_inspect and qc.quality_state == 'none':
+ qc.quality_state = 'waiting'
+ elif not qc.point_id.is_inspect and qc.quality_state == 'waiting':
+ qc.quality_state = 'none'
+
+ @api.onchange('test_results')
+ def _onchange_test_results(self):
+ if self.test_results == '合格':
+ self.reason = False
+ self.detailed_reason = False
+
+ def do_pass(self):
+ self.ensure_one()
+ super().do_pass()
+ if self.workorder_id:
+ # 1)将页签“判定结果”的检测结果值同步到【工单_后置三元检测_检测结果】
+ if self.test_results in ['返工', '报废']:
+ raise ValidationError('请重新选择【判定结果】-【检测结果】')
+ if self.workorder_id.state not in ['done']:
+ self.workorder_id.write({'test_results': self.test_results})
+ # 2)将关联的工单状态更新为“已完成”
+ self.workorder_id.button_finish()
+
+ def do_fail(self):
+ self.ensure_one()
+ super().do_fail()
+ if self.workorder_id:
+ # 1)将页签“判定结果”的检测结果值同步到【工单_后置三元检测_检测结果】
+ if not self.test_results:
+ raise ValidationError('请填写【判定结果】里的信息')
+ if self.test_results == '合格':
+ raise ValidationError('请重新选择【判定结果】-【检测结果】')
+ if self.workorder_id.state not in ['done']:
+ self.workorder_id.write(
+ {'test_results': self.test_results, 'reason': self.reason, 'detailed_reason': self.detailed_reason})
+ # 2)将关联的工单状态更新为“已完成”
+ self.workorder_id.button_finish()
+
# ==========零件特采接口==========
def _register_quality_check(self):
config = self.env['res.config.settings'].get_values()
@@ -31,10 +105,3 @@ class QualityCheck(models.Model):
else:
raise ValidationError("零件特采发送失败")
- # def do_fail(self):
- # self.write({
- # 'quality_state': 'fail',
- # 'user_id': self.env.user.id,
- # 'control_date': datetime.now()})
- # if self.picking_id and 'WH/MO/' in self.picking_id.origin:
- # self._register_quality_check()
diff --git a/sf_quality/views/quality_check_view.xml b/sf_quality/views/quality_check_view.xml
new file mode 100644
index 00000000..c1b2ae40
--- /dev/null
+++ b/sf_quality/views/quality_check_view.xml
@@ -0,0 +1,71 @@
+
+
+
+ sf.quality.check.view.form
+ quality.check
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sf.quality.check.view.tree
+ quality.check
+
+
+
+
+
+
+
+
+
+ sf.quality.check.view.search
+ quality.check
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sf_quality/views/view.xml b/sf_quality/views/view.xml
index 62a5b0e7..3f83acda 100644
--- a/sf_quality/views/view.xml
+++ b/sf_quality/views/view.xml
@@ -57,6 +57,10 @@
custom_required
1
+
+
+
+