90 lines
2.9 KiB
Ruby
90 lines
2.9 KiB
Ruby
class RulingBusesController < ApplicationController
|
|
before_action :set_time_thresh_and_locale
|
|
def widget
|
|
set_time_thresh_and_locale
|
|
subpart = OrbitHelper.get_current_widget
|
|
begin
|
|
cats = OrbitHelper.widget_categories || ['all']
|
|
@ruling_buses = RulingBusInfo.filter_by_widget_categories(cats)
|
|
bus_trans = t('ruling_bus.ruling_bus')
|
|
bus_infos = []
|
|
@ruling_buses.each do |bus_info|
|
|
bus_title = bus_info.destination.blank? ? ("#{bus_trans}(#{bus_info.monitor_point_show}" + (bus_info.hint.blank? ? (": "+I18n.t("ruling_bus.directions.#{bus_info.direction}")) : bus_info.hint) + ")") : "#{bus_trans}(#{bus_info.monitor_point_show}➠#{bus_info.destination_show})"
|
|
bus_data = get_bus_data(bus_info)
|
|
bus_infos << {"bus_title" => bus_title,
|
|
"bus_id" => bus_info.id.to_s,
|
|
"bus_data" => bus_data
|
|
}
|
|
end
|
|
{
|
|
"bus_infos" => bus_infos,
|
|
"extras" => {
|
|
"update_url" => "/#{I18n.locale}/xhr/get_bus",
|
|
"update_method" => "get",
|
|
"update_interval" => RulingBusesHelper::UpdateFrontInterval*1000,
|
|
"update_id" => subpart.id.to_s
|
|
}
|
|
}
|
|
rescue => e
|
|
puts [e,e.backtrace]
|
|
end
|
|
end
|
|
def get_bus
|
|
bus_infos = RulingBusInfo.where(:id.in => params[:bus_info_ids])
|
|
data = {}
|
|
bus_infos.each do |bus_info|
|
|
get_bus_data(bus_info,data)
|
|
end
|
|
render :json => data
|
|
end
|
|
private
|
|
def set_time_thresh_and_locale
|
|
@time_now = DateTime.now
|
|
@bus_locale = I18n.locale.to_s=='zh_tw' ? "Zh_tw" : 'En'
|
|
@time_thresh = @time_now - RulingBusesHelper::UpdateInterval.seconds
|
|
end
|
|
def get_bus_data(bus_info,data=nil)
|
|
bus_info_id = bus_info.id.to_s
|
|
cache = RulingBusCache.where(bus_info_id: bus_info_id).first
|
|
if (cache.nil? || cache.updated_at < @time_thresh)
|
|
tmp = RulingBusesHelper.get_stop_time(bus_info,@bus_locale)
|
|
if cache.nil?
|
|
RulingBusCache.create(dict: tmp, bus_info_id: bus_info_id)
|
|
else
|
|
cache.update_attributes(dict: tmp)
|
|
end
|
|
tmp
|
|
else
|
|
tmp = cache.dict
|
|
end
|
|
tmp = tmp.map do |v|
|
|
{"route_name"=> v["RouteName"][@bus_locale],
|
|
"time_to_arrive" => parse_time_diff(v,@time_now)
|
|
}
|
|
end
|
|
data[bus_info_id] = tmp if !data.nil?
|
|
tmp
|
|
end
|
|
def parse_time_diff(bus_data,now=nil)
|
|
arival = bus_data["NextBusTime"]
|
|
if !arival.blank?
|
|
arival = DateTime.parse(arival)
|
|
time_diff = ((arival-(now||DateTime.now))*1.days).to_i
|
|
h = time_diff/3600
|
|
tmp = time_diff%3600
|
|
m = tmp/60
|
|
s = tmp%60
|
|
if time_diff>=3600
|
|
"#{h}#{I18n.t("ruling_bus.time.hour")} #{m}#{I18n.t("ruling_bus.time.minute")} #{s}#{I18n.t("ruling_bus.time.second")}"
|
|
elsif time_diff>=60
|
|
"#{m}#{I18n.t("ruling_bus.time.minute")} #{s}#{I18n.t("ruling_bus.time.second")}"
|
|
elsif time_diff>0
|
|
"#{s}#{I18n.t("ruling_bus.time.second")}"
|
|
else
|
|
I18n.t("ruling_bus.leaved")
|
|
end+(bus_data["StopStatus"]==0? "" : " (#{I18n.t("ruling_bus.bus_status.#{bus_data["StopStatus"]}")})")
|
|
else
|
|
I18n.t("ruling_bus.bus_status.#{bus_data["StopStatus"]}")
|
|
end
|
|
end
|
|
end |