diff --git a/sf_base/models/process.py b/sf_base/models/process.py index 05b7791c..ea97dac0 100644 --- a/sf_base/models/process.py +++ b/sf_base/models/process.py @@ -6,7 +6,7 @@ class ModelType(models.Model): _description = '模型类型' name = fields.Char('名称') - routing_tmpl_id = fields.One2many('mrp.routing.workcenter', 'model_type_id', '工序模板') + routing_tmpl_id = fields.One2many('sf.model.type.routing.sort', 'model_type_id', '工序模板') class ResMrpRoutingWorkcenter(models.Model): @@ -16,5 +16,16 @@ class ResMrpRoutingWorkcenter(models.Model): is_repeat = fields.Boolean('重复', default=False) workcenter_id = fields.Many2many('mrp.workcenter', required=False) bom_id = fields.Many2one('mrp.bom', required=False) - sort = fields.Integer('排序') + route_workcenter_sort_id = fields.Many2many('sf.model.type.routing.sort') + + +class ModelTypeRoutingSort(models.Model): + _name = 'sf.model.type.routing.sort' + _description = '工序排序' + + sequence = fields.Integer('Sequence') + + route_workcenter_id = fields.Many2many('mrp.routing.workcenter') model_type_id = fields.Many2one('sf.model.type') + + diff --git a/sf_base/models/product_template.py b/sf_base/models/product_template.py index 7535ae92..48c42996 100644 --- a/sf_base/models/product_template.py +++ b/sf_base/models/product_template.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import models, fields,api from odoo.exceptions import ValidationError @@ -45,6 +45,22 @@ class ResProductTemplate(models.Model): copy_product_id.sudo().write(vals) return copy_product_id + # 在产品上增加模型类型和加工的面(例如:A、B) , + # 并根据模型类型计算出产品的胚料尺寸; + @api.onchange('model_type_id') + def count_embryo_size(self): + bom = self.env['mrp.bom.line'].search( + [('product_tmpl_id', '=', self.id)]) + for item in self: + print(bom.product_tmpl_id) + print(bom.model_long) + item.model_long = bom.model_long + 1 + print(item.model_long) + item.embryo_width = bom.embryo_width + 1 + item.embryo_height = bom.embryo_height + 1 + + + class ResProductCategory(models.Model): _inherit = "product.category" @@ -94,3 +110,7 @@ class ResMrpBom(models.Model): + + + + diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index e94d9ea6..565b5faf 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -14,6 +14,7 @@ access_mrs_materials_model,mrs_materials_model,model_mrs_materials_model,base.gr access_mrs_processing_technology,mrs_processing_technology,model_mrs_processing_technology,base.group_user,1,1,1,1 access_sf_tray,sf_tray,model_sf_tray,base.group_user,1,1,1,1 access_sf_model_type,sf_model_type,model_sf_model_type,base.group_user,1,1,1,1 +access_sf_model_type_routing_sort,sf_model_type_routing_sort,model_sf_model_type_routing_sort,base.group_user,1,1,1,1 diff --git a/sf_base/views/mrs_base_view.xml b/sf_base/views/mrs_base_view.xml index 10c6a6b6..713173d4 100644 --- a/sf_base/views/mrs_base_view.xml +++ b/sf_base/views/mrs_base_view.xml @@ -523,16 +523,13 @@ - - - - - - - - - - + + + + + + + diff --git a/sf_manufacturing_orders/models/mrp_workorder.py b/sf_manufacturing_orders/models/mrp_workorder.py index 6469e23e..200ec6b2 100644 --- a/sf_manufacturing_orders/models/mrp_workorder.py +++ b/sf_manufacturing_orders/models/mrp_workorder.py @@ -7,40 +7,42 @@ from odoo.addons.stock.models.stock_rule import ProcurementException from odoo.tools import float_compare, OrderedSet -class StockRule(models.Model): +class ReStockRule(models.Model): _inherit = 'stock.rule' + 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) -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)) - productions_values_by_company[procurement.company_id.id].append(rule._prepare_mo_vals(*procurement, bom)) + if errors: + raise ProcurementException(errors) - 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()) + print(productions.product_id.processing_panel) + # 查出产品的加工面板并对根据面板的数量循环生成工序 + for k in (productions.product_id.processing_panel.split(',')): + print(productions.product_id.model_type_id.routing_tmpl_id) + for j in productions.product_id.model_type_id.routing_tmpl_id: + 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 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.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 + 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( @@ -57,7 +59,7 @@ def _run_manufacture(self, procurements): 'mail.message_origin_link', values={'self': production, 'origin': origin_production}, subtype_id=self.env.ref('mail.mt_note').id) - return True + return True class ResMrpWorkOrder(models.Model): @@ -66,16 +68,6 @@ class ResMrpWorkOrder(models.Model): workcenter_id = fields.Many2one('mrp.workcenter', required=False) processing_panel = fields.Char('加工面') - @api.model_create_multi - def create(self, values): - res = super().create(values) - if self.env.context.get('skip_confirm'): - return res - to_confirm = res.filtered(lambda wo: wo.production_id.state in ("confirmed", "progress", "to_close")) - to_confirm = to_confirm.production_id.workorder_ids - to_confirm._action_confirm() - return res - def _action_confirm(self): workorders_by_production = defaultdict(lambda: self.env['mrp.workorder']) for workorder in self: diff --git a/sf_manufacturing_orders/models/sf_production.py b/sf_manufacturing_orders/models/sf_production.py index b02c895d..a41c65f6 100644 --- a/sf_manufacturing_orders/models/sf_production.py +++ b/sf_manufacturing_orders/models/sf_production.py @@ -42,7 +42,6 @@ class MrpProduction(models.Model): def _create_workorder(self): for production in self: - print(production.product_id.model_type_id) if not production.bom_id or not production.product_id: continue workorders_values = []