diff --git a/jikimo_purchase_request/__manifest__.py b/jikimo_purchase_request/__manifest__.py index 2ae6ce67..c6e58a41 100644 --- a/jikimo_purchase_request/__manifest__.py +++ b/jikimo_purchase_request/__manifest__.py @@ -10,6 +10,7 @@ 'data': [ 'security/ir.model.access.csv', 'views/sale_order_view.xml', + 'views/purchase_order.xml', 'views/mrp_production.xml', 'views/purchase_request_view.xml', 'wizard/purchase_request_line_make_purchase_order_view.xml', diff --git a/jikimo_purchase_request/models/purchase_order.py b/jikimo_purchase_request/models/purchase_order.py index 95f81e9f..29e6c646 100644 --- a/jikimo_purchase_request/models/purchase_order.py +++ b/jikimo_purchase_request/models/purchase_order.py @@ -16,6 +16,69 @@ class PurchaseOrder(models.Model): ('rejected', '已驳回') ], string='Status', readonly=True, index=True, copy=False, default='draft', tracking=True) + # 成品采购订单对应的坯料采购申请单和采购订单数量 + purchase_request_count = fields.Integer('子·采购申请数量', compute='_compute_purchase_request') + purchase_order_count = fields.Integer('子·采购订单数量', compute='_compute_purchase_request') + + @api.depends('state') + def _compute_purchase_request(self): + for record in self: + purchase_request_ids, purchase_order_ids = record.get_purchase_request_order() + record.purchase_request_count = len(purchase_request_ids) + record.purchase_order_count = len(purchase_order_ids) + + def action_view_preform_body_purchase_request(self): + self.ensure_one() + name_list = self._get_pinking_name() + purchase_request_ids = self.env['purchase.request'].search([('origin', 'in', name_list)]) + + action = { + 'res_model': 'purchase.request', + 'type': 'ir.actions.act_window', + } + if len(purchase_request_ids) == 1: + action.update({ + 'view_mode': 'form', + 'res_id': purchase_request_ids[0].id, + }) + else: + action.update({ + 'name': _("子·采购申请"), + 'domain': [('id', 'in', purchase_request_ids.ids)], + 'view_mode': 'tree,form', + }) + return action + + def action_view_preform_body_purchase_order(self): + self.ensure_one() + name_list = self._get_pinking_name() + purchase_order_ids = self.env['purchase.order'].search([('origin', 'in', name_list)]) + + action = { + 'res_model': 'purchase.order', + 'type': 'ir.actions.act_window', + } + if len(purchase_order_ids) == 1: + action.update({ + 'view_mode': 'form', + 'res_id': purchase_order_ids[0].id, + }) + else: + action.update({ + 'name': _("子·采购订单"), + 'domain': [('id', 'in', purchase_order_ids.ids)], + 'view_mode': 'tree,form', + }) + return action + + def get_purchase_request_order(self): + name_list = self._get_pinking_name() + purchase_request_ids = self.env['purchase.request'].search([('origin', 'in', name_list)]) + purchase_order_ids = self.env['purchase.order'].search([('origin', 'in', name_list)]) + return purchase_request_ids, purchase_order_ids + + def _get_pinking_name(self): + return [picking_id.name for picking_id in self.picking_ids if picking_id.name] def button_confirm(self): res = super(PurchaseOrder, self).button_confirm() diff --git a/jikimo_purchase_request/models/purchase_request.py b/jikimo_purchase_request/models/purchase_request.py index 7287cb6a..3820b1ac 100644 --- a/jikimo_purchase_request/models/purchase_request.py +++ b/jikimo_purchase_request/models/purchase_request.py @@ -16,6 +16,7 @@ class PurchaseRequest(models.Model): ) rule_new_add = fields.Boolean('采购请求为规则创建', default=False, compute='_compute_state', store=True) + rule_purchase_to_request = fields.Boolean('采购单根据规则创建坯料采购申请', default=False) @api.depends('state') def _compute_state(self): diff --git a/jikimo_purchase_request/models/stock_picking.py b/jikimo_purchase_request/models/stock_picking.py index 97b294f3..037484c7 100644 --- a/jikimo_purchase_request/models/stock_picking.py +++ b/jikimo_purchase_request/models/stock_picking.py @@ -44,4 +44,15 @@ class StockPicking(models.Model): purchase_request_lines.move_dest_ids = [ (4, x.id) for x in backorder_ids.move_ids if x.product_id.id in purchase_request_lines.mapped('product_id.id') ] - return res \ No newline at end of file + return res + + def _subcontracted_produce(self, subcontract_details): + super()._subcontracted_produce(subcontract_details) + + # 判断是否根据规则生成新的采购申请单据,如果生成则修改状态为 approved + if self: + pr_ids = self.env["purchase.request"].sudo().search( + [('origin', 'like', self.name), ('rule_purchase_to_request', '=', True), ('state', '=', 'draft')]) + if pr_ids: + pr_ids.write({'need_validation': False}) + pr_ids.write({"state": "approved", 'need_validation': True, 'rule_new_add': False}) diff --git a/jikimo_purchase_request/models/stock_rule.py b/jikimo_purchase_request/models/stock_rule.py index 4a99e804..a6d3d893 100644 --- a/jikimo_purchase_request/models/stock_rule.py +++ b/jikimo_purchase_request/models/stock_rule.py @@ -26,7 +26,7 @@ class StockRule(models.Model): request_data = rule._prepare_purchase_request( procurement.origin, procurement.values ) - request_data.update({'rule_new_add': True}) + request_data = self._update_request_data(procurement, request_data) pr = purchase_request_model.create(request_data) cache[domain] = pr elif ( @@ -44,6 +44,18 @@ class StockRule(models.Model): request_line_data.update({'origin': procurement.origin}) purchase_request_line_model.create(request_line_data) + def _update_request_data(self, procurement, request_data): + sp = self.env['stock.picking'].sudo().search([('name', '=', procurement.origin)]) + if len(sp) == 1: + po = self.env['purchase.order'].sudo().search( + [('name', '=', sp.origin), ('purchase_type', '=', 'outsourcing')]) + if po: + request_data.update({'rule_purchase_to_request': True}) + else: + request_data.update({'rule_new_add': True}) + return request_data + + def _run_buy(self, procurements): # 如果补货组相同,并且产品相同,则合并 procurements_dict = defaultdict() diff --git a/jikimo_purchase_request/views/purchase_order.xml b/jikimo_purchase_request/views/purchase_order.xml new file mode 100644 index 00000000..78f5b6a8 --- /dev/null +++ b/jikimo_purchase_request/views/purchase_order.xml @@ -0,0 +1,28 @@ + + + + purchase.order.inherited.form.jikimo.purchase.request + purchase.order + + + + + + + + + \ No newline at end of file diff --git a/jikimo_purchase_request/views/purchase_request_view.xml b/jikimo_purchase_request/views/purchase_request_view.xml index 151152e8..f793eaaa 100644 --- a/jikimo_purchase_request/views/purchase_request_view.xml +++ b/jikimo_purchase_request/views/purchase_request_view.xml @@ -67,6 +67,16 @@ + +
+
+
diff --git a/sf_demand_plan/models/sf_production_demand_plan.py b/sf_demand_plan/models/sf_production_demand_plan.py index 3be61e85..519917ae 100644 --- a/sf_demand_plan/models/sf_production_demand_plan.py +++ b/sf_demand_plan/models/sf_production_demand_plan.py @@ -79,6 +79,7 @@ class SfProductionDemandPlan(models.Model): model_long = fields.Char('尺寸(mm)', compute='_compute_model_long') blank_type = fields.Selection([('圆料', '圆料'), ('方料', '方料')], string='坯料分类', related='product_id.blank_type') + blank_precision = fields.Selection([('精坯', '精坯'), ('粗坯', '粗坯')], string='坯料类型', related='product_id.blank_precision') embryo_long = fields.Char('坯料尺寸(mm)', related='demand_plan_id.embryo_long') materials_id = fields.Char('材料', related='demand_plan_id.materials_id') model_machining_precision = fields.Selection(selection=_get_machining_precision, string='精度', diff --git a/sf_demand_plan/static/src/scss/style.css b/sf_demand_plan/static/src/scss/style.css index 9662a10a..08d382c1 100644 --- a/sf_demand_plan/static/src/scss/style.css +++ b/sf_demand_plan/static/src/scss/style.css @@ -81,4 +81,9 @@ input,label { cursor: pointer; } -} \ No newline at end of file +} + +th[data-name=processing_time] + th::before{ + content: '待执行单据'; + line-height: 38px; +} diff --git a/sf_demand_plan/views/demand_plan.xml b/sf_demand_plan/views/demand_plan.xml index a466f691..5fe049a5 100644 --- a/sf_demand_plan/views/demand_plan.xml +++ b/sf_demand_plan/views/demand_plan.xml @@ -4,14 +4,13 @@ sf.production.demand.plan + class="demand_plan_tree freeze-columns-before-part_number" create="false" delete="false">
- @@ -29,6 +28,7 @@ + @@ -44,7 +44,10 @@ - + @@ -63,6 +66,7 @@ + diff --git a/sf_dlm/models/product_supplierinfo.py b/sf_dlm/models/product_supplierinfo.py index f4278e03..a631efe4 100644 --- a/sf_dlm/models/product_supplierinfo.py +++ b/sf_dlm/models/product_supplierinfo.py @@ -3,6 +3,7 @@ import logging import re from odoo import models, fields, api +from odoo.exceptions import ValidationError class ResProductCategory(models.Model): @@ -47,11 +48,14 @@ class ResMrpBomMo(models.Model): item.subcontractor_name = '' def bom_create_line_has(self, embryo): + product = self.product_tmpl_id + if product.unit_number in (0, None, False): + raise ValidationError(f'产品{product.name}单件用量的值不能为{product.unit_number}') vals = { 'bom_id': self.id, 'product_id': embryo.id, 'product_tmpl_id': embryo.product_tmpl_id.id, - 'product_qty': 1, + 'product_qty': product.unit_number, 'product_uom_id': 1 } return self.env['mrp.bom.line'].sudo().create(vals) @@ -122,7 +126,7 @@ class ResMrpBomMo(models.Model): # 查bom的原材料 def get_raw_bom(self, product): raw_bom = self.env['product.product'].search( - [('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)],limit=1) + [('categ_id.type', '=', '原材料'), ('materials_type_id', '=', product.materials_type_id.id)], limit=1) return raw_bom diff --git a/sf_dlm_management/views/product_template_management_view.xml b/sf_dlm_management/views/product_template_management_view.xml index bb9904a7..75262611 100644 --- a/sf_dlm_management/views/product_template_management_view.xml +++ b/sf_dlm_management/views/product_template_management_view.xml @@ -95,6 +95,8 @@ + +