跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 实现套件类型的物料清单使用以及送货完毕订单送货状态不变bug修复

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

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
8 帖子 5 发布者 4.7k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 老 离线
    老 离线
    老刘
    写于 最后由 编辑
    #1

    商场卖可乐,可以卖百事可乐,也可以卖可口可乐,也可以打包一个百事可乐和可口可乐的套装,但是客户也可以拆开其中的一个单独买单,也可以一起买打包好的单。
    1.首先我们需要定义3个产品:可口可乐、百事可乐、无忧可乐套装。注意:定义无忧可乐套装的时候要定义:供应方法生产
    [img [检测到链接无效,已移除] /img]
    2.定义生产物料清单。注意:物料清单类型 必须选:套件/虚项
    [img [检测到链接无效,已移除] /img]
    3.发生销售
    [img [检测到链接无效,已移除] /img]
    4.查看送货单:
    [img [检测到链接无效,已移除] /img]
    ok,完毕!
    但是有个小问题,当发货完毕,生成发票,登记付款完毕的时候,订单不能自动变为“done”状态,这个问题待哪位大牛解决下。

    1 条回复 最后回复
    0
    • JoshuaJ 离线
      JoshuaJ 离线
      Joshua 管理员
      写于 最后由 编辑
      #2

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

      【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

      1 条回复 最后回复
      0
      • mrshellyM 离线
        mrshellyM 离线
        mrshelly
        写于 最后由 编辑
        #3

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

        1 条回复 最后回复
        0
        • W 离线
          W 离线
          wangpc
          写于 最后由 编辑
          #4

          很有价值的一个分享,受教了 😎

          1 条回复 最后回复
          0
          • 老 离线
            老 离线
            老刘
            写于 最后由 编辑
            #5

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

            1 条回复 最后回复
            0
            • 老 离线
              老 离线
              老刘
              写于 最后由 编辑
              #6

              综上所述,我决定找一个简单的解决方式:
              修改: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工作流,来完成订单状态的改变。

              1 条回复 最后回复
              0
              • M 离线
                M 离线
                matrowang
                写于 最后由 编辑
                #7

                有想法,谢谢了

                1 条回复 最后回复
                0

                • 登录

                • 没有帐号? 注册

                • 登录或注册以进行搜索。
                • 第一个帖子
                  最后一个帖子
                0
                • 版块
                • 标签
                • 热门
                • 用户
                • 群组