From 9830f8779eba5219de9bcec2bd169ea276a77481 Mon Sep 17 00:00:00 2001 From: jingquan huang Date: Thu, 27 Feb 2020 21:22:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E4=BA=91=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/ecloud_controller.rb | 375 ++++++++++++++++++++++ app/models/ecloud.rb | 11 + app/models/ecloud_log.rb | 3 + app/models/ecloud_productpara.rb | 4 + app/models/ecloud_service.rb | 6 + app/models/ecloud_serviece_servicepara.rb | 5 + app/models/ecloud_user.rb | 3 + app/models/ecloud_user_para.rb | 3 + app/models/ecloud_users.rb | 4 + 9 files changed, 414 insertions(+) create mode 100644 app/controllers/ecloud_controller.rb create mode 100644 app/models/ecloud.rb create mode 100644 app/models/ecloud_log.rb create mode 100644 app/models/ecloud_productpara.rb create mode 100644 app/models/ecloud_service.rb create mode 100644 app/models/ecloud_serviece_servicepara.rb create mode 100644 app/models/ecloud_user.rb create mode 100644 app/models/ecloud_user_para.rb create mode 100644 app/models/ecloud_users.rb diff --git a/app/controllers/ecloud_controller.rb b/app/controllers/ecloud_controller.rb new file mode 100644 index 000000000..8e29e5409 --- /dev/null +++ b/app/controllers/ecloud_controller.rb @@ -0,0 +1,375 @@ +#encoding=utf-8 +# 云启训练场(EduCoder)个人版 产品编码(appId) 9200108 +# 产品名称 计费类型 套餐编码 +# 云启训练场(EduCoder)个人版 固定包月 9200108001 +# 固定包月 9200108002 +# 固定包月 9200108003 +# --------------------------------------------------- +# 产品名称 计费类型 套餐编码 +# 云启训练场(EduCoder))院校版 包月+按license 9200109001 +# 包月+按license 9200109002 + +# 云启训练场(EduCoder))院校版 产品编码(appId) 9200109 + +require 'net/http' +require 'digest' + +class EcloudController < ApplicationController + + before_filter :save_para + before_filter :check_sign_key, only: [:ps_new, :ps_update, :bs_new, :bs_update] + + + def index + render file: 'public/react-oschina/build/index.html', :layout => false + end + + def trustie_login + end + + # 测试环境 + # CLIENT_ID = '1022' + # CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668' + # SERVER_URL = "https://221.176.54.92:9081/restful/services/" + # + + # 正式环境 + CLIENT_ID = '1056' + CLIENT_SECRET = '2e84256a-3de4-4713-9e02-10ee88a14592' + SERVER_URL = "https://221.176.53.130:44390/services/" + + + ## 签名 + def sign(timestamp) + Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}").upcase + end + + + # 企业/个人业务开通 + # applyno 申请单号,唯一 + # ecordercode 唯一标志一个企业的订购关系 + # params['opttype']:操作类型。0开通;1变更;2试用转商用;4再次开通 + # 业务列表opttype: 0新增;1注销;2修改 + # serviceparas: 但是由于企业版是按成员收费的,所以serviceparas里面会传成员数;个人版是包月计费的,serviceparas不会传成员数 + def bs_new + ActiveRecord::Base.transaction do + begin + if params['opttype'] == 0 # 开通企业/个人业务 + ecloud = Ecloud.create!(eloud_params) + create_service(params['services'], ecloud.try(:id)) if params['services'].present? + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + # 为管理员添加一条记录 + # 开通的时候都是用户的opttype也是0 + # 如果管理员已经存在,则不用重复开通 + euser = EcloudUser.where(userid: params['userid'], custid: params['custid']).first + unless euser + EcloudUser.create!(custid: params['custid'], opttype: params['opttype'], userid: params['userid'], + username: params['username'], useralias: params['useralias'], + mobile: params['mobile'], email: params['email'], begintime: params['begintime'], + endtime: params['endtime']) + end + elsif params['opttype'] == 2 # 试用转商用 # 变更企业/个人业务 + # 业务列表:注销业务(注销试用的套餐),另一个业务项的操作代码是:新增业务(开通商用的套餐) + # 需要通过产品服务编号和业务编码来区分哪个产品 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'], trial: true).first + + # 注销试用的套餐 + ## 需要注销的套餐; 试用转商用是不会有批量操作的,所以可以使用first + des_service = params['services'].select{|s| s['opttype'] == 1}.first + esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: des_service['code']).first + ecloud.update_attribute(:trial, params['trial']) + esd.update_attributes!(opttype: des_service['opttype'], begintime: des_service['begintime'], endtime: des_service['endtime']) + + # 试用转商用是不会有批量操作的 + # 新增业务 + add_service = params['services'].select{|s| s['opttype'] == 0} + create_service(add_service, ecloud.try(:id)) + # + + elsif params['opttype'] == 1 # 业务变更 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + # 套餐变更 + # 操作代码 0:新增业务,1:注销业务2:修改业务 + # # 新增服务 + add_service = params['services'].select{|s| s['opttype'] == 0} + create_service(add_service, ecloud.try(:id)) if add_service.present? + + # 如果有注销业务,注销业务 + des_services = params['services'].select{|s| s['opttype'] == 1} + if des_services.present? + des_services.each do |ds| + + logger.info("666666#{ecloud.try(:id)}, 55555555#{ds['code']}") + esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: ds['code']).first + esd.update_attributes!(opttype: ds['opttype'], begintime: ds['begintime'], endtime: ds['endtime']) + end + end + + # 变更业务 + edt_services = params['services'].select{|s| s['opttype'] == 2} + if edt_services.present? + edt_services.each do |es| + ese = EcloudService.where(ecloud_id: ecloud.try(:id), code: es['code']).first + ese.update_attributes!(opttype: es['opttype'], begintime: es['begintime'], endtime: es['endtime']) if ese.present? + create_serviceparas(es['serviceparas'].first, ese.id) if ese.present? + end + end + + + # ecloud = Ecloud.where(bossorderid: params['bossorderid']).first + # ecloud.update_attributes!(eloud_params) + # ecloud.ecloud_productparas.destroy + # ecloud.ecloud_services.destroy + # + # ecloud_id = ecloud.try(:id) + + elsif params['opttype'] == 4 # 再次重复开通 + # 再次申请开通,这种情况就是累加时间 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + create_service(params['services'], ecloud.try(:id)) + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + end + + # + # # 非试用情况下,为管理员单独创建一条账号,企业账号 + # unless params['trial'] + # EcloudUser.create!(ecloud_id: ecloud.try(:id), opttype: params['opttype'], userid: params['userid'], + # username: params['username'], useralias: params['useralias'], + # mobile: params['mobile'], email: params['email']) + # end + + render :json => {result: true, errmsg: ""} + # rescue Exception => e + # logger.error(e.message) + # render :json => {code: 500, msg: "#{e.message}"} + # raise ActiveRecord::Rollback + end + end + end + + # 企业/个人业务变更、注销 + # 处理业务平台退订、暂停(欠费暂停,信控暂停等)、暂停后恢复应用业务 + # 这个接口是不会新增业务的 + # 试用退订的时候bossorderid传空字符 + def bs_update + ActiveRecord::Base.transaction do + begin + case params['opttype'] + when 0 # 退订 + opttype = 6 + when 1 # 暂停 + opttype = 7 + when 2 # 恢复 + opttype = 8 + end + if params['bossorderid'].present? + ecloud = Ecloud.where(bossorderid: params['bossorderid']).first + ecloud.update_attribute(:opttype, opttype) + else + # 试用退订 + params['services'].each do |service| + ecloud_id = EcloudService.where(code: service['packagecode']).first.try(:ecloud_id) + Ecloud.find(ecloud_id).update_attribute(:opttype, opttype) + end + end + render :json => {result: true, errmsg: ""} + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + raise ActiveRecord::Rollback + end + end + end + + # 用户业务开通与变更接口 + # 授权statu为1,取消授权status为0 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + + def ps_new + ActiveRecord::Base.transaction do + begin + user_params = params['users'] + user_params.each do |user_param| + if user_param['opttype'] == 0 # 开通 + EcloudUser.create!(custid: params['custid'], opttype: user_param['opttype'], userid: user_param['userid'], + username: user_param['username'], useralias: user_param['useralias'], + mobile: user_param['mobile'], email: user_param['email'], begintime: user_param['begintime'].to_s, + endtime: user_param['endtime'].to_s) + elsif user_param['opttype'] == 1 # 变更 + ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first + ecloud_user.update_attributes!(opttype: user_param['opttype'], username: user_param['username'], + useralias: user_param['useralias'], mobile: user_param['mobile'], email: user_param['email'], + begintime: user_param['begintime'].to_s, endtime: user_param['endtime'].to_s) + end + end + + render :json => {success: true, errmsg: ""} + # end + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + raise ActiveRecord::Rollback + end + end + end + + # 用户业务状态变更 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + def ps_update + begin + user_params = params['users'] + user_params.each do |user_param| + case user_param['opttype'] + when 0 # 取消授权 + opttype = 3 + when 1 # 暂停 + opttype = 4 + when 2 # 恢复 + opttype = 5 + end + ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first + ecloud_user.update_attributes!(opttype: opttype, operatime: params['operatime'], effecttime: params['effecttime']) + end + + render :json => {success: true, errmsg: ""} + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + end + end + + def ecloud_login_callback + + unless params["test"] == 'true' + #获取code + logger.info "oauth2 login_callback: #{params}" + + raise "没有code" unless params[:code] + + url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code" + + "&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}" + + res = post(url) + logger.info "oauth2 authorization resp: #{res}" + # {"access_token":"ae673b2d-88b4-46cc-aa74-0b031f24b76f","expires":6,"refresh_token":"7380cc67-a59c-4c21-9000-70e12a58d175","username":"15111030087@QW_er","uid":2147} + + body = decode(res) + + raise '登录失败' unless body["access_token"] + + #获取此用户信息 + res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}") + logger.info "oauth2 get user info: #{res}" + # {"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"} + else + res = '{"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"}' + end + + + # 同步用户 + info = decode(res) + + user = User.find_by_ecoder_user_id(info["userid"]) + unless user + #新建用户 + user = User.create_with_ecoder!(info) + end + + self.logged_user = user + + user = UserExtension.where(:user_id => User.current.id).first + # if user.gender.nil? || user.school_id.nil? || User.current.lastname.nil? + # redirect_to my_account_path + # elsif user.identity == 3 && user.school_id.nil? + # redirect_to my_account_path + # else + # redirect_to User.current + # end + redirect_to User.current + end + + + private + def get(url) + uri = URI(url) + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = url.start_with?('https') + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Get.new(uri.request_uri) + request['Content-Type'] = 'application/json' + request['Accept'] = 'application/json' + response = http.request(request) + + response.body + end + + def post(url) + uri = URI(url) + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = url.start_with?('https') + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Post.new(uri.request_uri) + request['Content-Type'] = 'application/json' + request['Accept'] = 'application/json' + response = http.request(request) + + response.body + end + + def decode(s) + begin + obj = ActiveSupport::JSON.decode(s) + rescue ActiveSupport::JSON.parse_error + logger.error("Attempted to decode invalid JSON: #{s}") + end + end + + private + def eloud_params + return {applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'], + trial: params['trial'], bossorderid: params['bossorderid'], custid: params['custid'], custtype: params['custtype'], + custcode: params['custcode'], registersource: params['registersource'], custname: params['custname'], + userid: params['userid'], username: params['username'], useralias: params['useralias'], mobile: params['mobile'], + email: params['email'], productcode: params['productcode'], begintime: params['begintime'], + endtime: params['endtime']} + end + + # 新增套餐 + def create_service services, ecloud_id + services.each do |service| + ese = EcloudService.create!(opttype: service['opttype'], code: service['code'], begintime: service['begintime'], + endtime: service['endtime'], ecloud_id: ecloud_id) + if service['serviceparas'].present? + create_serviceparas(service['serviceparas'].first, ese.id) + end + end + end + + def create_serviceparas params_serviceparas, ese_id + if params_serviceparas.present? + EcloudServieceServicepara.create(key: params_serviceparas['key'], value: params_serviceparas['value'], ecloud_service_id: ese_id) + end + end + + def create_product_params params, ecloud_id + params.each do |p| + EcloudProductpara.create(key: p['key'], value: p['value'], ecloud_id: ecloud_id) + end + end + + def check_sign_key + sign = sign(params['timestamp']) + if sign != params['sign'] + render :json => {code: 501, msg: "sign的值错误"} + return + end + end + + def save_para + EcloudLog.create(url: request.url, para_value: params, applyno: params['applyno'], custid: params['custid'], + custcode: params['custcode'], userid: params['userid'], username: params['username']) + end + +end diff --git a/app/models/ecloud.rb b/app/models/ecloud.rb new file mode 100644 index 000000000..293948f3d --- /dev/null +++ b/app/models/ecloud.rb @@ -0,0 +1,11 @@ +#encoding=utf-8 +class Ecloud < ActiveRecord::Base + attr_accessible :applyno, :begintime, :bossorderid, :custcode, :custid, :custname, :custtype, :ecordercode, :endtime, + :mobile, :opttype, :productcode, :registersource, :string, :trial, :useralias, :userid, :username, :email, + :effecttime, :operatime + + has_many :ecloud_services, :dependent => :destroy # 业务列表 + has_many :ecloud_productparas, :dependent => :destroy # 开通参数列表 + + has_one :ecloud_user +end diff --git a/app/models/ecloud_log.rb b/app/models/ecloud_log.rb new file mode 100644 index 000000000..a1ac3636b --- /dev/null +++ b/app/models/ecloud_log.rb @@ -0,0 +1,3 @@ +class EcloudLog < ActiveRecord::Base + +end diff --git a/app/models/ecloud_productpara.rb b/app/models/ecloud_productpara.rb new file mode 100644 index 000000000..ec1b94bc5 --- /dev/null +++ b/app/models/ecloud_productpara.rb @@ -0,0 +1,4 @@ +class EcloudProductpara < ActiveRecord::Base + attr_accessible :key, :value, :ecloud_id + belongs_to :ecloud +end diff --git a/app/models/ecloud_service.rb b/app/models/ecloud_service.rb new file mode 100644 index 000000000..dba4a7b20 --- /dev/null +++ b/app/models/ecloud_service.rb @@ -0,0 +1,6 @@ +# 操作代码 0:新增业务,1:注销业务2:修改业务 +class EcloudService < ActiveRecord::Base + attr_accessible :begintime, :code, :endtime, :opttype, :ecloud_id, :packagecode, :bossorderid + belongs_to :ecloud + has_many :ecloud_serviece_serviceparas +end diff --git a/app/models/ecloud_serviece_servicepara.rb b/app/models/ecloud_serviece_servicepara.rb new file mode 100644 index 000000000..5dbff71f5 --- /dev/null +++ b/app/models/ecloud_serviece_servicepara.rb @@ -0,0 +1,5 @@ +# ket值,license表示人数,对应企业版;duration表示月数,对应个人版; +class EcloudServieceServicepara < ActiveRecord::Base + attr_accessible :key, :value, :ecloud_service_id + belongs_to :ecloud_service +end diff --git a/app/models/ecloud_user.rb b/app/models/ecloud_user.rb new file mode 100644 index 000000000..fad6f4702 --- /dev/null +++ b/app/models/ecloud_user.rb @@ -0,0 +1,3 @@ +class EcloudUser < ActiveRecord::Base + has_many :ecloud_user_paras +end diff --git a/app/models/ecloud_user_para.rb b/app/models/ecloud_user_para.rb new file mode 100644 index 000000000..3f4ddc5c2 --- /dev/null +++ b/app/models/ecloud_user_para.rb @@ -0,0 +1,3 @@ +class EcloudUserPara < ActiveRecord::Base + belongs_to :ecloud_user +end diff --git a/app/models/ecloud_users.rb b/app/models/ecloud_users.rb new file mode 100644 index 000000000..99da0df24 --- /dev/null +++ b/app/models/ecloud_users.rb @@ -0,0 +1,4 @@ +class EcloudUser < ActiveRecord::Base + # opttype: # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + attr_accessible :begintime, :email, :endtime, :mobile, :opttype, :paras, :useralias, :userid, :username, :custid +end