生产单根据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. Python字符串操作详解

    菜鸟学Python第五天 流程控制 for循环 while循环 VS for循环: while循环:称之为条件循环,循环的次数取决于条件何时为false for循环:称之为迭代器循环,循环的次数取决于 ...

  2. LeetCode(116) Populating Next Right Pointers in Each Node

    题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...

  3. 快速入门Matplotlib

    十分钟快速入门Matplotlib 函数式绘图 这个库主要有两种绘图方式,一种是像这样的类matlab的函数式绘图方法. import matplotlib.pyplot as plt import ...

  4. Hive 执行sql命令报错

    Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxExce ...

  5. 大数据学习——sqoop导出数据

    把数据从hadoop导出到关系型数据库 将数据从HDFS导出到RDBMS数据库 导出前,目标表必须存在于目标数据库中. u  默认操作是从将文件中的数据使用INSERT语句插入到表中 u  更新模式下 ...

  6. bootshiro---开源的后台管理框架--基于springboot2+ shiro+jwt的真正rest api资源无状态认证权限管理框架,开发人员无需关注权限问题,后端开发完api,前端页面配置即可

    https://gitee.com/tomsun28/bootshiro

  7. Brownie Slicing(二分枚举答案)

    描述 Bessie has baked a rectangular brownie that can be thought of as an RxC grid (1 <= R <= 500 ...

  8. 【JavaScript 8—基础知识点】:DOM

    一.总体概述 1.1,什么是DOM DOM(Document Object Model):D(文档):整个web加载的网页文档:O(对象):类似于window对象之类的东西,可以调用属性和方法,在这里 ...

  9. 11g自动分区超过最大限制

    公司业务系统一张表按时间每天分区 写入数据时报错:ORA-14300: 分区关键字映射到超出允许的最大分区数的分区 ORA-14300: partitioning key maps to a part ...

  10. BZOJ 2438 [中山市选2011]杀人游戏 ——期望DP

    发现每一次死亡的几率相等,所以只需要判断最少问多少人即可. 并且环上的点任意询问都可以. 所以直接Tarjan缩点,然后计算入度为0的点的数目. 但是还有一些情况的时候会减少一次询问,比如说:$1-& ...