diff --git a/sf_bf_connect/models/process_status.py b/sf_bf_connect/models/process_status.py index db7fe0d5..9c939edd 100644 --- a/sf_bf_connect/models/process_status.py +++ b/sf_bf_connect/models/process_status.py @@ -25,7 +25,7 @@ class StatusChange(models.Model): if not server_product: server_product_none.append(item.name) if server_product_none: - raise UserError(_("请先至产品中创建表面工艺参数为%s的服务产品", ", ".join(server_product_none))) + raise UserError(_("请先至【产品】中创建【表面工艺参数】为%s的服务产品", ", ".join(server_product_none))) # 使用super()来调用原始方法(在本例中为'sale.order'模型的'action_confirm'方法) res = super(StatusChange, self).action_confirm() diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 880db242..44fe8c92 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -131,7 +131,9 @@ class ResMrpWorkOrder(models.Model): is_subcontract = fields.Boolean(string='是否外协') surface_technics_parameters_id = fields.Many2one('sf.production.process.parameter', string="表面工艺可选参数") picking_ids = fields.Many2many('stock.picking', string='外协出入库单') + # purchase_id = fields.Many2one('purchase.order', string='外协采购单') surface_technics_picking_count = fields.Integer("外协出入库", compute='_compute_surface_technics_picking_ids') + surface_technics_purchase_count = fields.Integer("外协采购", compute='_compute_surface_technics_purchase_ids') @api.depends('name', 'production_id.name') def _compute_surface_technics_picking_ids(self): @@ -153,6 +155,43 @@ class ResMrpWorkOrder(models.Model): action['context'] = dict(self._context, default_origin=self.name) return action + @api.depends('state', 'production_id.name') + def _compute_surface_technics_purchase_ids(self): + for order in self: + if order.routing_type == '表面工艺': + production_programming = self.env['mrp.production'].search( + [('programming_no', '=', order.production_id.programming_no)], order='name asc') + production_list = [production.name for production in production_programming] + purchase = self.env['purchase.order'].search([('origin', '=', ','.join(production_list))]) + for line in purchase.order_line: + if line.product_id.server_product_process_parameters_id == order.surface_technics_parameters_id and line.product_qty == len( + production_programming): + # server_product = self.env['product.template'].search( + # [('server_product_process_parameters_id', '=', pp.id), + # ('detailed_type', '=', 'service')]) + # purchase_order_line = self.env['purchase.order.line'].search( + # [('product_id', '=', server_product.id), ('product_qty', '=', len(production_programming))]) + # if purchase_order_line: + order.surface_technics_purchase_count = len(purchase) + else: + order.surface_technics_purchase_count = 0 + + def action_view_surface_technics_purchase(self): + self.ensure_one() + production_programming = self.env['mrp.production'].search( + [('programming_no', '=', self.production_id.programming_no)], order='name asc') + production_list = [production.name for production in production_programming] + purchase_orders = self.env['purchase.order'].search([('origin', '=', ','.join(production_list))]) + result = { + "type": "ir.actions.act_window", + "res_model": "purchase.order", + "res_id": purchase_orders.id, + # "domain": [['id', 'in', self.purchase_id]], + "name": _("Purchase Orders"), + 'view_mode': 'form', + } + return result + supplier_id = fields.Many2one('res.partner', string='外协供应商') equipment_id = fields.Many2one('maintenance.equipment', string='加工设备', tracking=True) # 保存名称 @@ -887,8 +926,19 @@ class ResMrpWorkOrder(models.Model): if unclamp_workorder: if workorder.is_subcontract is False: workorder.state = 'ready' - # else: - + else: + production_programming = self.env['mrp.production'].search( + [('programming_no', '=', self.production_id.programming_no)], order='name asc') + production_list = [production.name for production in production_programming] + purchase_orders = self.env['purchase.order'].search( + [('origin', '=', ','.join(production_list))]) + for line in purchase_orders.order_line: + if line.product_id.server_product_process_parameters_id == order.surface_technics_parameters_id and line.product_qty == len( + production_programming): + if purchase_orders.state == 'purchase': + workorder.state = 'ready' + else: + workorder.state = 'waiting' # else: # if workorder.state not in ['cancel', 'rework']: @@ -941,7 +991,6 @@ class ResMrpWorkOrder(models.Model): workorder.state = 'waiting' continue - # elif workorder.routing_type == 'CNC加工' and workorder.state not in ['done', 'cancel', 'progress', # 'rework']: # per_work = self.env['mrp.workorder'].search( diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 16511087..721aa0a9 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -124,6 +124,10 @@ class ResProductMo(models.Model): name = '%s%s' % (item.cutting_tool_model_id.name, item.specification_id.name) item.name = name + def _get_process_parameters_product(self, production_process): + return self.env['product.template'].search( + [('server_product_process_parameters_id', '=', production_process.id)]).seller_ids[0] + @api.onchange('cutting_tool_model_id') def _onchange_cutting_tool_model_id(self): for item in self: diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index f1289261..f338924d 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -274,13 +274,17 @@ class StockRule(models.Model): if production_item.product_id.id in product_id_to_production_names: sorted_process_parameters = sorted(production_item.product_id.model_process_parameters_ids, key=lambda w: w.id) + consecutive_process_parameters = [] m = 0 for i in range(len(sorted_process_parameters) - 1): if m == 0: is_purchase = False - if sorted_process_parameters[i].supplier_id.id == sorted_process_parameters[ - i + 1].supplier_id.id and sorted_process_parameters[i].gain_way == '外协': + if self.env['product.template']._get_process_parameters_product( + sorted_process_parameters[i]).partner_id == self.env[ + 'product.template']._get_process_parameters_product(sorted_process_parameters[ + i + 1]).partner_id and \ + sorted_process_parameters[i].gain_way == '外协': if sorted_process_parameters[i] not in consecutive_process_parameters: consecutive_process_parameters.append(sorted_process_parameters[i]) consecutive_process_parameters.append(sorted_process_parameters[i + 1]) @@ -289,15 +293,15 @@ class StockRule(models.Model): else: if m == len(consecutive_process_parameters) - 1 and m != 0: self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, - production_item, - product_id_to_production_names) - if sorted_process_parameters[i] in consecutive_workorders: + production_item, + product_id_to_production_names) + if sorted_process_parameters[i] in consecutive_process_parameters: is_purchase = True consecutive_process_parameters = [] m = 0 # 当前面的连续采购单生成再生成当前工序的外协采购单 if is_purchase is False: - self.env['purchase.order'].get_purchase_order(consecutive_process_parameters[i], + self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, production_item, product_id_to_production_names) if m == len(consecutive_process_parameters) - 1 and m != 0: self.env['purchase.order'].get_purchase_order(consecutive_process_parameters, @@ -316,36 +320,6 @@ class StockRule(models.Model): else: self.env['purchase.order'].get_purchase_order(sorted_process_parameters[i], production_item, product_id_to_production_names) - # for pp in production_item.product_id.model_process_parameters_ids: - # if pp.gain_way == '外协': - # server_product = self.env['product.template'].search( - # [('server_product_process_parameters_id', '=', pp.id), - # ('detailed_type', '=', 'service')]) - # purchase_order_line = self.env['purchase.order.line'].search( - # [('product_id', '=', server_product.id)]) - # if not purchase_order_line: - # is_exist = False - # else: - # for item in purchase_order_line: - # purchase_order = self.env['purchase.order'].search( - # [('state', '=', 'draft'), ('origin', 'ilike', production_item.name), - # ('id', '=', item.order_id)]) - # if not purchase_order: - # is_exist = False - # if is_exist is False: - # production_process = product_id_to_production_names.get( - # production_item.product_id.id) - # self.env['purchase.order'].sudo().create({ - # 'partner_id': server_product.seller_ids.partner_id.id, - # 'origin': ','.join(production_process), - # 'state': 'draft', - # 'order_line': [(0, 0, { - # 'product_id': server_product.product_variant_id.id, - # 'product_qty': len(production_process), - # 'product_uom': server_product.uom_id.id - # })] - # }) - # # 同一个产品多个制造订单对应一个编程单和模型库 # # 只调用一次fetchCNC,并将所有生产订单的名称作为字符串传递 if not production_item.programming_no: diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index 805dcb1f..23b61c66 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -123,6 +123,18 @@ attrs="{'invisible': [('surface_technics_picking_count', '=', 0)]}"> + diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index e8a9faad..9a668e88 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -211,36 +211,46 @@ class RePurchaseOrder(models.Model): if not line.taxes_id: raise UserError('请对【产品】中的【税】进行选择') - def get_purchase_order(self, production, product_id_to_production_names): - for pp in production.product_id.model_process_parameters_ids: + def get_purchase_order(self, consecutive_process_parameters, production, product_id_to_production_names): + is_exist = True + server_product_process = [] + production_process = product_id_to_production_names.get( + production.product_id.id) + for pp in consecutive_process_parameters: if pp.gain_way == '外协': server_product = self.env['product.template'].search( [('server_product_process_parameters_id', '=', pp.id), ('detailed_type', '=', 'service')]) purchase_order_line = self.env['purchase.order.line'].search( - [('product_id', '=', server_product.id)]) + [('product_id', '=', server_product.id), ('product_qty', '=', len(production_process))]) if not purchase_order_line: is_exist = False + server_product_process.append((0, 0, { + 'product_id': server_product.product_variant_id.id, + 'product_qty': len(production_process), + 'product_uom': server_product.uom_id.id + })) else: for item in purchase_order_line: purchase_order = self.env['purchase.order'].search( [('state', '=', 'draft'), ('origin', 'ilike', production.name), - ('id', '=', item.order_id)]) + ('id', '=', item.order_id.id)]) if not purchase_order: is_exist = False - if is_exist is False: - production_process = product_id_to_production_names.get( - production.product_id.id) - self.env['purchase.order'].sudo().create({ - 'partner_id': server_product.seller_ids.partner_id.id, - 'origin': ','.join(production_process), - 'state': 'draft', - 'order_line': [(0, 0, { - 'product_id': server_product.product_variant_id.id, - 'product_qty': len(production_process), - 'product_uom': server_product.uom_id.id - })] - }) + server_product_process.append((0, 0, { + 'product_id': server_product.product_variant_id.id, + 'product_qty': len(production_process), + 'product_uom': server_product.uom_id.id + })) + if is_exist is False: + purchase_order = self.env['purchase.order'].search( + [('state', '=', 'draft'), ('origin', '=', ','.join(production_process))]) + if not purchase_order: + self.env['purchase.order'].sudo().create({ + 'partner_id': server_product.seller_ids.partner_id.id, + 'origin': ','.join(production_process), + 'state': 'draft', + 'order_line': server_product_process}) @api.onchange('order_line') def _onchange_order_line(self):