trainings: add pay and result page

dev_trainings
p31729568 6 years ago
parent 48cf73dbbf
commit 6c3054f8a4

@ -4151,7 +4151,7 @@ end
sheet1 = book.create_worksheet :name => "sheet" sheet1 = book.create_worksheet :name => "sheet"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue sheet1.row(0).default_format = blue
sheet1.row(0).concat(["姓名", "手机号","邮箱","单位名称", "职位","专业", "学号", '授课/研究领域' "支付方式","支付状态","支付时间", "发票类型", "发票抬头","税务登记号", "发票内容", "备注", "微信支付单号", "报名时间"]) sheet1.row(0).concat(["姓名", "手机号","邮箱","单位名称", "职位","专业", "学号", '授课/研究领域', "支付方式","支付状态","支付时间", "发票类型", "发票抬头","税务登记号", "发票内容", "备注", "微信支付单号", "报名时间"])
count_row = 1 count_row = 1
trainings.find_each do |t| trainings.find_each do |t|
sheet1[count_row, 0] = t.name sheet1[count_row, 0] = t.name

@ -10,7 +10,7 @@ class TrainingsController < ApplicationController
before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback] before_filter :authenticate, except: [:auth, :auth_callback, :pay_callback]
before_filter :find_tag_id, only: [:show, :create, :update, :enroll, :test] before_filter :find_tag_id, except: [:auth, :auth_callback, :pay_callback]
before_filter :find_training, only: [:show, :test] before_filter :find_training, only: [:show, :test]
@ -44,10 +44,13 @@ class TrainingsController < ApplicationController
end end
def pay def pay
_pay_params
@training = current_training @training = current_training
if @training.blank?
redirect_to enroll_training_path(id: @tag_id)
return
end
# 防止重复支付,对于已支付过的,不应该再到这个页来 # 防止重复支付,对于已支付过的,不应该再到这个页来
if @training.payed? if @training.payed?
redirect_to result_training_path(id: @tag_id) redirect_to result_training_path(id: @tag_id)
@ -55,7 +58,6 @@ class TrainingsController < ApplicationController
end end
@training.training_payinfo ||= TrainingPayinfo.new @training.training_payinfo ||= TrainingPayinfo.new
end end
def pay_callback def pay_callback
@ -98,11 +100,9 @@ class TrainingsController < ApplicationController
end end
def result def result
_pay_params
@training = current_training @training = current_training
end end
def create def create
@training = current_training || Training.new(params) @training = current_training || Training.new(params)
@training.training_type = @training_type @training.training_type = @training_type
@ -113,6 +113,7 @@ class TrainingsController < ApplicationController
@training.save! @training.save!
flash[:message] = '提交成功' flash[:message] = '提交成功'
redirect_to enroll_training_path(id: @tag_id) redirect_to enroll_training_path(id: @tag_id)
# redirect_to pay_training_path(id: @tag_id) # redirect_to pay_training_path(id: @tag_id)
end end
@ -120,8 +121,8 @@ class TrainingsController < ApplicationController
def update def update
@training = current_training @training = current_training
unless @training if @training.blank?
render_404 redirect_to enroll_training_path(id: @tag_id)
return return
end end
@ -132,6 +133,7 @@ class TrainingsController < ApplicationController
@training.save! @training.save!
flash[:message] = '提交成功' flash[:message] = '提交成功'
redirect_to enroll_training_path(id: @tag_id) redirect_to enroll_training_path(id: @tag_id)
# redirect_to pay_training_path(id: @tag_id) # redirect_to pay_training_path(id: @tag_id)
end end
@ -143,13 +145,11 @@ class TrainingsController < ApplicationController
# 采用ajax调用方式返回支付参数 # 采用ajax调用方式返回支付参数
def update_payinfo def update_payinfo
@training = current_training @training = current_training
unless @training if @training.blank?
render_404 redirect_to enroll_training_path(id: @tag_id)
return return
end end
_pay_params
attachment = nil attachment = nil
if params[:image] if params[:image]
attachment = Attachment.create!(file: params[:image], author: User.first) attachment = Attachment.create!(file: params[:image], author: User.first)
@ -163,12 +163,9 @@ class TrainingsController < ApplicationController
training_info = TrainingPayinfo.new(params) training_info = TrainingPayinfo.new(params)
end end
training_info.num = params[:enlistN].to_i training_info.num = params[:enlistN].to_i < 1 ? 1 : params[:enlistN].to_i
if training_info.num < 1
training_info.num = 1
end
training_info.fee = (training_info.num * @pay_fee).to_i training_info.fee = @training.registration_fee(training_info.num)
training_info.attachment = attachment if attachment.present? training_info.attachment = attachment if attachment.present?
@ -183,7 +180,8 @@ class TrainingsController < ApplicationController
training_info.save! training_info.save!
if params[:js] == 'true' if params[:js] == 'true'
_pay_js(training_info.fee) Rails.logger.info("### start wechat pay => fee: #{training_info.fee}")
_pay_js(0.01 || training_info.fee)
else else
redirect_to url = result_training_path(id: @tag_id) redirect_to url = result_training_path(id: @tag_id)
end end
@ -218,7 +216,7 @@ class TrainingsController < ApplicationController
# #
# 写入wechat_pay付费表 # 写入wechat_pay付费表
WechatPay.create!(training_id: @training.id, out_trade_no: out_trade_no) WechatPay.create!(training_id: @training.id, out_trade_no: out_trade_no)
render json: {status: 0, data: unifiedorder(out_trade_no, fee)} render json: {status: 0, data: unifiedorder(out_trade_no, fee, @training.pay_order_title)}
end end
end end
@ -248,9 +246,6 @@ class TrainingsController < ApplicationController
end end
private private
def _pay_params
@pay_fee = Redmine::Configuration['training_fee'].to_f || 5000
end
def authenticate def authenticate
if Rails.env.development? if Rails.env.development?
@ -279,7 +274,7 @@ class TrainingsController < ApplicationController
def current_training def current_training
Rails.logger.info("##########openid:#{session[:wechat_open_id]}, training_type: #{@training_type}") Rails.logger.info("##########openid:#{session[:wechat_open_id]}, training_type: #{@training_type}")
Training.where(openid: session[:wechat_open_id], training_type: @training_type).first @_current_training ||= Training.where(openid: session[:wechat_open_id], training_type: @training_type).first
end end
def valid_training def valid_training
@ -326,14 +321,10 @@ class TrainingsController < ApplicationController
end end
def unifiedorder(out_trade_no, fee) def unifiedorder(out_trade_no, fee, title)
@config = {} @config = {}
output = Wechat.pay.unifiedorder('湖南警察学院大数据培训会-报名费', output = Wechat.pay.unifiedorder(title, (fee * 100).to_i, session[:wechat_open_id], client_ip, out_trade_no)
(fee * 100).to_i,
session[:wechat_open_id],
client_ip,
out_trade_no)
data = output.fetch("xml") data = output.fetch("xml")
if data.nil? if data.nil?
raise "获取微信统一单错误" raise "获取微信统一单错误"
@ -361,5 +352,4 @@ class TrainingsController < ApplicationController
@config @config
end end
end end

@ -25,4 +25,22 @@ class Training < ActiveRecord::Base
research_field.present? && research_field.split(',').include?(str) research_field.present? && research_field.split(',').include?(str)
end end
def pay_order_title
case training_type
when 3 then '全国高校大数据和人工智能暑期师资培训会-报名费'
when 4 then '工程教育认证培训会-报名费'
end
end
def registration_fee(num = 1)
case training_type
when 3 then
# 三人以上 8折
num >= 3 ? 3000.0 * 0.8 * num : 3000.0 * num
when 4 then
1200.0 * num
else
raise ArgumentError
end
end
end end

@ -15,7 +15,12 @@ class TrainingPayinfo < ActiveRecord::Base
PayType_bank = 3 #银行卡支付 PayType_bank = 3 #银行卡支付
def pay_type_str def pay_type_str
pay_type==PayType_Wechat ? '微信支付' : (pay_type==PayType_alipay ? '支付宝支付' : (pay_type==PayType_bank ? '银行卡支付' : '')) case pay_type
when PayType_Wechat then '微信支付'
when PayType_alipay then '支付宝支付'
when PayType_bank then '银行卡支付'
else ''
end
end end
def pay_status_str def pay_status_str
@ -30,7 +35,7 @@ class TrainingPayinfo < ActiveRecord::Base
end end
def pay_time def pay_time
WechatPay.where(:out_trade_no => self.out_trade_no).first.try(:created_at) WechatPay.where(out_trade_no: out_trade_no).first.try(:created_at)
end end
def wechat_wait_pay? def wechat_wait_pay?

@ -1,5 +1,6 @@
<form action="/trainings/update_payinfo" method="post" accept-charset="UTF-8" enctype="multipart/form-data"> <form action="/trainings/update_payinfo" method="post" accept-charset="UTF-8" enctype="multipart/form-data">
<div style="padding-top: 10px"> <div style="padding-top: 10px">
<%= hidden_field_tag(:tag_id, params[:id]) %>
<div class="showPanel" id="payTypeLine" NavShow> <div class="showPanel" id="payTypeLine" NavShow>
<p class="clearfix pr"> <p class="clearfix pr">
<label>支付方式</label> <label>支付方式</label>
@ -39,7 +40,7 @@
<p class="clearfix" id="billRemark"> <p class="clearfix" id="billRemark">
<span class="grey fl">发票内容</span> <span class="grey fl">发票内容</span>
<input type="text" name="invoice_content" class="right_input" <input type="text" name="invoice_content" class="right_input"
value="<%#= @training.training_payinfo.invoice_content.presence || '会议注册费' %>"/> value="<%= @training.training_payinfo.try(:invoice_content).presence || '研讨会' %>"/>
</p> </p>
</div> </div>
<div class="infoBar mb10"> <div class="infoBar mb10">
@ -49,32 +50,36 @@
<%= render :partial => 'upload_img', :locals => {:training => @training} %> <%= render :partial => 'upload_img', :locals => {:training => @training} %>
</div> </div>
<div class="infoBar mb10"> <div class="infoBar mb10">
<p>费用明细<span class="color-orange" id="percentPay">3人及以上8折优惠)</span></p> <p>费用明细
<% if @training.training_type == 3 %>
<span class="color-orange" id="percentPay">3人及以上8折优惠)</span>
<% end %>
</p>
<p class="break-word justify moneyDetail">含会议注册费、场地费、培训费、教材资料费、餐费、专家差率费等</p> <p class="break-word justify moneyDetail">含会议注册费、场地费、培训费、教材资料费、餐费、专家差率费等</p>
<p class="clearfix"> <p class="clearfix">
<input type="hidden" name="enlistNum" value="1"/> <input type="hidden" name="enlistNum" value="1"/>
<input type="hidden" name="enlistMoney" value="3000"/> <input type="hidden" name="enlistMoney" value="<%= @training.registration_fee %>"/>
<span class="fl red mr5 font-16">¥<span id="enlistM">3000</span></span> <span class="fl red mr5 font-16">¥<span id="enlistM"><%= @training.registration_fee %></span></span>
<span class="lastPrice"></span> <span class="lastPrice"></span>
<span class="fr font-16"> <span class="fr font-16">
<a href="javascript:void(0)" class="minusNum" onclick="minusNum(this)"> <a href="javascript:void(0)" class="minusNum" onclick="minusNum(this)">
<i class="iconfont icon-default sky_blue font-18"></i> <i class="iconfont icon-default sky_blue font-18"></i>
</a> </a>
<span class="mr5 ml5 font-14"><span id="enlistN">1</span>人</span> <span class="mr5 ml5 font-14"><span id="enlistN">1</span>人</span>
<a href="javascript:void(0)" class="plusNum" onclick="plusNum(this)"> <a href="javascript:void(0)" class="plusNum" onclick="plusNum(this)">
<i class="iconfont icon-roundaddfill blue font-18"></i> <i class="iconfont icon-roundaddfill blue font-18"></i>
</a> </a>
</span> </span>
</p> </p>
</div> </div>
<p style="height: 44px;"></p> <p style="height: 44px;"></p>
<div class="bottomBtn <%= @training.training_payinfo.pay_type.to_i ==3 ? "" : "none" %>" id="offlinePaySubmitBtn"> <div class="bottomBtn <%= @training.training_payinfo.pay_type.to_i ==3 ? "" : "none" %>" id="offlinePaySubmitBtn">
<a href="<%= enroll_training_path(id: 'bigdata_hnjcxy_2019') %>" class="leftbtn">返回</a> <a href="<%= enroll_training_path(id: @tag_id) %>" class="leftbtn">返回</a>
<a href="javascript:void(0)" class="rightbtn" id="submitFormBtn">提交</a> <a href="javascript:void(0)" class="rightbtn" id="submitFormBtn">提交</a>
</div> </div>
<div class="bottomBtn <%= @training.training_payinfo.pay_type.to_i ==3 ? "none" : "" %>" id="paySubmitBtn"> <div class="bottomBtn <%= @training.training_payinfo.pay_type.to_i ==3 ? "none" : "" %>" id="paySubmitBtn">
<a href="<%= enroll_training_path(id: 'bigdata_hnjcxy_2019') %>" class="leftbtn">返回</a> <a href="<%= enroll_training_path(id: @tag_id) %>" class="leftbtn">返回</a>
<a href="javascript:void(0)" class="rightbtn" id="payBtn">立即支付</a> <a href="javascript:void(0)" class="rightbtn" id="payBtn">立即支付</a>
</div> </div>
@ -124,22 +129,20 @@
// //
// eruda.init(); // eruda.init();
// var userInfo = { var userInfo = {
// name: '<%= @training.name %>', name: '<%= @training.name %>',
// school: '<%= @training.school %>', school: '<%= @training.school %>',
// //支付方式默认为0 //支付方式默认为0
// // 1 微信支付 // 1 微信支付
// // 2 支付宝支付 // 2 支付宝支付
// // 3 银行卡支付 // 3 银行卡支付
// payType: <%#= @training.training_payinfo.pay_type.to_i %>, payType: <%= @training.training_payinfo.pay_type.to_i %>,
// //发票抬头
// //发票抬头 //为空则代表不需要发票
// //为空则代表不需要发票 invoiceTitle: '<%= @training.training_payinfo.invoice_title %>',
// invoiceTitle: '<%#= @training.training_payinfo.invoice_title %>', //税号
// invoiceNo: '<%= @training.training_payinfo.invoice_no %>'
// //税号 };
// invoiceNo: '<%#= @training.training_payinfo.invoice_no %>'
// };
//点击弹出发票弹框 //点击弹出发票弹框
aboutBillType(userInfo); aboutBillType(userInfo);
@ -147,13 +150,13 @@
aboutPayType(); aboutPayType();
//初始化发票类型 //初始化发票类型
//InitBill(userInfo); InitBill(userInfo);
//切换发票类型 //切换发票类型
$(".billType li").on("click", function () { $(".billType li").on("click", function () {
$(".billType li").removeClass("active"); $(".billType li").removeClass("active");
$(this).addClass("active"); $(this).addClass("active");
billTypeShowFun(parseInt($(this).index())); billTypeShowFun(parseInt($(this).index()), userInfo);
}) })
//关闭弹窗 //关闭弹窗
$(".billClose").on("click", function () { $(".billClose").on("click", function () {
@ -205,7 +208,7 @@
// 使用以上方式判断前端返回,微信团队郑重提示: // 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok但并不保证它绝对可靠。 //res.err_msg将在用户支付成功后返回ok但并不保证它绝对可靠。
setTimeout(function () { setTimeout(function () {
window.location.href = "/trainings/bigdata_hnjcxy_2019/result"; window.location.href = "/trainings/<%= @tag_id %>/result";
}, 500); }, 500);
} else if (res.err_msg == 'get_brand_wcpay_request:cancel') { } else if (res.err_msg == 'get_brand_wcpay_request:cancel') {
@ -236,7 +239,7 @@
//加减报名人数 //加减报名人数
function minusNum(item){ function minusNum(item){
var num=parseInt($("#enlistN").html()); var num=parseInt($("#enlistN").html());
var money=parseFloat(3000).toFixed(2); var money=parseFloat(<%= @training.registration_fee %>).toFixed(2);
var percent=$("#percentPay"); var percent=$("#percentPay");
if(num>1){ if(num>1){
num=num-1; num=num-1;
@ -259,7 +262,7 @@
} }
function plusNum(item){ function plusNum(item){
var num=parseInt($("#enlistN").html()); var num=parseInt($("#enlistN").html());
var money=parseFloat(3000).toFixed(2); var money=parseFloat(<%= @training.registration_fee %>).toFixed(2);
var percent=$("#percentPay"); var percent=$("#percentPay");
num=num+1; num=num+1;
@ -297,7 +300,7 @@
$(".billType li").eq(index).addClass("active"); $(".billType li").eq(index).addClass("active");
billTypeShowFun(index,userInfo); billTypeShowFun(index,userInfo);
} }
function billTypeShowFun(index){ function billTypeShowFun(index, userInfo){
if (parseInt(index) == 0) { if (parseInt(index) == 0) {
$(".needWrite").removeClass("none"); $(".needWrite").removeClass("none");
$(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.school); $(".billUnit").attr("placeholder", "请填写公司单位名称").val(userInfo.school);
@ -353,7 +356,7 @@
//提交发票信息 //提交发票信息
/*function submitBillInfo() { function submitBillInfo() {
var type = $(".billType li.active").html(); var type = $(".billType li.active").html();
var unit = $(".billUnit").val(); var unit = $(".billUnit").val();
var tax = $(".taxNumber").val(); var tax = $(".taxNumber").val();
@ -386,7 +389,7 @@
//记录选中的发票类型 //记录选中的发票类型
$("#billDemand").attr("status",$(".billType li.active").index()); $("#billDemand").attr("status",$(".billType li.active").index());
hideNav($(".billDownNav")); hideNav($(".billDownNav"));
}*/ }
function InitPhoto() { function InitPhoto() {
var tmpl = '<li class="weui-uploader__file" style="background-image:url(#url#)"></li>', var tmpl = '<li class="weui-uploader__file" style="background-image:url(#url#)"></li>',

@ -10,12 +10,12 @@
<span><%= @training.sex == 1 ? '男' : '女' %></span> <span><%= @training.sex == 1 ? '男' : '女' %></span>
</p> </p>
<p class="clearfix"> <p class="clearfix">
<label>专业</label> <label>单位</label>
<span><%= @training.major %></span> <span><%= @training.school %></span>
</p> </p>
<p class="clearfix"> <p class="clearfix">
<label>学号</label> <label>职位</label>
<span><%= @training.student_id %></span> <span><%= @training.position %></span>
</p> </p>
<p class="clearfix"> <p class="clearfix">
<label>手机号</label> <label>手机号</label>
@ -55,27 +55,27 @@
<% end %> <% end %>
<% end %> <% end %>
<!--发票<div class="showPanel"> <div class="showPanel">
<p class="clearfix"> <p class="clearfix">
<label>发票类型</label> <label>发票类型</label>
<span><%#= @training.training_payinfo.invoice_title.present? ? '普通发票' : '不需要' %></span> <span><%= @training.training_payinfo.invoice_title.present? ? '普通发票' : '不需要' %></span>
</p> </p>
<%# if @training.training_payinfo.invoice_title.present? %> <% if @training.training_payinfo.invoice_title.present? %>
<p class="clearfix"> <p class="clearfix">
<label>发票内容</label> <label>发票内容</label>
<span><%#= @training.training_payinfo.invoice_content %></span> <span><%= @training.training_payinfo.invoice_content %></span>
</p> </p>
<p class="clearfix"> <p class="clearfix">
<label>发票抬头</label> <label>发票抬头</label>
<span><%#= @training.training_payinfo.invoice_title %></span> <span><%= @training.training_payinfo.invoice_title %></span>
</p> </p>
<p class="clearfix"> <p class="clearfix">
<label>税务登记号</label> <label>税务登记号</label>
<span><%#= @training.training_payinfo.invoice_no %></span> <span><%= @training.training_payinfo.invoice_no %></span>
</p> </p>
<%# end %> <% end %>
</div>--> </div>
<div class="showPanel"> <div class="showPanel">
<p class="clearfix mb5"><label>其他信息</label></p> <p class="clearfix mb5"><label>其他信息</label></p>
@ -98,11 +98,11 @@
<% else %> <% else %>
<% if @training.training_payinfo.wechat_wait_pay? %> <% if @training.training_payinfo.wechat_wait_pay? %>
<div class="bottomBtn"> <div class="bottomBtn">
<%= link_to "返回", pay_training_path(id: 'bigdata_hnjcxy_2019'), class: 'leftbtn' %> <%= link_to "返回", pay_training_path(id: @tag_id), class: 'leftbtn' %>
<a href="javascript:void(0)" class="rightbtn" id="wechatPayBtn">立即支付</a> <a href="javascript:void(0)" class="rightbtn" id="wechatPayBtn">立即支付</a>
</div> </div>
<% elsif !@training.payed? %> <% elsif !@training.payed? %>
<%= link_to "返回", pay_training_path(id: 'bigdata_hnjcxy_2019'), class: 'returnBtn' %> <%= link_to "返回", pay_training_path(id: @tag_id), class: 'returnBtn' %>
<% end %> <% end %>
<% end %> <% end %>
</div> </div>
@ -144,7 +144,7 @@
// 使用以上方式判断前端返回,微信团队郑重提示: // 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok但并不保证它绝对可靠。 //res.err_msg将在用户支付成功后返回ok但并不保证它绝对可靠。
setTimeout(function () { setTimeout(function () {
window.location.href = "/trainings/bigdata_hnjcxy_2019/result"; window.location.href = "/trainings/<% @tag_id %>/result";
}, 500); }, 500);
} else if (res.err_msg == 'get_brand_wcpay_request:cancel') { } else if (res.err_msg == 'get_brand_wcpay_request:cancel') {

Loading…
Cancel
Save