bus/app/controllers/ruling_buses_controller.rb

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