Accept Merge Request #1576: (feature/修复外协出入库单 -> develop)
Merge Request: 修复外协出入库单 Created By: @杨金灵 Reviewed By: @胡尧 Approved By: @胡尧 Accepted By: @杨金灵 URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/1576
This commit is contained in:
@@ -309,7 +309,8 @@ class MrpProduction(models.Model):
|
|||||||
for move in production.move_raw_ids if move.product_id):
|
for move in production.move_raw_ids if move.product_id):
|
||||||
production.state = 'progress'
|
production.state = 'progress'
|
||||||
# 新添加的状态逻辑
|
# 新添加的状态逻辑
|
||||||
if production.state in ['to_close', 'progress', 'technology_to_confirmed'] and production.schedule_state == '未排':
|
if production.state in ['to_close', 'progress',
|
||||||
|
'technology_to_confirmed'] and production.schedule_state == '未排':
|
||||||
if not production.workorder_ids or production.is_adjust is True:
|
if not production.workorder_ids or production.is_adjust is True:
|
||||||
production.state = 'technology_to_confirmed'
|
production.state = 'technology_to_confirmed'
|
||||||
else:
|
else:
|
||||||
@@ -356,7 +357,6 @@ class MrpProduction(models.Model):
|
|||||||
if production.tool_state == '2':
|
if production.tool_state == '2':
|
||||||
production.state = 'rework'
|
production.state = 'rework'
|
||||||
|
|
||||||
|
|
||||||
# 退回调整
|
# 退回调整
|
||||||
def technology_back_adjust(self):
|
def technology_back_adjust(self):
|
||||||
process_parameters = []
|
process_parameters = []
|
||||||
@@ -849,15 +849,20 @@ class MrpProduction(models.Model):
|
|||||||
purchase_order = self.env['purchase.order'].search(
|
purchase_order = self.env['purchase.order'].search(
|
||||||
[('state', '=', 'draft'), ('origin', '=', item.name),
|
[('state', '=', 'draft'), ('origin', '=', item.name),
|
||||||
('purchase_type', '=', 'consignment')])
|
('purchase_type', '=', 'consignment')])
|
||||||
for line in purchase_order.order_line:
|
server_template = self.env['product.template'].search(
|
||||||
server_template = self.env['product.template'].search(
|
[('server_product_process_parameters_id', '=',
|
||||||
[('server_product_process_parameters_id', '=', workorder.surface_technics_parameters_id.id),
|
workorder.surface_technics_parameters_id.id),
|
||||||
('detailed_type', '=', 'service')])
|
('detailed_type', '=', 'service')])
|
||||||
purchase_order_line = self.env['purchase.order.line'].search(
|
for po in purchase_order:
|
||||||
[('product_id', '=', server_template.product_variant_id.id), ('id', '=', line.id),
|
for line in po.order_line:
|
||||||
('product_qty', '=', 1)], limit=1, order='id desc')
|
if line.product_id == server_template.product_variant_id:
|
||||||
if purchase_order_line:
|
continue
|
||||||
line.unlink()
|
if server_template.server_product_process_parameters_id != line.product_id.server_product_process_parameters_id:
|
||||||
|
purchase_order_line = self.env['purchase.order.line'].search(
|
||||||
|
[('product_id', '=', server_template.product_variant_id.id), ('id', '=', line.id),
|
||||||
|
('product_qty', '=', 1)], limit=1, order='id desc')
|
||||||
|
if purchase_order_line:
|
||||||
|
line.unlink()
|
||||||
|
|
||||||
def _reset_work_order_sequence(self):
|
def _reset_work_order_sequence(self):
|
||||||
"""
|
"""
|
||||||
@@ -898,8 +903,6 @@ class MrpProduction(models.Model):
|
|||||||
for cw in cancel_work_ids:
|
for cw in cancel_work_ids:
|
||||||
cw.sequence = sequence + 1
|
cw.sequence = sequence + 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _reset_work_order_sequence_1(self):
|
def _reset_work_order_sequence_1(self):
|
||||||
"""
|
"""
|
||||||
工单工序排序方法(旧)
|
工单工序排序方法(旧)
|
||||||
|
|||||||
@@ -1246,10 +1246,14 @@ class ResMrpWorkOrder(models.Model):
|
|||||||
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id),
|
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id),
|
||||||
('location_dest_id', '=', self.env['stock.location'].search(
|
('location_dest_id', '=', self.env['stock.location'].search(
|
||||||
[('barcode', 'ilike', 'VL-SPOC')]).id),
|
[('barcode', 'ilike', 'VL-SPOC')]).id),
|
||||||
('origin', '=', self.production_id.name)])
|
('origin', '=', self.production_id.name), ('state', 'not in', ['cancel', 'done'])])
|
||||||
if move_out.state != 'done':
|
for mo in move_out:
|
||||||
move_out.write({'state': 'assigned', 'production_id': False})
|
pick = self.env['stock.picking'].search([('id', '=', mo.picking_id.id), ('name', 'ilike', 'OCOUT'),
|
||||||
self.env['stock.move.line'].create(move_out.get_move_line(self.production_id, self))
|
('partner_id', '=', self.supplier_id.id)])
|
||||||
|
if pick:
|
||||||
|
if mo.state != 'done':
|
||||||
|
mo.write({'state': 'assigned', 'production_id': False})
|
||||||
|
self.env['stock.move.line'].create(mo.get_move_line(self.production_id, self))
|
||||||
|
|
||||||
# move_out._action_assign()
|
# move_out._action_assign()
|
||||||
if self.state == 'waiting' or self.state == 'ready' or self.state == 'progress':
|
if self.state == 'waiting' or self.state == 'ready' or self.state == 'progress':
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ class StockRule(models.Model):
|
|||||||
else:
|
else:
|
||||||
mrp_production = production
|
mrp_production = production
|
||||||
# if sale_order:
|
# if sale_order:
|
||||||
# sale_order.write({'schedule_status': 'to schedule'})
|
# sale_order.write({'schedule_status': 'to schedule'})
|
||||||
self.env['sf.production.plan'].sudo().with_company(company_id).create({
|
self.env['sf.production.plan'].sudo().with_company(company_id).create({
|
||||||
'name': production.name,
|
'name': production.name,
|
||||||
'order_deadline': sale_order.deadline_of_delivery,
|
'order_deadline': sale_order.deadline_of_delivery,
|
||||||
@@ -301,7 +301,6 @@ class StockRule(models.Model):
|
|||||||
'product_id': production.product_id.id,
|
'product_id': production.product_id.id,
|
||||||
'state': 'draft',
|
'state': 'draft',
|
||||||
})
|
})
|
||||||
technology_design_values = []
|
|
||||||
all_production = productions
|
all_production = productions
|
||||||
grouped_product_ids = {k: list(g) for k, g in groupby(all_production, key=lambda x: x.product_id.id)}
|
grouped_product_ids = {k: list(g) for k, g in groupby(all_production, key=lambda x: x.product_id.id)}
|
||||||
# 初始化一个字典来存储每个product_id对应的生产订单名称列表
|
# 初始化一个字典来存储每个product_id对应的生产订单名称列表
|
||||||
@@ -311,6 +310,7 @@ class StockRule(models.Model):
|
|||||||
# 为同一个product_id创建一个生产订单名称列表
|
# 为同一个product_id创建一个生产订单名称列表
|
||||||
product_id_to_production_names[product_id] = [production.name for production in all_production]
|
product_id_to_production_names[product_id] = [production.name for production in all_production]
|
||||||
for production_item in productions:
|
for production_item in productions:
|
||||||
|
technology_design_values = []
|
||||||
production_programming = self.env['mrp.production'].search(
|
production_programming = self.env['mrp.production'].search(
|
||||||
[('product_id.id', '=', production_item.product_id.id),
|
[('product_id.id', '=', production_item.product_id.id),
|
||||||
('origin', '=', production_item.origin)],
|
('origin', '=', production_item.origin)],
|
||||||
@@ -325,70 +325,69 @@ class StockRule(models.Model):
|
|||||||
else:
|
else:
|
||||||
production_item.write({'programming_no': production_programming.programming_no,
|
production_item.write({'programming_no': production_programming.programming_no,
|
||||||
'programming_state': '编程中'})
|
'programming_state': '编程中'})
|
||||||
if not technology_design_values:
|
i = 0
|
||||||
i = 0
|
if production_item.product_id.categ_id.type == '成品':
|
||||||
if production_item.product_id.categ_id.type == '成品':
|
# 根据加工面板的面数及成品工序模板生成工序设计
|
||||||
# 根据加工面板的面数及成品工序模板生成工序设计
|
if production_item.production_type == '自动化产线加工':
|
||||||
if production_item.production_type == '自动化产线加工':
|
model = 'sf.product.model.type.routing.sort'
|
||||||
model = 'sf.product.model.type.routing.sort'
|
domain = [
|
||||||
domain = [
|
('product_model_type_id', '=', production_item.product_id.product_model_type_id.id)]
|
||||||
('product_model_type_id', '=', production_item.product_id.product_model_type_id.id)]
|
else:
|
||||||
else:
|
model = 'sf.manual.product.model.type.routing.sort'
|
||||||
model = 'sf.manual.product.model.type.routing.sort'
|
domain = [('manual_product_model_type_id', '=',
|
||||||
domain = [('manual_product_model_type_id', '=',
|
production_item.product_id.product_model_type_id.id)]
|
||||||
production_item.product_id.product_model_type_id.id)]
|
product_routing_workcenter = self.env[model].search(domain, order='sequence asc')
|
||||||
product_routing_workcenter = self.env[model].search(domain, order='sequence asc')
|
if production_item.production_type == '自动化产线加工':
|
||||||
if production_item.production_type == '自动化产线加工':
|
for k in (production_item.product_id.model_processing_panel.split(',')):
|
||||||
for k in (production_item.product_id.model_processing_panel.split(',')):
|
|
||||||
for route in product_routing_workcenter:
|
|
||||||
i += 1
|
|
||||||
technology_design_values.append(
|
|
||||||
self.env['sf.technology.design'].json_technology_design_str(k, route, i, False))
|
|
||||||
else:
|
|
||||||
for route in product_routing_workcenter:
|
for route in product_routing_workcenter:
|
||||||
i += 1
|
i += 1
|
||||||
technology_design_values.append(
|
technology_design_values.append(
|
||||||
self.env['sf.technology.design'].json_technology_design_str(False, route, i, False))
|
self.env['sf.technology.design'].json_technology_design_str(k, route, i, False))
|
||||||
elif production_item.product_id.categ_id.type == '坯料':
|
else:
|
||||||
embryo_routing_workcenter = self.env['sf.embryo.model.type.routing.sort'].search(
|
for route in product_routing_workcenter:
|
||||||
[('embryo_model_type_id', '=', production_item.product_id.embryo_model_type_id.id)],
|
|
||||||
order='sequence asc'
|
|
||||||
)
|
|
||||||
for route_embryo in embryo_routing_workcenter:
|
|
||||||
i += 1
|
i += 1
|
||||||
technology_design_values.append(
|
technology_design_values.append(
|
||||||
self.env['sf.technology.design'].json_technology_design_str(False, route_embryo, i,
|
self.env['sf.technology.design'].json_technology_design_str(False, route, i, False))
|
||||||
False))
|
elif production_item.product_id.categ_id.type == '坯料':
|
||||||
surface_technics_arr = []
|
embryo_routing_workcenter = self.env['sf.embryo.model.type.routing.sort'].search(
|
||||||
route_workcenter_arr = []
|
[('embryo_model_type_id', '=', production_item.product_id.embryo_model_type_id.id)],
|
||||||
for item in production_item.product_id.product_model_type_id.surface_technics_routing_tmpl_ids:
|
order='sequence asc'
|
||||||
if item.route_workcenter_id.surface_technics_id.id:
|
)
|
||||||
for process_param in production_item.product_id.model_process_parameters_ids:
|
for route_embryo in embryo_routing_workcenter:
|
||||||
if item.route_workcenter_id.surface_technics_id == process_param.process_id:
|
i += 1
|
||||||
surface_technics_arr.append(
|
technology_design_values.append(
|
||||||
item.route_workcenter_id.surface_technics_id.id)
|
self.env['sf.technology.design'].json_technology_design_str(False, route_embryo, i,
|
||||||
route_workcenter_arr.append(item.route_workcenter_id.id)
|
False))
|
||||||
if surface_technics_arr:
|
surface_technics_arr = []
|
||||||
production_process = self.env['sf.production.process'].search(
|
route_workcenter_arr = []
|
||||||
[('id', 'in', surface_technics_arr)],
|
for item in production_item.product_id.product_model_type_id.surface_technics_routing_tmpl_ids:
|
||||||
order='sequence asc'
|
if item.route_workcenter_id.surface_technics_id.id:
|
||||||
)
|
for process_param in production_item.product_id.model_process_parameters_ids:
|
||||||
for p in production_process:
|
if item.route_workcenter_id.surface_technics_id == process_param.process_id:
|
||||||
logging.info('production_process:%s' % p.name)
|
surface_technics_arr.append(
|
||||||
process_parameter = production_item.product_id.model_process_parameters_ids.filtered(
|
item.route_workcenter_id.surface_technics_id.id)
|
||||||
lambda pm: pm.process_id.id == p.id)
|
route_workcenter_arr.append(item.route_workcenter_id.id)
|
||||||
if process_parameter:
|
if surface_technics_arr:
|
||||||
i += 1
|
production_process = self.env['sf.production.process'].search(
|
||||||
route_production_process = self.env[
|
[('id', 'in', surface_technics_arr)],
|
||||||
'mrp.routing.workcenter'].search(
|
order='sequence asc'
|
||||||
[('surface_technics_id', '=', p.id),
|
)
|
||||||
('id', 'in', route_workcenter_arr)])
|
for p in production_process:
|
||||||
technology_design_values.append(
|
logging.info('production_process:%s' % p.name)
|
||||||
self.env['sf.technology.design'].json_technology_design_str(False,
|
process_parameter = production_item.product_id.model_process_parameters_ids.filtered(
|
||||||
route_production_process,
|
lambda pm: pm.process_id.id == p.id)
|
||||||
i,
|
if process_parameter:
|
||||||
process_parameter))
|
i += 1
|
||||||
productions.technology_design_ids = technology_design_values
|
route_production_process = self.env[
|
||||||
|
'mrp.routing.workcenter'].search(
|
||||||
|
[('surface_technics_id', '=', p.id),
|
||||||
|
('id', 'in', route_workcenter_arr)])
|
||||||
|
technology_design_values.append(
|
||||||
|
self.env['sf.technology.design'].json_technology_design_str(False,
|
||||||
|
route_production_process,
|
||||||
|
i,
|
||||||
|
process_parameter))
|
||||||
|
production_item.technology_design_ids = technology_design_values
|
||||||
productions.write({'state': 'technology_to_confirmed'})
|
productions.write({'state': 'technology_to_confirmed'})
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -636,39 +635,24 @@ class StockPicking(models.Model):
|
|||||||
return '%s%s' % (rescode, num)
|
return '%s%s' % (rescode, num)
|
||||||
|
|
||||||
def button_validate(self):
|
def button_validate(self):
|
||||||
if self.picking_type_id.barcode == 'OCOUT':
|
res = super().button_validate()
|
||||||
move_out = self.env['stock.move'].search(
|
if res is True and self.picking_type_id.sequence_code == 'OCOUT':
|
||||||
[('location_id', '=', self.env['stock.location'].search(
|
# if self.id == move_out.picking_id.id:
|
||||||
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id),
|
# if move_out.move_line_ids.workorder_id.state == 'progress':
|
||||||
('location_dest_id', '=', self.env['stock.location'].search(
|
|
||||||
[('barcode', 'ilike', 'VL-SPOC')]).id),
|
|
||||||
('origin', '=', self.origin)])
|
|
||||||
move_in = self.env['stock.move'].search(
|
move_in = self.env['stock.move'].search(
|
||||||
[('location_dest_id', '=', self.env['stock.location'].search(
|
[('location_dest_id', '=', self.env['stock.location'].search(
|
||||||
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id),
|
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id),
|
||||||
('location_id', '=', self.env['stock.location'].search(
|
('location_id', '=', self.env['stock.location'].search(
|
||||||
[('barcode', 'ilike', 'VL-SPOC')]).id),
|
[('barcode', 'ilike', 'VL-SPOC')]).id),
|
||||||
('origin', '=', self.origin), ('picking_id', '=', self.id)])
|
('origin', '=', self.origin), ('state', 'not in', ['cancel', 'done'])])
|
||||||
if self.location_id == move_in.location_id and self.location_dest_id == move_in.location_dest_id:
|
production = self.env['mrp.production'].search([('name', '=', self.origin)])
|
||||||
if move_out.origin == move_in.origin:
|
for mi in move_in:
|
||||||
move_in.write({'production_id': False})
|
pick = self.env['stock.picking'].search([('id', '=', mi.picking_id.id), ('name', 'ilike', 'OCIN'),
|
||||||
if move_out.picking_id.state != 'done':
|
('partner_id', '=', self.partner_id.id)])
|
||||||
raise UserError(
|
if pick:
|
||||||
_('该入库单对应的单号为%s的出库单还未完成,不能进行验证操作!' % move_out.picking_id.name))
|
if mi.state != 'done':
|
||||||
res = super().button_validate()
|
mi.write({'state': 'assigned'})
|
||||||
if res is True and self.picking_type_id.barcode == 'OCIN':
|
self.env['stock.move.line'].create(mi.get_move_line(production, None))
|
||||||
if self.id == move_out.picking_id.id:
|
|
||||||
# if move_out.move_line_ids.workorder_id.state == 'progress':
|
|
||||||
move_in = self.env['stock.move'].search(
|
|
||||||
[('location_dest_id', '=', self.env['stock.location'].search(
|
|
||||||
[('barcode', 'ilike', 'WH-PREPRODUCTION')]).id),
|
|
||||||
('location_id', '=', self.env['stock.location'].search(
|
|
||||||
[('barcode', 'ilike', 'VL-SPOC')]).id),
|
|
||||||
('origin', '=', self.origin)])
|
|
||||||
production = self.env['mrp.production'].search([('name', '=', self.origin)])
|
|
||||||
if move_in.state != 'done':
|
|
||||||
move_in.write({'state': 'assigned'})
|
|
||||||
self.env['stock.move.line'].create(move_in.get_move_line(production, None))
|
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ class ProductionTechnologyReAdjustWizard(models.TransientModel):
|
|||||||
workorder.picking_ids.write({'state': 'cancel'})
|
workorder.picking_ids.write({'state': 'cancel'})
|
||||||
workorder.picking_ids.move_ids.write({'state': 'cancel'})
|
workorder.picking_ids.move_ids.write({'state': 'cancel'})
|
||||||
purchase_order = self.env['purchase.order'].search(
|
purchase_order = self.env['purchase.order'].search(
|
||||||
[('origin', '=', workorder.production_id.origin)])
|
[('origin', '=', workorder.production_id.name)])
|
||||||
for line in purchase_order.order_line:
|
for line in purchase_order.order_line:
|
||||||
if line.product_id.server_product_process_parameters_id == workorder.surface_technics_parameters_id:
|
if line.product_id.server_product_process_parameters_id == workorder.surface_technics_parameters_id:
|
||||||
purchase_order.write({'state': 'cancel'})
|
purchase_order.write({'state': 'cancel'})
|
||||||
@@ -104,6 +104,7 @@ class ProductionTechnologyReAdjustWizard(models.TransientModel):
|
|||||||
self.env['mrp.workorder'].json_workorder_str(special.production_id, special))
|
self.env['mrp.workorder'].json_workorder_str(special.production_id, special))
|
||||||
special.production_id.write({'workorder_ids': workorders_values})
|
special.production_id.write({'workorder_ids': workorders_values})
|
||||||
else:
|
else:
|
||||||
|
logging.info(workorder.blocked_by_workorder_ids)
|
||||||
if len(workorder.blocked_by_workorder_ids) > 1:
|
if len(workorder.blocked_by_workorder_ids) > 1:
|
||||||
if workorder.sequence == 1:
|
if workorder.sequence == 1:
|
||||||
workorder.blocked_by_workorder_ids = None
|
workorder.blocked_by_workorder_ids = None
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ class ProductionTechnologyWizard(models.TransientModel):
|
|||||||
workorder.picking_ids.write({'state': 'cancel'})
|
workorder.picking_ids.write({'state': 'cancel'})
|
||||||
workorder.picking_ids.move_ids.write({'state': 'cancel'})
|
workorder.picking_ids.move_ids.write({'state': 'cancel'})
|
||||||
purchase_order = self.env['purchase.order'].search(
|
purchase_order = self.env['purchase.order'].search(
|
||||||
[('origin', '=', workorder.production_id.origin)])
|
[('origin', '=', workorder.production_id.name)])
|
||||||
for line in purchase_order.order_line:
|
for line in purchase_order.order_line:
|
||||||
if line.product_id.server_product_process_parameters_id == workorder.surface_technics_parameters_id:
|
if line.product_id.server_product_process_parameters_id == workorder.surface_technics_parameters_id:
|
||||||
purchase_order.write({'state': 'cancel'})
|
purchase_order.write({'state': 'cancel'})
|
||||||
|
|||||||
@@ -265,17 +265,20 @@ class RePurchaseOrder(models.Model):
|
|||||||
}))
|
}))
|
||||||
for purchase in purchase_order:
|
for purchase in purchase_order:
|
||||||
for po in purchase.order_line:
|
for po in purchase.order_line:
|
||||||
if server_template.server_product_process_parameters_id == pp.surface_technics_parameters_id:
|
if po.product_id == server_template.product_variant_id:
|
||||||
|
continue
|
||||||
|
if server_template.server_product_process_parameters_id != po.product_id.server_product_process_parameters_id:
|
||||||
purchase_order_line = self.env['purchase.order.line'].search(
|
purchase_order_line = self.env['purchase.order.line'].search(
|
||||||
[('product_id', '=', server_template.product_variant_id.id),
|
[('product_id', '=', server_template.product_variant_id.id),
|
||||||
('product_qty', '=', 1.0), ('id', '=', po.id)], limit=1,
|
('product_qty', '=', 1.0), ('id', '=', purchase.id)], limit=1,
|
||||||
order='id desc')
|
order='id desc')
|
||||||
if not purchase_order_line and purchase not in purchase_order:
|
if not purchase_order_line:
|
||||||
server_product_process.append((0, 0, {
|
server_product_process.append((0, 0, {
|
||||||
'product_id': server_template.product_variant_id.id,
|
'product_id': server_template.product_variant_id.id,
|
||||||
'product_qty': 1,
|
'product_qty': 1,
|
||||||
'product_uom': server_template.uom_id.id
|
'product_uom': server_template.uom_id.id
|
||||||
}))
|
}))
|
||||||
|
|
||||||
if server_product_process:
|
if server_product_process:
|
||||||
self.env['purchase.order'].sudo().create({
|
self.env['purchase.order'].sudo().create({
|
||||||
'partner_id': server_template.seller_ids[0].partner_id.id,
|
'partner_id': server_template.seller_ids[0].partner_id.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user