From cbf8366cc3d0161c6d6cd968a2d78efa26d54436 Mon Sep 17 00:00:00 2001 From: gqh Date: Sun, 20 Nov 2022 19:05:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E5=BC=80=E5=A7=8B=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=AE=8C=E6=88=90=E4=B8=8A=E4=B8=80=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_route_workcenter/models/workcenter.py | 174 +++++++++++++-------- sf_route_workcenter/views/sf_workorder.xml | 17 +- 2 files changed, 119 insertions(+), 72 deletions(-) diff --git a/sf_route_workcenter/models/workcenter.py b/sf_route_workcenter/models/workcenter.py index cf5808ca..6b74e543 100644 --- a/sf_route_workcenter/models/workcenter.py +++ b/sf_route_workcenter/models/workcenter.py @@ -8,7 +8,8 @@ from io import BytesIO from odoo import api, fields, models, SUPERUSER_ID, _ from pystrich.code128 import Code128Encoder from odoo.exceptions import ValidationError - +from datetime import datetime, timedelta +from dateutil.relativedelta import relativedelta _logger = logging.getLogger(__name__) @@ -83,6 +84,56 @@ class MrpWorkOrder(models.Model): _description = '工单' + + + + + def button_start(self): + if self.state == 'waiting': + self.ensure_one() + if any(not time.date_end for time in self.time_ids.filtered(lambda t: t.user_id.id == self.env.user.id)): + return True + # As button_start is automatically called in the new view + if self.state in ('done', 'cancel'): + return True + + if self.product_tracking == 'serial': + self.qty_producing = 1.0 + else: + self.qty_producing = self.qty_remaining + + self.env['mrp.workcenter.productivity'].create( + self._prepare_timeline_vals(self.duration, datetime.now()) + ) + if self.production_id.state != 'progress': + self.production_id.write({ + 'date_start': datetime.now(), + }) + if self.state == 'progress': + return True + start_date = datetime.now() + vals = { + 'state': 'progress', + 'date_start': start_date, + } + if not self.leave_id: + leave = self.env['resource.calendar.leaves'].create({ + 'name': self.display_name, + 'calendar_id': self.workcenter_id.resource_calendar_id.id, + 'date_from': start_date, + 'date_to': start_date + relativedelta(minutes=self.duration_expected), + 'resource_id': self.workcenter_id.resource_id.id, + 'time_type': 'other' + }) + vals['leave_id'] = leave.id + return self.write(vals) + else: + if self.date_planned_start > start_date: + vals['date_planned_start'] = start_date + if self.date_planned_finished and self.date_planned_finished < start_date: + vals['date_planned_finished'] = start_date + return self.write(vals) + else:raise ValidationError(_('请先完成上一步工单')) # def get_tray_info(self): # @api.onchange('X_axis', 'Y_axis', 'Z_axis') # def get_center_point(self): @@ -196,56 +247,66 @@ class MrpWorkOrder(models.Model): return "" - def recreateManufacturing(self): + def recreateManufacturingOrWorkerOrder(self): """ - 重新生成制造订单 + 重新生成制造订单或者重新生成工单 """ - values = self.env['mrp.production'].create_production1_values(self.production_id) - productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company( - self.production_id.company_id).create( - values) - self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) - self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) - productions._create_workorder() - productions.filtered(lambda p: (not p.orderpoint_id and p.move_raw_ids) or \ - ( - p.move_dest_ids.procure_method != 'make_to_order' and not p.move_raw_ids and not p.workorder_ids)).action_confirm() + if self.test_results == '报废': + values = self.env['mrp.production'].create_production1_values(self.production_id) + productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company( + self.production_id.company_id).create( + values) + self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) + self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) + productions._create_workorder() + productions.filtered(lambda p: (not p.orderpoint_id and p.move_raw_ids) or \ + ( + p.move_dest_ids.procure_method != 'make_to_order' and not p.move_raw_ids and not p.workorder_ids)).action_confirm() - for production in productions: - origin_production = production.move_dest_ids and production.move_dest_ids[ - 0].raw_material_production_id or False - orderpoint = production.orderpoint_id - if orderpoint and orderpoint.create_uid.id == SUPERUSER_ID and orderpoint.trigger == 'manual': - production.message_post( - body=_('This production order has been created from Replenishment Report.'), - message_type='comment', - subtype_xmlid='mail.mt_note') - elif orderpoint: - production.message_post_with_view( - 'mail.message_origin_link', - values={'self': production, 'origin': orderpoint}, - subtype_id=self.env.ref('mail.mt_note').id) - elif origin_production: - production.message_post_with_view( - 'mail.message_origin_link', - values={'self': production, 'origin': origin_production}, - subtype_id=self.env.ref('mail.mt_note').id) - - # print(productions) - return "" - - def recreateWorkerOrder(self): - """ - 返工重新生成工单 - """ - productions = self.production_id - self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) - self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) - productions._create_workorder2(self.processing_panel) - return "" + for production in productions: + origin_production = production.move_dest_ids and production.move_dest_ids[ + 0].raw_material_production_id or False + orderpoint = production.orderpoint_id + if orderpoint and orderpoint.create_uid.id == SUPERUSER_ID and orderpoint.trigger == 'manual': + production.message_post( + body=_('This production order has been created from Replenishment Report.'), + message_type='comment', + subtype_xmlid='mail.mt_note') + elif orderpoint: + production.message_post_with_view( + 'mail.message_origin_link', + values={'self': production, 'origin': orderpoint}, + subtype_id=self.env.ref('mail.mt_note').id) + elif origin_production: + production.message_post_with_view( + 'mail.message_origin_link', + values={'self': production, 'origin': origin_production}, + subtype_id=self.env.ref('mail.mt_note').id) + if self.test_results == '返工': + productions = self.production_id + self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) + self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) + productions._create_workorder2(self.processing_panel) + else: + return True def fetchCNC(self): return "" + def json_workorder_str1(self, k, production, route): + workorders_values_str = [0, '', { + 'product_uom_id': production.product_uom_id.id, + 'qty_producing': 0, + 'operation_id': False, + 'name': route.route_workcenter_id.name, + 'processing_panel': k, + 'routing_type': route.routing_type, + 'workcenter_id': self.env['mrp.routing.workcenter'].get_workcenter(route.workcenter_ids.ids), + 'date_planned_start': False, + 'date_planned_finished': False, + 'duration_expected': 60, + 'duration': 0 + }] + return workorders_values_str ''' @@ -283,19 +344,8 @@ class MrpProduction(models.Model): for rec in self: current_sequence = 1 for work in rec.workorder_ids: - if work.processing_panel == '': - work.sequence = current_sequence - current_sequence += 1 - for work in rec.workorder_ids: - if work.processing_panel == k: - work.sequence = current_sequence - current_sequence += 1 - for work in rec.workorder_ids: - if work.processing_panel != k and work.processing_panel != "": - work.sequence = current_sequence - current_sequence += 1 - - + work.sequence = current_sequence + current_sequence += 1 def _create_workorder1(self, k): @@ -342,11 +392,11 @@ class MrpProduction(models.Model): if route.routing_type == '后置三元质量检测': workorders_values.append( - self.env['mrp.workorder'].json_workorder_str(k, production, route) + self.env['mrp.workorder'].json_workorder_str1(k, production, route) ) if route.routing_type == 'CNC加工': workorders_values.append( - self.env['mrp.workorder'].json_workorder_str(k, production, route)) + self.env['mrp.workorder'].json_workorder_str1(k, production, route)) production.workorder_ids = workorders_values for workorder in production.workorder_ids: @@ -358,8 +408,4 @@ class MrpProduction(models.Model): return res -class Attachment(models.Model): - _inherit = 'ir.attachment' - cnc_model = fields.Binary('cnc文件', attachment=False) - model_name = fields.Char('模型名称') diff --git a/sf_route_workcenter/views/sf_workorder.xml b/sf_route_workcenter/views/sf_workorder.xml index 203bb900..13e594fd 100644 --- a/sf_route_workcenter/views/sf_workorder.xml +++ b/sf_route_workcenter/views/sf_workorder.xml @@ -32,6 +32,10 @@ mrp.workorder + + + +
@@ -229,18 +233,15 @@ - +
-
-
-
+ +