工艺外协代码
This commit is contained in:
@@ -48,6 +48,7 @@
|
|||||||
'views/mrp_workorder_batch_replan.xml',
|
'views/mrp_workorder_batch_replan.xml',
|
||||||
'views/purchase_order_view.xml',
|
'views/purchase_order_view.xml',
|
||||||
'views/product_template_views.xml',
|
'views/product_template_views.xml',
|
||||||
|
'views/stock_warehouse_orderpoint.xml',
|
||||||
],
|
],
|
||||||
'assets': {
|
'assets': {
|
||||||
|
|
||||||
|
|||||||
@@ -18,3 +18,4 @@ from . import quick_easy_order
|
|||||||
from . import purchase_order
|
from . import purchase_order
|
||||||
from . import quality_check
|
from . import quality_check
|
||||||
from . import purchase_request_line
|
from . import purchase_request_line
|
||||||
|
from . import stock_warehouse_orderpoint
|
||||||
@@ -934,6 +934,7 @@ class MrpProduction(models.Model):
|
|||||||
cur_request_line.pop('group_id', None)
|
cur_request_line.pop('group_id', None)
|
||||||
cur_request_line.pop('production_name', None)
|
cur_request_line.pop('production_name', None)
|
||||||
self.env["purchase.request.line"].create(cur_request_line)
|
self.env["purchase.request.line"].create(cur_request_line)
|
||||||
|
pr.button_approved()
|
||||||
|
|
||||||
# 外协出入库单处理
|
# 外协出入库单处理
|
||||||
def get_subcontract_pick_purchase(self):
|
def get_subcontract_pick_purchase(self):
|
||||||
|
|||||||
@@ -512,7 +512,7 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
def _get_surface_technics_purchase_ids(self):
|
def _get_surface_technics_purchase_ids(self):
|
||||||
domain = [('origin', 'like', '%' + self.production_id.name + '%'), ('purchase_type', '=', 'consignment'), ('is_subcontract', '=', 'True'), ('state', '!=', 'cancel')]
|
domain = [('origin', 'like', '%' + self.production_id.name + '%'), ('purchase_type', '=', 'consignment'), ('state', '!=', 'cancel')]
|
||||||
# domain = [('origin', 'like', '%' + self.production_id.name + '%'), ('purchase_type', '=', 'consignment')]
|
# domain = [('origin', 'like', '%' + self.production_id.name + '%'), ('purchase_type', '=', 'consignment')]
|
||||||
# domain = [('group_id', '=', self.production_id.procurement_group_id.id), ('purchase_type', '=', 'consignment')]
|
# domain = [('group_id', '=', self.production_id.procurement_group_id.id), ('purchase_type', '=', 'consignment')]
|
||||||
purchase_orders = self.env['purchase.order'].search(domain, order='id desc')
|
purchase_orders = self.env['purchase.order'].search(domain, order='id desc')
|
||||||
@@ -1242,6 +1242,12 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
}]
|
}]
|
||||||
return workorders_values_str
|
return workorders_values_str
|
||||||
|
|
||||||
|
def check_lot_exists(self, picking_id, lot_id):
|
||||||
|
return bool(
|
||||||
|
picking_id.move_ids.move_line_ids.filtered(
|
||||||
|
lambda line: line.lot_id.id == lot_id
|
||||||
|
)
|
||||||
|
)
|
||||||
def _process_compute_state(self):
|
def _process_compute_state(self):
|
||||||
sorted_workorders = sorted(self, key=lambda x: x.sequence)
|
sorted_workorders = sorted(self, key=lambda x: x.sequence)
|
||||||
for workorder in sorted_workorders:
|
for workorder in sorted_workorders:
|
||||||
@@ -1263,10 +1269,17 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
workorder.state = 'pending'
|
workorder.state = 'pending'
|
||||||
continue
|
continue
|
||||||
# ================= 如果制造订单制造类型为【人工线下加工】==========================
|
# ================= 如果制造订单制造类型为【人工线下加工】==========================
|
||||||
|
lot_id = workorder.production_id.move_raw_ids.move_line_ids.lot_id
|
||||||
|
picking_ids = workorder.production_id.picking_ids.filtered(
|
||||||
|
lambda wk: wk.location_id.name == '外协收料区' and wk.location_dest_id.name == '制造前')
|
||||||
|
# exists = any(
|
||||||
|
# move_line.lot_id == lot_id
|
||||||
|
# for picking in picking_ids
|
||||||
|
# for move in picking.move_ids
|
||||||
|
# for move_line in move.move_line_ids
|
||||||
|
# )
|
||||||
if (workorder.production_id.production_type == '人工线下加工'
|
if (workorder.production_id.production_type == '人工线下加工'
|
||||||
and workorder.production_id.schedule_state == '已排'
|
and workorder.production_id.schedule_state == '已排' and lot_id):
|
||||||
and len(workorder.production_id.picking_ids.filtered(
|
|
||||||
lambda w: w.state not in ['done', 'cancel'])) == 0):
|
|
||||||
# and workorder.production_id.programming_state == '已编程'
|
# and workorder.production_id.programming_state == '已编程'
|
||||||
if workorder.is_subcontract is True:
|
if workorder.is_subcontract is True:
|
||||||
if workorder.production_id.state == 'rework':
|
if workorder.production_id.state == 'rework':
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ class PurchaseOrder(models.Model):
|
|||||||
total_qty = sum(quants.mapped('quantity')) # 计算该位置的总库存量
|
total_qty = sum(quants.mapped('quantity')) # 计算该位置的总库存量
|
||||||
is_available = total_qty > 0
|
is_available = total_qty > 0
|
||||||
if not is_available:
|
if not is_available:
|
||||||
continue
|
raise UserError('请先完成坯料入库')
|
||||||
for production_id in productions:
|
for production_id in productions:
|
||||||
work_ids = production_id.workorder_ids.filtered(
|
work_ids = production_id.workorder_ids.filtered(
|
||||||
lambda wk: wk.state not in ['done', 'rework', 'cancel'])
|
lambda wk: wk.state not in ['done', 'rework', 'cancel'])
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class SfProductionProcessParameter(models.Model):
|
|||||||
def _compute_service_products(self):
|
def _compute_service_products(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
# 假设取第一条作为主明细
|
# 假设取第一条作为主明细
|
||||||
record.service_products = record.outsourced_service_products.id if record.outsourced_service_products else False
|
record.service_products = record.outsourced_service_products.ids if record.outsourced_service_products else False
|
||||||
|
|
||||||
def _inverse_service_products(self):
|
def _inverse_service_products(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
|
|||||||
11
sf_manufacturing/models/stock_warehouse_orderpoint.py
Normal file
11
sf_manufacturing/models/stock_warehouse_orderpoint.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
|
||||||
|
import base64
|
||||||
|
from io import BytesIO
|
||||||
|
from odoo import api, fields, models, SUPERUSER_ID, _
|
||||||
|
|
||||||
|
|
||||||
|
class StockWarehouseOrderpoint(models.Model):
|
||||||
|
_inherit = 'stock.warehouse.orderpoint'
|
||||||
|
origin = fields.Char(string='来源')
|
||||||
|
_order = 'create_date DESC'
|
||||||
16
sf_manufacturing/views/stock_warehouse_orderpoint.xml
Normal file
16
sf_manufacturing/views/stock_warehouse_orderpoint.xml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data>
|
||||||
|
<record id="view_warehouse_orderpoint_tree_editable_inherit" model="ir.ui.view">
|
||||||
|
<field name="name">补货</field>
|
||||||
|
<field name="model">stock.warehouse.orderpoint</field>
|
||||||
|
<field name="inherit_id" ref="stock.view_warehouse_orderpoint_tree_editable"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='qty_to_order']" position="after">
|
||||||
|
<field name="origin"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
<!-- 继承补货单的搜索视图 -->
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
@@ -393,6 +393,7 @@ class RePurchaseOrder(models.Model):
|
|||||||
# route_ids
|
# route_ids
|
||||||
result.append({
|
result.append({
|
||||||
"product_id": server_template.product_variant_id.id,
|
"product_id": server_template.product_variant_id.id,
|
||||||
|
'related_product': production.product_id.id,
|
||||||
"name": production.procurement_group_id.name,
|
"name": production.procurement_group_id.name,
|
||||||
"date_required": fields.Datetime.now(),
|
"date_required": fields.Datetime.now(),
|
||||||
"product_uom_id":server_template.uom_id.id,
|
"product_uom_id":server_template.uom_id.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user