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

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

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

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

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



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



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


  • 管理员

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



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



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



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



  • 综上所述,我决定找一个简单的解决方式:<br />修改:addons/sale_stock/stock.py 下stock_move :为其增加action_done 方法:(PS:为啥不直接修改stock下面的action_done方法,因为如果没有安装sale_stock模块,会造成代码无法运行)。<br />先把/sale/stock.py 下单方法整个抄过来:<br /><br />然后再下面增加如下代码:<br />。。。。。。<br />        move_ids = []<br />        moves=[] <----增加<br />。。。。<br />            move_ids.append(move.id)<br />            moves.append(move)  <----增加<br /><br />        。。。。。。。。。。。。。。。。。(原代码)<br />        for id in move_ids:<br />            wf_service.trg_trigger(uid, 'stock.move', id, cr)<br />            <br />        #为分解打包商品后的stock.move检查是否全部为“done”,如果是,那么原来订单时注册的stock.move也改变状态为“done”<br />        #并且注册触发器            <br />        for mv in moves:<br />            sale_line_id=mv.sale_line_id<br />            other_move_ids = self.search(cr, uid, [('id','!=',mv.id),('state','not in',['done','cancel']),<br />                                                    ('sale_line_id','=',sale_line_id.id)], context=context)<br />            phantom_mv =[]<br />            all_done= True<br />            for ohid in other_move_ids:<br />                ohmv=self.browse(cr, uid, ohid, context)<br />                if ohmv.picking_id:<br />                    all_done= False<br />                    break<br />                phantom_mv.append(ohmv.id);<br />            if all_done and phantom_mv and len(phantom_mv)>0 :<br />                self.write(cr, uid, phantom_mv, {'state': 'done', 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}, context=context)<br />                for phid in phantom_mv:<br />                    wf_service.trg_trigger(uid, 'stock.move', phid, cr)                <br /><br />        #增加完毕<br />        for pick_id in picking_ids:<br />            wf_service.trg_write(uid, 'stock.picking', pick_id, cr)<br /><br />当然,这个判断不是很科学(最好的办法是拆解套件包时,记录原procurement.order.id或者stock_move.id,通过关系获取),我判断的依据是sale_line_id 下的stock_move的picking_id为空,即作为 phantom(套件)类型的发送单。改变其状态为done,正确激活订单时所注册的Triggers工作流,来完成订单状态的改变。



  • 有想法,谢谢了


登录后回复
 

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