Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

实现套件类型的物料清单使用以及送货完毕订单送货状态不变bug修复



  • 商场卖可乐,可以卖百事可乐,也可以卖可口可乐,也可以打包一个百事可乐和可口可乐的套装,但是客户也可以拆开其中的一个单独买单,也可以一起买打包好的单。
    1.首先我们需要定义3个产品:可口可乐、百事可乐、无忧可乐套装。注意:定义无忧可乐套装的时候要定义:供应方法生产
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2833;image[/img]
    2.定义生产物料清单。注意:物料清单类型 必须选:套件/虚项
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2837;image[/img]
    3.发生销售
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2835;image[/img]
    4.查看送货单:
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2839;image[/img]
    ok,完毕!
    但是有个小问题,当发货完毕,生成发票,登记付款完毕的时候,订单不能自动变为“done”状态,这个问题待哪位大牛解决下。



  • 商场卖可乐,可以卖百事可乐,也可以卖可口可乐,也可以打包一个百事可乐和可口可乐的套装,但是客户也可以拆开其中的一个单独买单,也可以一起买打包好的单。
    1.首先我们需要定义3个产品:可口可乐、百事可乐、无忧可乐套装。注意:定义无忧可乐套装的时候要定义:供应方法生产
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2833;image[/img]
    2.定义生产物料清单。注意:物料清单类型 必须选:套件/虚项
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2837;image[/img]
    3.发生销售
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2835;image[/img]
    4.查看送货单:
    [img]http://shine-it.net/index.php?action=dlattach;topic=13271.0;attach=2839;image[/img]
    ok,完毕!
    但是有个小问题,当发货完毕,生成发票,登记付款完毕的时候,订单不能自动变为“done”状态,这个问题待哪位大牛解决下。


  • 管理员

    谢谢楼主分享虚项(phantom Bom)的用法。至于你说的销售订单没变成Done状态可以看看销售订单上的Paid,Delivered是否已经打勾。



  • 赞.... 关注.....



  • 很有价值的一个分享,受教了 8)



  • 今天晚上看了代码,初步确认:由于确认订单自动生成发货单同时有工作流写入数据库(Triggers为procurement.order / id),但是生产模块修改发货单的产品为其他产品(实际上是增加产品)后(stock_move 发生变化,对应procurement.order 也发送了变化),当发生发货完成是,stock_move的id不是原始id,所以procurement.order也不是订单时注册在工作流中间的id,工作流引擎不能正确重启工作流运行,造成不能自动完成发货状态。



  • 综上所述,我决定找一个简单的解决方式:
    修改:addons/sale_stock/stock.py 下stock_move :为其增加action_done 方法:(PS:为啥不直接修改stock下面的action_done方法,因为如果没有安装sale_stock模块,会造成代码无法运行)。
    先把/sale/stock.py 下单方法整个抄过来:

    然后再下面增加如下代码:
    。。。。。。
            move_ids = []
            moves=[] <----增加
    。。。。
                move_ids.append(move.id)
                moves.append(move)  <----增加

            。。。。。。。。。。。。。。。。。(原代码)
            for id in move_ids:
                wf_service.trg_trigger(uid, 'stock.move', id, cr)
               
            #为分解打包商品后的stock.move检查是否全部为“done”,如果是,那么原来订单时注册的stock.move也改变状态为“done”
            #并且注册触发器           
            for mv in moves:
                sale_line_id=mv.sale_line_id
                other_move_ids = self.search(cr, uid, [('id','!=',mv.id),('state','not in',['done','cancel']),
                                                        ('sale_line_id','=',sale_line_id.id)], context=context)
                phantom_mv =[]
                all_done= True
                for ohid in other_move_ids:
                    ohmv=self.browse(cr, uid, ohid, context)
                    if ohmv.picking_id:
                        all_done= False
                        break
                    phantom_mv.append(ohmv.id);
                if all_done and phantom_mv and len(phantom_mv)>0 :
                    self.write(cr, uid, phantom_mv, {'state': 'done', 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)
                    for phid in phantom_mv:
                        wf_service.trg_trigger(uid, 'stock.move', phid, cr)               

            #增加完毕
            for pick_id in picking_ids:
                wf_service.trg_write(uid, 'stock.picking', pick_id, cr)

    当然,这个判断不是很科学(最好的办法是拆解套件包时,记录原procurement.order.id或者stock_move.id,通过关系获取),我判断的依据是sale_line_id 下的stock_move的picking_id为空,即作为 phantom(套件)类型的发送单。改变其状态为done,正确激活订单时所注册的Triggers工作流,来完成订单状态的改变。



  • 有想法,谢谢了


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待