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 @@
+
+
@@ -104,7 +106,7 @@
-
+