生产单根据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

 
 

 
 

 
 

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

 
 

 
 

 
 

工作流 -拣货单

 
 

 
 

MRP Force Reservation的作用的更多相关文章

  1. [转帖]直击案发现场!TCP 10倍延迟的真相是?

    直击案发现场!TCP 10倍延迟的真相是? http://zhuanlan.51cto.com/art/201911/605268.htm 内核参数调优 非常重要啊. 什么是经验?就是遇到问题,解决问 ...

  2. D3.js 力导向图的制作

    力导向图中每一个节点都受到力的作用而运动,这种是一种非常绚丽的图表. 力导向图(Force-Directed Graph),是绘图的一种算法.在二维或三维空间里配置节点,节点之间用线连接,称为连线. ...

  3. 王者荣耀是怎样炼成的(三)unity组件与脚本

    转载请注明出处:http://www.cnblogs.com/yuxiuyan/p/7565345.html 上回书说到了unity的基本操作.这回我们来侃侃unity中的组件与脚本. 目录结构 一. ...

  4. TCP的发送系列 — 发送缓存的管理(一)

    主要内容:TCP发送缓存的初始化.动态调整.申请和释放. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 数据结构 TCP对发送缓存的管理是在两个层面上进 ...

  5. 力导向图Demo

    <html> <head> <meta charset="utf-8"> <title>力导向图</title> < ...

  6. d3实现的力向导图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Mac OS下面安装mysql以及mysql常用命令

    使用brew安装mysql brew install mysql 安装成功后使用下面命令启动/关闭服务 brew services start mysql brew services stop mys ...

  8. D3.js系列——布局:饼状图和力导向图

    一.饼状图 在布局的应用中,最简单的就是饼状图. 1.数据 有如下数据,需要可视化: , , , , ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终止角度,这些 ...

  9. 被严重误会?APS系统没有想象的那么复杂

    APS的出现要从90年代了,但到现在,很多行业内的顾问或用户提到APS都马上想到的是“要求很精确”“难度很大”“脱离实际”“太理想化”“工作量太大”等等,然后把它束之高阁不睬. 在这里,给大家分析一下 ...

随机推荐

  1. 链式链表的C风格实现

    头文件: #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; //将数据的类型分离,相当于句柄 //只是一个小节点 包含着 ...

  2. 【Oracle】使用dblink+minus方式迁移数据

    一.需求说明 1.数据库a104的表syssde.a4_syssde_department中有1000条数据: 2.数据库a230的表syssde.a4_syssde_department中有800条 ...

  3. DRF filter

    filter 配置 fiter定义 自定义filter继承BaseFilterBackend,必须重写filter_queryset,返回值为过滤后的queryset filter在GenericAP ...

  4. Knockout v3.4.0 中文版教程-11-控制文本内容和外观-text绑定

    2. text绑定 目的 text绑定把传入的参数通过关联的DOM元素来显示文本值. 通常这对像<span>或<em>标签等使用,但技术上你可以对任何元素使用该绑定. 例子 T ...

  5. Builder(构造者)

    Builder(构造者) <?php class Product { private $name; public function setName($name) { $this->name ...

  6. WordPress 多语言支持(本地化)

    本博客将介绍WordPress的多语言制作 首先需要在wp-content目录下创建一个languages文件夹,用于存放语言包文件. 然后在模板目录下的functions.php,然后在代码中添加函 ...

  7. 刷题总结——作诗(bzoj2821)

    题目: Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章, ...

  8. Spoj-NPC2015A Eefun Guessing Words

    Eefun Guessing Words Eefun is currently learning to read. His way of learning  is unique, by trying ...

  9. nmon性能分析工具(生成图表)

    1. nmon性能结果生成报告工具下载地址: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power% ...

  10. Linux(13):期中架构(5)--- 前端部分:keepalived高可用 & HTTPS & iptables防火墙

    keepalived 高可用集群 1. keepalived服务概念说明 # 1.1 keepalived软件的作用? Keepalived软件起初是专为LVS负载均衡软件设计的, 用来管理并监控LV ...