# 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