From ba92f616a096d99de75af79bb0c195d3b8eb0218 Mon Sep 17 00:00:00 2001 From: gqh Date: Tue, 15 Nov 2022 16:16:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E4=BC=98=E5=8C=96=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/models/sf_base.py | 1 + sf_base/views/mrs_common_view.xml | 3 +- sf_manufacturing_orders/__manifest__.py | 2 + sf_manufacturing_orders/models/__init__.py | 1 + .../models/sf_production.py | 160 ++++++------------ sf_route_workcenter/__manifest__.py | 2 +- sf_route_workcenter/models/__init__.py | 3 +- sf_route_workcenter/models/workcenter.py | 51 +++--- sf_route_workcenter/views/sf_workorder.xml | 6 +- 9 files changed, 89 insertions(+), 140 deletions(-) diff --git a/sf_base/models/sf_base.py b/sf_base/models/sf_base.py index c8f5a53d..e337d301 100644 --- a/sf_base/models/sf_base.py +++ b/sf_base/models/sf_base.py @@ -248,6 +248,7 @@ class CuttingToolType(models.Model): remark = fields.Text('备注') active = fields.Boolean('有效', default=True) + class CNCprocessing(models.Model): _name = 'cnc.processing' _description = "CNC加工" diff --git a/sf_base/views/mrs_common_view.xml b/sf_base/views/mrs_common_view.xml index 452bd664..fa9cfba1 100644 --- a/sf_base/views/mrs_common_view.xml +++ b/sf_base/views/mrs_common_view.xml @@ -297,7 +297,7 @@ - + @@ -337,5 +337,6 @@ + \ No newline at end of file diff --git a/sf_manufacturing_orders/__manifest__.py b/sf_manufacturing_orders/__manifest__.py index 9ef495bb..4bcec36c 100644 --- a/sf_manufacturing_orders/__manifest__.py +++ b/sf_manufacturing_orders/__manifest__.py @@ -13,6 +13,8 @@ 'depends': ['mrp'], 'data': [ 'views/sf_production.xml', + + ], 'demo': [ ], diff --git a/sf_manufacturing_orders/models/__init__.py b/sf_manufacturing_orders/models/__init__.py index e1f5282a..28bfd6c0 100644 --- a/sf_manufacturing_orders/models/__init__.py +++ b/sf_manufacturing_orders/models/__init__.py @@ -1,2 +1,3 @@ from . import sf_production from . import mrp_workorder + diff --git a/sf_manufacturing_orders/models/sf_production.py b/sf_manufacturing_orders/models/sf_production.py index 764f5d33..39984650 100644 --- a/sf_manufacturing_orders/models/sf_production.py +++ b/sf_manufacturing_orders/models/sf_production.py @@ -203,115 +203,51 @@ class StockRule(models.Model): return True - # @api.model - # def _run_manufacture(self, procurements): - # productions_values_by_company = defaultdict(list) - # errors = [] - # for procurement, rule in procurements: - # if float_compare(procurement.product_qty, 0, precision_rounding=procurement.product_uom.rounding) <= 0: - # # If procurement contains negative quantity, don't create a MO that would be for a negative value. - # continue - # bom = rule._get_matching_bom(procurement.product_id, procurement.company_id, procurement.values) - # - # product = self.env['product.template'].search( - # ["&", ("id", '=', procurement.product_id.id), ('single_manufacturing', '!=', False)]) - # if not product: - # productions_values_by_company[procurement.company_id.id].append( - # rule._prepare_mo_vals1(*procurement, bom)) - # else: - # orders_vals = rule._prepare_mo_vals(*procurement, bom) - # - # if isinstance(orders_vals, list): - # for vals in orders_vals: - # productions_values_by_company[procurement.company_id.id].append(vals) - # else: - # productions_values_by_company[procurement.company_id.id].append(orders_vals) - # - # if errors: - # raise ProcurementException(errors) - # - # for company_id, productions_values in productions_values_by_company.items(): - # # create the MO as SUPERUSER because the current user may not have the rights to do it (mto product launched by a sale for example) - # productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company(company_id).create( - # productions_values) - # a = self.env['stock.move'].sudo().create(productions._get_moves_raw_values()) - # b = self.env['stock.move'].sudo().create(productions._get_moves_finished_values()) - # c = 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) - # return True - # - # def _prepare_mo_vals1(self, product_id, product_qty, product_uom, location_id, name, origin, company_id, values, - # bom): - # date_planned = self._get_date_planned(product_id, company_id, values) - # date_deadline = values.get('date_deadline') or date_planned + relativedelta( - # days=company_id.manufacturing_lead) + relativedelta(days=product_id.produce_delay) - # mo_values = { - # 'origin': origin, - # 'product_id': product_id.id, - # 'product_description_variants': values.get('product_description_variants'), - # 'product_qty': product_qty, - # 'product_uom_id': product_uom.id, - # 'location_src_id': self.location_src_id.id or self.picking_type_id.default_location_src_id.id or location_id.id, - # 'location_dest_id': location_id.id, - # 'bom_id': bom.id, - # 'date_deadline': date_deadline, - # 'date_planned_start': date_planned, - # 'date_planned_finished': fields.Datetime.from_string(values['date_planned']), - # 'procurement_group_id': False, - # 'propagate_cancel': self.propagate_cancel, - # 'orderpoint_id': values.get('orderpoint_id', False) and values.get('orderpoint_id').id, - # 'picking_type_id': self.picking_type_id.id or values['warehouse_id'].manu_type_id.id, - # 'company_id': company_id.id, - # 'move_dest_ids': values.get('move_dest_ids') and [(4, x.id) for x in values['move_dest_ids']] or False, - # 'user_id': False, - # } - # # Use the procurement group created in _run_pull mrp override - # # Preserve the origin from the original stock move, if available - # if location_id.warehouse_id.manufacture_steps == 'pbm_sam' and values.get('move_dest_ids') and values.get( - # 'group_id') and values['move_dest_ids'][0].origin != values['group_id'].name: - # origin = values['move_dest_ids'][0].origin - # mo_values.update({ - # 'name': values['group_id'].name, - # 'procurement_group_id': values['group_id'].id, - # 'origin': origin, - # }) - # return mo_values - # - # def _prepare_mo_vals(self, product_id, product_qty, product_uom, location_id, name, origin, company_id, values, - # bom): - # - # mo_lists = [] - # for num in range(1, int(product_qty) + 1): - # vals = super(StockRule, self)._prepare_mo_vals(product_id, 1.0, product_uom, location_id, name, origin, - # company_id, values, - # bom) - # vals.update({ - # # 'name': values['group_id'].name, - # 'procurement_group_id': values['group_id'].id, - # # 'origin': origin, - # }) - # mo_lists.append(vals) - # - # return mo_lists + @api.model + def _run_manufacture(self, procurements): + productions_values_by_company = defaultdict(list) + errors = [] + for procurement, rule in procurements: + if float_compare(procurement.product_qty, 0, precision_rounding=procurement.product_uom.rounding) <= 0: + # If procurement contains negative quantity, don't create a MO that would be for a negative value. + continue + bom = rule._get_matching_bom(procurement.product_id, procurement.company_id, procurement.values) + + productions_values_by_company[procurement.company_id.id].append(rule._prepare_mo_vals(*procurement, bom)) + + if errors: + raise ProcurementException(errors) + + for company_id, productions_values in productions_values_by_company.items(): + # create the MO as SUPERUSER because the current user may not have the rights to do it (mto product launched by a sale for example) + productions = self.env['mrp.production'].with_user(SUPERUSER_ID).sudo().with_company(company_id).create( + productions_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.lot_producing_id._get_next_serial(productions.company_id,productions.product_id) + productions.action_generate_serial() + 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) + return True \ No newline at end of file diff --git a/sf_route_workcenter/__manifest__.py b/sf_route_workcenter/__manifest__.py index 6cf239f2..c7764d13 100644 --- a/sf_route_workcenter/__manifest__.py +++ b/sf_route_workcenter/__manifest__.py @@ -10,7 +10,7 @@ """, 'category': 'YZ', 'website': 'https://www.sf.cs.jikimo.com', - 'depends': ['mrp', 'sf_base','hr_holidays'], + 'depends': ['mrp', 'sf_base', 'hr_holidays'], 'data': [ 'views/sf_tray_view.xml', 'views/sf_workorder.xml', diff --git a/sf_route_workcenter/models/__init__.py b/sf_route_workcenter/models/__init__.py index 94d72e99..c1bb7975 100644 --- a/sf_route_workcenter/models/__init__.py +++ b/sf_route_workcenter/models/__init__.py @@ -1,2 +1,3 @@ # -*-coding:utf-8-*- -from . import workcenter \ No newline at end of file +from . import workcenter + diff --git a/sf_route_workcenter/models/workcenter.py b/sf_route_workcenter/models/workcenter.py index 77cf7c7a..f703da78 100644 --- a/sf_route_workcenter/models/workcenter.py +++ b/sf_route_workcenter/models/workcenter.py @@ -7,6 +7,7 @@ import math from io import BytesIO from odoo import api, fields, models, SUPERUSER_ID from pystrich.code128 import Code128Encoder +from odoo.exceptions import ValidationError _logger = logging.getLogger(__name__) @@ -122,14 +123,6 @@ class MrpWorkOrder(models.Model): Y10_axis = fields.Float(string='Uz10', default=0) Z10_axis = fields.Float(string='Uz10', default=0) - # 扫码绑定托盘方法 - def gettray(self): - return "" - - # 解除托盘绑定 - def unbindtray(self): - return "" - # 计算配料中心点和与x轴倾斜度方法 def getcenter(self): x1 = self.X1_axis @@ -173,30 +166,50 @@ class MrpWorkOrder(models.Model): cnc_ids = fields.One2many("cnc.processing", 'workorder_id', string="CNC加工") - tray_code = fields.Char( string="托盘",compute='updateTrayState') + tray_code = fields.Char(string="托盘") + + # 扫码绑定托盘方法 + def gettray(self): + if self.tray_code != False: + values = self.env['sf.tray'].search([("code", "=", self.tray_code)]) + if values: + if values.state == "占用": + raise ValidationError('该托盘已占用') + if values.state == "报损": + raise ValidationError('该托盘已损坏') + else: + values.update({ + 'workorder_id': self, + 'production_id': self.production_id, + 'state': '占用', + }) + else: + raise ValidationError('该托盘编码已失效') + else:return "" - @api.depends('tray_code') - def updateTrayState(self): - tray = self.env['sf.tray'].search([("code",'=',self.tray_code)]) + # 解除托盘绑定 + def unbindtray(self): + tray = self.env['sf.tray'].search([("production_id", "=", self.production_id.id)]) if tray: - tray.workorder_id = self - else: - return "" + tray.unclamp() + + return "" def recreateManufacturing(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( + 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() + 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[ @@ -231,8 +244,6 @@ class MrpWorkOrder(models.Model): productions.create_workorder1(self.processing_panel) return "" - - def fetchCNC(self): return "" @@ -247,8 +258,6 @@ class MrpProduction(models.Model): _description = "制造订单" tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘") - - def create_production1_values(self, production): production_values_str = {'origin': production.origin, 'product_id': production.product_id.id, diff --git a/sf_route_workcenter/views/sf_workorder.xml b/sf_route_workcenter/views/sf_workorder.xml index 9fadae15..18af6f7b 100644 --- a/sf_route_workcenter/views/sf_workorder.xml +++ b/sf_route_workcenter/views/sf_workorder.xml @@ -24,7 +24,7 @@
-
@@ -159,7 +159,7 @@ - + @@ -176,8 +176,6 @@ - -