You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/services/review_service.rb

231 lines
6.2 KiB

#coding=utf-8
#
require 'net/http'
require 'uri'
class ReviewService
@review_server_url = EduSetting.get('review_server_url')
def self.logger
@logger ||= Logger.new(File.join(Rails.root, "log", "review.log"), 'daily')
end
def self.root_url
@review_server_url.presence || 'http://10.9.79.221:80'
end
def self.postForm(action, map)
Rails.logger.info("##################------action: #{action}")
Rails.logger.info("##################------action: #{map}")
begin
uri = URI.parse("#{root_url}/api/v1/#{action}")
Rails.logger.info "请求url: #{uri}"
Rails.logger.info "参数: "
map.each do |k, v|
Rails.logger.info "#{k}=>#{v}"
end
res = Net::HTTP.post_form uri, map
body = res.body
Rails.logger.info("返回: #{body}")
content = JSON.parse(body)
content
rescue => e
Rails.logger.error("post #{action}: exception #{e.message}")
end
end
def self.postJson(action, params)
begin
uri = URI.parse("#{root_url}/api/v1/#{action}")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = root_url.start_with?('https')
req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' => 'application/x-www-form-urlencoded;charset=utf-8'})
req.body = params.to_json
res = https.request(req)
body = res.body
logger.info("--uri_exec: .....res is #{body}")
content = JSON.parse(body)
raise content["msg"] if content["code"] != 0
content["data"]
rescue Exception => e
logger.error("--uri_exec: exception #{e.message}")
end
end
class CheckResponse
attr_accessor :status, :msg, :query_id
def initialize(status, msg, query_id)
@status = status
@msg = msg
@query_id = query_id
end
end
#查重
# 参数说明
# user_list [
# {
# user_id: 1,
# code_info: [
# {
# "path": "src/step1/HelloWorld.java",
# "content: "ADAGWDSSAS22",
# "passed_time": "2016-01-08 00:00:00"
# },
# ]
# },
# ]
#
# 返回说明
#
# {
# code: 0, 0 成功,其他失败
# msg: '', //失败时的错误消息
# query_id: '123123123', //本次查重的查询号
# }
#
#
def self.check(user_list = [], language='java')
File.open("/tmp/check_codes_#{Time.now}.json", 'w+') do |f|
f.write(user_list.to_json)
end
data = postForm('check_codes', {user_data: user_list.to_json, language: language})
if data.nil?
return CheckResponse.new(-1, "系统调用出错", "")
end
Rails.logger.info("@@@@@@@@@@@@@@@@------------#{data}")
CheckResponse.new(data["status"], data["msg"], data["query_id"])
end
class QueryResultResponse
UserList = Struct.new(:user_id, :target_user_id, :origin_path, :target_path, :rate)
attr_accessor :status, :msg, :user_lists
def initialize(status, msg, user_lists)
@status, @msg, @user_lists = status, msg, []
if user_lists.present?
user_lists.each do |info|
user = find_by_user_id_and_origin_path(info["user_id"], info["path"]["origin"])
if !user.present?
add_user_list(info)
elsif user.rate < info["rate"]
set_user_list(user, info)
end
end
end
end
def set_user_list(user, obj)
user.user_id = obj["user_id"]
user.target_user_id = obj["target_user_id"]
user.origin_path = obj["path"]["origin"]
user.target_path = obj["path"]["target"]
user.rate = obj["rate"]
end
def add_user_list(obj)
user_list = UserList.new
set_user_list(user_list, obj)
@user_lists << user_list
end
def find_by_user_id_and_origin_path(user_id, origin_path)
self.user_lists.each do |user|
return user if user.user_id == user_id and user.origin_path == origin_path
end
nil
end
end
class QueryDetailResultResponse
CodeInfo = Struct.new(:origin_path, :target_path, :origin_content, :target_content, :target_user_id, :rate)
attr_accessor :status, :msg, :code_info
def initialize(status, msg, code_info)
@status, @msg, @code_info = status, msg, []
if code_info.present?
code_info.each do |code|
info = find_by_path(code["path"]["origin"])
if !info.present?
add_code_info(code)
elsif info.rate < code["rate"]
set_code_info(info, code)
end
end
end
end
def set_code_info(info, obj)
info.origin_path = obj["path"]["origin"]
info.target_path = obj["path"]["target"]
info.origin_content = obj["content"]["origin"]
info.target_content = obj["content"]["target"]
info.target_user_id = obj["target_user_id"]
info.rate = obj["rate"]
end
def add_code_info(obj)
info = CodeInfo.new
set_code_info(info, obj)
@code_info << info
end
def find_by_path(path)
self.code_info.each do |code_info|
return code_info if code_info.origin_path == path
end
nil
end
end
#查询查重的结果
#
# 输入参数
# query_id 待查询的ID
# user_id 传入则查详情
#
# 文档参考 https://www.showdoc.cc/127895880302646?page_id=1271144663669096
#
def self.query_result(opt = {})
unless opt[:query_id].present?
logger.error "query_id没有传"
return
end
if opt[:user_id].present?
data = postForm('check_info', query_id: opt[:query_id], user_id: opt[:user_id])
if data.nil?
return QueryDetailResultResponse.new(-1, "系统调用出错", [])
end
response = QueryDetailResultResponse.new(data['status'], data['msg'], data["code_info"])
return response
else
data = postForm('check_lists', query_id: opt[:query_id])
if data.nil?
return CheckResponse.new(-1, "系统调用出错", "")
end
response = QueryResultResponse.new(data['status'], data['msg'], data["user_lists"])
return response
end
end
end