# encoding: utf-8
require "rubyXL"
require "json"
class HncCancerPredictsController < ApplicationController
def initialize
super
@app_title = "hnc_cancer_predict"
end
def calculate
begin
create_first_field
if params["header"].to_i == 1
locale = params["locale"].to_s rescue "zh_tw"
locale = "zh_tw" if locale == "zh_cn"
result = {}
@hnc_head_images = {}
@form_to_show.hnc_head_images_id.each do |image_id|
next if image_id.to_s == ""
@image = HncHeadimages.find_by(:id => image_id.to_s)
@url = @image.temp_file.to_s
@hnc_head_images[@image.sort_number.to_i] = ('')
end
result["hnc_head_images"] = Hash[@hnc_head_images.sort].values.join("")
@hnc_head_images = {}
@form_to_show.title_images_id.each do |image_id|
next if image_id.to_s == ""
@image = HncHeadimages.find_by(:id => image_id.to_s)
@url = @image.temp_file.to_s
@hnc_head_images[@image.sort_number.to_i] = ('')
end
result["danger_texts"] = (@form_to_show.danger_texts[locale] rescue "")
result["title"] = Hash[@hnc_head_images.sort].values.join("")
result["page_title"] = @form_to_show.title_texts[params[:locale]]
elsif params["get_mapping_data_from_csv"].to_i == 1
result = {}
result["mapping_data_from_csv"] = JSON.parse(@form_to_show.mapping_data_from_csv) rescue {}
else
@record = HncCancerPredictrecord.new
@record.title = @app_title
@choice_keys = []
@choice_values = []
@choice_names = []
@form_to_show.form_show.values.each { |choice| @choice_keys.push choice[:variable] }
@form_to_show.form_show.values.each { |choice| @choice_values.push ((choice[:is_num] == 1) ? [] : choice[:choice_fields]) }
@form_to_show.form_show.values.each { |choice| @choice_names.push choice[:name] }
@choice_keys.each_with_index { |key, i| @record.names[key] = @choice_names[i] }
@choice_keys.each_with_index { |key, i| @record.values[key] = @choice_values[i] }
params["data"].each do |rec_key, rec_value|
@record.result[rec_key] = rec_value
end
@record.submit_time = Time.now.to_s
@record.save
locale = params["data"]["locale"].to_s rescue "zh_tw"
locale = "zh_tw" if locale == "zh_cn"
result = {}
mapping_data_from_csv = JSON.parse(@form_to_show.mapping_data_from_csv) rescue {}
@form_to_show.all_variables.each do |v|
result[v] = 0
end
@form_to_show.form_show.each do |num, property|
@variable = property[:variable]
if @variable.present?
if property[:is_num] == 1
if property[:is_float] == 1
result[@variable] = params["data"][@variable].to_f rescue 0.0
else
result[@variable] = params["data"][@variable].to_i rescue 0
end
elsif property[:choice_fields].present?
if !(@form_to_show.advance_mode)
result[@variable] = params["data"][@variable].to_i rescue 0
else
if property[:need_map_values] == 1
result[@variable] = property[:map_values][params["data"][@variable].to_i - 1]
else
if property[:revert_value] != 1
result[@variable] = params["data"][@variable].to_i - 1
else
result[@variable] = ((property[:choice_fields].length - params["data"][@variable].to_i) rescue params["data"][@variable].to_i)
end
end
end
end
if @form_to_show.advance_mode && property[:hnc_cancer_predict_mapping_file].present?
if (mapping_data_from_csv != {})
mapping_hash = mapping_data_from_csv[@variable]
temp_index = 0
temp_value = result[@variable]
mapping_hash.each_with_index do |(k, v), i|
if i == 0
index_val = v.index(temp_value) rescue nil
if !index_val.nil?
temp_index = index_val
else
closest_value = v.min_by { |x| (temp_value - x).abs }
temp_index = v.index(closest_value)
end
end
result[k] = v[temp_index]
end
end
end
end
end
formula_variables = @form_to_show.tmp_lpv_variables
begin
eval_hidden_variables(result)
rescue => e
@form_to_show.generate_eval_formula
eval_hidden_variables(result)
end
begin
eval_formula(result)
rescue => e
@form_to_show.generate_eval_formula
eval_formula(result)
end
result["lpv"] = result[formula_variables.last]
result["lpv_variable"] = {}
formula_variables.each do |variable_name|
result["lpv_variable"]["#{variable_name}"] = result[variable_name]
end
@years = @form_to_show.years
result["years"] = @years
@therapy_choices = [I18n.t("hnc_cancer_predict.table.Surgeryonly")]
@form_to_show.form_show_in_result.values.each { |choice| @therapy_choices.push choice["name"][locale] }
@therapy_names = @form_to_show.treatment_method
result["treatment_method"] = @therapy_names
result["treatment_method_active_indices"] = @form_to_show.treatment_method_active_indices
result["table"] = @form_to_show.result_table_translations[locale]
year = params["data"]["year"] rescue nil
if year.nil?
year = @years.last.to_f
else
year = year.to_f
end
year_index = @years.index(year)
@servive_ratio = eval(@form_to_show.tmp_years_settings_for_ruby[year_index])
@servive_ratio = (@servive_ratio * 100).round(2)
result["texts"] = @form_to_show.result_text_translations[locale]
result["extra_therapy_texts"] = @form_to_show.extra_therapy_texts[locale] rescue @form_to_show.extra_therapy_texts["zh_tw"]
result["servive_ratio"] = @servive_ratio
end
result = result.merge(params)
render :json => result
rescue => e
puts [e.to_s, e.backtrace]
raise e
end
end
def index
uid = OrbitHelper.params[:uid] rescue ""
tags = OrbitHelper.widget_tags
categories = OrbitHelper.widget_categories || []
@table_str = File.read(HncCancerPredictfields::ToolTableMap[I18n.locale])
preidct_js_url = "/assets/#{HncCancerPredictfields::JS}"
if File.exist?(HncCancerPredictfields::JSFileName)
js_filename = File.read(HncCancerPredictfields::JSFileName)
if js_filename.include?(HncCancerPredictfields::JS)
asset = Rails.application.assets[js_filename]
preidct_js_url = "#{Rails.application.config.assets.prefix}/#{asset.digest_path}"
else
preidct_js_url = "#{Rails.application.config.assets.prefix}/#{File.basename(js_filename)}"
end
end
{
"hnc_cancer_predict" => [],
"extras" => { "table" => @table_str, "preidct_js_url" => preidct_js_url },
}
end
def widget
uid = OrbitHelper.params[:uid] rescue ""
tags = OrbitHelper.widget_tags
categories = OrbitHelper.widget_categories || []
@table_str = File.read(HncCancerPredictfields::ToolTableMap[I18n.locale])
preidct_js_url = "/assets/#{HncCancerPredictfields::JS}"
if File.exist?("public/cancer_tool_js_filename.txt")
js_filename = File.read("public/cancer_tool_js_filename.txt")
if js_filename.include?(HncCancerPredictfields::JS)
asset = Rails.application.assets[js_filename]
preidct_js_url = "#{Rails.application.config.assets.prefix}/#{asset.digest_path}"
else
preidct_js_url = "#{Rails.application.config.assets.prefix}/#{File.basename(js_filename)}"
end
end
{
"hnc_cancer_predict" => [],
"extras" => { "table" => @table_str, "preidct_js_url" => preidct_js_url },
}
end
def create_first_field
if HncCancerPredictfields.where("title" => (@app_title + "_back")).count == 0
@form_to_show = HncCancerPredictfields.new()
@form_to_show.title = @app_title + "_back"
@form_to_show.save
end
@form_to_show
if HncCancerPredictfields.where("title" => @app_title).count == 0
@form_to_show = HncCancerPredictfields.new()
@form_to_show.title = @app_title
@form_to_show.save
@form_to_show = HncCancerPredictfields.where("title" => @app_title).first
else
@form_to_show = HncCancerPredictfields.where("title" => @app_title).first
end
end
def read_mapping_file(mapping_file)
if mapping_file.class != HncCancerPredictMappingFile
mapping_file = HncCancerPredictMappingFile.find(mapping_file_id) rescue nil
end
if !mapping_file.nil?
csv_rows = CSV.read(mapping_file.temp_file.file.path)
titles = csv_rows[0]
infos = {}
titles.each_with_index do |title, i|
infos[title] = []
csv_rows[1..-1].each do |row|
infos[title] << row[i].to_f
end
end
return infos
else
return {}
end
end
end