zoukankan      html  css  js  c++  java
  • MRP Force Reservation的作用

    生产单根据BOM计算出相应的物料需求,生产领料单stock.picking ( internal moves)

    Stock.picking使用工作流自动计算库存量,如果库存量够,则使用 test_assigned() picking的状态切换到 assigned

    test_assigned()调用 stock.check_assign() 计算库存量是否够

       

    如果原材料库存量不够,生产单就会处于 confirmed 状态,而不能进入 assigned状态 子工作流

       

    使用force reservation按钮之后,系统会把picking对应的stock.move预留下来,这样就可以完成移库操作;如工作流所示

       

    picking状态为 assigned的,就是可以完成picking的文档

       

    stock.move状态的改变,会影响到'产品可用数量'

       

    模型 stock.move

       

    def check_assign(self, cr, uid, ids, context=None):

    """ Checks the product type and accordingly writes the state.

    @return: No. of moves done

    """

    done = []

    count = 0

    pickings = {}

    if context is None:

    context = {}

    for move in self.browse(cr, uid, ids, context=context):

    if move.product_id.type == 'consu' or move.location_id.usage == 'supplier':

    if move.state in ('confirmed', 'waiting'):

    done.append(move.id)

    pickings[move.picking_id.id] = 1

    continue

    if move.state in ('confirmed', 'waiting'):

    # Important: we must pass lock=True to _product_reserve() to avoid race conditions and double reservations

    res = self.pool.get('stock.location')._product_reserve(cr, uid, [move.location_id.id], move.product_id.id, move.product_qty, {'uom': move.product_uom.id}, lock=True)

    if res:

    #_product_available_test depends on the next status for correct functioning

    #the test does not work correctly if the same product occurs multiple times

    #in the same order. This is e.g. the case when using the button 'split in two' of

    #the stock outgoing form

    self.write(cr, uid, [move.id], {'state':'assigned'})

    done.append(move.id)

    pickings[move.picking_id.id] = 1

    r = res.pop(0)

    product_uos_qty = self.pool.get('stock.move').onchange_quantity(cr, uid, ids, move.product_id.id, r[0], move.product_id.uom_id.id, move.product_id.uos_id.id)['value']['product_uos_qty']

    move.write({

    'location_id': r[1],

    'product_qty': r[0],

    'product_uos_qty': product_uos_qty,

    })

       

    while res:

    r = res.pop(0)

    product_uos_qty = self.pool.get('stock.move').onchange_quantity(cr, uid, ids, move.product_id.id, r[0], move.product_id.uom_id.id, move.product_id.uos_id.id)['value']['product_uos_qty']

    move_id = self.copy(cr, uid, move.id, {'product_uos_qty': product_uos_qty, 'product_qty': r[0], 'location_id': r[1]})

    done.append(move_id)

    if done:

    count += len(done)

    self.write(cr, uid, done, {'state': 'assigned'})

       

    if count:

    for pick_id in pickings:

    wf_service = netsvc.LocalService("workflow")

    wf_service.trg_write(uid, 'stock.picking', pick_id, cr)

    return count

       

       

    模型 product.product

    def _product_available(self, cr, uid, ids, field_names=None, arg=False, context=None):

    """ Finds the incoming and outgoing quantity of product.

    @return: Dictionary of values

    """

    if not field_names:

    field_names = []

    if context is None:

    context = {}

    res = {}

    for id in ids:

    res[id] = {}.fromkeys(field_names, 0.0)

    for f in field_names:

    c = context.copy()

    if f == 'qty_available':

    c.update({ 'states': ('done',), 'what': ('in', 'out') })

    if f == 'virtual_available':

    c.update({ 'states': ('confirmed','waiting','assigned','done'), 'what': ('in', 'out') })

    if f == 'incoming_qty':

    c.update({ 'states': ('confirmed','waiting','assigned'), 'what': ('in',) })

    if f == 'outgoing_qty':

    c.update({ 'states': ('confirmed','waiting','assigned'), 'what': ('out',) })

    stock = self.get_product_available(cr, uid, ids, context=c)

    for id in ids:

    res[id][f] = stock.get(id, 0.0)

    return res

       

    模型 mrp.production

    def force_production(self, cr, uid, ids, *args):

    """ Assigns products.

    @param *args: Arguments

    @return: True

    """

    pick_obj = self.pool.get('stock.picking')

    pick_obj.force_assign(cr, uid, [prod.picking_id.id for prod in self.browse(cr, uid, ids)])

    return True

       

       

       

    模型 stock.picking

    def force_assign(self, cr, uid, ids, *args):

    """ Changes state of picking to available if moves are confirmed or waiting.

    @return: True

    """

    wf_service = netsvc.LocalService("workflow")

    for pick in self.browse(cr, uid, ids):

    move_ids = [x.id for x in pick.move_lines if x.state in ['confirmed','waiting']]

    self.pool.get('stock.move').force_assign(cr, uid, move_ids)

    wf_service.trg_write(uid, 'stock.picking', pick.id, cr)

    return True

       

       

    模型 stock.move

    def force_assign(self, cr, uid, ids, context=None):

    """ Changes the state to assigned.

    @return: True

    """

    self.write(cr, uid, ids, {'state': 'assigned'})

    wf_service = netsvc.LocalService('workflow')

    for move in self.browse(cr, uid, ids, context):

    if move.picking_id:

    wf_service.trg_write(uid, 'stock.picking', move.picking_id.id, cr)

    return True

       

       

       

    工作流 -生产单 -调用拣货子流程

       

       

       

    工作流 -拣货单

       

       

    转载注明原作者 /by Jeffery
  • 相关阅读:
    关于C++类中的静态数据成员
    关于C++中char,sizeof,strlen,string
    C++学习笔记(7)
    C++学习笔记(6)
    C++学习笔记(指针)
    C++学习笔记(4)
    UVA 10780
    UVA 531
    HDU, 3579 Hello Kiki
    UVA, 10413 Crazy Savages
  • 原文地址:https://www.cnblogs.com/odoouse/p/4690412.html
Copyright © 2011-2022 走看看