生产单根据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. 有关linux的GPG签名验证错误的解决方法。

    GPG签名验证错误:由于没有公钥,下列签名无法进行验证: NO_PUBKEY 6AF0E1940624A220 找了下原因,虽然不知道原理,不过大概意思还是能才出来的,解决方法如下: gpg --ke ...

  2. iOS UITextView点击事件处理

    自定义一个UITextView UITextView 的selectedRange 影响 selectedTextRange 改变前者可影响后者 self.selectedRange -->se ...

  3. 包含min的栈

    #include <iostream> #include <stack> using namespace std; void push(stack<int> &am ...

  4. Codeforces Round #877 (Div. 2) E. Danil and a Part-time Job

    E. Danil and a Part-time Job 题目链接:http://codeforces.com/contest/877/problem/E time limit per test2 s ...

  5. ORACLE 检索某列包含特定字符串的数据表工具存储过程

    使用示例: delete APPS.FIND_RESULT; set serveroutput ondeclare     v_ret varchar(200);begin     apps.sp_f ...

  6. 面试准备——java设计模式

    1 总体来说,设计模式分为三大类: 设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 创建型模式(五种):工厂方法模式.抽象工厂模式.单例模式. ...

  7. Matplotlib基本图形之折线图

    Matplotlib基本图形之折线图折线图特点 折线图是用折线将各数据连起来组成的图形常用来观察数据随时间变化的趋势例如:股票价格,温度变化,等等 示例代码: import os import tim ...

  8. Leetcode 397.整数替换

    整数替换 给定一个正整数 n,你可以做如下操作: 1. 如果 n 是偶数,则用 n / 2替换 n.2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n.n 变为 1 所需的最小替换次数是 ...

  9. HDU——1242Rescue(BFS+优先队列求点图最短路)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. centos7 下修改网络配置

    修改ip地址 编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static 静态ip DEFROUTE=yes ...