diff --git a/Gemfile b/Gemfile index dfa8914afd..30266d1c6d 100644 --- a/Gemfile +++ b/Gemfile @@ -37,6 +37,7 @@ gem 'font-awesome-rails' gem 'carrierwave' gem 'mini_magick' gem 'letter_opener', group: :development +gem 'aasm' group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console diff --git a/Gemfile.lock b/Gemfile.lock index 35313ffdf1..64543c4cd5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,8 @@ GEM remote: https://rubygems.org/ specs: + aasm (4.12.0) + concurrent-ruby (~> 1.0) actioncable (5.0.0) actionpack (= 5.0.0) nio4r (~> 1.2) @@ -189,6 +191,7 @@ PLATFORMS ruby DEPENDENCIES + aasm bootstrap-sass byebug carrierwave diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e60347d31c..65467a89ea 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -16,7 +16,7 @@ def create product_list.quantity = cart_item.quantity product_list.save end - + current_cart.clean! OrderMailer.notify_order_placed(@order).deliver! @@ -35,7 +35,8 @@ def show def pay_with_alipay @order = Order.find_by_token(params[:id]) @order.set_payment_with!("alipay") - @order.pay! + @order.make_payment! + redirect_to order_path(@order.token), notice: "使用支付宝成功完成付款" end @@ -43,7 +44,7 @@ def pay_with_alipay def pay_with_wechat @order = Order.find_by_token(params[:id]) @order.set_payment_with!("wechat") - @order.pay! + @order.make_payment! redirect_to order_path(@order.token), notice: "使用微信成功完成付款" end diff --git a/app/models/order.rb b/app/models/order.rb index 433a5128df..20cea88a9a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -20,4 +20,39 @@ def pay! belongs_to :user has_many :product_lists + + include AASM + + aasm do + state :order_placed, initial: true + state :paid + state :shipping + state :shipped + state :order_cancelled + state :good_returned + + event :make_payment, after_commit: :pay! do + transitions from: :order_placed, to: :paid + end + + event :ship do + transitions from: :paid, to: :shipping + end + + event :deliver do + transitions from: :shipping, to: :shipped + end + + event :return_good do + transitions from: :shipped, to: :good_returned + end + + event :cancel_order do + transitions from: [:order_placed, :paid], to: :order_cancelled + end + end + + + + end diff --git a/db/migrate/20170517043732_add_aasm_state_to_order.rb b/db/migrate/20170517043732_add_aasm_state_to_order.rb new file mode 100644 index 0000000000..4028b8c968 --- /dev/null +++ b/db/migrate/20170517043732_add_aasm_state_to_order.rb @@ -0,0 +1,6 @@ +class AddAasmStateToOrder < ActiveRecord::Migration[5.0] + def change + add_column :orders, :aasm_state, :string, default: "order_placed" + add_index :orders, :aasm_state + end +end diff --git a/db/schema.rb b/db/schema.rb index cb102c0b82..9fd5dd7cc1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170517033724) do +ActiveRecord::Schema.define(version: 20170517043732) do create_table "cart_items", force: :cascade do |t| t.integer "cart_id" @@ -32,11 +32,13 @@ t.string "billing_address" t.string "shipping_name" t.string "shipping_address" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.string "token" t.boolean "is_paid", default: false t.string "payment_method" + t.string "aasm_state", default: "order_placed" + t.index ["aasm_state"], name: "index_orders_on_aasm_state" end create_table "product_lists", force: :cascade do |t|