Gem aasm

本文介绍了一个基于状态机的状态管理流程,包括从待审批到完成的各个阶段,以及每个事件触发的状态转换逻辑。还介绍了如何记录状态变更及审批过程。
gem aasm TODO
 # 状态机 默认使用的是aasm_state 想要制定状态列名,使用aasm :state
 # State Machine
     aasm column: "state", requires_new_transaction: false,whiny_transitions: true,
          whiny_persistence: true,
          requires_lock: true do

       state :pending, initial: true # 已创建疑点,尚未申请
       state :applied   # 已申请
       state :submitted # 已提交(待审批)(由疑点申请人提交)
       state :confirmed # 部门领导已确认疑点,待疑点逐步审批(由部门审核人发起)
       state :canceled  # 已取消(可由申请人或部门审核人取消,需填取消理由)
       state :auditing  # 审批中
       state :rejected  # 审批驳回
       state :approved  # 审批已通过
       state :completed # 已完成
       state :finished  # 已落实

       # 跟踪疑点状态变化
       每次操作后会网approval中添加状态改变记录,
       after_all_transitions :save_approval

       # 提交申请
       # 调用 @problem.apply 不更改数据库中字段值,apply!会更改数据库字段值
       event :apply do
         transitions from: :pending, to: :applied
       end

       # 提交审批(已申请,或者驳回)
       # TODO 提交前验证信息 if: ->{valid?(:submit)}
       event :owner_submited  do

         transitions from: [:applied,:rejected], to: :submitted
       end

       # 部门领导确认疑点,待疑点逐步审批(由部门审核人发起)
       event :confirm, after_commit: ->{ deliver!} do
         transitions from: :submitted, to: :confirmed
       end

       # 可由申请人或部门审核人取消
       event :cancel do
         transitions from: [:submitted, :pending, :rejected], to: :canceled,
                     # TODO: 删除疑点相关附件信息
                     after: [:delete_accessories]
       end

       # 审批中
       event :auditing  do
         transitions from: [:confirmed, :rejected], to: :auditing
         transitions from: :confirmed, to: :auditing
       end

       # 审核驳回
       event :rejected do
         transitions from: :auditing, to: :rejected
       end

       # 完成疑点审批
       event :complete do
         transitions from: [:auditing,:rejected] ,to: :completed
       end
       # 落实疑点
       event :finished do
         transitions from: :complete ,to: :finished
       end
     end


     # 获取当前时间转化点
     # state_names = aasm.states.map(&:name)
     %w(confirmed canceled auditing completed finished).each do |state|
       define_method("#{state}_at") do
         self.approvals.where(to_state: state).first.try(:created_at)
       end
     end

     # 获取当前审批状态
     # 调用方法state_has_{state}
     %w(submitted confirmed canceled auditing completed finished).each do |state|
       define_method("state_has_#{state}?") do
         self.approvals.where(to_state: state).first.present?
       end
     end

     def approval_aply_only?
       approvals.where( to_state: :applied).size == 0
     end

如果想更改数据库中的状态内容需要使用event! 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值