class Warehouse::List

Attributes

items[RW]

Public Class Methods

new(items=nil) click to toggle source
# File lib/warehouse/list.rb, line 21
def initialize(items=nil)
  self.items = (items || [])
end
none() click to toggle source
# File lib/warehouse/list.rb, line 16
def none
  new
end

Public Instance Methods

*(qty) click to toggle source

把料號 * 數量 (Clone List)

# File lib/warehouse/list.rb, line 70
def *(qty)
  Warehouse::List.new.tap do |list|
    items!.each do |item|
      list.items << item.deep_dup.tap { |i| i.qty = i.qty * qty }
    end
  end
end
+(item) click to toggle source

把料號加入到清單內 (Clone List)

# File lib/warehouse/list.rb, line 53
def +(item)
  case item
  when Warehouse::Item::Code, Warehouse::Item::Barcode
    add_item(item)
  when Warehouse::Item::Random
    # 隨機抽一個
    add_item(item.fetch!)
  when Warehouse::List
    list = deep_dup
    item.each do |target|
      list += target
    end
    list
  end
end
deep_dup() click to toggle source
# File lib/warehouse/list.rb, line 78
def deep_dup
  Warehouse::List.new(items.map { |item| item.deep_dup })
end
find(code, type: nil) click to toggle source

找到此清單底下料號 (同樣 object_id)

# File lib/warehouse/list.rb, line 26
def find(code, type: nil)
  case type
  when :code
    items.detect { |item| item.code? && item.code == code }
  when :barcode
    items.detect { |item| item.barcode? && item.barcode == code }
  else
    items.detect do |item|
      (item.code? && item.code == code) || (item.barcode? && item.barcode == code)
    end
  end
end
items!() click to toggle source

解開隨機料號 (New List)

# File lib/warehouse/list.rb, line 40
def items!
  list = Warehouse::List.new
  items.each do |item|
    extra_items = item.is_a?(Warehouse::Item::Random) ? item.fetch! : [ item ]

    extra_items.each do |item|
      list.items << item
    end
  end
  list
end
to_a() click to toggle source
# File lib/warehouse/list.rb, line 91
def to_a
  items.map(&:to_h)
end
to_h() click to toggle source
# File lib/warehouse/list.rb, line 82
def to_h
  items.map do |item|
    [
      (item.code? ? item.code : item.barcode),
      item.qty
    ]
  end.to_h
end

Protected Instance Methods

add_item(item) click to toggle source
# File lib/warehouse/list.rb, line 97
def add_item(item)
  list = deep_dup
  # 找到 barcode or code item
  target = if item.code?
    list.find(item.code, type: :code)
  else
    list.find(item.barcode, type: :barcode)
  end

  if target.present?
    target.qty = (target.qty + item.qty)
  else
    list.items << item.deep_dup
  end
  list
end