소스 검색

Merge branch 'dev2.10.4' of http://192.168.3.207:10080/qmx/jy into dev2.10.4

zhangyuhan 5 년 전
부모
커밋
d3979b78e6
100개의 변경된 파일5231개의 추가작업 그리고 1224개의 파일을 삭제
  1. 2 1
      README.md
  2. 17 19
      src/jfw/front/dataExport.go
  3. 5 3
      src/jfw/front/front.go
  4. 56 0
      src/jfw/front/order.go
  5. 91 0
      src/jfw/front/singleLogin.go
  6. 8 5
      src/jfw/front/ws_dataExport.go
  7. 3 0
      src/jfw/front/wxMyOrder.go
  8. 1 0
      src/jfw/modules/app/src/app/front/login.go
  9. 0 4
      src/jfw/modules/app/src/web/staticres/jyapp/course/css/order_list.css
  10. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/course/image/lessonsOffline.png
  11. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/course/image/lessonsOnline.png
  12. 39 10
      src/jfw/modules/app/src/web/staticres/jyapp/dataExport/css/pay_order.css
  13. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/datareport/image/report_icon.png
  14. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/images/reportTip.png
  15. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/images/report_dialog.png
  16. 10 1
      src/jfw/modules/app/src/web/staticres/jyapp/js/common.js
  17. 30 7
      src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js
  18. 177 0
      src/jfw/modules/app/src/web/staticres/jyapp/wx_course/css/order_list.css
  19. 17 6
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_payOrder.html
  20. 169 9
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_toMyOrder.html
  21. 1 1
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_toOrderDetail.html
  22. 81 60
      src/jfw/modules/app/src/web/templates/invoice/check_invoice.html
  23. 3 0
      src/jfw/modules/app/src/web/templates/invoice/invoicing.html
  24. 8 1
      src/jfw/modules/app/src/web/templates/me/mine.html
  25. 13 4
      src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html
  26. 5 1
      src/jfw/modules/app/src/web/templates/weixin/historypush.html
  27. 9 1
      src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html
  28. 4 0
      src/jfw/modules/app/src/web/templates/weixin/wxkeyset/index.html
  29. 25 0
      src/jfw/modules/datareport/src/a/init.go
  30. 31 0
      src/jfw/modules/datareport/src/config.json
  31. 48 0
      src/jfw/modules/datareport/src/config/config.go
  32. 109 0
      src/jfw/modules/datareport/src/entity/report.go
  33. 9 0
      src/jfw/modules/datareport/src/filter/filter.go
  34. 22 0
      src/jfw/modules/datareport/src/filter/sessionfilter.go
  35. 17 0
      src/jfw/modules/datareport/src/main.go
  36. 309 0
      src/jfw/modules/datareport/src/service/newDataReport.go
  37. 225 0
      src/jfw/modules/datareport/src/service/reportOrder.go
  38. BIN
      src/jfw/modules/datareport/src/src
  39. 66 0
      src/jfw/modules/datareport/src/util/common.go
  40. 36 0
      src/jfw/modules/datareport/src/util/db.go
  41. 154 7
      src/jfw/modules/subscribepay/src/entity/dataReportStruct.go
  42. 14 5
      src/jfw/modules/subscribepay/src/entity/dataexport.go
  43. 175 0
      src/jfw/modules/subscribepay/src/entity/jyCourseOnlineStruct.go
  44. 3 2
      src/jfw/modules/subscribepay/src/filter/sessionfilter.go
  45. 8 3
      src/jfw/modules/subscribepay/src/main.go
  46. 37 28
      src/jfw/modules/subscribepay/src/pay/aliPay.go
  47. 77 0
      src/jfw/modules/subscribepay/src/pay/util.go
  48. 29 18
      src/jfw/modules/subscribepay/src/pay/wxPay.go
  49. 2 0
      src/jfw/modules/subscribepay/src/pay_config.json
  50. 36 0
      src/jfw/modules/subscribepay/src/reportEmailTemplate.html
  51. 65 0
      src/jfw/modules/subscribepay/src/rpcfollow/rpc.go
  52. 211 1
      src/jfw/modules/subscribepay/src/service/commonAction.go
  53. 2 2
      src/jfw/modules/subscribepay/src/service/orderListDetails.go
  54. 22 11
      src/jfw/modules/subscribepay/src/service/payCallback.go
  55. 17 5
      src/jfw/modules/weixin/src/config.json
  56. 22 1
      src/jfw/modules/weixin/src/jrpc/jrpc.go
  57. 40 3
      src/jfw/modules/weixin/src/wx/wx.go
  58. 6 0
      src/jfw/public/rpccall.go
  59. BIN
      src/web/staticres/course/image/lessonsOffline.png
  60. BIN
      src/web/staticres/course/image/lessonsOnline.png
  61. BIN
      src/web/staticres/datareport/image/datareport_repy_icon.jpg
  62. BIN
      src/web/staticres/datareport/image/report_icon.png
  63. 2 2
      src/web/staticres/js/public-nav.js
  64. 4 0
      src/web/staticres/order/css/bootstrap.min.css
  65. 3 0
      src/web/staticres/order/css/iconfont.css
  66. 237 0
      src/web/staticres/order/css/order_detail.css
  67. 442 0
      src/web/staticres/order/css/order_pay.css
  68. 169 0
      src/web/staticres/order/css/pay_success.css
  69. 76 0
      src/web/staticres/order/css/reset_pc.css
  70. 3 0
      src/web/staticres/order/iconfont/iconfont.css
  71. BIN
      src/web/staticres/order/iconfont/iconfont.eot
  72. BIN
      src/web/staticres/order/iconfont/iconfont.ttf
  73. BIN
      src/web/staticres/order/iconfont/iconfont.woff
  74. BIN
      src/web/staticres/order/iconfont/iconfont.woff2
  75. BIN
      src/web/staticres/order/image/alipay.png
  76. BIN
      src/web/staticres/order/image/bgsanjiao.png
  77. BIN
      src/web/staticres/order/image/pay_success.png
  78. BIN
      src/web/staticres/order/image/qrcode.png
  79. BIN
      src/web/staticres/order/image/smallCode.png
  80. BIN
      src/web/staticres/order/image/telphone.png
  81. BIN
      src/web/staticres/order/image/wxpay.png
  82. BIN
      src/web/staticres/order/image/zhifubao.png
  83. 5 0
      src/web/staticres/order/js/bootstrap.min.js
  84. 1 0
      src/web/staticres/order/js/jquery-2.1.4.min.js
  85. 38 20
      src/web/staticres/pccss/public-nav-1200.css
  86. 12 3
      src/web/staticres/vipsubscribe/css/vip_index_new.css
  87. 9 4
      src/web/staticres/vipsubscribe/css/vip_renew.css
  88. 0 4
      src/web/staticres/wx_course/css/order_list.css
  89. 40 11
      src/web/staticres/wx_dataExport/css/pay_order.css
  90. 7 2
      src/web/templates/common/pchead.html
  91. 54 2
      src/web/templates/course/pc/orderPay.html
  92. 209 203
      src/web/templates/course/pc/order_detail.html
  93. 75 26
      src/web/templates/course/pc/paySuccess.html
  94. 244 0
      src/web/templates/order/pc/datareport/detail.html
  95. 181 0
      src/web/templates/order/pc/orderPay.html
  96. 71 0
      src/web/templates/order/pc/paySuccess.html
  97. 580 523
      src/web/templates/pc/myOrder.html
  98. 17 6
      src/web/templates/weixin/dataExport/dataExport_payOrder.html
  99. 8 5
      src/web/templates/weixin/dataExport/dataExport_paySuccess.html
  100. 178 194
      src/web/templates/weixin/dataExport/dataExport_toMyOrder.html

+ 2 - 1
README.md

@@ -4,4 +4,5 @@ weixin sdk https://github.com/wizjin/weixin
 web用xweb框架
 
 v2.10.4
-微信app样式统一
+微信app样式统一
+

+ 17 - 19
src/jfw/front/dataExport.go

@@ -241,26 +241,24 @@ func (d *DataExport) QueryOrder() error {
 				v["order_money"] = float64(orderMoney.(int64)) / 100
 			}
 			v["filter_id"] = util.EncodeArticleId2ByCheck(util.ObjToString(v["filter_id"]))
-			if util.ObjToString(v["product_type"]) == "招投标课程" {
-				/*
-					create_time_str := util.ObjToString(v["create_time"])
-					//创建时间戳
-					create_time, _ := time.ParseInLocation(util.Date_Full_Layout, create_time_str, time.Local)
-					var create_time_stamp int64 = 0
-					order_countdown := config.Seoconfig["orderCountdown"].(string) //配置文件读取
-					onehour, _ := time.ParseDuration(util.ObjToString(order_countdown))
-					create_time_stamp = create_time.Add(onehour).Unix()
-					//如果超过72小时 取消订单  创建72小时后的时间戳<当前时间戳
-					if create_time_stamp < time.Now().Unix() && util.IntAll(v["order_status"]) == 0 {
-						v["order_status"] = orderStatus_cancel
-						//需要把pc端获取订单和移动结合在一起。
-						var thsql = `UPDATE dataexport_order  SET order_status = -2 WHERE order_status = 0 AND order_code = '` + util.ObjToString(v["order_code"]) + `'`
-						i := public.Mysql.UpdateOrDeleteBySql(thsql)
-						if i < 1 {
-							log.Println(util.ObjToString(v["order_code"]), "订单状态处理失败")
-						}
+			if util.ObjToString(v["product_type"]) == "招投标课程" || util.ObjToString(v["product_type"]) == "线上课程" || util.ObjToString(v["product_type"]) == "VIP订阅" || util.ObjToString(v["product_type"]) == "企业商机管理" || util.ObjToString(v["product_type"]) == "数据报告" {
+				create_time_str := util.ObjToString(v["create_time"])
+				//创建时间戳
+				create_time, _ := time.ParseInLocation(util.Date_Full_Layout, create_time_str, time.Local)
+				var create_time_stamp int64 = 0
+				order_countdown := config.Seoconfig["orderCountdown"].(string) //配置文件读取
+				onehour, _ := time.ParseDuration(util.ObjToString(order_countdown))
+				create_time_stamp = create_time.Add(onehour).Unix()
+				//如果超过72小时 取消订单  创建72小时后的时间戳<当前时间戳
+				if create_time_stamp < time.Now().Unix() && util.IntAll(v["order_status"]) == 0 {
+					v["order_status"] = orderStatus_cancel
+					//需要把pc端获取订单和移动结合在一起。
+					var thsql = `UPDATE dataexport_order  SET order_status = -2 WHERE order_status = 0 AND order_code = '` + util.ObjToString(v["order_code"]) + `'`
+					i := public.Mysql.UpdateOrDeleteBySql(thsql)
+					if i < 1 {
+						log.Println(util.ObjToString(v["order_code"]), "订单状态处理失败")
 					}
-				*/
+				}
 			}
 		}
 	}

+ 5 - 3
src/jfw/front/front.go

@@ -465,10 +465,12 @@ func (f *Front) Topics() error {
 
 //
 func (f *Front) Notin() error {
-	ref := f.GetSession("referer")
-	if ref != nil && ref != "" {
-		f.T["ref"] = ref.(string)
+	refer := "/"
+	tmp := f.Header("Referer")
+	if tmp != f.Request.URL.String() {
+		refer = tmp
 	}
+	f.T["ref"] = refer
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {
 		shareid = "10" //fmt.Sprintf("%s%d", config.Seoconfig["jysskzy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[7:14], rand.Intn(9))

+ 56 - 0
src/jfw/front/order.go

@@ -0,0 +1,56 @@
+package front
+
+import (
+	"fmt"
+	qutil "qfw/util"
+	"strings"
+	"time"
+
+	"github.com/go-xweb/xweb"
+)
+
+type JyOrder struct {
+	*xweb.Action
+	orderDetail xweb.Mapper `xweb:"/front/(.*)/jyOrderDetail/(.*)"` //订单详情
+	orderPay    xweb.Mapper `xweb:"/front/(\\w+)/orderPay/(.*)"`    //订单支付
+	paySuccess  xweb.Mapper `xweb:"/front/(\\w+)/paySuccess/(.*)"`  //支付完成页面
+}
+
+func init() {
+	xweb.AddAction(&JyOrder{})
+}
+
+//pc端详情页
+func (this *JyOrder) OrderDetail(orderType, orderCode string) {
+	this.T["orderId"] = orderCode
+	this.Render(fmt.Sprintf("/order/pc/%s/detail.html", orderType))
+}
+
+//pc端订单支付页
+func (this *JyOrder) OrderPay(orderType, orderCode string) error {
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	if userId == "" {
+		return this.Redirect("/notin/page")
+	}
+	this.T["shareid"] = "10"
+	this.T["orderType"] = orderType
+	this.T["orderCode"] = orderCode
+	return this.Render("/order/pc/orderPay.html")
+}
+
+//pc支付成功页面
+func (this *JyOrder) PaySuccess(orderType, orderCode string) error {
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	if userId == "" {
+		return this.Redirect("/notin/page")
+	}
+	this.T["payway"] = qutil.If(strings.Index(this.GetString("payway"), "wx") > -1, "微信", "支付宝")
+	this.T["email"] = this.GetString("email")
+	if payTime, err := this.GetInt("payTime"); err == nil {
+		this.T["payTime"] = time.Unix(payTime, 0).Format("2006年01月02日")
+	}
+	this.T["shareid"] = "10"
+	this.T["orderType"] = orderType
+	this.T["orderCode"] = orderCode
+	return this.Render("/order/pc/paySuccess.html")
+}

+ 91 - 0
src/jfw/front/singleLogin.go

@@ -0,0 +1,91 @@
+package front
+
+import (
+	"fmt"
+	"jfw/public"
+	"net/url"
+	"qfw/util/redis"
+	"time"
+
+	"github.com/go-xweb/httpsession"
+
+	"jfw/config"
+	"jfw/jyutil"
+	"log"
+	qutil "qfw/util"
+
+	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
+)
+
+type SingleLogin struct {
+	*xweb.Action
+	singleLogin xweb.Mapper `xweb:"/swordfish/SingleLogin"` //微信登录中转
+}
+
+func init() {
+	xweb.AddAction(&SingleLogin{})
+}
+
+//是否关注处理
+func (this *SingleLogin) SingleLogin() error {
+	userid := qutil.ObjToString(this.GetSession("userId"))
+	toHref := this.GetString("toHref")
+	log.Println("SingleLogin sessionId", this.Session().Id())
+	if userid != "" { //已有session,直接跳转至结果页面
+		return this.Redirect(toHref)
+	}
+	data := map[string]interface{}{}
+	stateKey := this.GetString("state")
+	log.Println("SingleLogin stateKey", userid, stateKey)
+	if stateKey == "" { //公众号回调
+		stateKey = getTmpKey()
+		data["href"] = toHref
+		data["title"] = this.GetString("title")
+		redis.Put("other", stateKey, data, 60*5) //存储信息
+		return this.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(this.Site()+this.Url()), stateKey), 302)
+	}
+	//获取wx跳转前参数
+	if redisValue := redis.Get("other", stateKey); redisValue != nil {
+		if param, ok := redisValue.(map[string]interface{}); ok {
+			data = param
+		}
+	}
+	log.Println("SingleLogin data", data)
+	openid := jyutil.Getopenid(this.GetString("code")) //获取用户openid
+	if loginCreateSess(openid, this.Session()) {
+		log.Println("已关注用户", openid, data["href"])
+		return this.Redirect(qutil.ObjToString(data["href"]))
+	}
+	log.Println("SingleLogin 未关注用户", openid)
+	if len(data) > 0 { //存储携带信息
+		redis.Put("other", fmt.Sprintf("SingleLogin_%s", openid), data, 60*30)
+	}
+	return this.Render("/weixin/singlelogin/index.html")
+}
+
+func getTmpKey() string {
+	return fmt.Sprintf("%s_%s", time.Now().Format("20060102150405"), qutil.GetLetterRandom(5))
+}
+
+func loginCreateSess(openid string, sess *httpsession.Session) bool {
+	_person, ok := public.MQFW.FindOne("user", bson.M{"s_m_openid": openid, "i_ispush": 1})
+	if ok && *_person != nil && len(*_person) > 0 {
+		person := *_person
+		if person["i_shareknow"] != nil {
+			sess.Set("shareknow", person["i_shareknow"])
+		}
+		sess.Set("userId", (person["_id"].(bson.ObjectId)).Hex())
+		sess.Set("s_m_openid", person["s_m_openid"])
+		sess.Set("openid", person["s_m_openid"])
+		sess.Set("s_nickname", person["s_nickname"])
+		if person["s_avatar"] == nil {
+			sess.Set("s_avatar", person["s_headimage"])
+		} else {
+			sess.Set("s_avatar", person["s_avatar"])
+		}
+		return true
+	} else {
+		return false
+	}
+}

+ 8 - 5
src/jfw/front/ws_dataExport.go

@@ -14,7 +14,6 @@ import (
 	"qfw/util"
 	"qfw/util/jy"
 	"qfw/util/redis"
-	"strconv"
 	"strings"
 	"time"
 
@@ -90,10 +89,14 @@ func (w *WsDataExport) GetPreview() error {
 //
 func (w *WsDataExport) PaySuccessPage() error {
 	defer util.Catch()
-	w.T["email"] = w.GetString("email")
-	w.T["orderCode"] = w.GetString("orderCode")
-	payTime, _ := strconv.ParseInt(w.GetString("payTime"), 10, 64)
-	w.T["payTime"] = util.FormatDateByInt64(&payTime, util.Date_Short_Layout)
+	orderCode := w.GetString("orderCode")
+	userId := util.ObjToString(w.GetSession("userId"))
+	res := public.Mysql.FindOne("dataexport_order", map[string]interface{}{"user_id": userId, "order_code": orderCode}, "user_mail,pay_time", "")
+	if res != nil || len(*res) == 0 {
+		w.T["email"] = (*res)["user_mail"]
+		w.T["payTime"] = (*res)["pay_time"]
+	}
+	w.T["orderCode"] = orderCode
 	return w.Render("/weixin/dataExport/dataExport_paySuccess.html", &w.T)
 }
 

+ 3 - 0
src/jfw/front/wxMyOrder.go

@@ -329,6 +329,9 @@ func (w *WxMyOrder) WxToOrderDetail() error {
 			wxPayMap := map[string]interface{}{}
 			wxPayMap["out_trade_no"] = orderDetail["out_trade_no"]
 			wxpay := public.Mysql.FindOne(table, wxPayMap, "", "")
+			if wxpay == nil {
+				return ""
+			}
 			return util.ObjToString((*wxpay)["transaction_id"])
 		}()
 	}

+ 1 - 0
src/jfw/modules/app/src/app/front/login.go

@@ -916,6 +916,7 @@ func ClearSession(s *httpsession.Session) {
 	s.Del("prevSelectEntId")
 	s.Del("autoSelectEntId")
 	s.Del("app_name")
+	s.Del("s_phone")
 }
 
 //生成签名,返回手机端

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 4
src/jfw/modules/app/src/web/staticres/jyapp/course/css/order_list.css


BIN
src/jfw/modules/app/src/web/staticres/jyapp/course/image/lessonsOffline.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/course/image/lessonsOnline.png


+ 39 - 10
src/jfw/modules/app/src/web/staticres/jyapp/dataExport/css/pay_order.css

@@ -8,7 +8,7 @@
 }
 
 #pay_order {
-  padding-bottom: 2.7rem;
+  padding-bottom: 3.5rem;
   font-size: .24rem !important;
 	background: rgba(245,244,249,1);
 	margin-top: 20px;
@@ -305,7 +305,7 @@ letter-spacing: 0.02rem;
           transform: scale(0.8);
 }
 #pay_order   .radio-form .read {
-  font-size: .26rem;
+  font-size: .24rem;
 }
 #pay_order   .radio-form .read a {
   color: #2cb7ca;
@@ -322,18 +322,47 @@ letter-spacing: 0.02rem;
           align-items: center;
   -webkit-box-pack: end;
       -ms-flex-pack: end;
-          justify-content: flex-end;
-  padding: .12rem .12rem;
+          justify-content: space-between;
+  height: .96rem;
+  padding: 0 .32rem;
 }
-#pay_order   .price span {
-  text-decoration: line-through;
+#pay_order .price .totalnum{
+  display: flex;
+  align-items: flex-start;
+  padding-top: 0.1rem;
+  height: 100%;
   font-size: .26rem;
-  color: #888;
+  color: #9B9CA3;
+  font-weight: 500;
+}
+#pay_order .price .pricenum{
+  display: flex;
+  flex-direction: column-reverse;
+}
+#pay_order   .price .pricenum .pay_bef {
+  color: #9B9CA3;
+  font-weight: 500;
+  font-size: .24rem;
+  margin-right: .18rem;
+}
+#pay_order   .price .pricenum .pay_bef .pay_before {
+  text-decoration: line-through;
+}
+#pay_order   .price .pricenum .pay_dis {
+  text-align: end;
+  color: #FB483D;
   margin-right: .18rem;
 }
-#pay_order  .price strong {
+#pay_order   .price .pricenum .pay_dis .bef_text{
+  font-size: .32rem;
+}
+#pay_order  .price .pay_discount {
   font-size: .4rem;
-  color: #1d1d1d;
+  color: #FB483D;
+  font-weight: 500;
+}
+.weui-cells:before{
+  border-top: 0;
 }
 #pay_order  .form-btn {
   display: -webkit-box;
@@ -342,7 +371,7 @@ letter-spacing: 0.02rem;
   -webkit-box-align: center;
       -ms-flex-align: center;
           align-items: center;
-	border-top:1px solid #e0e0e0;
+	/* border-top:1px solid #e0e0e0; */
 }
 #pay_order  .form-btn .btn {
   -webkit-box-flex: 1;

BIN
src/jfw/modules/app/src/web/staticres/jyapp/datareport/image/report_icon.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/images/reportTip.png


BIN
src/jfw/modules/app/src/web/staticres/jyapp/images/report_dialog.png


+ 10 - 1
src/jfw/modules/app/src/web/staticres/jyapp/js/common.js

@@ -621,7 +621,7 @@ function loginSuccess(result){
 	if(callBackUrl != null){
 		afterLoginSuccess("",true);
 		//window.location.href = callBackUrl;
-		location.replace(callBackUrl);
+		locationReplace(callBackUrl);
 		return
 	}
 	//
@@ -632,6 +632,15 @@ function loginSuccess(result){
 	//window.location.href = "/jyapp/jylab/mainSearch";
 	//location.replace("/jyapp/jylab/mainSearch");
 }
+//2020-05-30 android replace失效
+function locationReplace(url){
+	if(history.replaceState){
+		history.replaceState(null, document.title, url);
+		history.go(0);
+	}else{
+		location.replace(url);
+	}
+}
 function afterLoginSuccess(type,canBack){
 	if(!canBack){
 		prohibitBack();

+ 30 - 7
src/jfw/modules/app/src/web/staticres/jyapp/js/searchindex.js

@@ -3086,17 +3086,21 @@ var Active_Tip = function(){
 	this.active = null;
 	this.isLogin = false;
 	var _this = this;
+	var tipEndTime = 1593532800000; //2020-07-01-00-00-00
 	//默认弹出框
 	if(_this.active == null){
 		var time = localStorage.getItem("Active_Vip_Invite")
-		if(!time||_this.nowTime>parseInt(time)+1000*60*60*24*30){
+		if(parseInt(time) >= tipEndTime){
+			return   //超过弹窗结束日期
+		}
+		if(!time||_this.nowTime>parseInt(time)+1000*60*60*24){
 			_this.active = new Active_Vip_Invite(_this.nowTime);
 		}
 	}
 	if(_this.active != null){
 		$("body").append('<div class="modal fade" id="myModal-tap" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="true" style="z-index: 100001;">'
 						+'<div class="modal-dialog" style="height:100%;margin:0px;">'
-							+'<div style="width: 5.6rem;height: 7.2rem;position: relative;top: 3.5rem;left: 50%;margin-left: -2.8rem;">'
+							+'<div style="width: 6rem;height: 7.2rem;position: relative;top: 3.5rem;left: 50%;margin-left: -2.8rem;">'
 								+'<img src="/jyapp/vipsubscribe/image/close.png" style="position: absolute;width: 27px;top:-66.5px;right: .3rem;" onclick="ActiveTip.close()">'
 								+_this.active.getHtml()
 							+'</div>'
@@ -3425,7 +3429,7 @@ var Active_Default = function(nowTime){
 		localStorage.setItem("lastAlertDate",nowTime);
 	}
 	this.getHtml = function(){
-		var html = '<div class="pop-new" style="background: url(/jyapp/images/search/dataexportAd.png);background-size: cover;height: inherit;width: inherit;border-radius: 8px;">'
+		var html = '<div class="pop-new" style="background: url(/jyapp/images/report_dialog.png);background-size: cover;height: inherit;width: inherit;border-radius: 8px;">'
 					+'<div style="position: absolute;color: #0687DB;font-size: 14px;bottom: .6rem;left: 50%;margin-left: -2.3rem;font-family: 微软雅黑;width: 4.6rem;border: 1px solid #fff;border-radius: 6px;text-align: center;cursor: pointer;height: .8rem;line-height: .8rem;" id="goToInvite"></div>'
 				+'</div>';
 		return html;
@@ -3437,16 +3441,17 @@ var Active_Vip_Invite = function(nowTime){
 		$("#goToInvite").on("tap",function(){
 			if(ActiveTip.isLogin){
 				ActiveTip.close();
-				window.location.href = "/jyapp/vipsubscribe/introducePage";
+				window.location.href = "/datareport/page/introduce";
 			}else{
-				window.location.href = "/jyapp/free/login?url="+encodeURIComponent("/jyapp/vipsubscribe/introducePage");
+				window.location.href = "/jyapp/free/login?url="+encodeURIComponent("/datareport/page/introduce");
 			}
 		});
+		nowTime = new Date(formatDate(nowTime,true)+ " 00:00:00").getTime();
 		localStorage.setItem("Active_Vip_Invite",nowTime);
 	}
 	this.getHtml = function(){
-		var html = '<div class="pop-new" style="background: url(/jyapp/vipsubscribe/image/vip_home.png);background-size: cover;height: inherit;width: inherit;border-radius: 8px;">'
-					+'<div style="position: absolute;color: #0687DB;font-size: 14px;bottom: .65rem;left: 50%;margin-left: -1.7rem;font-family: 微软雅黑;width: 3.4rem;border-radius: 20px;text-align: center;cursor: pointer;height: .8rem;line-height: .8rem;" id="goToInvite"></div>'
+		var html = '<div class="pop-new" style="background: url(/jyapp/images/reportTip.png);background-size: cover;height: inherit;width: inherit;border-radius: 8px;">'
+					+'<div style="position: absolute;color: #0687DB;font-size: 14px;bottom: 1.35rem;left: 50%;margin-left: -1.7rem;font-family: 微软雅黑;width: 4.3rem;border-radius: 20px;text-align: center;cursor: pointer;height: 1.2rem;line-height: 1.2rem;" id="goToInvite"></div>'
 				+'</div>';
 		return html;
 	}
@@ -3456,3 +3461,21 @@ var ActiveTip = null;
 window.onload = function(){
 	ActiveTip = new Active_Tip();
 }
+
+function formatDate(date,hms) {
+	if(date ===null || date==="" || date === 0){
+		return "-"
+	}
+	var date = new Date(date);
+	var YY = date.getFullYear() + '-';
+	var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+	var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
+	var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
+	var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
+	var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
+	if(!hms){
+		return YY + MM + DD + " " + hh + mm + ss
+	}else{
+		return YY + MM + DD
+	}
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 177 - 0
src/jfw/modules/app/src/web/staticres/jyapp/wx_course/css/order_list.css


+ 17 - 6
src/jfw/modules/app/src/web/templates/dataExport/dataExport_payOrder.html

@@ -154,6 +154,21 @@
             </div>
         </main>
         <div class="fixed-bottom-box" id="bottombox">
+            <div class="price">
+                <div class="totalnum">
+                    合计:
+                </div>
+                <div class="pricenum">
+                    <div class="pay_bef">
+                        <span>原价:¥</span>
+                        <span class="pay_before"></span>
+                    </div>
+                    <div class="pay_dis">
+                        <span class="bef_text">¥</span>
+                        <strong class="pay_discount"></strong>
+                    </div>
+                </div>
+            </div>
             <div class="weui-cells weui-cells_checkbox radio-form">
                 <label class="weui-cell weui-check__label" for="s11">
                     <div class="weui-cell__hd">
@@ -165,10 +180,6 @@
                     </div>
                 </label>
             </div>
-            <div class="price">
-                <span class="pay_before"></span>
-                <strong class="pay_discount"></strong>
-            </div>
             <div class="form-btn j-button-group">
                 <button class="btn prew dataPreview j-button-cancel1" style="line-height: normal;">预览数据</button>
                 <button class="btn enter toPay j-button-confirm1" style="line-height: normal;" disabled="disabled">确认支付</button>
@@ -298,8 +309,8 @@
         }
         shouldPay = shouldPay > orderMinPrice ? shouldPay : orderMinPrice;
         beforePay = beforePay > orderMinPrice ? beforePay : orderMinPrice;
-        $(".pay_discount").text("¥" + shouldPay);
-        $(".pay_before").text("¥" + beforePay)
+        $(".pay_discount").text(shouldPay);
+        $(".pay_before").text(beforePay)
     }
 
     //

+ 169 - 9
src/jfw/modules/app/src/web/templates/dataExport/dataExport_toMyOrder.html

@@ -560,11 +560,14 @@
 
 			function appendList(listhtml){
 				listhtml.children(".card-content").on("click", function(event){
+          if($(this).find(".media").attr("href")){
+            return
+          }
 					var eid = $(this).find(".media").attr("eid");
 					var isVipOrder =$(this).find(".media").attr("isvipOrder");
-                    var courseOrder = $(this).find(".media").attr("courseOrder");
-                    var isent = $(this).find(".media").attr("isent");
-                    var vid = $(this).find(".media").attr("vid");
+          var courseOrder = $(this).find(".media").attr("courseOrder");
+          var isent = $(this).find(".media").attr("isent");
+          var vid = $(this).find(".media").attr("vid");
 					beforeJump(eid,isVipOrder,courseOrder,isent,vid);
 				});
 				$(".card_lists").append(listhtml);
@@ -612,6 +615,7 @@
 			}
 
 			function renewalOrBuyAgain_ent(pattern,e){
+        setSessionStorage()
 				var renew = 0;
 				setSessionStorage();
 				var orderCode = $(e).parent(".card-footer").prev(".card-content").find("a").attr("eid");
@@ -746,6 +750,7 @@
 												var isEntOrder =$(obj).parent(".card-footer").prev(".card-content").children(".media").attr("isent");
 												var courseOrder =$(obj).parent(".card-footer").prev(".card-content").children(".media").attr("courseOrder");
 												var courseId = $(obj).parent(".card-footer").prev(".card-content").find("a").attr("eid");
+                        var courseOnlineOrder =$(obj).parent(".card-footer").prev(".card-content").children(".media").attr("courseOnlineOrder");
 												//vip订单取消了没有再次购买
 												if (isVipOrder!="true"){
 													if(courseOrder !== "true"){
@@ -753,7 +758,10 @@
 															self.text("已取消");
 															/*$(obj).parent(".card-footer").html('<a  onclick="renewalOrBuyAgain_ent(1,this)" class="btn cancle">再次购买</a>')*/
 															$(obj).parent(".card-footer").html("");
-														}else{
+														}else if(courseOnlineOrder=="true"){
+                              self.text("已取消");
+                              $(obj).parent(".card-footer").remove();
+                            }else{
 															self.text("已取消");
 															$(obj).parent(".card-footer").html('<a  onclick="onceMore(this)" class="btn cancle">再次购买</a>')
 														}
@@ -1883,7 +1891,7 @@
 										orderStatusHtmls = "notpay";
 										lastHtml = `<div class="card-footer">
 														<a  class="btn cancle gopay_btn" onclick="cancelOrder(${id},this)">取消订单</a>
-														<a onclick="setSessionStorage()" href="/jyapp/course/optionPay?code=${orderCode}" class="btn pay green-btn">去支付</a>
+														<a onclick="setSessionStorage()" href="/jyapp/course/optionPay?code=${orderCode}" class="btn green-btn">去支付</a>
 													</div>`;
 									}else if(orderStatus === 1){
 										if(courseStatus === 5){
@@ -1944,7 +1952,7 @@
 											orderStatusHtmls = "refund";
 											lastHtml = `<div class="card-footer">
 															<a  class="btn cancle gray-btn" onclick="cancelOrder(${id},this)">取消订单</a>
-															<a onclick="setSessionStorage()" href="/jyapp/course/optionPay?code=${orderCode}" class="btn pay green-btn">再次支付</a>
+															<a onclick="setSessionStorage()" href="/jyapp/course/optionPay?code=${orderCode}" class="btn green-btn">再次支付</a>
 														</div>`;
 											helpHtml = `<span class="doubt iconfont icon-bangzhu" onclick="phoneShow()"></span>`
 										}else{
@@ -1952,7 +1960,7 @@
                                             orderStatusHtmls = "notpay";
                                             lastHtml = `<div class="card-footer">
                                             				<a class="btn cancle gray-btn" onclick="cancelOrder(${id},this)">取消订单</a>
-                                            				<a onclick="setSessionStorage()" href="/jyapp/course/optionPay?code=${orderCode}" class="btn pay green-btn">去支付</a>
+                                            				<a onclick="setSessionStorage()" href="/jyapp/course/optionPay?code=${orderCode}" class="btn green-btn">去支付</a>
                                             			</div>`;
                                         }
 									}else if(orderStatus === 1){
@@ -2015,8 +2023,7 @@
 												<div class="card-content">
 													<a onclick="setSessionStorage()" href="${orderUrl}" eid="${courseId}" vid="${orderCode}" class="media" courseOrder="true">
 														<div class="media-img">
-															<span class="img-container">
-															</span>
+															<img src="/jyapp/course/image/lessonsOffline.png">
 														</div>
 														<div class="media-info">
 															<p class="item-ifo ellipsis-2">${courseName}</p>
@@ -2031,6 +2038,157 @@
 												</div>
 												${lastHtml}
 											</div>`
+							}else if (obj.product_type=="线上课程"){
+								count++;
+								var id = obj.id;
+								//订单编号
+								var orderCode = obj.order_code;
+								//创建时间
+								var createTime=obj.create_time;
+								createTime =createTime.replace(/-/g,".")
+								var payWay = obj.pay_way
+								var filterObj = JSON.parse(obj.filter);
+								var courseName = filterObj.s_name;
+								var courseLength = filterObj.s_courseDate;
+								var courseEndTimeStamp = filterObj.l_endtime;
+								var courseId = filterObj._id;
+								var orderStatus = obj.order_status;
+								var orderStatusHtml = "";
+								var orderStatusHtmls = "";
+                var orderMoney = obj.order_money;
+                var applybillStatus= obj.applybill_status;
+                
+                var courseEndTime = new Date(courseEndTimeStamp*1000)
+                
+								var lastHtml = "";
+								var orderUrl = "/jyxsapp/orderMsg?code="+ orderCode;
+							
+								if(orderStatus === 0){
+									orderStatusHtml = "待付款";
+									orderStatusHtmls = "notpay";
+									lastHtml = `<div class="card-footer">
+													<a  class="btn cancle" onclick="cancelOrder(${id},this)">取消订单</a>
+													<a onclick="setSessionStorage()" href="/jyxsapp/confirmPay?code=${orderCode}&price=${orderMoney}" class="btn green-btn">去支付</a>
+												</div>`;
+								}else if(orderStatus === 1){
+									orderStatusHtml = "已完成";
+                  orderStatusHtmls ="finish";
+                  if(applybillStatus==1){
+                		lastHtml = `<div class="card-footer">
+											<a onclick="setSessionStorage()" href="/jyxsapp/invoiceDetail?code=${orderCode}&id=${id}" class="btn cancle">查看发票</a>
+										</div>`
+                  }else{
+                		lastHtml = `<div class="card-footer">
+											<a onclick="setSessionStorage()" href="/jyxsapp/invoice?code=${orderCode}" class="btn cancle">开发票</a>
+										</div>`
+                  }
+								}else{
+									orderStatusHtml = "已取消";
+                  orderStatusHtmls = "status-text";
+								}
+
+								listhtml += `<div class="card">
+												<div class="card-header">
+													<span class="time">${createTime}</span>
+													<span class="status ${orderStatusHtmls}">${orderStatusHtml}</span>
+													<a class="shanchu iconfont  icon-shanchu" title="删除订单" onclick="deleteOrder(${id},this)"></a>
+													
+												</div>
+												<div class="card-content">
+													<a onclick="setSessionStorage()" href="${orderUrl}" eid="${courseId}" vid="${orderCode}" class="media" courseOnlineOrder="true">
+														<div class="media-img">
+															<img src="/jyapp/course/image/lessonsOnline.png">
+														</div>
+														<div class="media-info">
+															<p class="item-ifo ellipsis-2">${courseName}</p>
+															<p class="item-ifo ellipsis">课程类型:线上课程</p>
+															<p class="item-ifo ellipsis">课程时长:${courseLength}</p>
+															<p class="item-ifo ellipsis">有效日期:${courseEndTime.getFullYear()}/${courseEndTime.getMonth()+1}/${courseEndTime.getDate()} 到期</p>
+														</div>
+													</a>
+													<div class="price">
+														<strong class="current">¥${formatMoney(orderMoney)}</strong>
+													</div>
+												</div>
+												${lastHtml}
+											</div>`
+							}else if (obj.product_type=="数据报告"){
+								if(typ==1 || $(".tab-link.active").index() === 1){	//待付款订单列表页
+									if(obj.order_status==-2){
+										continue;
+									}
+								}
+								count++;
+								var id = obj.id;
+								//订单编号
+								var orderCode = obj.order_code;
+								//创建时间
+								var createTime=obj.create_time;
+								createTime =createTime.replace(/-/g,".")
+								var payWay = obj.pay_way
+								var filterObj = JSON.parse(obj.filter);
+
+								var courseId = filterObj._id;
+								var orderStatus = obj.order_status;
+								var orderStatusHtml = "";
+								var orderStatusHtmls = "";
+								var reportName = filterObj.report_name;
+								var pushTimeStamp = filterObj.l_pushtime;
+                var orderMoney = obj.order_money;
+                var applybillStatus= obj.applybill_status;
+
+                var pushTime = new Date(pushTimeStamp * 1000)
+                
+								var lastHtml = "";
+								var orderUrl = "/datareport/page/order/detail/" + orderCode;
+							
+								if(orderStatus === 0){
+									orderStatusHtml = "待付款";
+									orderStatusHtmls = "notpay";
+									lastHtml = `<div class="card-footer">
+													<a  class="btn cancle" onclick="cancelOrder(${id},this)">取消订单</a>
+													<a onclick="setSessionStorage()" href="/datareport/page/pay?ordercode=${orderCode}" class="btn green-btn">去支付</a>
+												</div>`;
+								}else if(orderStatus === 1){
+									orderStatusHtml = "已完成";
+                  orderStatusHtmls ="finish";
+                  if(applybillStatus==1){
+                		lastHtml = `<div class="card-footer">
+											<a onclick="checkinvoice(this)" class="btn cancle">查看发票</a>
+										</div>`
+                  }else{
+                		lastHtml = `<div class="card-footer">
+											<a onclick="invoiceAdd(this)" class="btn cancle">开发票</a>
+										</div>`
+                  }
+								}else{
+									orderStatusHtml = "已取消";
+                  orderStatusHtmls = "status-text";
+								}
+
+								listhtml += `<div class="card">
+												<div class="card-header">
+													<span class="time">${createTime}</span>
+													<span class="status ${orderStatusHtmls}">${orderStatusHtml}</span>
+													<a class="shanchu iconfont  icon-shanchu" title="删除订单" onclick="deleteOrder(${id},this)"></a>
+													
+												</div>
+												<div class="card-content">
+													<a onclick="setSessionStorage()" href="${orderUrl}" eid="${orderCode}" class="media" datareportOrder="true">
+														<div class="media-img">
+															<img src="/jyapp/datareport/image/report_icon.png">
+														</div>
+														<div class="media-info">
+														  <p class="item-ifo ellipsis">报告名称:${reportName}</p>
+										          <p class="item-ifo ellipsis">发布日期:${pushTime.getFullYear()}/${pushTime.getMonth() + 1}/${pushTime.getDate()}</p>	
+                            </div>
+													</a>
+													<div class="price">
+														<strong class="current">¥${formatMoney(orderMoney)}</strong>
+													</div>
+												</div>
+												${lastHtml}
+											</div>`
 							}else if (obj.product_type=="企业商机管理"){
 								if(typ==1 || $(".tab-link.active").index() === 1){	//待付款订单列表页
 									if(obj.order_status==-2){
@@ -2291,11 +2449,13 @@
 			})
 				//查看发票
 				function checkinvoice(e) {
+          setSessionStorage()
 					var orderCode = $(e).parent(".card-footer").prev(".card-content").find("a").attr("eid");
 					window.location.href = "/jyapp/front/invoice/check_invoice.html?order_code="+orderCode;
 				}
 				//开发票
   			function invoiceAdd(e){
+          setSessionStorage()
   				var orderCode = $(e).parent(".card-footer").prev(".card-content").find("a").attr("eid");
           $.post("/subscribepay/orderListDetails/isOver", {"order_code":orderCode}, function(data) {
               if(data.status==1){

+ 1 - 1
src/jfw/modules/app/src/web/templates/dataExport/dataExport_toOrderDetail.html

@@ -760,7 +760,7 @@
 										var wait_html = '<div class="bg nopay-bg"><h3 class="status">待付款</h3><p class="remaining"></p><div>'
 
 										$(".order-main").before(wait_html)
-										startTimeOver(r.data.create_time,r.data.countdown)
+										// startTimeOver(r.data.create_time,r.data.countdown)
 										var go_pay = ''
 										go_pay += '<div class="j-button-group" ><button class="j-button-confirm" id="buy" onclick="choosePayWay(\''+r.data.order_code+'\',\''+filter_id+'\')">立即支付</button></div>'
 										$(".j-footer").append(go_pay)

+ 81 - 60
src/jfw/modules/app/src/web/templates/invoice/check_invoice.html

@@ -113,68 +113,18 @@
 		var u = navigator.userAgent, app = navigator.appVersion;
 		var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
         $(function () {
-            $.ajax({
-                url:"/jypay/invoice/show",
-                type:"POST",
-                data:{"order_code":order_code},
-                success:function (r) {
-                    console.log("rrrr",r)
-                    if (r.data !=""){
-                        $(".taitou").text(r.data.invoice_type)
-                        $("#phone_num").text(r.data.phone);
-                        $("#identification_number").text(r.data.taxpayer_identnum)
-                        if(r.data.company_name == null||r.data.company_name == ""){
-                            $("#company").hide()
-                            $("#id_number").hide()
-                        }else{
-                            $("#company_name").text(r.data.company_name)
-                            $("#identification_number").text(r.data.taxpayer_identnum)
-                        }
-                        $("#e-mail").text(r.data.mail)
-                        if (r.status == "success"){
-                            $("#process li").addClass("active")
-                            $("#processing").hide()
-                            $("#change").show()
-                            download_url = r.data.url
-                            $("#show_invoice").attr('href_',r.data.url);
-                            if (r.data.invoice_changed == 1){
-                                $(".j-footer").html("");
-                                var checkinvoice = ' <div class="j-button-group" id="processing" onclick="download(\''+download_url+'\')"><a id="show_invoice" href_='+r.data.url+' + class="j-button-confirm">查看发票</a></div>'
-                                $(".j-footer").append(checkinvoice)
-
-                            }
-
-                        }else{
-                            if (r.data.invoice_status == -1){
-                                $(".change").hide()
-                                $("#processing").hide()
-                                changed = r.data.invoice_changed
-                                $.post("/subscribepay/orderListDetails/isOver", {"order_code":order_code,"ischanged": "true"}, function(data) {
+            var interval;
+            var isOk =false;
+            checkInvoiceStatus(order_code);
+            function checkInvoiceStatus(order_code){
+                if (interval) {
+                    clearInterval(interval);
+                }
+                clicktime()
+                interval = setInterval(clicktime ,2000)
 
-                                    if(data.status==1){
-                                        $(".backInvoice").show()
-                                    }else{
-                                        window.location.href = "/jyapp/front/cantInvoice";
-                                    };
-                                })
-                            }
-                        }
-                    }else{
-                        $("#phone_num").text(r.datas.user_phone);
-                        $("#identification_number").text(r.datas.applybill_taxnum)
-                        if(typeof (r.datas.applybill_company) == "undefined"||r.datas.applybill_company == null){
-                            $("#company").hide()
-                            $("#id_number").hide()
-                        }else{
-                            $("#company_name").text(r.data.applybill_company)
-                            $("#identification_number").text(r.data.applybill_taxnum)
-                        }
-                        $("#e-mail").text(r.datas.user_mail)
-                        $("#processing").hide()
-                    }
+            }
 
-                }
-            })
             if (getParam("cc")=="replaceInv"){
               $(".again_inv").hide();
             }
@@ -254,6 +204,77 @@
                         window.open("/jyapp/front/invoice/showpage?order_code="+order_code+"&c=1&isSys=true",'_self');
                     }
         })
+
+        //查看发票接口
+        function clicktime (){
+            $.ajax({
+                url:"/jypay/invoice/show",
+                type:"POST",
+                data:{"order_code":order_code},
+                success:function (r) {
+                    console.log("rrrr",r)
+                    if (r.data !=""){
+                        $(".taitou").text(r.data.invoice_type)
+                        $("#phone_num").text(r.data.phone);
+                        $("#identification_number").text(r.data.taxpayer_identnum)
+                        if(r.data.company_name == null||r.data.company_name == ""){
+                            $("#company").hide()
+                            $("#id_number").hide()
+                        }else{
+                            $("#company_name").text(r.data.company_name)
+                            $("#identification_number").text(r.data.taxpayer_identnum)
+                        }
+                        $("#e-mail").text(r.data.mail)
+                        if (r.status == "success"){
+                            $("#process li").addClass("active")
+                            $("#processing").hide()
+                            $("#change").show()
+                            download_url = r.data.url
+                            $("#show_invoice").attr('href_',r.data.url);
+                            if (r.data.invoice_changed == 1){
+                                $(".j-footer").html("");
+                                var checkinvoice = ' <div class="j-button-group" id="processing" onclick="download(\''+download_url+'\')"><a id="show_invoice" href_='+r.data.url+' + class="j-button-confirm">查看发票</a></div>'
+                                $(".j-footer").append(checkinvoice)
+
+                            }
+                            isOk=true;
+
+                        }else{
+                            if (r.data.invoice_status == -1){
+                                $(".change").hide()
+                                $("#processing").hide()
+                                changed = r.data.invoice_changed
+                                $.post("/subscribepay/orderListDetails/isOver", {"order_code":order_code,"ischanged": "true"}, function(data) {
+
+                                    if(data.status==1){
+                                        $(".backInvoice").show()
+                                    }else{
+                                        window.location.href = "/jyapp/front/cantInvoice";
+                                    };
+                                })
+                            }
+                        }
+                    }else{
+                        $("#phone_num").text(r.datas.user_phone);
+                        $("#identification_number").text(r.datas.applybill_taxnum)
+                        if(typeof (r.datas.applybill_company) == "undefined"||r.datas.applybill_company == null){
+                            $("#company").hide()
+                            $("#id_number").hide()
+                        }else{
+                            $("#company_name").text(r.datas.applybill_company)
+                            $("#identification_number").text(r.data.applybill_taxnum)
+                        }
+                        $("#e-mail").text(r.datas.user_mail)
+                        $("#processing").hide()
+                        isOk=true;
+                    }
+
+                }
+            })
+            if (isOk) {
+                clearInterval(interval);
+            }
+        }
     </script>
 </body>
 </html>

+ 3 - 0
src/jfw/modules/app/src/web/templates/invoice/invoicing.html

@@ -147,6 +147,9 @@
                                 if (product_name == 0){  //历史数据
                                     $(".user-phone").attr("value",r.datas.user_phone)
                                     $(".user-mail").attr("value",r.datas.user_mail)
+									invoice.phoneStatus = true;
+									invoice.emailStatus = true;
+									$(".j-button-confirm").removeAttr("disabled")
                                 }
                                 if (r.datas.applybill_status == 1){
                                     $(".j-footer").hide();

+ 8 - 1
src/jfw/modules/app/src/web/templates/me/mine.html

@@ -287,8 +287,15 @@ color:#1d1d1d;
     <script src="{{Msg "seo" "cdn"}}/jyapp/js/fastclick.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/js.html"}}
     <script>
+    var isExaminePhone={{session "s_phone"}}=="18613717801";
     $(function () {
-      var isPageHide = false;   
+        if(isExaminePhone){
+          $(".u_right.govip").remove();
+        }
+        // 商机管理购买成功:记录从哪个页面跳到去购买的
+        sessionStorage.setItem('paySuccessNextStepLink', location.pathname);
+
+        var isPageHide = false;
 			window.addEventListener('pageshow', function () {      
 				if (isPageHide) {
 					location.reload();

+ 13 - 4
src/jfw/modules/app/src/web/templates/vipsubscribe/vip_introduce.html

@@ -135,10 +135,19 @@
             </div>
         </div>
         <div class="menu">
-            {{if not .T.notShowTrial }}
-                <a onclick="window.location.replace('/jyapp/vipsubscribe/trialInfo')" class="try_btn">试用7天</a>
-            {{end}}
-            <a onclick="window.location.replace('/jyapp/vipsubscribe/vipsubscribe_new')" class="subscribe_btn">去订阅</a>
+            <script>
+              var phone = {{session "s_phone"}}
+              if(phone=="18613717801"){
+                document.write('<div style="color: #2CB7CA;border-top: 1px solid #ddd;font-size: .33rem;background-color: #fff;position: absolute;left: 0px;right: 0px;top: 0px;bottom: 0px;text-align: center;">详情请咨询<span style="font-size: .28rem;padding-left: 10px;">zhengkun@topnet.net.cn</span></div>');  
+              }else{
+                var html = "";
+                {{if not .T.notShowTrial}}
+                  html += '<a onclick="window.location.replace(\'/jyapp/vipsubscribe/trialInfo\')" class="try_btn">试用7天</a>';
+                {{end}}
+                html += '<a onclick="window.location.replace(\'/jyapp/vipsubscribe/vipsubscribe_new\')" class="subscribe_btn">去订阅</a>';
+                document.write(html);
+              }
+            </script>
         </div>
     </div>
 </div>

+ 5 - 1
src/jfw/modules/app/src/web/templates/weixin/historypush.html

@@ -11,7 +11,7 @@
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/jyapp/vipsubscribe/css/weui.min.css?v={{Msg "seo" "version"}}"/>
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/jyapp/vipsubscribe/iconfont/iconfont.css?v={{Msg "seo" "version"}}"/>
     <script>
-		//
+        var isExaminePhone={{session "s_phone"}}=="18613717801";
     		function afterReceivePushMessage(type,url){
           if(type=="bid" || type=="vipreport"){
             JyObj.showRedSpotOnMenu("subscribe");
@@ -47,6 +47,10 @@
             }
         }
         $(function () {
+            if(isExaminePhone){
+              $(".app-layout-header>ul>li:eq(1)").css("visibility","hidden");
+              $(".header_header,.open_remind,.renew_toast,._renew_toast,.nv_renew_toast,.vip_report_tip").remove();
+            }
             setTimeout(function(){
               loadJS("{{Msg "seo" "cdn"}}/jyapp/js/fastclick.js?v={{Msg "seo" "version"}}",function(){
                 FastClick.attach(document.body);

+ 9 - 1
src/jfw/modules/app/src/web/templates/weixin/search/mainSearch.html

@@ -23,6 +23,10 @@
 	SuperSearch.sortArray = {{.T.sortArray}};
 	var CDN = {{Msg "seo" "cdn"}};
 	var VERSION = {{Msg "seo" "version"}};
+  var isExaminePhone={{session "s_phone"}}=="18613717801";
+  if(mySysIsIos()&&(userId==null||userId==""||isExaminePhone)){
+    localStorage.setItem("Active_Vip_Invite",new Date().getTime());
+  }
 </script>
 </head>
 <body id="home_main" class="p13">
@@ -971,7 +975,7 @@
 				if(userId==""){
 					window.location.href='/jyapp/free/login?back=index';
 				}else{
-					window.location.href='/jyapp/course/list';
+					window.location.href='/jyxsapp/';
 				}
 			},300);
     });
@@ -1028,6 +1032,10 @@
   		window.location.href = "/jyapp/free/login?to=back";
   		return;
   	}
+    var adv_name = $(e).parent().attr("adv_name");
+    if((localStorage.loginPhone=="18613717801"||isExaminePhone)&&adv_name&&adv_name.indexOf("APP搜索页轮播图")>-1){
+      return
+    }
 		//百度统计
 		var ce = $(e).parent();
  // if (ce.attr("adv_name")!="APP搜索列表页-中部"){

+ 4 - 0
src/jfw/modules/app/src/web/templates/weixin/wxkeyset/index.html

@@ -87,6 +87,7 @@
 }
 </style>
 <script>
+var isExaminePhone={{session "s_phone"}}=="18613717801";
 var isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
 var isfocusing = true;
 var focusinputindex = -1;
@@ -112,6 +113,9 @@ if(localStorage&&localStorage.tsGuide_status=="1"){
 	backUrl = "/jyapp/swordfish/historypush";
 }
 $(function(){
+  if(isExaminePhone){
+    $(".vip_banner").remove();
+  }
 	// 关闭设置弹窗
 	$('#close_set').on('click',() =>{
 		$('.msg_alert').hide();

+ 25 - 0
src/jfw/modules/datareport/src/a/init.go

@@ -0,0 +1,25 @@
+package initxweb
+
+import (
+	"service"
+	"time"
+
+	"github.com/go-xweb/httpsession"
+	"github.com/go-xweb/xweb"
+)
+
+func init() {
+	//开启redissession
+	httpsession.IsRedisSessionStore = true
+	xweb.Config.Profiler = true
+	xweb.RootApp().AppConfig.StaticFileVersion = false
+	xweb.RootApp().AppConfig.CheckXsrf = false
+	xweb.RootApp().AppConfig.EnableHttpCache = false
+	xweb.RootApp().AppConfig.Mode = xweb.Product
+	xweb.RootApp().AppConfig.ReloadTemplates = true
+	xweb.RootApp().AppConfig.SessionTimeout = 7 * 24 * time.Hour
+	xweb.RootApp().Logger.SetOutputLevel(1) //输出日志,改为4则不输出任何日志
+
+	xweb.AddRouter("/datareport/api", &service.NewDataReport{})
+	xweb.AddRouter("/datareport/api", &service.ReportOrder{})
+}

+ 31 - 0
src/jfw/modules/datareport/src/config.json

@@ -0,0 +1,31 @@
+{
+	"mongodbServers": "192.168.3.128:27080",
+    "mongodbPoolSize": 5,
+    "mongodbName": "qfw",
+    "redisaddrs": "other=192.168.3.128:1712,session=192.168.3.128:1712",
+    "webport": "92",
+    "jypayrpc":"127.0.0.1:8600",
+    "mysql": {
+        "dbName": "jianyu",
+        "address": "192.168.3.11:3366",
+        "userName": "root",
+        "passWord": "Topnet123",
+		"maxOpenConns":500,
+		"maxIdleConns":200
+    },
+    "mail": [
+        {
+            "addr": "smtp.exmail.qq.com",
+            "port": 465,
+            "pwd": "ue9Rg9Sf4CVtdm5a",
+            "user": "public03@topnet.net.cn"
+        },
+        {
+            "addr": "smtp.exmail.qq.com",
+            "port": 465,
+            "pwd": "ue9Rg9Sf4CVtdm5a",
+            "user": "public03@topnet.net.cn"
+        }
+    ],
+    "orderTimeoutHours":72
+}

+ 48 - 0
src/jfw/modules/datareport/src/config/config.go

@@ -0,0 +1,48 @@
+package config
+
+import (
+	qutil "qfw/util"
+	"qfw/util/mail"
+)
+
+type config struct {
+	MongodbServers  string
+	MongodbPoolSize int
+	MongodbName     string
+	Redisaddrs      string
+	Webport         string
+	Jypayrpc        string
+	Mysql           struct {
+		DbName       string
+		Address      string
+		UserName     string
+		PassWord     string
+		MaxOpenConns int
+		MaxIdleConns int
+	}
+	Mail []struct {
+		Addr string
+		Port int
+		Pwd  string
+		User string
+	}
+	OrderTimeoutHours int
+}
+
+var Config *config
+
+//发送邮件邮箱
+var GmailAuth []*mail.GmailAuth
+
+func init() {
+	qutil.ReadConfig(&Config)
+	for _, v := range Config.Mail {
+		mail := &mail.GmailAuth{
+			SmtpHost: v.Addr,
+			SmtpPort: v.Port,
+			User:     v.User,
+			Pwd:      v.Pwd,
+		}
+		GmailAuth = append(GmailAuth, mail)
+	}
+}

+ 109 - 0
src/jfw/modules/datareport/src/entity/report.go

@@ -0,0 +1,109 @@
+package entity
+
+import (
+	. "config"
+	"errors"
+	"log"
+	"net/rpc"
+	frpc "qfw/util/rpc"
+)
+
+var JyReportMamager reportOrder
+
+type reportOrder struct {
+}
+
+type ReportOutline struct {
+	ReportId    string //报告id
+	ReportName  string //报告名称
+	BrforePrice int    //原价
+	Price       int    //价格
+	Pushtime    int64  //发布日期
+	CoverUrl    string //封面地址
+	Email       string
+	Phone       string
+	Company     string
+}
+
+//创建订单
+func (this *reportOrder) CreateOrder(userid, openid string, outline ReportOutline) (string, error) {
+	r, err := rpc.DialHTTP("tcp", Config.Jypayrpc)
+	if err != nil {
+		return "", err
+	}
+	param := frpc.JyPayOrderParam{
+		Price:       outline.Price,
+		ProductType: "DATAREPORT",
+		Userid:      userid,
+		Openid:      openid,
+		Detail: map[string]interface{}{
+			"report_id":   outline.ReportId,
+			"report_name": outline.ReportName,
+			"s_price":     outline.BrforePrice,
+			"i_price":     outline.Price,
+			"l_pushtime":  outline.Pushtime,
+			"cover_url":   outline.CoverUrl,
+			"email":       outline.Email,
+			"phone":       outline.Phone,
+			"company":     outline.Company,
+		},
+	}
+	resData := frpc.JyPayOrderResult{}
+	err = r.Call("JyPayRpc.CreateOrder", param, &resData)
+	if err != nil {
+		return "", err
+	}
+	if resData.Status == -1 { //出错
+		return "", errors.New(resData.Err)
+	} else { //成功
+		return resData.OrderCode, nil
+	}
+}
+
+//选择支付方式
+func (this *reportOrder) FlushOrder(ordercode, pay_way, openid, ip string) (string, error) {
+	r, err := rpc.DialHTTP("tcp", Config.Jypayrpc)
+	if err != nil {
+		return "", err
+	}
+	param := frpc.JyPayOrderChangeParam{
+		ProductType: "DATAREPORT",
+		OrderCode:   ordercode,
+		Ip:          ip,
+		Openid:      openid,
+		PayWay:      pay_way,
+	}
+	resData := frpc.JyPayOrderResult{}
+	err = r.Call("JyPayRpc.FlushOrder", param, &resData)
+	if err != nil {
+		return "", err
+	}
+	if resData.Status == -1 { //出错
+		return "", errors.New(resData.Err)
+	} else { //成功
+		return resData.PayStr, nil
+	}
+}
+
+//关闭订单
+func (this *reportOrder) CloseOrder(ordercode string) error {
+	r, err := rpc.DialHTTP("tcp", Config.Jypayrpc)
+	if err != nil {
+		log.Println("DialHTTP: ", err)
+	}
+	param := frpc.JyPayOrderCloseParam{
+		ProductType: "DATAREPORT",
+		OrderCode:   ordercode,
+	}
+	resData := frpc.JyPayOrderResult{}
+	err = r.Call("JyPayRpc.CloseOrder", param, &resData)
+	if err != nil {
+		return nil
+	}
+	if resData.Status == -1 { //出错
+		log.Println(resData.Err)
+		return errors.New(resData.Err)
+	} else { //成功
+		return nil
+	}
+}

+ 9 - 0
src/jfw/modules/datareport/src/filter/filter.go

@@ -0,0 +1,9 @@
+package filter
+
+import (
+	"github.com/go-xweb/xweb"
+)
+
+func init() {
+	xweb.AddFilter(&sessionfilter{App: xweb.RootApp()})
+}

+ 22 - 0
src/jfw/modules/datareport/src/filter/sessionfilter.go

@@ -0,0 +1,22 @@
+package filter
+
+import (
+	"net/http"
+
+	"github.com/go-xweb/xweb"
+)
+
+//登录限制
+type sessionfilter struct {
+	App *xweb.App
+}
+
+//继承过滤器方法
+func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
+	session := l.App.SessionManager.Session(req, w)
+	if session.Get("userId") == nil {
+		w.Write([]byte("{\"error_code\":1001,\"error_msg\":\"需要登录\"}"))
+		return false
+	}
+	return true
+}

+ 17 - 0
src/jfw/modules/datareport/src/main.go

@@ -0,0 +1,17 @@
+package main
+
+import (
+	_ "a"
+	. "config"
+	_ "filter"
+	"net/http"
+	_ "service"
+	_ "util"
+
+	"github.com/go-xweb/xweb"
+)
+
+func main() {
+	mux1 := http.NewServeMux()
+	xweb.RunBase(":"+Config.Webport, mux1)
+}

+ 309 - 0
src/jfw/modules/datareport/src/service/newDataReport.go

@@ -0,0 +1,309 @@
+package service
+
+import (
+	. "api"
+	"config"
+	"encoding/json"
+	"entity"
+	"fmt"
+	"log"
+	"math"
+	qutil "qfw/util"
+	"qfw/util/redis"
+	"strconv"
+	"strings"
+	"time"
+	"util"
+
+	"github.com/go-xweb/xweb"
+)
+
+//数据报告公共接口
+type NewDataReport struct {
+	*xweb.Action
+	reportList   xweb.Mapper `xweb:"/getList"`     //获取数据报告列表
+	reportDetail xweb.Mapper `xweb:"/getDetail"`   //获取数据报告详情页信息
+	orderSubmit  xweb.Mapper `xweb:"/orderSubmit"` //数据报告订单提交
+
+	sendEmailCode  xweb.Mapper `xweb:"/sendEmailCode"`  //发送邮箱验证码
+	checkEmailCode xweb.Mapper `xweb:"/checkEmailCode"` //校验邮箱验证码
+	userMsg        xweb.Mapper `xweb:"/userMsg"`        //用户信息回显
+	pay            xweb.Mapper `xweb:"/pay"`            //订单支付
+}
+
+var (
+	pageSize  = 10 //每页数据量
+	tableName = "jy_datareport"
+)
+
+//数据报告列表
+func (this *NewDataReport) ReportList() {
+	pageIndex, _ := this.GetInteger("page_index") //当前页码数
+	errMsg, data := func() (string, map[string]interface{}) {
+		pageIndex = qutil.If(pageIndex < 1, 1, pageIndex).(int)
+		key := "datareport_page_" + strconv.Itoa(pageIndex)
+		if dataArr := redis.Get("other", key); dataArr != nil {
+			counts := util.Mysql.Count(tableName, M{"report_status": 1, "isdelete": 0})
+			if counts == 0 {
+				return "未查询到数据", nil
+			}
+			pCounts := math.Ceil(float64(counts) / float64(pageSize))
+			return "", map[string]interface{}{
+				"page_count": pCounts,   //总页数
+				"page_index": pageIndex, //当前页数
+				"list":       dataArr,   //数据
+			}
+		}
+		count := util.Mysql.Count(tableName, M{"report_status": 1, "isdelete": 0})
+		if count == 0 {
+			return "未查询到数据", nil
+		}
+		rData := util.Mysql.Find(tableName, M{"report_status": 1, "isdelete": 0}, "", "create_time desc", (pageIndex-1)*pageSize, pageSize)
+		if rData == nil || len(*rData) == 0 {
+			return "数据查询异常", nil
+		}
+		resArr := []map[string]interface{}{}
+		for _, v := range *rData {
+			resArr = append(resArr, map[string]interface{}{
+				"id":           v["report_id"],
+				"title":        v["report_name"],
+				"price":        v["i_price"],
+				"before_price": v["s_price"],
+				"publishtime":  v["start_time"],
+				"img":          v["cover_url"],
+			})
+		}
+		redis.Put("other", key, resArr, 60)
+		pCount := math.Ceil(float64(count) / float64(pageSize))
+		return "", map[string]interface{}{
+			"page_count": pCount,    //总页数
+			"page_index": pageIndex, //当前页数
+			"list":       resArr,    //数据
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       data,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//数据报告详情页信息
+func (this *NewDataReport) ReportDetail() {
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "id") {
+		return
+	}
+	errMsg, rData := func() (string, map[string]interface{}) {
+		reportId := this.GetString("id") //报告id
+		key := "datareport_detail_" + reportId
+		if res := redis.Get("other", key); res != nil {
+			data := qutil.ObjToMap(res)
+			return "", map[string]interface{}{
+				"id":           (*data)["report_id"],
+				"title":        (*data)["report_name"],
+				"price":        (*data)["i_price"],
+				"before_price": (*data)["s_price"],
+				"publishtime":  (*data)["start_time"],
+				"img":          (*data)["cover_url"],
+				"content":      (*data)["s_desrice"],
+			}
+		}
+		rData := util.Mysql.FindOne(tableName, M{"report_id": reportId}, "report_id,report_name,i_price,s_price,start_time,cover_url,s_desrice", "")
+		if rData == nil {
+			return "未查询到数据", nil
+		}
+		if str, err := json.Marshal(*rData); err == nil {
+			redis.Put("other", key, string(str), 60*60)
+		} else {
+			log.Println("数据报告订单详情redis序列化错误")
+		}
+
+		return "", map[string]interface{}{
+			"id":           (*rData)["report_id"],
+			"title":        (*rData)["report_name"],
+			"price":        (*rData)["i_price"],
+			"before_price": (*rData)["s_price"],
+			"publishtime":  (*rData)["start_time"],
+			"img":          (*rData)["cover_url"],
+			"content":      (*rData)["s_desrice"],
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//订单提交
+func (this *NewDataReport) OrderSubmit() {
+	reportId := this.GetString("reportId") //报告id
+	email := this.GetString("email")
+	phone := this.GetString("phone")
+	company := this.GetString("company")
+	errMsg, rData := func() (string, map[string]interface{}) {
+		//数据校验
+		if !util.PhoneReg.MatchString(phone) || !util.EmailReg.MatchString(email) || company == "" {
+			return "数据校验不通过", nil
+		}
+		//报告校验
+		query := map[string]interface{}{"report_id": reportId, "report_status": 1, "isdelete": 0}
+		// query := map[string]interface{}{"report_id": reportId}
+		log.Println("query", query)
+		r := util.Mysql.FindOne(tableName, query, "report_id,report_name,i_price,s_price,start_time,cover_url", "")
+		if r == nil || len(*r) == 0 {
+			return "未查询到此报告", nil
+		}
+		userid := qutil.ObjToString(this.GetSession("userId"))
+		openid := qutil.ObjToString(this.GetSession("s_m_openid"))
+		startTime := qutil.Int64All((*r)["start_time"])
+		ordercode, err := entity.JyReportMamager.CreateOrder(userid, openid, entity.ReportOutline{
+			ReportId:    fmt.Sprint((*r)["report_id"]),
+			ReportName:  qutil.ObjToString((*r)["report_name"]),
+			BrforePrice: qutil.IntAll((*r)["s_price"]),
+			Price:       qutil.IntAll((*r)["i_price"]),
+			Pushtime:    startTime,
+			CoverUrl:    qutil.ObjToString((*r)["cover_url"]),
+			Email:       email,
+			Phone:       phone,
+			Company:     company,
+		})
+		if err != nil {
+			log.Printf("%s OrderSubmit CreateOrder %v\n", userid, err)
+			return "创建订单出错", nil
+		}
+		return "", map[string]interface{}{
+			"ordercode": ordercode,
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//发送邮箱验证码
+func (this *NewDataReport) SendEmailCode() {
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "email") {
+		return
+	}
+	errMsg, rData := func() (string, map[string]interface{}) {
+		email := this.GetString("email")
+		if !util.EmailReg.MatchString(email) {
+			return "邮箱校验失败", nil
+		}
+		userId := qutil.ObjToString(this.GetSession("userId"))
+		lastSendDEVerify := qutil.Int64All(this.GetSession("ReportCreateEmailCodeTime_" + userId))
+		timeSpaceing := lastSendDEVerify + 60*5 - time.Now().Unix()
+		incurKey := fmt.Sprintf("ReportSendEmailCode_%s_%d", userId, time.Now().Day())
+		if timeSpaceing >= 0 {
+			return "已发送,5分钟后再尝试", nil
+		}
+		//每日限制10次
+		times := qutil.IntAll(redis.Get("other", incurKey))
+		if times >= 10 {
+			return "已达到每日最大验证次数", nil
+		}
+		if times == 0 {
+			redis.Put("other", incurKey, 1, 24*60*60)
+		} else {
+			redis.Incr("other", incurKey)
+		}
+		//生成随机数
+		verifyStr := strings.ToUpper(qutil.GetComplexRandom(6, 3, 3))
+		this.SetSession("ReportSendEmail_"+userId, email)
+		this.SetSession("ReportSendEmailCode_"+userId, verifyStr)
+		this.SetSession("ReportCreateEmailCodeTime_"+userId, time.Now().Unix())
+		if !util.SendMailIdentCode(email, verifyStr, config.GmailAuth) {
+			return "验证码发送失败", nil
+		}
+		return "", map[string]interface{}{"status": 1}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//验证邮箱验证码
+func (this *NewDataReport) CheckEmailCode() {
+	email := this.GetString("email")
+	emailCode := this.GetString("emailCode")
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	errMsg, rData := func() (string, map[string]interface{}) {
+		ReportSendEmail := qutil.ObjToString(this.GetSession("ReportSendEmail_" + userId))
+		ReportSendEmailCode := qutil.ObjToString(this.GetSession("ReportSendEmailCode_" + userId))
+		if email != "" && emailCode == ReportSendEmailCode && emailCode != "" && email == ReportSendEmail {
+			this.DelSession("ReportSendEmailCode_" + userId)
+			this.DelSession("ReportCreateEmailCodeTime_" + userId)
+			this.DelSession("ReportSendEmail_" + userId)
+		} else {
+			return "验证码错误", nil
+		}
+		return "", map[string]interface{}{"status": 1}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//用户信息回显
+func (this *NewDataReport) UserMsg() {
+	userId, _ := this.GetSession("userId").(string)
+	errMsg, rData := func() (string, map[string]interface{}) {
+		data := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
+			"user_id":      userId,
+			"product_type": "数据报告",
+		}, "order_status,pay_time,user_mail,pay_way,filter", "create_time desc")
+		// if data != nil && qutil.IntAll((*data)["order_status"]) == 1 {
+		if data != nil {
+			str := map[string]interface{}{}
+			filterStr := qutil.ObjToString((*data)["filter"])
+			if err := json.Unmarshal([]byte(filterStr), &str); err != nil {
+				log.Printf("%s UserMsgUnmarshal 出错 [%s]\n", userId, filterStr)
+				return "查询回显信息失败", nil
+			}
+			email := str["email"]
+			phone := str["phone"]
+			company := str["company"]
+			return "", map[string]interface{}{"email": email, "phone": phone, "company": company}
+		} else {
+			return "", nil
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//订单支付
+func (this *NewDataReport) Pay() {
+	// userId, _ := this.GetSession("userId").(string)
+	orderCode := qutil.ObjToString(this.GetString("ordercode"))
+	payway := qutil.ObjToString(this.GetString("payway"))
+	openId := qutil.ObjToString(this.GetSession("s_m_openid"))
+	errMsg, rData := func() (string, map[string]interface{}) {
+		if payway == "" { //默认微信js支付
+			payway = "wx_js"
+		}
+		if !(payway == "wx_js" || payway == "wx_app" || payway == "ali_app") { //
+			return "未知支付方式", nil
+		}
+		payStr, err := entity.JyReportMamager.FlushOrder(orderCode, payway, openId, this.IP())
+		if err != nil {
+			return "支付失败", map[string]interface{}{"status": 0}
+		}
+		return "", map[string]interface{}{"status": 1, "payStr": payStr}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}

+ 225 - 0
src/jfw/modules/datareport/src/service/reportOrder.go

@@ -0,0 +1,225 @@
+package service
+
+import (
+	. "api"
+	"config"
+	"encoding/base64"
+	"encoding/json"
+	"entity"
+	"log"
+	qutil "qfw/util"
+	"strings"
+	"time"
+	"util"
+
+	"github.com/SKatiyar/qr"
+	"github.com/go-xweb/xweb"
+)
+
+type ReportOrder struct {
+	*xweb.Action
+	getPayParam xweb.Mapper `xweb:"/pay"`         //获取支付串
+	paySuccess  xweb.Mapper `xweb:"/paySuccess"`  //订单支付完成查询
+	orderDetail xweb.Mapper `xweb:"/orderDetail"` //订单详情
+}
+
+var ReportPaywayArr = []string{"wx_js", "wx_app", "wx_pc", "ali_app", "ali_pc"}
+
+//获取支付参数
+func (this *ReportOrder) GetPayParam() {
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "payway", "ordercode") {
+		return
+	}
+	errMsg, rData := func() (string, map[string]interface{}) {
+		payway := this.GetString("payway")
+		ordercode := this.GetString("ordercode")
+		//支付方式校验
+		paywayCheck := false
+		for _, v := range ReportPaywayArr {
+			if v == payway {
+				paywayCheck = true
+				break
+			}
+		}
+		if !paywayCheck {
+			return "未知支付方式", nil
+		}
+		r := util.Mysql.FindOne("dataexport_order", M{"order_code": ordercode, "user_id": this.GetSession("userId")}, "pay_way,code_url,prepay_time", "")
+		if r == nil || len(*r) == 0 {
+			return "未知订单", nil
+		}
+		payStr := (*r)["code_url"]
+		if payStr != "" && payway == (*r)["pay_way"] {
+			prepayTime, err := time.ParseInLocation(qutil.Date_Full_Layout, qutil.ObjToString((*r)["prepay_time"]), time.Local)
+			surplus_second := prepayTime.Unix() + 7200 - time.Now().Unix()
+			if payway == "wx_pc" {
+				r, _ := qr.Encode(payStr.(string), qr.M)
+				pngdat := r.PNG()
+				payStr = base64.StdEncoding.EncodeToString(pngdat)
+			}
+			if err == nil && surplus_second > 0 {
+				return "", map[string]interface{}{
+					"payStr":  payStr,
+					"timeout": surplus_second,
+				}
+			}
+		}
+		openid := qutil.ObjToString(this.GetSession("s_m_openid"))
+		payStr, err := entity.JyReportMamager.FlushOrder(ordercode, payway, openid, this.IP())
+		if err != nil {
+			log.Println(err)
+			return "创建订单出错", nil
+		}
+		if payway == "wx_pc" {
+			r, _ := qr.Encode(payStr.(string), qr.M)
+			pngdat := r.PNG()
+			payStr = base64.StdEncoding.EncodeToString(pngdat)
+		}
+		return "", map[string]interface{}{
+			"payStr":  payStr,
+			"timeout": 7200,
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//取消订单
+func (this *ReportOrder) OrderCancel() {
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "ordercode") {
+		return
+	}
+	errMsg, rData := func() (string, map[string]interface{}) {
+		return "", nil
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//订单支付是否完成
+func (this *ReportOrder) PaySuccess() {
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "ordercode") {
+		return
+	}
+	errMsg, rData := func() (string, map[string]interface{}) {
+		ordercode := this.GetString("ordercode")
+		r := util.Mysql.FindOne("dataexport_order", M{"order_code": ordercode, "user_id": this.GetSession("userId")}, "order_status", "")
+		if r == nil || len(*r) == 0 {
+			return "未知订单", nil
+		}
+		return "", map[string]interface{}{
+			"status": qutil.If(qutil.IntAll((*r)["order_status"]) == 1, 1, 0),
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}
+
+//订单详情
+func (this *ReportOrder) OrderDetail() {
+	if !R.CheckReqParam(this.ResponseWriter, this.Request, "ordercode") {
+		return
+	}
+	errMsg, rData := func() (string, map[string]interface{}) {
+		ordercode := this.GetString("ordercode")
+		allMsg := this.GetString("all")
+		r := util.Mysql.FindOne("dataexport_order", M{"order_code": ordercode, "user_id": this.GetSession("userId")},
+			"pay_way,order_money,user_mail,filter,pay_time,order_status,product_type,create_time,order_code,out_trade_no,prepay_time,applybill_status", "")
+		if r == nil || len(*r) == 0 {
+			return "未知订单", nil
+		}
+		payWay := qutil.ObjToString((*r)["pay_way"])
+		orderStatus := qutil.IntAll((*r)["order_status"])
+		if orderStatus == -1{
+			return "订单已删除",nil
+		}
+		baseMap := map[string]interface{}{
+			"state":           orderStatus,
+			"payWay":          payWay,
+			"ordercode":       (*r)["order_code"],
+			"payMoney":        (*r)["order_money"],
+			"email":           (*r)["user_mail"],
+			"productType":     "数据报告",
+			"applybillStatus": (*r)["applybill_status"],
+		}
+		//创建时间
+		createTimeStr := qutil.ObjToString((*r)["create_time"])
+		createTime, err := time.ParseInLocation(qutil.Date_Full_Layout, createTimeStr, time.Local)
+		if err == nil {
+			baseMap["createTime"] = createTime.Unix()
+		}
+		nowStamp := time.Now().Unix()
+		if orderStatus == 1 { //获取支付时间和订单号
+			payTimeStr := qutil.ObjToString((*r)["pay_time"])
+			payTime, _ := time.ParseInLocation(qutil.Date_Full_Layout, payTimeStr, time.Local)
+			baseMap["payTime"] = payTime.Unix()
+			baseMap["paymentId"] = func() string {
+				table := "weixin_pay"
+				if strings.Index(payWay, "ali") > -1 {
+					table = "ali_pay"
+				}
+				wxpaydata := util.Mysql.FindOne(table, map[string]interface{}{
+					"out_trade_no": qutil.ObjToString((*r)["out_trade_no"]),
+				}, "transaction_id", "")
+				if wxpaydata != nil && len(*wxpaydata) > 0 { //线下支付没有微信订单编号
+					return qutil.ObjToString((*wxpaydata)["transaction_id"])
+				}
+				return ""
+			}()
+		} else if orderStatus == 0 {
+			//订单支付剩余时间
+			orderTimeout := createTime.Add(time.Duration(config.Config.OrderTimeoutHours)*time.Hour).Unix() - nowStamp
+			if orderTimeout <= 0 {
+				//订单状态已取消
+				baseMap["state"] = -2
+				util.Mysql.Update("dataexport_order", map[string]interface{}{
+					"order_code": ordercode,
+				}, map[string]interface{}{
+					"order_status": -2,
+				})
+			} else {
+				if strings.Index(payWay, "pc") > -1 { //返回二维码有效时间
+					if prepayTime, err := time.ParseInLocation(qutil.Date_Full_Layout, qutil.ObjToString((*r)["prepay_time"]), time.Local); err == nil {
+						baseMap["surplusTime"] = prepayTime.Unix() + 7200 - nowStamp
+					}
+				} else { //返回订单有效时间
+					baseMap["surplusTime"] = orderTimeout
+				}
+			}
+		}
+
+		if allMsg == "" {
+			return "", baseMap
+		}
+		productInfo := map[string]interface{}{}
+		if filter := qutil.ObjToString((*r)["filter"]); filter != "" {
+			detailMap := map[string]interface{}{}
+			if json.Unmarshal([]byte(filter), &detailMap) == nil {
+				productInfo["productName"] = detailMap["report_name"]
+				productInfo["phone"] = detailMap["phone"]
+				productInfo["entName"] = detailMap["company"]
+				productInfo["releaseTime"] = detailMap["l_pushtime"] //发布时间
+				productInfo["email"] = detailMap["email"]            //
+				productInfo["beforePrice"] = detailMap["s_price"]    //原价
+			}
+		}
+		return "", map[string]interface{}{
+			"productInfo": productInfo,
+			"orderInfo":   baseMap,
+		}
+	}()
+	this.ServeJson(Result{
+		Data:       rData,
+		Error_msg:  errMsg,
+		Error_code: qutil.If(errMsg == "", 0, -1).(int),
+	})
+}

BIN
src/jfw/modules/datareport/src/src


+ 66 - 0
src/jfw/modules/datareport/src/util/common.go

@@ -0,0 +1,66 @@
+package util
+
+import (
+	"config"
+	"fmt"
+	"log"
+	"qfw/util/mail"
+	"regexp"
+	"time"
+)
+
+var (
+	EmailReg = regexp.MustCompile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$")
+	PhoneReg = regexp.MustCompile("^[1][3-9][0-9]{9}$")
+)
+
+//发送邮件
+func ReportSendMail(target_mail, html string) {
+	for k, v := range config.GmailAuth {
+		if mail.GSendMail("剑鱼标讯", target_mail, "", "", "数据报告", html, "", "", v) {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送数据报告邮件成功", v.User))
+			break
+		}
+		if k < len(config.GmailAuth)-1 {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送数据报告邮件失败!3s后使用其他邮箱尝试", v.User))
+		} else {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送数据报告邮件失败!", v.User))
+		}
+		time.Sleep(time.Second * 3)
+	}
+}
+
+//发送邮箱验证码
+func SendMailIdentCode(to, code string, auth []*mail.GmailAuth) bool {
+	html := fmt.Sprintf(`<div>
+            <div>
+                  %s,您好!
+            </div>
+            <div style="padding: 20px 70px 10px 70px;">
+                  <p>您正在验证邮箱地址,请在邮件验证码输入框输入下方验证码:</p>
+                  <span style="font-weight: bold;font-size: x-large;">%s</span>
+                  <p>请勿向任何人泄露您收到的验证码。</p>
+                  <p>如果您没有使用剑鱼标讯,请忽略此邮件。</p>
+                  <p>此为系统邮件,请勿回复。</p>
+                  <p>如有疑问,请联系客服 400-108-6670。</p>
+            </div>
+            <div>
+                  <p>此致</p>
+                  <p>剑鱼标讯</p>
+            </div>      
+      </div>`, to, code)
+
+	for k, v := range auth {
+		if mail.GSendMail("剑鱼标讯", to, "", "", "剑鱼标讯邮箱校验", html, "", "", v) {
+			log.Println(to, fmt.Sprintf("使用%s发送邮件成功", v.User))
+			return true
+		}
+		if k < len(auth)-1 {
+			log.Println(to, fmt.Sprintf("使用%s发送邮件失败!3s后使用其他邮箱尝试", v.User))
+		} else {
+			log.Println(to, fmt.Sprintf("使用%s发送邮件失败!", v.User))
+		}
+		time.Sleep(time.Second * 3)
+	}
+	return false
+}

+ 36 - 0
src/jfw/modules/datareport/src/util/db.go

@@ -0,0 +1,36 @@
+package util
+
+import (
+	. "config"
+	mg "qfw/mongodb"
+	"qfw/util/mysql"
+	"qfw/util/redis"
+)
+
+var MQFW mg.MongodbSim
+var Mysql *mysql.Mysql
+
+func init() {
+	//初始化redis
+	redisConfig := Config.Redisaddrs
+	if redisConfig != "" {
+		redis.InitRedisBySize(redisConfig, 100, 30, 300)
+	}
+	//初始化mongodb
+	MQFW = mg.MongodbSim{
+		MongodbAddr: Config.MongodbServers,
+		Size:        Config.MongodbPoolSize,
+		DbName:      Config.MongodbName,
+	}
+	MQFW.InitPool()
+	//初始化mysql
+	Mysql = &mysql.Mysql{
+		Address:      Config.Mysql.Address,
+		UserName:     Config.Mysql.UserName,
+		PassWord:     Config.Mysql.PassWord,
+		DBName:       Config.Mysql.DbName,
+		MaxOpenConns: Config.Mysql.MaxOpenConns,
+		MaxIdleConns: Config.Mysql.MaxIdleConns,
+	}
+	Mysql.Init()
+}

+ 154 - 7
src/jfw/modules/subscribepay/src/entity/dataReportStruct.go

@@ -2,7 +2,14 @@ package entity
 
 import (
 	"config"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"log"
+	"pay"
 	qutil "qfw/util"
+	frpc "qfw/util/rpc"
+	"strconv"
 	"time"
 	"util"
 )
@@ -11,31 +18,171 @@ import (
 type dataReportStruct struct{}
 
 var JyDataReportStruct dataReportStruct
+var DataReportSign map[string]string
+
+func init() {
+	DataReportSign = map[string]string{
+		"wx_app":  pay.WX_DATAREPORT_APP,
+		"wx_js":   pay.WX_DATAREPORT_JSAPI,
+		"wx_pc":   pay.WX_DATAREPORT_NATIVE,
+		"ali_app": pay.ALI_DATAREPORT_APP,
+		"ali_pc":  pay.ALI_DATAREPORT_NATIVE,
+	}
+}
 
 func (this *dataReportStruct) PayCallBack(param *CallBackParam) (update bool) {
-	orderdata := util.Mysql.FindOne("jy_datareport_order", map[string]interface{}{
+	orderdata := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
 		"out_trade_no": param.OutTradeno,
 		"order_money":  param.TotalFee,
-	}, "order_status,report_id,user_mail", "")
-
+	}, "order_status,create_time,user_mail,user_openid,product_type,order_code,filter", "")
 	if orderdata != nil {
 		now := time.Now()
 		order_status := qutil.IntAll((*orderdata)["order_status"])
 		if order_status == 0 {
-			update = util.Mysql.Update("jy_datareport_order", map[string]interface{}{
+			payTime := qutil.FormatDate(&now, qutil.Date_Full_Layout)
+			update = util.Mysql.Update("dataexport_order", map[string]interface{}{
 				"out_trade_no": param.OutTradeno,
 				"order_money":  param.TotalFee,
 			}, map[string]interface{}{
 				"pay_money":    param.CashFee,
-				"pay_time":     qutil.FormatDate(&now, qutil.Date_Full_Layout),
+				"pay_time":     payTime,
 				"order_status": 1,
-				//"pay_way":      "wx_js",
 			})
 			if update {
 				//发送数据
-				go SendDatareportMailToPayUser(qutil.IntAll((*orderdata)["report_id"]), param.OutTradeno, qutil.ObjToString((*orderdata)["user_mail"]), config.GmailAuth)
+				str := map[string]interface{}{}
+				filterStr := qutil.ObjToString((*orderdata)["filter"])
+				if err := json.Unmarshal([]byte(filterStr), &str); err != nil {
+					log.Printf("Unmarshal 出错 [%s]\n", filterStr)
+					return false
+				}
+				orderCode := qutil.ObjToString((*orderdata)["order_code"])
+				createTime := qutil.ObjToString((*orderdata)["create_time"])
+				price := param.CashFee
+				prices := strconv.FormatFloat(float64(price)/100, 'f', -1, 64)
+				email := qutil.ObjToString(str["email"])
+				phone := qutil.ObjToString(str["phone"])
+				company := qutil.ObjToString(str["company"])
+				report_id := qutil.IntAll(str["report_id"])
+				openid := qutil.ObjToString((*orderdata)["user_openid"])
+				product_type := qutil.ObjToString((*orderdata)["product_type"])
+				report_name := qutil.ObjToString(str["report_name"])
+				go sendtemp(openid, orderCode, report_name+" "+product_type, payTime)
+				go SendDatareportMailToPayUser(report_id, prices, param.OutTradeno, email, orderCode, phone, company, createTime, payTime, config.GmailAuth)
 			}
 		}
 	}
 	return
 }
+
+//创建订单
+func (this *dataReportStruct) NewOrder(param frpc.JyPayOrderParam) (ordercode string, err error) {
+	//插入数据库
+	now := time.Now()
+	ordercode = pay.GetOrderCode(param.Userid)
+	detailByte, marshalErr := json.Marshal(param.Detail)
+	if marshalErr != nil {
+		err = marshalErr
+		return
+	}
+
+	orderId := util.Mysql.Insert("dataexport_order", map[string]interface{}{
+		"order_money":    param.Price,
+		"order_status":   0,
+		"user_openid":    param.Openid,
+		"order_code":     ordercode,
+		"product_type":   "数据报告",
+		"create_time":    qutil.FormatDate(&now, qutil.Date_Full_Layout),
+		"prepay_time":    qutil.FormatDate(&now, qutil.Date_Full_Layout),
+		"original_price": param.Price,
+		"filter_id":      qutil.If(param.Detail != nil && param.Detail["report_id"] != nil, param.Detail["report_id"], ""), //课程id
+		"pay_way":        param.PayWay,
+		"user_id":        param.Userid,
+		"user_phone":     param.Detail["phone"],
+		"user_mail":      param.Detail["email"],
+		"filter":         string(detailByte), //订单详情
+	})
+	if orderId <= 0 {
+		err = errors.New("订单插入失败")
+		return
+	}
+	return
+}
+
+//更新订单
+func (this *dataReportStruct) FlushOrder(param frpc.JyPayOrderChangeParam) (string, error) {
+	productSign, ok := DataReportSign[param.PayWay]
+	if !ok || productSign == "" {
+		return "", errors.New("未知支付类型")
+	}
+	//查询订单
+	res := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
+		"order_code":   param.OrderCode,
+		"order_status": 0,
+	}, "order_money,out_trade_no,pay_way", "")
+	if res == nil || len(*res) == 0 {
+		return "", errors.New("未找到订单" + param.OrderCode)
+	}
+	price := qutil.IntAll((*res)["order_money"])
+	if price == 0 {
+		return "", errors.New("查询金额异常" + param.OrderCode)
+	}
+	//关闭之前交易
+	pay.CloseOrder(qutil.ObjToString((*res)["pay_way"]), qutil.ObjToString((*res)["out_trade_no"]))
+
+	//创建支付串
+	tradeno, prepayid, payParam, payErr := pay.CreateOrderPay(price, productSign, param.Ip, param.Openid, param.PayWay)
+	if payErr != nil {
+		return "", payErr
+	}
+	now := time.Now()
+	if !util.Mysql.Update("dataexport_order", map[string]interface{}{
+		"order_status": 0,
+		"order_code":   param.OrderCode,
+	}, map[string]interface{}{
+		"prepay_time":  qutil.FormatDate(&now, qutil.Date_Full_Layout),
+		"prepay_id":    prepayid,
+		"code_url":     payParam,
+		"out_trade_no": tradeno,
+		"pay_way":      param.PayWay,
+	}) {
+		return "", errors.New(fmt.Sprintf("%s,%s更新数据库出错", param.OrderCode, param.PayWay))
+	}
+	return payParam, nil
+}
+
+func (this *dataReportStruct) CloseOrder(ordercode string) error {
+	err := pay.CloseOrderByOrderCode(ordercode)
+	if err != nil {
+		return err
+	}
+	if !util.Mysql.Update("dataexport_order", map[string]interface{}{
+		"order_status": 0,
+		"order_code":   ordercode,
+	}, map[string]interface{}{
+		"order_status": -2,
+	}) {
+		return errors.New(fmt.Sprintf("%s关闭订单更新数据库出错", ordercode))
+	}
+	return nil
+}
+
+func sendtemp(openid, order_coded, product_type, pay_time string) {
+	if openid == "" || order_coded == "" || product_type == "" || pay_time == "" {
+		fmt.Println("数据报告模板参数异常")
+	} else {
+		ok, status := frpc.WxPush(config.Config.Weixinrpc, "WeiXinRpc.SendDataReportMsg", &frpc.NotifyMsg{
+			Openid:  openid,
+			Title:   "尊敬的客户,您的订单已支付成功",
+			Detail:  product_type, //产品类型
+			Service: order_coded,  //订单编号
+			Date:    pay_time,     //支付时间
+			Remark:  "数据报告将以电子版形式发送至您的邮箱,请注意垃圾邮件过滤,感谢您的光临",
+			Url:config.Config.WebDomain+"/datareport/page/order/detail/"+order_coded,
+
+		})
+		if !ok {
+			fmt.Println("数据报告", order_coded, ok, status)
+		}
+	}
+}

+ 14 - 5
src/jfw/modules/subscribepay/src/entity/dataexport.go

@@ -6,6 +6,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"io/ioutil"
 	"log"
 	"os"
 	qutil "qfw/util"
@@ -21,10 +22,18 @@ import (
 	"gopkg.in/mgo.v2/bson"
 )
 
-var ExConf *DataexportConfig
+var (
+	ExConf          *DataexportConfig
+	reportEmailHtml string
+)
 
 func init() {
 	qutil.ReadConfig("./dataexport.json", &ExConf)
+	r, err := os.Open("./reportEmailTemplate.html")
+	log.Println("MailHtmlError", err)
+	defer r.Close()
+	bs, _ := ioutil.ReadAll(r)
+	reportEmailHtml = string(bs)
 }
 
 //价格配置文件
@@ -872,15 +881,15 @@ func GetPriceDes_SieveCondition(minPrice, maxPrice string) string {
 }
 
 //数据报告发送邮件
-func SendDatareportMailToPayUser(report_id int, out_trade_no, user_mail string, auth []*mail.GmailAuth) {
+func SendDatareportMailToPayUser(report_id int, price, out_trade_no, user_mail, order_code, phone, company, create_time, pay_time string, auth []*mail.GmailAuth) {
 	res := util.Mysql.FindOne("jy_datareport", map[string]interface{}{
 		"report_id": report_id,
-	}, "s_url", "")
-	if res == nil || (*res)["s_url"] == "" {
+	}, "report_url", "")
+	if res == nil || (*res)["report_url"] == "" {
 		log.Println("%d:未知数据报告\n", report_id)
 		return
 	}
-	mailcontent := fmt.Sprintf(ExConf.DataReportContent, config.Config.WebDomain+(*res)["s_url"].(string))
+	mailcontent := fmt.Sprintf(reportEmailHtml, config.Config.WebDomain+(*res)["report_url"].(string), order_code, create_time, pay_time, price, user_mail, phone, company)
 	if SendRetryMail(ExConf.Mail_retry, user_mail, "数据报告", mailcontent, "", nil, auth) {
 		log.Printf("用户%s:数据报告附件邮件发送成功!数据报告id:%d\n", user_mail, report_id)
 		now := time.Now()

+ 175 - 0
src/jfw/modules/subscribepay/src/entity/jyCourseOnlineStruct.go

@@ -0,0 +1,175 @@
+package entity
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"pay"
+	qutil "qfw/util"
+	frpc "qfw/util/rpc"
+	"time"
+	"util"
+
+	"gopkg.in/mgo.v2/bson"
+)
+
+//剑鱼线上课程
+
+type jyCourseOnline struct{}
+
+var JyCourseOnline jyCourseOnline
+
+var CourseProductSign map[string]string
+
+func init() {
+	CourseProductSign = map[string]string{
+		"wx_app":  pay.WX_COURSEONLINE_APP,
+		"wx_js":   pay.WX_COURSEONLINE_JSAPI,
+		"wx_pc":   pay.WX_COURSEONLINE_NATIVE,
+		"ali_app": pay.ALI_COURSEONLINE_APP,
+		"ali_pc":  pay.ALI_COURSEONLINE_NATIVE,
+	}
+}
+
+//支付完成回调
+func (this *jyCourseOnline) PayCallBack(param *CallBackParam) bool {
+	now := time.Now()
+	update := false
+	orderdata := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
+		"out_trade_no": param.OutTradeno,
+		"order_money":  param.TotalFee,
+		"product_type": "线上课程",
+	}, "id,order_status,order_money,order_code,filter_id,user_id", "")
+	pay_time := qutil.FormatDate(&now, qutil.Date_Full_Layout)
+	if orderdata != nil {
+		order_status := qutil.IntAll((*orderdata)["order_status"])
+		if order_status == 0 {
+			update = util.Mysql.Update("dataexport_order", map[string]interface{}{
+				"order_status": 0,
+				"out_trade_no": param.OutTradeno,
+				"order_money":  param.TotalFee,
+			}, map[string]interface{}{
+				"pay_money":    param.CashFee,
+				"pay_time":     pay_time,
+				"order_status": 1,
+			})
+			courseId := qutil.ObjToString((*orderdata)["filter_id"])
+			if update && courseId != "" {
+				//更新课程销量
+				util.MQFW.Update("jy_course", &map[string]interface{}{
+					"_id": qutil.StringTOBsonId(courseId),
+				}, &map[string]interface{}{
+					"$inc": bson.M{"i_tradeRate": 1},
+				}, false, false)
+				//取消此用户其他此课程订单
+				util.Mysql.Update("dataexport_order", map[string]interface{}{
+					"user_id":      (*orderdata)["user_id"],
+					"filter_id":    courseId,
+					"order_status": 0,
+				}, map[string]interface{}{
+					"order_status": -2,
+				})
+			}
+		} else {
+			update = true
+		}
+	}
+	return update
+}
+
+//生成订单
+func (this *jyCourseOnline) NewOrder(param frpc.JyPayOrderParam) (ordercode string, err error) {
+	productSign, ok := CourseProductSign[param.PayWay]
+	if !ok || productSign == "" {
+		err = errors.New("未知支付类型")
+		return
+	}
+	//创建支付串
+	tradeno, prepayid, payParam, payErr := pay.CreateOrderPay(param.Price, productSign, param.Ip, param.Openid, param.PayWay)
+	if payErr != nil {
+		err = payErr
+		return
+	}
+	//插入数据库
+	now := time.Now()
+	ordercode = pay.GetOrderCode(param.Userid)
+	detailByte, marshalErr := json.Marshal(param.Detail)
+	if marshalErr != nil {
+		err = marshalErr
+		return
+	}
+	orderId := util.Mysql.Insert("dataexport_order", map[string]interface{}{
+		"order_money":    param.Price,
+		"order_status":   0,
+		"user_openid":    param.Openid,
+		"prepay_id":      prepayid,
+		"code_url":       payParam,
+		"out_trade_no":   tradeno,
+		"order_code":     ordercode,
+		"product_type":   "线上课程",
+		"create_time":    qutil.FormatDate(&now, qutil.Date_Full_Layout),
+		"prepay_time":    qutil.FormatDate(&now, qutil.Date_Full_Layout),
+		"original_price": param.Price,
+		"filter_id":      qutil.If(param.Detail != nil && param.Detail["_id"] != nil, param.Detail["_id"], ""), //课程id
+		"pay_way":        param.PayWay,
+		"user_id":        param.Userid,
+		"filter":         string(detailByte), //订单详情
+	})
+	if orderId <= 0 {
+		err = errors.New("订单插入失败")
+		return
+	}
+	return
+}
+
+//更新订单
+func (this *jyCourseOnline) FlushOrder(param frpc.JyPayOrderChangeParam) (string, error) {
+	productSign, ok := CourseProductSign[param.PayWay]
+	if !ok || productSign == "" {
+		return "", errors.New("未知支付类型")
+	}
+	//查询订单
+	res := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": param.OrderCode}, "order_money", "")
+	if res == nil || len(*res) == 0 {
+		return "", errors.New("未找到订单" + param.OrderCode)
+	}
+	price := qutil.IntAll((*res)["order_money"])
+	if price == 0 {
+		return "", errors.New("查询金额异常" + param.OrderCode)
+	}
+	//创建支付串
+	tradeno, prepayid, payParam, payErr := pay.CreateOrderPay(price, productSign, param.Ip, param.Openid, param.PayWay)
+	if payErr != nil {
+		return "", payErr
+	}
+	now := time.Now()
+	if !util.Mysql.Update("dataexport_order", map[string]interface{}{
+		"order_status": 0,
+		"order_code":   param.OrderCode,
+	}, map[string]interface{}{
+		"prepay_time":  qutil.FormatDate(&now, qutil.Date_Full_Layout),
+		"prepay_id":    prepayid,
+		"code_url":     payParam,
+		"out_trade_no": tradeno,
+		"pay_way":      param.PayWay,
+	}) {
+		return "", errors.New(fmt.Sprintf("%s,%s更新数据库出错", param.OrderCode, param.PayWay))
+	}
+	return payParam, nil
+}
+
+func (this *jyCourseOnline) CloseOrder(ordercode string) error {
+	err := pay.CloseOrderByOrderCode(ordercode)
+	if err != nil {
+		return err
+	}
+	if !util.Mysql.Update("dataexport_order", map[string]interface{}{
+		"order_status": 0,
+		"order_code":   ordercode,
+	}, map[string]interface{}{
+		"order_status": -2,
+	}) {
+		return errors.New(fmt.Sprintf("%s关闭订单更新数据库出错", ordercode))
+	}
+	return nil
+}

+ 3 - 2
src/jfw/modules/subscribepay/src/filter/sessionfilter.go

@@ -17,10 +17,11 @@ func (l *sessionfilter) Do(w http.ResponseWriter, req *http.Request) bool {
 	rqu := req.URL.Path
 	if strings.HasPrefix(rqu, "/jypay/callback/") || //支付回调
 		strings.HasPrefix(rqu, "/jypay/weixin/reward/") || //打赏跳转
-		strings.HasPrefix(rqu, "/jypay/course/free") ||
+		strings.HasPrefix(rqu, "/jypay/course/free") || //招投标课程
 		strings.HasPrefix(rqu, "/jypay/invoice/callback") ||
 		strings.HasPrefix(rqu, "/subscribepay/index/getIndexMessage") ||
-		strings.HasPrefix(rqu, "/res/dataexport") {
+		strings.HasPrefix(rqu, "/res/dataexport") ||
+		rqu == "/jypay/wx/getwxSdkSign" { //微信js调用参数
 		return true
 	}
 	session := l.App.SessionManager.Session(req, w)

+ 8 - 3
src/jfw/modules/subscribepay/src/main.go

@@ -4,14 +4,16 @@ import (
 	_ "a"
 	. "config"
 	_ "filter"
-	"github.com/go-xweb/xweb"
 	"log"
 	"net/http"
 	"net/rpc"
+	"qfw/util/endless"
 	"rpcfollow"
 	_ "service"
 	"timetask"
 	_ "util"
+
+	"github.com/go-xweb/xweb"
 )
 
 func main() {
@@ -20,8 +22,11 @@ func main() {
 		frpc := new(rpcfollow.JyPayRpc)
 		rpc.Register(frpc)
 		rpc.HandleHTTP()
-
-		err := http.ListenAndServe(":"+Config.Webrpcport, nil)
+		// err := http.ListenAndServe(":"+Config.Webrpcport, nil)
+		// if err != nil {
+		// 	log.Println("ListenAndServe: ", err)
+		// }
+		err := endless.ListenAndServe(":"+Config.Webrpcport, nil, func() {})
 		if err != nil {
 			log.Println("ListenAndServe: ", err)
 		}

+ 37 - 28
src/jfw/modules/subscribepay/src/pay/aliPay.go

@@ -18,16 +18,17 @@ import (
 )
 
 type aliPayStruct struct {
-	Appid            string
-	PrivateKey       *rsa.PrivateKey //请求接口秘钥
-	AliPublicKey     *rsa.PublicKey  //支付完成回调,校验使用(取支付宝后台)
-	CallBackUrl      string          //支付完成回调地址
-	Requseturl       string          //接口请求地址
-	Subject_sjdc     string          //支付小标题
-	Subject_sjbg     string          //支付小标题
-	Subject_subvip   string          //支付小标题
-	Subject_course   string          //支付小标题
-	Subject_entniche string          //支付小标题
+	Appid                string
+	PrivateKey           *rsa.PrivateKey //请求接口秘钥
+	AliPublicKey         *rsa.PublicKey  //支付完成回调,校验使用(取支付宝后台)
+	CallBackUrl          string          //支付完成回调地址
+	Requseturl           string          //接口请求地址
+	Subject_sjdc         string          //支付小标题
+	Subject_sjbg         string          //支付小标题
+	Subject_subvip       string          //支付小标题
+	Subject_course       string          //支付小标题
+	Subject_courseOnline string          //支付小标题
+	Subject_entniche     string          //支付小标题
 }
 
 var Alipay *aliPayStruct
@@ -44,16 +45,17 @@ func init() {
 		panic(err)
 	}
 	Alipay = &aliPayStruct{
-		Appid:            qutil.ObjToString(config.AliPayConf["appid"]),
-		PrivateKey:       privateKey,
-		AliPublicKey:     aliPublicKey,
-		CallBackUrl:      qutil.ObjToString(config.Config.WebDomain) + "/jypay/callback/aliPay",
-		Requseturl:       qutil.ObjToString(config.AliPayConf["reqUrl"]),
-		Subject_sjdc:     qutil.ObjToString(config.AliPayConf["Subject_sjdc"]),
-		Subject_sjbg:     qutil.ObjToString(config.AliPayConf["Subject_sjbg"]),
-		Subject_subvip:   qutil.ObjToString(config.AliPayConf["Subject_subvip"]),
-		Subject_course:   qutil.ObjToString(config.AliPayConf["Subject_course"]),
-		Subject_entniche: qutil.ObjToString(config.AliPayConf["Subject_entniche"]),
+		Appid:                qutil.ObjToString(config.AliPayConf["appid"]),
+		PrivateKey:           privateKey,
+		AliPublicKey:         aliPublicKey,
+		CallBackUrl:          qutil.ObjToString(config.Config.WebDomain) + "/jypay/callback/aliPay",
+		Requseturl:           qutil.ObjToString(config.AliPayConf["reqUrl"]),
+		Subject_sjdc:         qutil.ObjToString(config.AliPayConf["Subject_sjdc"]),
+		Subject_sjbg:         qutil.ObjToString(config.AliPayConf["Subject_sjbg"]),
+		Subject_subvip:       qutil.ObjToString(config.AliPayConf["Subject_subvip"]),
+		Subject_course:       qutil.ObjToString(config.AliPayConf["Subject_course"]),
+		Subject_entniche:     qutil.ObjToString(config.AliPayConf["Subject_entniche"]),
+		Subject_courseOnline: qutil.ObjToString(config.AliPayConf["Subject_courseOnline"]),
 	}
 }
 
@@ -68,25 +70,32 @@ const (
 	ALI_DATAEXPORT_NATIVE = "z" //支付宝数据导出-扫码支付
 	ALI_DATAEXPORT_APP    = "Z" //支付宝数据导出-app支付
 	ALI_DATAREPORT_APP    = "X" //支付宝数据报告-app支付
-	ALI_SUBVIP_NATIVE     = "y" //支付宝vip订阅-扫码支付
-	ALI_SUBVIP_APP        = "Y" //支付宝数vip订阅--扫码支付
-	ALI_COURSE_NATIVE     = "v" //剑鱼招投标课程-扫码支付
-	ALI_COURSE_APP        = "V" //剑鱼招投标课程-app支付
-	ALI_ENTNICHE_APP      = "U" //支付宝企业商机管理--app支付
+	ALI_DATAREPORT_NATIVE = "x" //支付宝数据报告-扫码支付
+
+	ALI_SUBVIP_NATIVE       = "y" //支付宝vip订阅-扫码支付
+	ALI_SUBVIP_APP          = "Y" //支付宝数vip订阅--扫码支付
+	ALI_COURSE_NATIVE       = "v" //剑鱼招投标课程-扫码支付
+	ALI_COURSE_APP          = "V" //剑鱼招投标课程-app支付
+	ALI_ENTNICHE_APP        = "U" //支付宝企业商机管理--app支付
+	ALI_ENTNICHE_NATIVE     = "u" //支付宝企业商机管理--app支付
+	ALI_COURSEONLINE_NATIVE = "t" //剑鱼线上课程-扫码支付
+	ALI_COURSEONLINE_APP    = "T" //剑鱼线上课程-app支付
 )
 
 func (w *aliPayStruct) GetTradeno(tradenoSign string) (string, string) {
 	tradeno, subject := "", ""
 	if tradenoSign == ALI_DATAEXPORT_NATIVE || tradenoSign == ALI_DATAEXPORT_APP {
 		subject = w.Subject_sjdc
-	} else if tradenoSign == ALI_DATAREPORT_APP {
+	} else if tradenoSign == ALI_DATAREPORT_APP || tradenoSign == ALI_DATAREPORT_NATIVE {
 		subject = w.Subject_sjbg
-	} else if tradenoSign == ALI_SUBVIP_NATIVE || tradenoSign == ALI_SUBVIP_APP {
+	} else if tradenoSign == ALI_SUBVIP_NATIVE || tradenoSign == ALI_SUBVIP_APP || tradenoSign == ALI_SUBVIP_NATIVE {
 		subject = w.Subject_subvip
 	} else if tradenoSign == ALI_COURSE_NATIVE || tradenoSign == ALI_COURSE_APP {
 		subject = w.Subject_course
-	} else if tradenoSign == ALI_ENTNICHE_APP {
+	} else if tradenoSign == ALI_ENTNICHE_APP || tradenoSign == ALI_ENTNICHE_NATIVE {
 		subject = w.Subject_entniche
+	} else if tradenoSign == ALI_COURSEONLINE_NATIVE || tradenoSign == ALI_COURSEONLINE_APP {
+		subject = w.Subject_courseOnline
 	}
 	tradeno = fmt.Sprintf("%s_%d%s%s", tradenoSign, time.Now().UnixNano(), qutil.GetRandom(5), qutil.GetLetterRandom(6))
 	return tradeno, subject

+ 77 - 0
src/jfw/modules/subscribepay/src/pay/util.go

@@ -15,8 +15,85 @@ import (
 	qutil "qfw/util"
 	"strings"
 	"time"
+	"util"
 )
 
+/*
+公共创建订单
+price 价格
+productSign 产品种类标识
+ip 用户ip(仅微信支付需要)
+openid 用户openid(仅微信支付需要)
+payWay 支付方式
+*/
+func CreateOrderPay(price int, productSign, ip, openid, payWay string) (tradeno, prepayid, payParam string, err error) {
+	switch payWay {
+	case "wx_js", "wx_app", "wx_pc": //微信公众号支付,微信app支付,微信扫码支付
+		var ret *map[string]string
+		tradeno, ret = WxStruct.CreatePrepayOrder(productSign, ip, openid, "", price)
+		log.Println(tradeno, ret)
+		if ret == nil {
+			err = errors.New("创建异常")
+			return
+		}
+		if (*ret)["status"] != "1" {
+			errMsg := "创建微信订单出错"
+			if (*ret)["errcodedes"] != "" {
+				errMsg = (*ret)["errcodedes"]
+			} else if (*ret)["errcode"] != "" {
+				errMsg = (*ret)["errcode"]
+			}
+			err = errors.New(errMsg)
+			return
+		}
+		prepayid = qutil.ObjToString((*ret)["prepayid"])
+		if payWay == "wx_js" {
+			payParam = WxStruct.GetWxjsPaySign(prepayid)
+		} else if payWay == "wx_app" {
+			payParam = WxStruct.GetAppWxPayStr(prepayid)
+		} else if payWay == "wx_pc" {
+			payParam = (*ret)["codeurl"]
+		}
+	case "ali_app", "ali_pc": //支付宝app支付,支付宝扫码支付
+		payParam, tradeno, err = Alipay.GetOrderPayParam(qutil.Float64All(price), productSign)
+		if err != nil {
+			errors.New("创建支付宝订单出错")
+			return
+		}
+	}
+	return
+}
+
+//关闭订单
+func CloseOrderByOrderCode(ordercode string) error {
+	res := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": ordercode}, "out_trade_no,pay_way", "")
+	if res == nil || len(*res) == 0 {
+		return errors.New("关闭订单出错,未找到订单" + ordercode)
+	}
+	tradeno := qutil.ObjToString((*res)["out_trade_no"])
+	if tradeno == "" {
+		return errors.New("关闭订单出错,tradeno异常" + ordercode)
+	}
+	payWay := qutil.ObjToString((*res)["pay_way"])
+	if payWay == "" {
+		return errors.New("关闭订单出错,pay_way异常" + ordercode)
+	}
+	if !CloseOrder(tradeno, payWay) {
+		return errors.New(fmt.Sprintf("%s关闭订单异常%s", ordercode, payWay))
+	}
+	return nil
+}
+
+func CloseOrder(tradeno, payWay string) bool {
+	if strings.HasPrefix(payWay, "wx") {
+		return WxStruct.CloseOrder(tradeno, payWay)
+
+	} else if strings.HasPrefix(payWay, "ali") {
+		return Alipay.CloseOrder(tradeno)
+	}
+	return false
+}
+
 //创建订单号
 func GetOrderCode(id string) string {
 	return fmt.Sprintf("%s%s", time.Now().Format("150405"), qutil.GetRandom(6))

+ 29 - 18
src/jfw/modules/subscribepay/src/pay/wxPay.go

@@ -12,18 +12,25 @@ import (
 )
 
 const (
-	WX_REWARD_JSAPI      = "a" //微信打赏
-	WX_DATAEXPORT_NATIVE = "b" //数据导出-扫码支付
-	WX_DATAEXPORT_JSAPI  = "c" //数据导出-微信js支付
-	WX_DATAEXPORT_APP    = "C" //数据导出-微信app支付
-	WX_DATAREPORT_JSAPI  = "d" //数据报告-微信js支付
-	WX_DATAREPORT_APP    = "D" //数据报告-微信app支付
-	WX_SUBVIP_JSAPI      = "e" //VIP订阅-js支付
-	WX_SUBVIP_APP        = "E" //VIP订阅-APP支付
-	WX_COURSE_JSAPI      = "f" //剑鱼招投标课程-js支付
-	WX_COURSE_APP        = "F" //剑鱼招投标课程-APP支付
-	WX_COURSE_NATIVE     = "g" //剑鱼招投标课程-扫码支付
-	WX_ENTNICHE_APP      = "H" //企业商机管理-APP支付
+	WX_REWARD_JSAPI        = "a" //微信打赏
+	WX_DATAEXPORT_NATIVE   = "b" //数据导出-扫码支付
+	WX_DATAEXPORT_JSAPI    = "c" //数据导出-微信js支付
+	WX_DATAEXPORT_APP      = "C" //数据导出-微信app支付
+	WX_DATAREPORT_JSAPI    = "d" //数据报告-微信js支付
+	WX_DATAREPORT_APP      = "D" //数据报告-微信app支付
+	WX_SUBVIP_JSAPI        = "e" //VIP订阅-js支付
+	WX_SUBVIP_APP          = "E" //VIP订阅-APP支付
+	WX_COURSE_JSAPI        = "f" //剑鱼招投标课程-js支付
+	WX_COURSE_APP          = "F" //剑鱼招投标课程-APP支付
+	WX_COURSE_NATIVE       = "g" //剑鱼招投标课程-扫码支付
+	WX_ENTNICHE_APP        = "H" //企业商机管理-APP支付
+	WX_COURSEONLINE_JSAPI  = "i" //课程线上课程-js支付
+	WX_COURSEONLINE_APP    = "I" //剑鱼线上课程-APP支付
+	WX_COURSEONLINE_NATIVE = "j" //剑鱼线上课程-扫码支付
+	WX_DATAREPORT_NATIVE   = "k" //数据报告-扫码支付
+	WX_SUBVIP_NATIVE       = "l" //VIP订阅-APP支付
+	WX_ENTNICHE_NATIVE     = "m" //VIP订阅-APP支付
+
 )
 
 var WxStruct *WeixinStruct
@@ -41,6 +48,7 @@ type WeixinStruct struct {
 	Subvip_msg        string
 	Entniche_msg      string
 	Course_msg        string
+	CourseOnline_msg  string
 	OpenidSwitch      *map[string]interface{}
 }
 
@@ -60,6 +68,7 @@ func init() {
 		Subvip_msg:        util.ObjToString(payConfig["subvip_msg"]),
 		Entniche_msg:      util.ObjToString(payConfig["entniche_msg"]),
 		Course_msg:        util.ObjToString(payConfig["course_msg"]),
+		CourseOnline_msg:  util.ObjToString(payConfig["courseOnline_msg"]),
 		OpenidSwitch:      util.ObjToMap(config.WxPayConf["openidSwitch"]),
 	}
 }
@@ -78,24 +87,26 @@ func (w *WeixinStruct) CreatePrepayOrder(tradeno, ip, openid, detailmsg string,
 		attachmsg, bodymsg = w.Dashang_attachmsg, w.Dashang_bodymsg
 	} else if tradeno == WX_DATAEXPORT_NATIVE || tradeno == WX_DATAEXPORT_JSAPI || tradeno == WX_DATAEXPORT_APP { //数据导出
 		attachmsg, bodymsg, detailmsg = w.sjdc_msg, w.sjdc_msg, w.sjdc_msg
-	} else if tradeno == WX_DATAREPORT_JSAPI || tradeno == WX_DATAREPORT_APP { //数据报告
+	} else if tradeno == WX_DATAREPORT_JSAPI || tradeno == WX_DATAREPORT_APP || tradeno == WX_DATAREPORT_NATIVE { //数据报告
 		attachmsg, bodymsg, detailmsg = w.Sjbg_msg, w.Sjbg_msg, w.Sjbg_msg
-	} else if tradeno == WX_SUBVIP_JSAPI || tradeno == WX_SUBVIP_APP { //vip订阅
+	} else if tradeno == WX_SUBVIP_JSAPI || tradeno == WX_SUBVIP_APP || tradeno == WX_SUBVIP_NATIVE { //vip订阅
 		attachmsg, bodymsg, detailmsg = w.Subvip_msg, w.Subvip_msg, w.Subvip_msg
 	} else if tradeno == WX_COURSE_NATIVE || tradeno == WX_COURSE_APP || tradeno == WX_COURSE_JSAPI { //招投标课程
 		attachmsg, bodymsg, detailmsg = w.Course_msg, w.Course_msg, w.Course_msg
-	} else if tradeno == WX_ENTNICHE_APP {
+	} else if tradeno == WX_ENTNICHE_APP || tradeno == WX_ENTNICHE_NATIVE {
 		attachmsg, bodymsg, detailmsg = w.Entniche_msg, w.Entniche_msg, w.Entniche_msg
+	} else if tradeno == WX_COURSEONLINE_APP || tradeno == WX_COURSEONLINE_JSAPI || tradeno == WX_COURSEONLINE_NATIVE {
+		attachmsg, bodymsg, detailmsg = w.CourseOnline_msg, w.CourseOnline_msg, w.CourseOnline_msg
 	}
 	//支付类型分类
 
 	tradeType, appid := "", w.Appid
-	if tradeno == WX_REWARD_JSAPI || tradeno == WX_DATAEXPORT_JSAPI || tradeno == WX_DATAREPORT_JSAPI || tradeno == WX_SUBVIP_JSAPI || tradeno == WX_COURSE_JSAPI { //微信js支付
+	if tradeno == WX_REWARD_JSAPI || tradeno == WX_DATAEXPORT_JSAPI || tradeno == WX_DATAREPORT_JSAPI || tradeno == WX_SUBVIP_JSAPI || tradeno == WX_COURSE_JSAPI || tradeno == WX_COURSEONLINE_JSAPI { //微信js支付
 		tradeType = "JSAPI"
-	} else if tradeno == WX_DATAEXPORT_APP || tradeno == WX_DATAREPORT_APP || tradeno == WX_SUBVIP_APP || tradeno == WX_COURSE_APP || tradeno == WX_ENTNICHE_APP { //app支付
+	} else if tradeno == WX_DATAEXPORT_APP || tradeno == WX_DATAREPORT_APP || tradeno == WX_SUBVIP_APP || tradeno == WX_COURSE_APP || tradeno == WX_ENTNICHE_APP || tradeno == WX_COURSEONLINE_APP { //app支付
 		tradeType = "APP"
 		appid = w.Appid_app
-	} else if tradeno == WX_DATAEXPORT_NATIVE || tradeno == WX_COURSE_NATIVE { //扫码支付
+	} else if tradeno == WX_DATAEXPORT_NATIVE || tradeno == WX_COURSE_NATIVE || tradeno == WX_COURSEONLINE_NATIVE || tradeno == WX_DATAREPORT_NATIVE || tradeno == WX_ENTNICHE_NATIVE || tradeno == WX_SUBVIP_NATIVE { //扫码支付
 		tradeType = "NATIVE"
 	}
 	tradeno = w.GetTradeno(tradeno)

+ 2 - 0
src/jfw/modules/subscribepay/src/pay_config.json

@@ -12,6 +12,7 @@
             "sjbg_msg": "剑鱼标讯-数据报告",
             "subvip_msg":"剑鱼标讯-vip订阅",
             "course_msg":"剑鱼标讯-招投标课程",
+            "courseOnline_msg":"剑鱼标讯-线上课程",
 			"entniche_msg":"剑鱼标讯-企业商机管理"
         },
         "openidSwitch": {
@@ -32,6 +33,7 @@
         "Subject_sjbg": "剑鱼数据报告",
         "Subject_subvip": "剑鱼VIP订阅",
         "Subject_course":"剑鱼标讯-招投标课程",
+		"Subject_courseOnline":"剑鱼标讯-线上课程",
 		"Subject_entniche": "企业商机管理",
         "privateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAtO7CU4hpdcMmV43MEA8bqQJYYx+f6yvYkP0nFc/oCvU24bU6zAdK/H2H56quEwD8Dh5YtVTfUCcKqpcG9HXY11TXWKCEUQiK1tkb0o7oSSURwk6h1DdDbg8m1+H8s+k+mvMvcqVCYKYi03PIPQyJCuHmzx/vcaALXRr2HOrEFaFFA8WYST1rywiKeyrC9PCNX1aJjGADhCs3cGrdZEJc4k+2tIHTYJccx+mJ96QiEkzFhJTqEmSFPcNqNUX9uCPgeVhfHW2pRNyffvrhoEyeSr1QoOpaYyn0I5JD2axnypBFCbk6P69LY3eGNKtOe81lp9hiZbMYpXPqb6KwPXTVQQIDAQABAoIBAEbJQm276MaR2uZWK4f84S12JW5iaQZw2QGgiTIXbQkcdqRHawF3uPafhhQ0ynXU5MgBR2NqGRQasimbfLUXhgZ4wueBpUKuvOLhfekaz/YN8qy6ZsXH+TGN6/x6BYu9rSiiC+YmkZmOZgGkQqrfxJ3lU4+lRuCFZOzAJ5mYn652CHRJXy6eDgZfyFLP2ol4/ioJEhwnGFXV345DlsVgmXTEe+IfjTyuvzxBtjod4lfu3dj/f2PhPrcgvN0ZQf1ldZbS+6FkMWInMOQt/WsJ/ANfiKgQ4sPzlxIhmVjrvDlnYTc1lbFekyInzZumV0pDyId+1Y6LAjxJTAhnjFAlBSECgYEAwsQdxOiZNLtxZ8J8JCQHKERYIo7euArW0iAurF+3Q9VNeGj0voFrmfHPju5OF5BHtuc7D3lkwZG4Ac+pyQtxF5dsEMl4vBoNc6onRQFsSDVEEIpl7OBghGlg1as23tvPSMh7DKnILM9OzVfFQ9WLvwHJwLRGsM7LOtmNovq4UFsCgYEA7dE/9Avr5YtCUjij8Y2zkAxN6qb8+ggqFoPiCr91JNGaKNKV9D2K7D3Zk49TXFJm7SX2zgYFuqR2Pa9vAWh9jtmwsc8L0qpIym4J1MM5ud/Xiu9c8O/prQOr7JlICNdk8WfqGbUC83BYfWa5SDonlXFYi6x3LlXdZnvEfZF645MCgYAC2ZnR6tFrGx8StJ7abIiKR02+27ZYnRf9pSjprtDgtjtW+royG3S2oPo3jjcoUx0piQKtPEqEJpy5sg86+ObjwHx9VmVk40C1I5VFhjrOZ7EiSNQq/jGLXntjRQkdg7vpxb0/NzDNrw7pJFKnpnVQCzenkTvDlJMWvl47N04BJwKBgHnpVtuIcPlPFkSH/KMLfQ1PAXJVAEI8hTbdjLbtxuOE/34F1hFKqzjHzA2034roQxM27vpWZAF15Zdho4oZQqREPCwqc2kfGgmLt0Z2fdUnRptWcVKh6ixjQXMccKz3niuSlZNwE38wDGzciAbaqQgW/sk7NC1wnvq2X9fvCAw5AoGANG2usqWYF4x+LvbhcdrKpJsjtvkLa2u9g2/wNXdoj+tBrv310O22/YM5LOcq9MrKPlx1S1C1KLoQO9TWFZiYuQ9C/sk7/ZTNmKQxCxVV0FVPaBYp+meD6sjgoRVJvaqY0UxnJwlHWMrusPTFua7Mtogqx9cvzlQolWh5VX7N1DM=\n-----END RSA PRIVATE KEY-----",
         "callbackPublicKey":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqFZfev75+sa7O0f29qwuWeqWRQ+p59c8hz2s4aeh5Ohc08P1ls5e8UmPhaN9ZTkGwabOKN658pOhmVoa16ldKFZQ5j1hLTDS6yfKcvVs/hf1mQvsbUjtZgCfMQx5NNf1R4MsTvAqbl2l6DXMu7gHjAhKNR0QQBELv7HmYuWPE35ELQqBH0eVcvWSNV3/3zOansftY5NIT749B+Bv1uirE8PNMp20sWWqx8fMNi2EZksnWNUmnVldBqUwMJIxcXolBH/RGX5ZjBlBenoIB3PVQ8/+SPz9Hip7+QNH8utSnUlrh2AsJVtdNKIQk74Eevkn+Q+WyUVGoY0ca9DzGwh4hQIDAQAB"

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 36 - 0
src/jfw/modules/subscribepay/src/reportEmailTemplate.html


+ 65 - 0
src/jfw/modules/subscribepay/src/rpcfollow/rpc.go

@@ -3,6 +3,7 @@ package rpcfollow
 import (
 	"config"
 	"entity"
+	"errors"
 	"fmt"
 	"log"
 	qutil "qfw/util"
@@ -13,6 +14,70 @@ import (
 
 type JyPayRpc struct{}
 
+//rpc调用获取支付
+func (c *JyPayRpc) CreateOrder(param *frpc.JyPayOrderParam, res *frpc.JyPayOrderResult) error {
+	qutil.Try(func() {
+		var err error
+		if param.ProductType == "COURSEONLINE" {
+			res.OrderCode, err = entity.JyCourseOnline.NewOrder(*param)
+		} else if param.ProductType == "DATAREPORT" {
+			res.OrderCode, err = entity.JyDataReportStruct.NewOrder(*param)
+		} else {
+			err = errors.New("未知产品信息")
+		}
+		if err != nil {
+			res.Err = err.Error()
+			res.Status = -1
+		}
+		return
+	}, func(e interface{}) {})
+	return nil
+}
+
+//rpc刷新订单
+func (c *JyPayRpc) FlushOrder(param *frpc.JyPayOrderChangeParam, res *frpc.JyPayOrderResult) error {
+	qutil.Try(func() {
+		var payStr string
+		var err error
+		if param.ProductType == "COURSEONLINE" {
+			payStr, err = entity.JyCourseOnline.FlushOrder(*param)
+		} else if param.ProductType == "DATAREPORT" {
+			payStr, err = entity.JyDataReportStruct.FlushOrder(*param)
+		} else {
+			err = errors.New("未知产品信息")
+		}
+		if err != nil {
+			res.Err = err.Error()
+			res.Status = -1
+		} else {
+			res.OrderCode = param.OrderCode
+			res.PayStr = payStr
+		}
+		return
+	}, func(e interface{}) {})
+	return nil
+}
+
+//关闭订单
+func (c *JyPayRpc) CloseOrder(param *frpc.JyPayOrderCloseParam, res *frpc.JyPayOrderResult) error {
+	qutil.Try(func() {
+		var err error
+		if param.ProductType == "COURSEONLINE" {
+			err = entity.JyCourseOnline.CloseOrder(param.OrderCode)
+		} else {
+			err = errors.New("未知产品信息")
+		}
+		if err != nil {
+			res.Err = err.Error()
+			res.Status = -1
+		} else {
+			res.OrderCode = param.OrderCode
+		}
+		return
+	}, func(e interface{}) {})
+	return nil
+}
+
 //数据导出线下支付完成调用
 func (c *JyPayRpc) DateExportOrderFinishByOffline(param *frpc.DateExportData, ret *string) error {
 	log.Println("DateExportOrderFinishByOffline---", param)

+ 211 - 1
src/jfw/modules/subscribepay/src/service/commonAction.go

@@ -2,14 +2,20 @@ package service
 
 import (
 	"config"
+	"encoding/base64"
+	"encoding/json"
 	"entity"
+	"errors"
 	"log"
+	"net/rpc"
 	"pay"
 	qutil "qfw/util"
+	"qfw/util/redis"
 	"strings"
 	"time"
 	"util"
 
+	"github.com/SKatiyar/qr"
 	"gopkg.in/mgo.v2/bson"
 
 	"github.com/go-xweb/xweb"
@@ -23,7 +29,11 @@ type CommonAction struct {
 	deleteOrder   xweb.Mapper `xweb:"/deleteOrder"`           //删除订单
 	vipPaySuccess xweb.Mapper `xweb:"/vipPaySuccess"`         //数据导出是否支付成功
 
-	applyInvoice xweb.Mapper `xweb:"/applyInvoice"` //申请发票
+	applyInvoice    xweb.Mapper `xweb:"/applyInvoice"`       //申请发票
+	getwxSdkSign    xweb.Mapper `xweb:"/wx/getwxSdkSign"`    //微信js参数
+	getWxjsPayParam xweb.Mapper `xweb:"/wx/getWxjsPayParam"` //获取微信支付参数
+	getPcPayCode    xweb.Mapper `xweb:"/pc/getPayCode"`      //获取扫码支付参数
+
 }
 
 //----------------------------申请发票------------------------------------
@@ -204,3 +214,203 @@ func (d *CommonAction) VipPaySuccess() {
 		"success": success,
 	})
 }
+
+func (d *CommonAction) GetwxSdkSign() {
+	var sign []string
+	url := d.GetString("url")
+	if url != "" {
+		sign = SignJSSDK(url)
+	}
+	d.ServeJson(map[string]interface{}{
+		"wxsdk": sign,
+	})
+}
+
+func SignJSSDK(url string) []string {
+	qutil.Catch()
+	var signature []string
+	var key = "wxsignature_" + url
+	if ret := redis.Get("other", key); ret != nil {
+		if d, err := json.Marshal(ret); err == nil {
+			json.Unmarshal(d, &signature)
+		}
+	}
+	if signature == nil || len(signature) == 0 {
+		qutil.Try(func() {
+			client, err := rpc.DialHTTP("tcp", config.Config.Weixinrpc)
+			defer client.Close()
+			if err != nil {
+				log.Println(err.Error())
+				return
+			}
+			err = client.Call("WeiXinRpc.GetJSInterfaceParam", url, &signature)
+			if err != nil {
+				log.Println(err.Error())
+			}
+		}, func(e interface{}) {})
+		if signature == nil || len(signature) != 4 || signature[3] == "" {
+			signature = []string{"", "", "", ""}
+		} else {
+			redis.Put("other", key, signature, 90*60)
+		}
+	}
+	return signature
+}
+
+func (this *CommonAction) GetWxjsPayParam() {
+	orderCode := this.GetString("orderCode")
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	r := func() *entity.FuncResult {
+		//根据订单号获取订单数据
+		query := map[string]interface{}{
+			"user_id":      userId,
+			"order_code":   orderCode,
+			"order_status": 0,
+		}
+		oData := util.Mysql.FindOne("dataexport_order", query, "id,code_url,prepay_time,pay_way,order_money", "")
+		if oData == nil || len(*oData) == 0 {
+			return &entity.FuncResult{false, errors.New("未知订单"), nil}
+		}
+		//判断订单是否超过两小时
+		prepayTime, _ := time.ParseInLocation(qutil.Date_Full_Layout, qutil.ObjToString((*oData)["prepay_time"]), time.Local)
+		jsPayParam := qutil.ObjToString((*oData)["code_url"])
+		payway := qutil.ObjToString((*oData)["pay_way"])
+		if time.Now().Before(prepayTime.Add(time.Hour*2)) && jsPayParam != "" && payway == "wx_js" {
+			//未过期
+			return &entity.FuncResult{true, nil, map[string]interface{}{"res": jsPayParam}}
+		}
+		//重新生成订单
+		totalfee := qutil.IntAll((*oData)["order_money"])
+		tradeno, prepayid := "", ""
+		dotype := this.GetString("dotype")
+		productFlag := ""
+		if dotype == "vip" {
+			productFlag = pay.WX_SUBVIP_JSAPI
+		} else if dotype == "dataexport" {
+			productFlag = pay.WX_DATAEXPORT_JSAPI
+		} else if dotype == "onlineCourse" {
+			productFlag = pay.WX_COURSEONLINE_JSAPI
+		} else if dotype == "datareport" {
+			productFlag = pay.WX_DATAREPORT_JSAPI
+		} else {
+			return &entity.FuncResult{false, errors.New("未知订单类型"), nil}
+		}
+		var ret *map[string]string
+		tradeno, ret = pay.WxStruct.CreatePrepayOrder(productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), "", totalfee)
+		if ret == nil || (*ret)["status"] != "1" {
+			errMsg := "创建微信订单出错"
+			if (*ret)["errcodedes"] != "" {
+				errMsg = (*ret)["errcodedes"]
+			} else if (*ret)["errcode"] != "" {
+				errMsg = (*ret)["errcode"]
+			}
+			return &entity.FuncResult{false, errors.New(errMsg), nil}
+		}
+		prepayid = qutil.ObjToString((*ret)["prepayid"])
+		jsPayParam = pay.GetWxJsPayStr(prepayid)
+
+		//更新订单表
+		now := time.Now()
+		ok := util.Mysql.Update("dataexport_order", query, map[string]interface{}{
+			"code_url":     jsPayParam,
+			"prepay_time":  qutil.FormatDate(&now, qutil.Date_Full_Layout),
+			"out_trade_no": tradeno,
+			"prepay_id":    prepayid,
+			"pay_way":      "wx_js",
+		})
+		if !ok {
+			return &entity.FuncResult{false, errors.New("数据库操作异常"), nil}
+		}
+		return &entity.FuncResult{true, nil, map[string]interface{}{"orderCode": orderCode, "res": jsPayParam}}
+	}()
+	if r.Err != nil {
+		log.Printf("%s CreateOrder err:%v\n", userId, r.Err.Error())
+	}
+	this.ServeJson(r.Format())
+}
+
+//扫码支付公共接口
+func (this *CommonAction) GetPcPayCode() {
+	orderCode := this.GetString("orderCode")
+	payway_req := this.GetString("payway")
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	r := func() *entity.FuncResult {
+
+		//根据订单号获取订单数据
+		query := map[string]interface{}{
+			"user_id":      userId,
+			"order_code":   orderCode,
+			"order_status": 0,
+		}
+		oData := util.Mysql.FindOne("dataexport_order", query, "id,code_url,prepay_time,pay_way,order_money,product_type", "")
+		if oData == nil || len(*oData) == 0 {
+			return &entity.FuncResult{false, errors.New("未知订单"), nil}
+		}
+		payway := qutil.ObjToString((*oData)["pay_way"])
+		codeParam := qutil.ObjToString((*oData)["code_url"])
+		totalfee := qutil.IntAll((*oData)["order_money"])
+		if totalfee <= 0 {
+			return &entity.FuncResult{false, errors.New("订单金额异常"), nil}
+		}
+		if payway_req == "" { //回显之前支付方式
+			if payway == "wx_pc" || payway == "ali_pc" {
+				payway_req = payway
+			} else {
+				payway_req = "wx_pc" //默认支付方式
+			}
+		}
+		if !(payway_req == "wx_pc" || payway_req == "ali_pc") {
+			return &entity.FuncResult{false, errors.New("参数异常"), nil}
+		}
+		if payway == payway_req && codeParam != "" {
+			//判断订单是否超过两小时
+			prepayTime, _ := time.ParseInLocation(qutil.Date_Full_Layout, qutil.ObjToString((*oData)["prepay_time"]), time.Local)
+			timeout := prepayTime.Unix() + 2*60*60 - time.Now().Unix()
+			if timeout > 0 {
+				//未过期
+				return &entity.FuncResult{true, nil, map[string]interface{}{"payway": payway_req, "res": codeParam, "money": totalfee, "timeout": timeout}}
+			}
+		}
+		//重新生成订单
+		dotype := qutil.ObjToString((*oData)["product_type"])
+		productFlag := ""
+		if dotype == "企业商机管理" {
+			productFlag = qutil.If(payway_req == "wx_pc", pay.WX_ENTNICHE_NATIVE, pay.ALI_ENTNICHE_NATIVE).(string)
+		} else if dotype == "数据报告" {
+			productFlag = qutil.If(payway_req == "wx_pc", pay.WX_DATAREPORT_NATIVE, pay.ALI_DATAREPORT_NATIVE).(string)
+		} else if dotype == "VIP订阅" {
+			productFlag = qutil.If(payway_req == "wx_pc", pay.WX_SUBVIP_NATIVE, pay.ALI_SUBVIP_NATIVE).(string)
+		} else {
+			return &entity.FuncResult{false, errors.New("未知订单类型"), nil}
+		}
+		//获取订单支付串
+		log.Println(totalfee, productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), payway_req)
+		tradeno, prepayid, codeParam, err := pay.CreateOrderPay(totalfee, productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), payway_req)
+		if err != nil {
+			log.Printf("GetPcPayCode %s %s创建订单出错%v\n", userId, payway_req, err)
+			return &entity.FuncResult{false, errors.New("创建订单异常"), nil}
+		}
+		//更新订单表
+		now := time.Now()
+		ok := util.Mysql.Update("dataexport_order", query, map[string]interface{}{
+			"code_url":     codeParam,
+			"prepay_time":  qutil.FormatDate(&now, qutil.Date_Full_Layout),
+			"out_trade_no": tradeno,
+			"prepay_id":    prepayid,
+			"pay_way":      payway_req,
+		})
+		if !ok {
+			return &entity.FuncResult{false, errors.New("数据库操作异常"), nil}
+		}
+		return &entity.FuncResult{true, nil, map[string]interface{}{"payway": payway_req, "res": codeParam, "money": totalfee, "timeout": 2 * 60 * 60}}
+	}()
+	if r.Err != nil {
+		log.Printf("%s CreateOrder err:%v\n", userId, r.Err.Error())
+	}
+	if payway_req == "wx_pc" && r.Data["res"] != nil {
+		rEncode, _ := qr.Encode(qutil.ObjToString(r.Data["res"]), qr.M)
+		pngdat := rEncode.PNG()
+		r.Data["res"] = base64.StdEncoding.EncodeToString(pngdat)
+	}
+	this.ServeJson(r.Format())
+}

+ 2 - 2
src/jfw/modules/subscribepay/src/service/orderListDetails.go

@@ -572,7 +572,7 @@ func (o *OrderListDetails) SetRes(res []map[string]interface{}, queryM map[strin
 			create_time_stamp = create_time.AddDate(0, 0, i_countdown).Unix()
 		}
 		now_time_stamp := time.Now().Unix()
-		if create_time_stamp < now_time_stamp && (qutil.ObjToString(v["product_type"]) == "VIP订阅" || qutil.ObjToString(v["product_type"]) == "招投标课程" || qutil.ObjToString(v["product_type"]) == "企业商机管理") {
+		if create_time_stamp < now_time_stamp && (qutil.ObjToString(v["product_type"]) == "VIP订阅" || qutil.ObjToString(v["product_type"]) == "招投标课程" || qutil.ObjToString(v["product_type"]) == "线上课程" || qutil.ObjToString(v["product_type"]) == "企业商机管理" || qutil.ObjToString(v["product_type"]) == "数据报告") {
 			if v["order_status"] != nil {
 				order_status := qutil.Int64All(v["order_status"])
 				if order_status == 0 {
@@ -731,7 +731,7 @@ func FortyEightHoursCancel(order string, create_time_stamp, now_time_stamp int64
 		}
 		//如果超过48小时 取消订单  创建48小时后的时间戳<当前时间戳
 		if create_time_stamp < now_time_stamp {
-			if qutil.IntAll((*res)["order_status"]) == 0 && qutil.ObjToString((*res)["pay_way"]) != "transferAccounts" { //未支付状态下 删除订单需要先关闭订单
+			if qutil.IntAll((*res)["order_status"]) == 0 && qutil.ObjToString((*res)["pay_way"]) != "transferAccounts" && qutil.ObjToString((*res)["out_trade_no"]) != "" { //未支付状态下 删除订单需要先关闭订单
 				flag = pay.CloseDataExportOrder(qutil.ObjToString((*res)["pay_way"]), qutil.ObjToString((*res)["out_trade_no"]), qutil.ObjToString((*res)["prepay_time"]))
 			} else {
 				flag = true

+ 22 - 11
src/jfw/modules/subscribepay/src/service/payCallback.go

@@ -35,19 +35,15 @@ func (this *PayCallBackAction) TestPay() {
 		"user_id": userid,
 	}
 	ordercode := this.GetString("ordercode")
-	typeFlag := this.GetString("type")
-	if !(typeFlag == "dataexport" || typeFlag == "datareport" || typeFlag == "vip") {
-		this.Write("未知操作")
-		return
-	}
 	if ordercode != "" {
 		query["order_code"] = ordercode
 	}
-	rDate := util.Mysql.FindOne("dataexport_order", query, "", "create_time desc")
+	rDate := util.Mysql.FindOne("dataexport_order", query, "product_type,out_trade_no,order_money", "create_time desc")
 	if rDate == nil || len(*rDate) == 0 {
 		this.Write("未找到此订单")
 		return
 	}
+	typeFlag := qutil.ObjToString((*rDate)["product_type"])
 	thisParam := &entity.CallBackParam{
 		qutil.IntAll((*rDate)["order_money"]),
 		0,
@@ -56,24 +52,31 @@ func (this *PayCallBackAction) TestPay() {
 		"",
 		"",
 	}
-	if typeFlag == "dataexport" { //数据导出
+	if typeFlag == "数据报告" { //数据导出
 		if !entity.JyDataExportStruct.PayCallBack(thisParam) {
 			log.Printf("数据导出更新执行出错 %+v\n", thisParam)
 			this.Write("数据导出更新执行出错")
 			return
 		}
-	} else if typeFlag == "datareport" { //数据报告
+	} else if typeFlag == "数据报告" { //数据报告
 		if !entity.JyDataReportStruct.PayCallBack(thisParam) {
 			log.Printf("数据报告更新执行出错 %+v\n", thisParam)
 			this.Write("数据报告更新执行出错")
 			return
 		}
-	} else if typeFlag == "vip" { //vip订阅
+	} else if typeFlag == "VIP订阅" { //vip订阅
 		if !entity.JyVipSubStruct.PayCallBack(thisParam) {
 			log.Printf("vip订阅更新执行出错 %+v\n", thisParam)
 			this.Write("vip订阅更新执行出错")
 			return
 		}
+	} else if typeFlag == "企业商机管理" {
+		if !entity.EntnicheStruct.PayCallBack(thisParam) {
+			log.Printf("企业商机管理管理更新执行出错 %+v\n", thisParam)
+			return
+		}
+	} else {
+		this.Write("未知支付类型")
 	}
 	log.Printf("%s模拟支付成功\n", ordercode)
 	this.Write("模拟支付成功")
@@ -122,7 +125,7 @@ func (a *PayCallBackAction) AliPayCallback() {
 				log.Printf("支付宝数据导出更新执行出错 %+v\n", thisParam)
 				return false
 			}
-		} else if strings.HasPrefix(thisParam.OutTradeno, pay.ALI_DATAREPORT_APP) { //数据报告
+		} else if strings.HasPrefix(thisParam.OutTradeno, pay.ALI_DATAREPORT_APP) || strings.HasPrefix(thisParam.OutTradeno, pay.ALI_DATAREPORT_NATIVE) { //数据报告
 			if !entity.JyDataReportStruct.PayCallBack(thisParam) {
 				log.Printf("支付宝数据报告更新执行出错 %+v\n", thisParam)
 				return false
@@ -141,6 +144,10 @@ func (a *PayCallBackAction) AliPayCallback() {
 				log.Printf("支付宝企业商机管理更新执行出错 %+v\n", thisParam)
 				return false
 			}
+		} else if strings.HasPrefix(thisParam.OutTradeno, pay.ALI_COURSEONLINE_APP) || strings.HasPrefix(thisParam.OutTradeno, pay.ALI_COURSEONLINE_NATIVE) { //线上课程
+			if !entity.JyCourseOnline.PayCallBack(thisParam) {
+				log.Printf("支付宝线上课程更新执行出错 %+v\n", thisParam)
+			}
 		}
 		if !thisParam.SaveAliPayRecord() {
 			log.Printf("支付宝支付保存支付记录出错 %+v\n", thisParam)
@@ -189,7 +196,7 @@ func (p *PayCallBackAction) WxPayCallback() {
 			if update = entity.JyDataExportStruct.PayCallBack(thisParam); !update {
 				log.Printf("微信数据导出更新执行出错 %+v\n", thisParam)
 			}
-		} else if strings.HasPrefix(thisParam.OutTradeno, pay.WX_DATAREPORT_APP) || strings.HasPrefix(thisParam.OutTradeno, pay.WX_DATAREPORT_JSAPI) { //数据报告
+		} else if strings.HasPrefix(thisParam.OutTradeno, pay.WX_DATAREPORT_APP) || strings.HasPrefix(thisParam.OutTradeno, pay.WX_DATAREPORT_JSAPI) || strings.HasPrefix(thisParam.OutTradeno, pay.WX_DATAREPORT_NATIVE) { //数据报告
 			if update = entity.JyDataReportStruct.PayCallBack(thisParam); !update {
 				log.Printf("微信数据报告更新执行出错 %+v\n", thisParam)
 			}
@@ -205,6 +212,10 @@ func (p *PayCallBackAction) WxPayCallback() {
 			if update = entity.EntnicheStruct.PayCallBack(thisParam); !update {
 				log.Printf("微信企业商机管理更新执行出错 %+v\n", thisParam)
 			}
+		} else if strings.HasPrefix(thisParam.OutTradeno, pay.WX_COURSEONLINE_APP) || strings.HasPrefix(thisParam.OutTradeno, pay.WX_COURSEONLINE_JSAPI) || strings.HasPrefix(thisParam.OutTradeno, pay.WX_COURSEONLINE_NATIVE) { //线上课程
+			if update = entity.JyCourseOnline.PayCallBack(thisParam); !update {
+				log.Printf("微信线上课程更新执行出错 %+v\n", thisParam)
+			}
 		}
 		if insert = thisParam.SaveWxPayRecord(); !insert {
 			log.Printf("微信支付保存支付记录出错 %+v\n", thisParam)

+ 17 - 5
src/jfw/modules/weixin/src/config.json

@@ -8,11 +8,11 @@
     "weixinrpcport": "8083",
     "webrpcport": "127.0.0.1:8084",
     "jyop_webrpcport": "127.0.0.1:8012",
-    "webdomain": "http://web-jydev-zyh.jianyu360.cn",
-    "appid": "wxa9bf9bc2e6817908",
-    "apptoken": "top20192019",
-    "appsecret": "a06e55ae0496314b83902edb478147e9",
-    "proxysess": "http://web-jydev-zyh.jianyu360.cn/front/sess/%s",
+    "webdomain": "http://web-jydev-wky.jianyu360.cn",
+	"appid": "wx79f2cc873dbea989",
+	"apptoken": "top2016top2016",
+	"appsecret": "fb3f77e9c6725811b5c39f6d58bd58a3",
+	"proxysess": "http://web-jydev-wky.jianyu360.cn/front/sess/%s",
     "followCompany": 10,
     "welcomemsg": "用剑鱼标讯,所有功能完全免费,\n和传统的会员制说再见!\n\n<a href='%s'>点击这里</a>设置关键词,或直接回复“订阅 关键词”,如“订阅 教学设备”,您将随时随地接收招标信息!\n\n剑鱼标讯,让投标无限可能!",
     "tpl_subscribe_push_id": "IY_RWWzMlwDK6hcd6RAzTec6qre8n5r8PNOOUM_hgk0",
@@ -20,6 +20,7 @@
     "tpl_bidopen_id": "3URB-9evmkJ9wntI8iGMEl8_elSAC3wL3ZrQQX-q0cg",
     "tpl_managernotify_id": "LB0XHcbNQKcbgUdDfDncuJW10jay4EfoJ9j-UVh2j5A",
     "tpl_logapply_id": "nWhZ25_llXTKg-3ulTpwAVIdDzRxnxyQ36MdHAiANOk",
+    "tpl_datareport_id": "bkGuL_twVo6lTiMQhN_fWiE2TtqvewvPMElQ14IidCY",
     "tpl_activeapply_id": "zZ5ELQuVLfWH3a9cNAf2OBAnn30iY-ywI1rqByJ6KTI",
     "weixinAutoRpl": "感谢使用剑鱼标讯!\n1.<a href='%s'>【订阅招标信息】</a>\n2.<a href='%s'>【搜索招标信息】</a>\n3.<a href='http://mp.weixin.qq.com/mp/homepage?__biz=MzIyNTM1NDUyNw==&hid=1&sn=f9e98da1975f85011ee138a4ee5cfbe8#wechat_redirect'>【产品帮助】</a>\n4.<a href='http://www.myfans.cc/30a78e9b78'>【招标社区】</a> \n5.<a href='%s'>点击这里,查看“%s”的相关招标信息</a>\n6.快速订阅:回复“订阅”加上你的关键词,比如“订阅 教学设备”\n7.如需人工协助,请回复“客服”\n8.<a href='https://res.jianyu360.com/jyapp/free/download/normal?source=weixinAutoRpl'>下载剑鱼标讯APP,更加方便快捷</a>",
     "autoReplay": {
@@ -91,5 +92,16 @@
         }
     ],
 	"policysupport":"<a href='https://www.jianyu360.com/jyfcfg/main.html'>点击此处</a>,立即查看最新的企业扶持政策。",
+<<<<<<< HEAD
 	"policyKeys":"政策"
 }
+=======
+	"policyKeys":"政策",
+	"datareportUserReply":{
+		"title":"剑鱼标讯数据报告",
+		"url":"https://www.jianyu360.com/swordfish/SingleLogin?toHref=https%3A%2F%2Fwww.jianyu360.com%2Fdatareport%2Fpage%2Fintroduce",
+		"picUrl":"http://web-jydev-wky.jianyu360.cn/datareport/image/datareport_repy_icon.jpg",
+		"desc":"剑鱼标讯官方制作的高质量行业数据报告"
+	}
+}
+>>>>>>> release

+ 22 - 1
src/jfw/modules/weixin/src/jrpc/jrpc.go

@@ -23,12 +23,13 @@ type WeiXinRpc struct {
 	Wwx *weixin.Weixin
 }
 
-var TPL_SUBSCRIBE_PUSH_ID, TPL_PUSH_ID, TPL_BIDOPEN_ID, TPL_MANAGERNOTIFY_ID, TPL_LOGAPPLY_ID, TPL_ACTIVEAPPLY_ID string
+var TPL_SUBSCRIBE_PUSH_ID, TPL_PUSH_ID, TPL_BIDOPEN_ID, TPL_MANAGERNOTIFY_ID, TPL_LOGAPPLY_ID, TPL_ACTIVEAPPLY_ID ,TPL_DATAREPORT_ID string
 
 func init() {
 	TPL_SUBSCRIBE_PUSH_ID = config.Sysconfig["tpl_subscribe_push_id"].(string)
 	TPL_PUSH_ID = config.Sysconfig["tpl_push_id"].(string)
 	TPL_BIDOPEN_ID = config.Sysconfig["tpl_bidopen_id"].(string)
+	TPL_DATAREPORT_ID = config.Sysconfig["tpl_datareport_id"].(string)
 	TPL_MANAGERNOTIFY_ID = config.Sysconfig["tpl_managernotify_id"].(string)
 	TPL_LOGAPPLY_ID = config.Sysconfig["tpl_logapply_id"].(string)
 	TPL_ACTIVEAPPLY_ID = config.Sysconfig["tpl_activeapply_id"].(string)
@@ -89,6 +90,26 @@ func (w *WeiXinRpc) SendBidOpenMsg(param *qrpc.NotifyMsg, ret *qrpc.RpcResult) e
 	return nil
 }
 
+//数据报告订阅成功发送模板消息
+func (w *WeiXinRpc) SendDataReportMsg(param *qrpc.NotifyMsg, ret *qrpc.RpcResult) error {
+	_, err := w.Wwx.PostTemplateMessage(param.Openid, TPL_DATAREPORT_ID, param.Url,
+		weixin.TmplData{
+			"first":    weixin.TmplItem{param.Title, ""},
+			"keyword1": weixin.TmplItem{param.Detail, ""},
+			"keyword2": weixin.TmplItem{param.Service, ""},
+			"keyword3": weixin.TmplItem{param.Date, ""},
+			"keyword4": weixin.TmplItem{"无", ""},
+			"remark":   weixin.TmplItem{param.Remark, ""},
+		})
+	if err != nil {
+		*ret = "N"
+		log.Println("SendDataReportMsg error", err, param.Openid)
+	} else {
+		*ret = "Y"
+		log.Println("SendDataReportMsg success", param.Openid)
+	}
+	return nil
+}
 //发送保函消息
 func (w *WeiXinRpc) SendLOGApplyMsg(param *qrpc.NotifyMsg, ret *qrpc.RpcResult) error {
 	_, err := w.Wwx.PostTemplateMessage(param.Openid, TPL_LOGAPPLY_ID, param.Url,

+ 40 - 3
src/jfw/modules/weixin/src/wx/wx.go

@@ -793,7 +793,29 @@ func Subscribe(w ResponseWriter, r *Request) {
 			Description: subscribeReply["description"].(string),
 		}})
 	}
-
+	if source == "68" { //微信扫码登录页-登录回复
+		if redisValue := redis.Get("other", fmt.Sprintf("SingleLogin_%s", openid)); redisValue != nil {
+			if param, ok := redisValue.(map[string]interface{}); ok {
+				time.AfterFunc(time.Second, func() {
+					w.PostText(fmt.Sprintf("<a href='%s'>点击此处打开《%s》</a>", util.ObjToString(param["href"]), util.ObjToString(param["title"])))
+				})
+			}
+		}
+	}
+	if source == "69" { //数据报告-关注回复图文
+		datareportReply := util.ObjToMap(config.Sysconfig["datareportUserReply"])
+		if datareportReply != nil && len(*datareportReply) > 0 {
+			time.AfterFunc(time.Second, func() {
+				artArr := []Article{Article{
+					Title:       (*datareportReply)["title"].(string),
+					Url:         (*datareportReply)["url"].(string),
+					PicUrl:      (*datareportReply)["picUrl"].(string),
+					Description: (*datareportReply)["desc"].(string),
+				}}
+				w.PostNews(artArr)
+			})
+		}
+	}
 	//企业扶持
 	if source == "66" {
 		go w.PostText(config.Sysconfig["policysupport"].(string))
@@ -926,7 +948,22 @@ func ScanHandler(w ResponseWriter, r *Request) {
 	if isRepeatCall(openid, r.CreateTime) {
 		return
 	}
-	log.Println("openid======", openid)
+	log.Println("openid======", openid, r.EventKey)
+	if r.EventKey == "69" { //数据报告-扫码回复图文
+		datareportReply := util.ObjToMap(config.Sysconfig["datareportUserReply"])
+		if datareportReply != nil && len(*datareportReply) > 0 {
+			time.AfterFunc(time.Second, func() {
+				artArr := []Article{Article{
+					Title:       (*datareportReply)["title"].(string),
+					Url:         (*datareportReply)["url"].(string),
+					PicUrl:      (*datareportReply)["picUrl"].(string),
+					Description: (*datareportReply)["desc"].(string),
+				}}
+				w.PostNews(artArr)
+			})
+		}
+	}
+
 	m, b := tools.MQFW.FindOneByField("user", `{"s_m_openid":"`+openid+`"}`, `{"_id":1,"s_headimage":1,"o_jy":1,"o_vipjy":1,"i_vip_status":1}`)
 	if b {
 		//剑鱼标讯订阅提醒  (1:关注事件,2:扫码事件,3:发送客服消息处理,4:支付操作)
@@ -1632,7 +1669,7 @@ func vipFastSubscribe(user *map[string]interface{}, keyWord, openId, m string) (
 				},
 			},
 			"$set": bson.M{
-				"o_vipjy.l_modifydate":                                        time.Now().Unix(),
+				"o_vipjy.l_modifydate": time.Now().Unix(),
 				"o_vipjy.a_items." + strconv.Itoa(classify_index) + ".s_item": classify_name,
 			},
 		}, false, false)

+ 6 - 0
src/jfw/public/rpccall.go

@@ -23,6 +23,12 @@ func SendBidOpenMsg(p *qrpc.NotifyMsg) bool {
 	return ok
 }
 
+//发送数据报告模板消息
+func SendDataReportMsg(p *qrpc.NotifyMsg) bool {
+	ok, _ := qrpc.WxPush(rpcserver, "WeiXinRpc.SendDataReportMsg", p)
+	return ok
+}
+
 //发送保函申请消息
 func SendLOGApplyMsg(p *qrpc.NotifyMsg) bool {
 	ok, _ := qrpc.WxPush(rpcserver, "WeiXinRpc.SendLOGApplyMsg", p)

BIN
src/web/staticres/course/image/lessonsOffline.png


BIN
src/web/staticres/course/image/lessonsOnline.png


BIN
src/web/staticres/datareport/image/datareport_repy_icon.jpg


BIN
src/web/staticres/datareport/image/report_icon.png


+ 2 - 2
src/web/staticres/js/public-nav.js

@@ -9,7 +9,7 @@ $(function () {
 		    $thisWidth = $(this).width(),
 		    //当前宽度
 		$thisIndex = $(this).index();
-		if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jypc/toPushView")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1){
+		if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jypc/toPushView")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1||$href.indexOf("/orderPay")>-1){
             $navLi.find("a:not(.link)").css({"color":"#252627"});
 		}else{
 			$navLi.find("a:not(.link)").css({"color":"#fff"});
@@ -54,7 +54,7 @@ function seclectNavLi(el, $index) {
 	var $slider = $(".public-nav .jynav .slider");
 	/*获取当前这个元素的css*/
 	var $thisCss = el.eq($index).width();
-	if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1){
+	if((typeof(myPageNavIsNormal)!="undefined"&&myPageNavIsNormal==true)||$href.indexOf("supsearch")>-1||$href.indexOf("bidsearchforent")>-1||$href.indexOf("promotional/topics")>-1||$href.indexOf("list")>-1||$href.indexOf("article/content")>-1||$href.indexOf("article/bdprivate")>-1||$href.indexOf("article/mailprivate")>-1||$href.indexOf("article/bdcontent")>-1||$href.indexOf("/jyblog")>-1||$href.indexOf("/dataExport")>-1||$href.indexOf("/front/dataService.html")>-1||$href.indexOf("/front/course")>-1||$href.indexOf("/front/dataexport")>-1||$href.indexOf("/orderPay")>-1){
         el.find("a:not(.link)").css({"color":"#252627"});
 	}else{
 		el.find("a:not(.link)").css({"color":"#fff"});

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 4 - 0
src/web/staticres/order/css/bootstrap.min.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
src/web/staticres/order/css/iconfont.css


+ 237 - 0
src/web/staticres/order/css/order_detail.css

@@ -0,0 +1,237 @@
+#order_detail {
+  line-height: 1;
+  padding-top: 76px;
+  padding-bottom: 60px;
+  background-color: #fff;
+}
+
+#order_detail .order_crumb {
+  padding: 24px 0 12px;
+}
+
+#order_detail .order_crumb a {
+  display: inline-block;
+  font-size: 16px;
+  color: #1D1D1D;
+  cursor: pointer;
+  text-decoration: none;
+  font-size: 14px;
+}
+
+#order_detail .order_crumb .active {
+  color: #2CB7CA;
+}
+
+#order_detail .order_main .greenBg {
+  border-top: 2px solid #2CB7CA;
+  background-color: rgba(44, 183, 202, 0.08);
+}
+
+#order_detail .order_main .redBg {
+  border-top: 2px solid #FE737A;
+  background-color: rgba(254, 115, 122, 0.08);
+}
+
+#order_detail .order_main .greenFont {
+  color: #2CB7CA;
+}
+
+#order_detail .order_main .redFont {
+  color: #FE737A;
+}
+
+#order_detail .order_main .o_m_thead {
+  padding: 18px 30px 20px;
+}
+
+#order_detail .order_main .o_m_thead .order_id {
+  font-size: 14px;
+  line-height: 24px;
+}
+
+#order_detail .order_main .o_m_thead .order_state {
+  margin-top: 14px;
+}
+
+#order_detail .order_main .o_m_thead .order_state span:nth-child(1) {
+  float: left;
+}
+
+#order_detail .order_main .o_m_thead .order_state .go_pay {
+  float: right;
+  display: inline-block;
+  padding: 6px 24px;
+  font-size: 14px;
+  line-height: 18px;
+  background: #2CB7CA;
+  border-radius: 4px;
+  color: #fff;
+  text-decoration: none;
+}
+
+#order_detail .order_main .o_m_thead .refund_item {
+  font-size: 14px;
+  line-height: 24px;
+}
+
+#order_detail .order_main .o_m_tbody .b_list {
+  margin-top: 16px;
+  border: 1px solid #EBEBEB;
+}
+
+#order_detail .order_main .o_m_tbody .list_thead {
+  padding: 0 30px;
+  height: 36px;
+  line-height: 36px;
+  background: #F5F5FB;
+  font-size: 14px;
+  color: #1D1D1D;
+  border-top: 2px solid #AAAAAA;
+}
+
+#order_detail .order_main .o_m_tbody .list_tbody {
+  padding: 20px 30px;
+}
+
+#order_detail .order_main .o_m_tbody .tb_left {
+  width: 540px;
+  border-right: 1px solid #EBEBEB;
+  padding-right: 30px;
+}
+
+#order_detail .order_main .o_m_tbody .tb_left p {
+  line-height: 24px;
+  font-size: 14px;
+  color: #1D1D1D;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+#order_detail .order_main .o_m_tbody .tb_right {
+  padding-left: 30px;
+}
+
+#order_detail .order_main .o_m_tbody .tb_right p {
+  line-height: 24px;
+  font-size: 14px;
+  color: #1D1D1D;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+#order_detail .order_main .o_m_tbody .line {
+  width: 1140px;
+  margin: 0 auto;
+  height: 1px;
+  border-bottom: 1px dashed #E0E0E0;
+}
+
+#order_detail .order_main .o_m_tbody .check_voucher {
+  display: inline-block;
+  width: 68px;
+  height: 22px;
+  line-height: 22px;
+  font-size: 13px;
+  color: #fff;
+  background: #2CB7CA;
+  border-radius: 2px;
+  text-decoration: none;
+  text-align: center;
+}
+
+#order_detail .order_main .o_m_tbody .refund_label {
+  display: inline-block;
+  width: 70px;
+  margin-right: 36px;
+  font-size: 14px;
+  color: #1D1D1D;
+}
+
+#order_detail .order_main .o_m_tbody .refund_value {
+  font-size: 14px;
+  color: #FF3A20;
+}
+
+#order_detail .order_main .o_m_tbody .refund_select {
+  display: inline-block;
+  width: 260px;
+  height: 36px;
+  margin-top: 16px;
+  padding: 0 20px;
+  line-height: 36px;
+  vertical-align: middle;
+  font-size: 14px;
+  border: 1px solid #E0E0E0;
+  box-sizing: border-box;
+  border-radius: 4px;
+}
+
+#order_detail .order_main .o_m_tbody .refund_handle {
+  margin-top: 32px;
+  margin-bottom: 160px;
+}
+
+#order_detail .order_main .o_m_tbody .refund_handle .refund_btn .submit_btn, #order_detail .order_main .o_m_tbody .refund_handle .refund_btn .cancel_btn {
+  width: 180px;
+  height: 46px;
+  line-height: 46px;
+  text-align: center;
+  font-size: 16px;
+  border-radius: 6px;
+}
+
+#order_detail .order_main .o_m_tbody .refund_handle .refund_btn .submit_btn {
+  background-color: #2CB7CA;
+  color: #fff;
+  margin-right: 6px;
+}
+
+#order_detail .order_main .o_m_tbody .refund_handle .refund_btn .submit_btn:disabled {
+  color: rgba(255, 255, 255, 0.6);
+  cursor: no-drop;
+}
+
+#order_detail .order_main .o_m_tbody .refund_handle .refund_btn .cancel_btn {
+  background-color: #fff;
+  border: 1px solid #E0E0E0;
+  color: #1D1D1D;
+}
+
+#order_detail .toast {
+  display: none;
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  width: 144px;
+  height: 140px;
+  background: rgba(0, 0, 0, 0.65);
+  border-radius: 12px;
+  margin-top: -70px;
+  margin-left: -72px;
+  text-align: center;
+}
+
+#order_detail .toast i {
+  display: block;
+  margin-top: 26px;
+  font-size: 52px;
+  color: #fff;
+}
+
+#order_detail .toast span {
+  display: block;
+  margin-top: 14px;
+  font-size: 16px;
+  color: #fff;
+  line-height: 24px;
+}
+#order_detail .order_main .o_m_thead .service_number{
+  font-family: Microsoft YaHei;
+  font-style: normal;
+  font-weight: normal;
+  font-size: 14px;
+  line-height: 24px;
+  color: #686868;
+}

+ 442 - 0
src/web/staticres/order/css/order_pay.css

@@ -0,0 +1,442 @@
+#order_pay {
+    line-height: 1;
+    /*  padding-top: 76px;*/
+    padding-bottom: 60px;
+    background-color: #fff;
+    font-size: 14px;
+}
+
+#order_pay .op_crumb {
+    padding: 24px 0 12px;
+}
+
+#order_pay .op_crumb a {
+    display: inline-block;
+    font-size: 16px;
+    color: #1D1D1D;
+    cursor: pointer;
+    text-decoration: none;
+    font-size: 14px;
+}
+
+#order_pay .op_crumb .active {
+    color: #2CB7CA;
+}
+
+#order_pay .op_main {
+    padding: 0 30px;
+    border-top: 2px solid #2CB7CA;
+    border-left: 1px solid #EBEBEB;
+    border-right: 1px solid #EBEBEB;
+    border-bottom: 1px solid #EBEBEB;
+}
+
+#order_pay .op_main .top {
+    height: 84px;
+    border-bottom: 1px solid #E0E0E0;
+}
+
+#order_pay .op_main .top .t_left {
+    float: left;
+    padding: 34px 0 30px;
+    font-size: 16px;
+    color: #1D1D1D;
+}
+
+#order_pay .op_main .top .t_right {
+    float: right;
+}
+
+#order_pay .op_main .top .t_right .t_right_number {
+    padding-top: 16px;
+    line-height: 24px;
+    color: #686868;
+    font-size: 14px;
+}
+
+#order_pay .op_main .top .t_right .t_right_money {
+    color: #1D1D1D;
+    font-size: 14px;
+}
+
+#order_pay .op_main .top .t_right .t_right_money strong {
+    color: #FF3A20;
+    font-size: 24px;
+}
+
+#order_pay .op_main .middle {
+    padding-bottom: 40px;
+}
+
+#order_pay .op_main .middle .pay_box {
+    height: 88px;
+    line-height: 88px;
+    border-bottom: 1px solid #EBEBEB;
+}
+
+#order_pay .op_main .middle .pay_tab {
+    margin: 24px 0 24px 30px;
+}
+
+#order_pay .op_main .middle .pay_tab .tab_item {
+    width: 136px;
+    height: 40px;
+    line-height: 40px;
+    text-align: center;
+    border: 1px solid #E0E0E0;
+    border-radius: 4px;
+    float: left;
+    margin-right: 16px;
+    font-size: 14px;
+    color: #1D1D1D;
+    cursor: pointer;
+}
+
+#order_pay .op_main .middle .pay_tab .wx img {
+    width: 22px;
+    height: 20px;
+    margin-right: 8px;
+    vertical-align: middle;
+    margin-top: -4px;
+}
+
+#order_pay .op_main .middle .pay_tab .zfb img {
+    width: 20px;
+    height: 20px;
+    margin-right: 8px;
+    vertical-align: middle;
+}
+
+#order_pay .op_main .middle .pay_tab .active {
+    border-radius: 5px;
+    border: 1px solid #2CB7CA;
+    background: url(../image/bgsanjiao.png) no-repeat bottom right;
+    background-size: 19px 19px;
+}
+
+#order_pay .op_main .middle .pay_content .m_code {
+    float: left;
+    margin: 38px 0 0 214px;
+}
+
+#order_pay .op_main .middle .pay_content .m_code .warn {
+    font-size: 14px;
+    line-height: 18px;
+    color: #1D1D1D;
+}
+
+#order_pay .op_main .middle .pay_content .m_code .warn em {
+    color: #FF3A20;
+}
+
+#order_pay .op_main .middle .pay_content .m_code .qrcode_box {
+    width: 308px;
+    height: 308px;
+    margin-top: 26px;
+    border: 1px solid #E0E0E0;
+    border-radius: 4px;
+    overflow: hidden;
+}
+
+#order_pay .op_main .middle .pay_content .m_code .qrcode_box img {
+    width: 100%;
+    height: 100%;
+}
+
+#order_pay .op_main .middle .pay_content .m_code .tips {
+    margin-top: 34px;
+    margin-left: 32px;
+    color: #1D1D1D;
+    font-size: 16px;
+    line-height: 20px;
+}
+
+#order_pay .op_main .middle .pay_content .m_code .tips img {
+    width: 26px;
+    height: 26px;
+    vertical-align: middle;
+    margin-right: 10px;
+}
+
+#order_pay .op_main .middle .pay_content .m_phone {
+    float: left;
+    margin-top: 80px;
+    width: 323px;
+    height: 399px;
+}
+
+#order_pay .op_main .middle .pay_content .m_phone img {
+    width: 100%;
+    height: 100%;
+}
+
+#order_pay .op_main .middle .pay_content .m_l_title {
+    padding: 24px 0 16px;
+    color: #1D1D1D;
+    font-size: 16px;
+}
+
+#order_pay .op_main .middle .pay_content .m_l_body {
+    background: #F7F7F7;
+    padding: 20px;
+    line-height: 24px;
+    display: inline-block;
+}
+
+#order_pay .op_main .middle .pay_content .m_l_body li {
+    font-size: 14px;
+    width: 100%;
+}
+
+#order_pay .op_main .middle .pay_content .m_l_body li span:nth-child(1) {
+    color: #1D1D1D;
+}
+
+#order_pay .op_main .middle .pay_content .m_l_body li span:nth-child(2) {
+    color: #686868;
+}
+
+#order_pay .op_main .middle .pay_content .transfer_tips {
+    line-height: 24px;
+    padding: 16px 0 18px;
+    font-size: 14px;
+    color: #686868;
+    border-bottom: 1px solid #E0E0E0;
+    height: 100px;
+}
+
+#order_pay .op_main .middle .pay_content .transfer_tips li {
+    width: 100%;
+}
+
+#order_pay .op_main .middle .pay_content .example {
+    margin-left: 24px;
+    color: #2CB7CA;
+    font-size: 14px;
+    line-height: 24px;
+    cursor: pointer;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box {
+    position: relative;
+    width: 100px;
+    height: 100px;
+    border-radius: 4px;
+    background: #F7F7F7;
+    border: 1px solid #E0E0E0;
+    overflow: hidden;
+    cursor: pointer;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .input_label, #order_pay .op_main .middle .pay_content .upload .upload_box .input_file, #order_pay .op_main .middle .pay_content .upload .upload_box img, #order_pay .op_main .middle .pay_content .upload .upload_box .screen {
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    width: 100%;
+    height: 100%;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .input_label {
+    text-align: center;
+    z-index: 88;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .input_label i {
+    display: block;
+    color: #686868;
+    font-size: 24px;
+    line-height: 24px;
+    margin-top: 24px;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .input_label span {
+    font-size: 20px;
+    font-size: 14px;
+    line-height: 24px;
+    color: #686868;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .input_file {
+    opacity: 0;
+    z-index: 100;
+    cursor: pointer;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box img {
+    z-index: 101;
+    display: block;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .screen {
+    display: none;
+    z-index: 102;
+    background-color: rgba(0, 0, 0, 0.6);
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .screen .del {
+    width: 40px;
+    text-align: center;
+    margin: 30px auto;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .screen .del i {
+    display: block;
+    font-size: 16px;
+    color: #fff;
+}
+
+#order_pay .op_main .middle .pay_content .upload .upload_box .screen .del span {
+    display: block;
+    font-size: 14px;
+    color: #fff;
+    line-height: 24px;
+}
+
+#order_pay .op_main .middle .pay_content .btn_handle {
+    margin-top: 30px;
+}
+
+#order_pay .op_main .middle .pay_content .btn_handle .submit_btn, #order_pay .op_main .middle .pay_content .btn_handle .cancel_btn {
+    width: 180px;
+    height: 46px;
+    line-height: 46px;
+    text-align: center;
+    font-size: 16px;
+    border-radius: 6px;
+}
+
+#order_pay .op_main .middle .pay_content .btn_handle .submit_btn {
+    background-color: #2CB7CA;
+    color: #fff;
+    border: 1px solid #2CB7CA;
+    margin-right: 10px;
+}
+
+#order_pay .op_main .middle .pay_content .btn_handle .submit_btn:disabled {
+    background-color: #87DFEA;
+    cursor: no-drop;
+}
+
+#order_pay .op_main .middle .pay_content .btn_handle .cancel_btn {
+    background-color: #fff;
+    border: 1px solid #E0E0E0;
+    color: #1D1D1D;
+}
+
+#order_pay .toast {
+    display: none;
+    position: fixed;
+    top: 50%;
+    left: 50%;
+    width: 144px;
+    height: 140px;
+    background: rgba(0, 0, 0, 0.65);
+    border-radius: 12px;
+    margin-top: -70px;
+    margin-left: -72px;
+    text-align: center;
+}
+
+#order_pay .toast i {
+    display: block;
+    margin-top: 26px;
+    font-size: 52px;
+    color: #fff;
+}
+
+#order_pay .toast span {
+    display: block;
+    margin-top: 14px;
+    font-size: 16px;
+    color: #fff;
+    line-height: 24px;
+}
+
+.visib_ {
+    visibility: hidden;
+}
+
+.j-wx-code {
+    width: 335px;
+    height: 355px;
+    background-color: #fff;
+    -webkit-border-radius: 6px;
+    -moz-border-radius: 6px;
+    border-radius: 6px;
+    position: relative;
+
+}
+
+.j-wx-code > .code-close {
+    width: 40px;
+    height: 40px;
+    position: absolute;
+    right: -20px;
+    top: -20px;
+    cursor: pointer;
+    -webkit-transition: all 1s;
+    -o-transition: all 1s;
+    -moz-transition: all 1s;
+    transition: all 1s;
+}
+
+.j-wx-code > .code-close:hover {
+    -webkit-transform: scale(1.2);
+    -moz-transform: scale(1.2);
+    -ms-transform: scale(1.2);
+    -o-transform: scale(1.2);
+    transform: scale(1.2);
+}
+
+.j-wx-code > .code-title {
+    height: 82px;
+    background: url(/images/j-wx-code-title.png) center center no-repeat;
+    -webkit-animation: moveYun 15s infinite linear both;
+    -moz-animation: moveYun 15s infinite linear both;
+    -o-animation: moveYun 15s infinite linear both;
+    animation: moveYun 15s infinite linear both;
+}
+
+.j-wx-code > .code-wxm {
+    text-align: center;
+    margin-bottom: -6px;
+    margin-top: -16px;
+
+}
+
+.j-wx-code > .code-wxm > img {
+    width: 200px;
+    height: 200px;
+    margin-top: -5px;
+}
+
+.j-wx-code > .code-text {
+    font: 16px "microsoft yahei";
+    text-align: center;
+    color: #252627;
+}
+
+.j-wx-code > .code-bottom {
+    width: 470px;
+    height: 211px;
+    position: absolute;
+    bottom: -113px;
+    left: -73px;
+    background: url(/images/j-wx-code-bottom.png) 0 0 no-repeat;
+}
+
+.j-wx-code > .code-bottom > img {
+    position: absolute;
+    left: 280px;
+    top: 88px;
+    -webkit-animation: codeWxMove 10s linear both;
+    -moz-animation: codeWxMove 10s linear both;
+    -o-animation: codeWxMove 10s linear both;
+    animation: codeWxMove 10s linear both;
+    -webkit-animation-fill-mode: forwards;
+    -moz-animation-fill-mode: forwards;
+    -o-animation-fill-mode: forwards;
+    animation-fill-mode: forwards;
+}

+ 169 - 0
src/web/staticres/order/css/pay_success.css

@@ -0,0 +1,169 @@
+.pay_success {
+  line-height: 1;
+  padding-top: 76px;
+  padding-bottom: 60px;
+  background-color: #F5F5FB;
+}
+
+.pay_success .ps_header {
+  padding: 40px 0 16px;
+  font-size: 18px;
+  color: #1D1D1D;
+}
+
+.pay_success .ps_content {
+  padding: 0 30px;
+  border-top: 2px solid #2CB7CA;
+  background-color: #fff;
+}
+
+.pay_success .ps_content .c_top {
+  padding: 18px 0 24px;
+  border-bottom: 1px dashed #E0E0E0;
+}
+
+.pay_success .ps_content .c_top .c_t_status {
+  text-align: center;
+  font-size: 18px;
+  color: #1D1D1D;
+}
+
+.pay_success .ps_content .c_top .c_t_status img {
+  width: 100px;
+  height: 80px;
+}
+
+.pay_success .ps_content .c_top .c_t_status p {
+  line-height: 24px;
+  padding-left: 20px;
+}
+
+.pay_success .ps_content .c_top .c_t_tips {
+  margin-top: 8px;
+  text-align: center;
+  font-size: 16px;
+  line-height: 24px;
+  color: #686868;
+}
+
+.pay_success .ps_content .c_top .c_t_price {
+  margin-top: 8px;
+  text-align: center;
+  color: #FF3A20;
+  font-size: 24px;
+  line-height: 32px;
+}
+
+.pay_success .ps_content .c_bottom {
+  padding: 24px 0 222px;
+  text-align: center;
+}
+
+.pay_success .ps_content .c_bottom .order_item {
+  font-size: 14px;
+  line-height: 24px;
+  color: #888888;
+}
+
+.pay_success .ps_content .c_bottom .order_item span:nth-child(1) {
+  display: inline-block;
+  width: 80px;
+  text-align: left;
+}
+
+.pay_success .ps_content .c_bottom .order_item span:nth-child(2) {
+  display: inline-block;
+  width: 160px;
+  text-align: right;
+}
+
+.pay_success .ps_content .c_bottom .check_order {
+  display: inline-block;
+  margin-top: 32px;
+  width: 132px;
+  height: 46px;
+  line-height: 46px;
+  background-color: #2CB7CA;
+  color: #fff;
+  font-size: 16px;
+  border-radius: 6px;
+  text-decoration: none;
+  text-align: center;
+}
+.j-wx-code{
+  width: 335px;
+  height: 355px;
+  background-color: #fff;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  position: relative;
+
+}
+.j-wx-code>.code-close{
+  width: 40px;
+  height: 40px;
+  position: absolute;
+  right: -20px;
+  top: -20px;
+  cursor: pointer;
+  -webkit-transition: all 1s;
+  -o-transition: all 1s;
+  -moz-transition: all 1s;
+  transition: all 1s;
+}
+.j-wx-code>.code-close:hover{
+  -webkit-transform: scale(1.2);
+  -moz-transform: scale(1.2);
+  -ms-transform: scale(1.2);
+  -o-transform: scale(1.2);
+  transform: scale(1.2);
+}
+.j-wx-code>.code-title{
+  height: 82px;
+  background:url(/images/j-wx-code-title.png) center center no-repeat;
+  -webkit-animation: moveYun 15s infinite linear both;
+  -moz-animation: moveYun 15s infinite linear both;
+  -o-animation: moveYun 15s infinite linear both;
+  animation: moveYun 15s infinite linear both;
+}
+.j-wx-code>.code-wxm{
+  text-align: center;
+  margin-bottom: -6px;
+  margin-top: -16px;
+
+}
+.j-wx-code>.code-wxm>img{
+  width: 200px;
+  height: 200px;
+  margin-top: -5px;
+}
+.j-wx-code>.code-text{
+  font: 16px "microsoft yahei";
+  text-align: center;
+  color: #252627;
+}
+.j-wx-code>.code-bottom{
+  width: 470px;
+  height: 211px;
+  position: absolute;
+  bottom: -113px;
+  left: -73px;
+  background: url(/images/j-wx-code-bottom.png) 0 0 no-repeat;
+}
+.j-wx-code>.code-bottom>img{
+  position: absolute;
+  left: 280px;
+  top: 88px;
+  -webkit-animation: codeWxMove 10s linear both;
+  -moz-animation: codeWxMove 10s linear both;
+  -o-animation: codeWxMove 10s linear both;
+  animation: codeWxMove 10s linear both;
+  -webkit-animation-fill-mode:forwards;
+  -moz-animation-fill-mode:forwards;
+  -o-animation-fill-mode:forwards;
+  animation-fill-mode:forwards;
+}
+.onlyDiscount{
+  display: none;
+}

+ 76 - 0
src/web/staticres/order/css/reset_pc.css

@@ -0,0 +1,76 @@
+html, body, div, span, applet, object, iframe, 
+h1, h2, h3, h4, h5, h6, p, blockquote, pre, 
+a, abbr, acronym, address, big, cite, code, 
+del, dfn, em, font, img, ins, kbd, q, s, samp, 
+small, strike, strong, sub, sup, tt, var, 
+dl, dt, dd, li, 
+fieldset, form, label, legend, 
+table, caption, tbody, tfoot, thead, tr, th, td { 
+margin: 0; 
+padding: 0; 
+border: 0; 
+outline: 0; 
+font-weight: inherit; 
+font-style: inherit; 
+font-family: inherit;
+-webkit-tap-highlight-color: transparent;
+} 
+:focus { 
+outline: 0; 
+} 
+body { 
+/*line-height: 1; */
+/*color: black; 
+background: white; */
+font-family: "Microsoft YaHei",sans-serif;
+font-size: 16px;
+-webkit-font-smoothing: antialiased;
+} 
+input{
+	font-family: "Microsoft YaHei",sans-serif;
+	-webkit-appearance: none;
+}
+button{ 
+	outline: none;border: none;
+	}
+table { 
+border-collapse: separate; 
+border-spacing: 0; 
+} 
+caption, th, td { 
+text-align: left; 
+font-weight: normal; 
+} 
+textarea { resize:none;-webkit-appearance: none; }
+img{border:0;}
+a{
+	text-decoration:none;
+	color: #000;
+	font-size: 14px;
+}
+/*selet 下拉三角改变*/
+/*select {border: none;border-radius: 0;appearance:none;-moz-appearance:none;-webkit-appearance:none;background:#ffffff url(../images/public-img/pub-Xsj.png) no-repeat 95% center;}*/
+/*清除ie的默认选择框样式清除,隐藏下拉箭头*/
+/*select::-ms-expand { display: none;}
+html{-webkit-text-size-adjust: none;}	*/	
+	
+/*a:link {color:#606060;} 
+a:visited {color:#606060;} 
+a:hover{color:#8cb91e;	text-decoration: underline;}
+a:active {color:#606060;}*/
+address,caption,cite,code,dfn,em,th,b,i {font-weight: normal;font-style: normal;}
+
+.clearfix:after {visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; }
+.clearfix {*zoom:1; }
+.fl {float:left; }
+.fr {float: right; }
+.w {width: 1200px; margin: 0 auto;}
+.ellipsis {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+/*去除下拉框*/
+/*input[type="search"]::-webkit-search-cancel-button{
+  display: none;
+}*/

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
src/web/staticres/order/iconfont/iconfont.css


BIN
src/web/staticres/order/iconfont/iconfont.eot


BIN
src/web/staticres/order/iconfont/iconfont.ttf


BIN
src/web/staticres/order/iconfont/iconfont.woff


BIN
src/web/staticres/order/iconfont/iconfont.woff2


BIN
src/web/staticres/order/image/alipay.png


BIN
src/web/staticres/order/image/bgsanjiao.png


BIN
src/web/staticres/order/image/pay_success.png


BIN
src/web/staticres/order/image/qrcode.png


BIN
src/web/staticres/order/image/smallCode.png


BIN
src/web/staticres/order/image/telphone.png


BIN
src/web/staticres/order/image/wxpay.png


BIN
src/web/staticres/order/image/zhifubao.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 5 - 0
src/web/staticres/order/js/bootstrap.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
src/web/staticres/order/js/jquery-2.1.4.min.js


+ 38 - 20
src/web/staticres/pccss/public-nav-1200.css

@@ -134,26 +134,44 @@ input:-ms-input-placeholder {
 }
 
 .public-nav .more{
-  height: 75px;
-}
-
-.more .items{
-  background-color: #fff;
-  width: 95px;
-  margin-left: -10px;
-  position: absolute;
-  z-index: 999;
-  border-bottom-left-radius: 5px;
-  border-bottom-right-radius: 5px;
-  transition: all 0.5s;
+ 	height: 75px;
 }
 
-.more .items.course .link{
-  white-space: nowrap;
-  line-height: 60px;
-  cursor: pointer;
-  font-size: 15px;
-}
-.more .items.course .link:hover {
-  color: rgba(44,183,202)!important;
+.more .items.course{
+	background-color: #fff;
+	width: 100px;
+	margin-left: -10px;
+	position: absolute;
+	z-index: 999;
+	transition: all 0.5s;
+	border-radius: 4px;
+}
+.more .items.course .item{
+	height: 50px;
+	line-height:50px;
+}
+
+.more .items.course .item.item_line{
+	border-bottom: 1px solid #E0E0E0;
+}
+.more .items.course .item .link{
+	white-space: nowrap;
+	line-height: 49px;
+	cursor: pointer;
+	font-size: 15px;
+}
+.more .items.course .item a:hover {
+ 	color: rgba(44,183,202)!important;
+}
+
+.more .items.course::before {
+	content: "";
+    width: 0;
+    height: 0;
+    top: -8px;
+    margin-left: -2.5px;
+    position: absolute;
+    border-left: 5px solid transparent;
+    border-right: 5px solid transparent;
+    border-bottom: 8px solid #fff;
 }

+ 12 - 3
src/web/staticres/vipsubscribe/css/vip_index_new.css

@@ -269,7 +269,7 @@
   display: flex;
   align-items: center;
   padding: 0.18rem 0.3rem;
-  border-bottom: 1px solid #cecece;
+  /* border-bottom: 1px solid #cecece; */
 }
 
 .vip-footer .footer-preview-container .clause-box a {
@@ -280,11 +280,20 @@
   display: flex;
   align-items: center;
   padding: 0 0.3rem;
-  height: 0.94rem;
+  height: 0.76rem;
   font-size: 0.26rem;
   color: #686868;
 }
 
+.vip-footer .footer-preview-container .preview-content .billing-list-btn {
+  color: #9B9CA3;
+}
+
+.vip-footer .footer-preview-container .preview-content .billing-mon {
+  font-size: 0.32rem;
+  color: #FB483D;
+}
+
 .vip-footer .footer-preview-container .preview-content {
   flex: 1;
   display: flex;
@@ -298,7 +307,7 @@
 
 .vip-footer .footer-preview-container .preview-content .billing-price {
   font-size: 0.4rem;
-  color: #1d1d1d;
+  color: #FB483D;
 }
 
 .vip-footer .footer-button-group {

+ 9 - 4
src/web/staticres/vipsubscribe/css/vip_renew.css

@@ -124,7 +124,7 @@
     display: flex;
     align-items: center;
     padding: 0.18rem 0.3rem;
-    border-bottom: 1px solid #cecece;
+    /* border-bottom: 1px solid #cecece; */
 }
 
 .vip-footer .footer-preview-container .clause-box a {
@@ -135,7 +135,7 @@
     display: flex;
     align-items: center;
     padding: 0 0.3rem;
-    height: 0.94rem;
+    height: 0.76rem;
     font-size: 0.26rem;
     color: #686868;
 }
@@ -148,12 +148,17 @@
 }
 
 .vip-footer .footer-preview-container .preview-content .billing-list-btn {
-    color: #2cb7ca;
+    color: #9B9CA3;
+}
+
+.vip-footer .footer-preview-container .preview-content .billing-mon {
+    font-size: 0.32rem;
+    color: #FB483D;
 }
 
 .vip-footer .footer-preview-container .preview-content .billing-price {
     font-size: 0.4rem;
-    color: #1d1d1d;
+    color: #FB483D;
 }
 
 .vip-footer .footer-button-group {

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 4
src/web/staticres/wx_course/css/order_list.css


+ 40 - 11
src/web/staticres/wx_dataExport/css/pay_order.css

@@ -8,7 +8,7 @@
 }
 
 #pay_order {
-  	padding-bottom: 2.7rem;
+  	padding-bottom: 3.5rem;
     font-size: .24rem !important;
 		background: rgba(245,244,249,1);
 }
@@ -293,7 +293,7 @@ letter-spacing: 0.02rem;
 }
 #pay_order  .radio-form {
   background: transparent;
-  padding: .12rem .12rem;
+  padding: .12rem .32rem;
   border: 0;
   margin: 0;
 }
@@ -305,7 +305,7 @@ letter-spacing: 0.02rem;
           transform: scale(0.8);
 }
 #pay_order .radio-form .read {
-  font-size: .26rem;
+  font-size: .24rem;
 }
 #pay_order.radio-form .read a {
   color: #2cb7ca;
@@ -322,18 +322,47 @@ letter-spacing: 0.02rem;
           align-items: center;
   -webkit-box-pack: end;
       -ms-flex-pack: end;
-          justify-content: flex-end;
-  padding: .12rem .12rem;
+          justify-content: space-between;
+  height: .96rem;
+  padding: 0 .32rem;
 }
-#pay_order  .price span {
-  text-decoration: line-through;
+#pay_order .price .totalnum{
+  display: flex;
+  align-items: flex-start;
+  padding-top: 0.1rem;
+  height: 100%;
   font-size: .26rem;
-  color: #888;
+  color: #9B9CA3;
+  font-weight: 500;
+}
+#pay_order .price .pricenum{
+  display: flex;
+  flex-direction: column-reverse;
+}
+#pay_order   .price .pricenum .pay_bef {
+  color: #9B9CA3;
+  font-weight: 500;
+  font-size: .24rem;
+  margin-right: .18rem;
+}
+#pay_order   .price .pricenum .pay_bef .pay_before {
+  text-decoration: line-through;
+}
+#pay_order   .price .pricenum .pay_dis {
+  text-align: end;
+  color: #FB483D;
   margin-right: .18rem;
 }
-#pay_order  .price strong {
+#pay_order   .price .pricenum .pay_dis .bef_text{
+  font-size: .32rem;
+}
+#pay_order  .price .pay_discount {
   font-size: .4rem;
-  color: #1d1d1d;
+  color: #FB483D;
+  font-weight: 500;
+}
+.weui-cells:before{
+  border-top: 0;
 }
 #pay_order  .form-btn {
   display: -webkit-box;
@@ -342,7 +371,7 @@ letter-spacing: 0.02rem;
   -webkit-box-align: center;
       -ms-flex-align: center;
           align-items: center;
-	border-top:1px solid #e0e0e0;
+	/* border-top:1px solid #e0e0e0; */
 }
 #pay_order  .form-btn .btn {
   -webkit-box-flex: 1;

+ 7 - 2
src/web/templates/common/pchead.html

@@ -37,9 +37,14 @@
                     <a href="/front/dataService.html">数据服务</a>
 				</li>
 				<li class="more">
-				    <a>增值服务</a>
+				  <a>增值服务</a>
 					<div class="items course" style="display: none">
-						<a class="link" href="/front/course/list">招投标课程</a>
+            <!--<div class="item item_line">
+              <a class="link" href="/jyxspc/">线上课程</a>
+            </div>-->
+            <div class="item">
+              <a class="link" href="/front/course/list">线下课程</a>
+            </div>
 					</div>
 				</li>
 				<li class="slider"></li>

+ 54 - 2
src/web/templates/course/pc/orderPay.html

@@ -289,7 +289,6 @@
 			})
             // 删除图片
             $('.upload_box').on('click','.screen',function(){
-                console.log("删除图片")
 				//$("#upload").upload("reset");
                 $('.upload_box img').remove();
                 $('.screen').hide();
@@ -306,7 +305,6 @@
 					async: false,
 					dataType: 'json',
 					success: function(r){
-						console.log(r)
 						if(r.success){
 			                $('.toast').show("linear");
 			                setTimeout(function () {
@@ -322,6 +320,45 @@
 		})
 		//获取订单信息
 		function reloadMore(c){
+			if(pageName=="datareport"){
+				$.ajax({
+					type: 'post',
+					url: '/datareport/api/orderDetail?t='+new Date().getTime(),
+					data: {"ordercode": c,"all":true},
+					async: false,
+					dataType: 'json',
+					success: function(r){
+						if(r.data){
+							var rd = r.data;
+							var orderInfo = r.data.orderInfo
+							$(".t_right_number").text("订单编号:"+c);
+							$(".t_right_money strong").text("¥"+parseInt(orderInfo["payMoney"])/100);
+							if(orderInfo["payWay"].indexOf("wx")>-1){
+								$(".wx").addClass("active");
+								$(".pay_content .con").eq(0).show();
+								orderInfo["payWay"]="wx_pc"
+							}else{
+								$(".zfb").addClass("active");
+								$(".pay_content .con").eq(1).show();
+								orderInfo["payWay"]="ali_pc"
+							}
+							payWay = orderInfo["payWay"]
+							payTime = orderInfo["createTime"]
+							productType = "数据报告";
+							if(payWay!="transferAccounts"&&payWay!=""&&orderInfo["payMoney"]!=""&&payTime!="") {
+								OrderPay()
+							}else{
+								$(".pay_content").removeClass("visib_");
+							}
+							$(".t_right_number").text("订单编号:"+c);
+							$(".order_pay").removeClass("visib_");
+						}else{
+							alert("请求有误")
+						}
+					}
+				})
+				return
+			}
 			if(c!=""){
 				$.ajax({
 					type: 'post',
@@ -389,6 +426,16 @@
 							alert("请求有误")
 						}
 					})
+			}else if(pageName==="datareport"){
+				$(".t_left").text("订单已提交成功,请尽快支付")
+				$.post("/datareport/api/pay", {
+					payway: payWay,
+					ordercode: orderCode
+				}, function(r) {
+					if (r.data) {
+						showCode(r.data.payStr, r.data.timeout);
+					}
+				})
 			}else{
 				$(".t_left").text("订单已提交成功,请尽快支付")
 				$.post("/jypay/dataexport/getOrderPayMsg", {
@@ -416,6 +463,9 @@
 			var t = new Date(prepaytime).getTime() + limit - new Date().getTime();
 	        t=t>limit?limit:t;
 			interval_t = parseInt(t / 1000);
+			if(productType === "数据报告"){
+				interval_t = prepaytime;
+			}
 			interval = setInterval(function() {
 				var h = Math.floor(interval_t / 60 / 60 % 24);
 				var m = Math.floor(interval_t / 60 % 60);
@@ -440,6 +490,8 @@
 						if (r.success) {
 							if(productType=="招投标课程"){
 								window.location.replace("/front/course/paySuccess?code=" + orderCode);
+							}else if(productType === "数据报告"){
+								window.location.replace("/front/course/paySuccess?code=" + orderCode + "&pageName="+ productType);
 							}else{
 								window.location.replace("/front/dataExport/paysuccess?code=" + orderCode);
 							}

+ 209 - 203
src/web/templates/course/pc/order_detail.html

@@ -1,29 +1,29 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>订单详情</title>
-    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/css/bootstrap.min.css?v={{Msg "seo" "version"}}">
-    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
-    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/css/reset_pc.css?v={{Msg "seo" "version"}}">
-    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/css/order_detail.css?v={{Msg "seo" "version"}}">
-    {{include "/common/pnc.html"}}
-    <link href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "vebrsion"}}" rel="stylesheet">
-    <link href="{{Msg "seo" "cdn"}}/css/dev2/reset_pc.css?v={{Msg "seo" "version"}}" rel="stylesheet">
-    <link rel="stylesheet" type="text/css" href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}" />
-    <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}"></script>
-    <!--[if lt IE 9]>
-            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.3/html5shiv.js"></script>
-            <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
-        <![endif]-->
-    <style>
-        #myModal {
-            display: none;
-        }
-		.openinvoice, .lookinvoice{
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>订单详情</title>
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/css/bootstrap.min.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/css/reset_pc.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/course/css/order_detail.css?v={{Msg "seo" "version"}}">
+    {{include "/common/pnc.html"}}
+    <link href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "vebrsion"}}" rel="stylesheet">
+    <link href="{{Msg "seo" "cdn"}}/css/dev2/reset_pc.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+    <link rel="stylesheet" type="text/css" href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}" />
+    <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}"></script>
+    <!--[if lt IE 9]>
+            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.3/html5shiv.js"></script>
+            <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
+        <![endif]-->
+    <style>
+        #myModal {
+            display: none;
+        }
+		.openinvoice, .lookinvoice{
 			float: right;
 			display: inline-block;
 			padding: 6px 24px;
@@ -32,180 +32,186 @@
 			background: #2CB7CA;
 			border-radius: 4px;
 			color: #fff;
-			text-decoration: none;
-		}
-    </style>
-</head>
-<body>
-{{include "/common/pchead.html"}}
-    <!-- header -->
-    <!-- main  START -->
-    <div class="order_detail" id="order_detail">
-        <div class="w order_crumb">
-            <a href="#" onclick="window.location.href='/front/dataExport/toMyOrder'">我的订单</a><em> > </em>
-            <a href="#" class="active">订单详情</a>
-        </div>
-        <div class="w order_main">
-            <!-- greenBg 为绿色背景及边框 redBg为红色背景及边框 -->
-            <div class="o_m_thead greenBg">
-                <p class="order_id"></p>
-                <p class="clearfix order_state">
-                    <span class="refund_wait_verify">
-                    <span class="redFont hide" id="status_refund_verify">退款审核中</span>
-                    <span class="greenFont hide" id="status_refunded">已退款</span>
-
-                    </span>
-                    <!--greenFont为绿色字体 redFont为红色字体 -->
-                    <span class="greenFont hide" id="status_success">已完成</span>
-                    <span class="redFont hide" id="status_wait_pay">待付款</span>
-                    <span class="redFont hide" id="status_verify">转账审核中</span>
-                    <span class="greenFont hide" id="status_cancelled">已取消</span>
-                    <span class="redFont hide" id="status_no_transfer_received">未收到转账!</span>
-                    <span class="service_number hide" id="service_num" style="margin-left: 20px" >客服电话:400-108-6670</span>
-                    <!-- 当订单状态为待付款时显示去支付 -->
-                    <a href="" class="go_pay" style="display: none">去支付</a>
-                    <a href="" class="openinvoice" style="display: none">开发票</a>
-                    <a href="" class="lookinvoice" style="display: none">查看发票</a>
-                </p>
-            </div>
-            <div class="o_m_tbody">
-                <!-- 订单信息 -->
-                <div class="b_list">
-                    <div class="list_thead">
-                        <span class="fl">订单信息</span>  
-                        <!-- 当退款状态时显示订单编号 -->
-                    </div>
-                    <div class="clearfix list_tbody">
-                        <div class="fl tb_left" id="order_info_left">
-                        </div>
-                        <div class="fl tb_right" id="order_info_right">
-                        </div>
-                    </div>
-                </div>
-                <!-- 支付信息 -->
-                <div class="b_list">
-                    <div class="list_thead">支付信息</div>
-                    <div class="clearfix list_tbody">
-                        <div class="fl tb_left" id="pay_info_left">
-                        </div>
-                        <div class="fl tb_right" id="pay_info_right">
-                            <!-- <p>支付单号:201808112020123668449975621302148</p> -->
-                        </div>
-                    </div>
-                    <!-- 中间虚线 -->
-                    <div class="line"></div>
-                    <div class="clearfix list_tbody">
-                        <div class="fl tb_left" id = "price_info">
-                        </div>
-                        <div class="fl tb_right" id="discount_info">
-
-                        </div>
-                    </div>
-                </div>
-                <!-- 发票信息 -->
-				<div style="display: none;">
-					<div class="b_list" id="invoice_list" style="display: none">
-						<div class="list_thead">发票信息</div>
-						<div class="clearfix list_tbody">
-							<div class="fl tb_left" id="invoice_info_left">
-							</div>
-							<div class="fl tb_right"id="invoice_info_right">
-							</div>
-						</div>
-						<!-- 中间虚线 -->
-						<div class="line"></div>
-						<div class="clearfix list_tbody">
-							<div class="fl tb_left" id="invoice_details">
-							</div>
-							<div class="fl tb_right" id="buyer_information">
-							</div>
-						</div>
-					</div>
-                </div>
-                <!-- 退款操作 -->
-                <!-- <div class="b_list">
-                    <div class="list_thead">退款操作</div>
-                    <div class="clearfix list_tbody">
-                        <div class="fl tb_left" style="border: 0;">
-                            <div class="refund">
-                                <span class="refund_label">退款金额:</span>
-                                <span class="refund_value">¥12788</span>
-                            </div>
-                            <div class="refund">
-                                <span class="refund_label">退款原因:</span>
-                                <select class="refund_select" name="" id="">
-                                    <option disabled  selected="selected" style='display:none;'>请选择退款原因</option>
-                                    <option value="时间冲突">时间冲突</option>
-                                    <option value="信息填写有误">信息填写有误</option>
-                                </select>
-                            </div>
-                            <div class="refund refund_handle">
-                                <span class="refund_label"></span>
-                                <span class="refund_btn">
-                                    <button class="submit_btn" disabled>提交申请</button>
-                                    <button class="cancel_btn">取消</button>
-                                </span>
-                            </div>
-                        </div>
-                    </div>
-                </div> -->
-            </div>
-        </div>
-        <!-- 凭证 -->
-        <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
-             aria-hidden="true">
-            <div class="modal-dialog">
-                <div class="modal-content" style="border-radius: 0;">
-                    <img src="" alt="" style="width: 100%;height: 100%;">
-                </div>
-            </div>
-        </div>
-        <!-- toast提示框 -->
-        <div class="toast">
-            <i class="iconfont icon-zhifuwancheng"></i>
-            <span>提交成功</span>
-        </div>
-    </div>
-    <!-- main END -->
-    {{include "/common/pcbottom.html"}}
-    {{include "/common/baiducc.html"}}
-    <script src="{{Msg "seo" "cdn"}}/course/js/jquery-2.1.4.min.js?v={{Msg "seo" "version"}}"></script>
-    <script src="{{Msg "seo" "cdn"}}/course/js/bootstrap.min.js?v={{Msg "seo" "version"}}"></script>
-    <script src="{{Msg "seo" "cdn"}}/course/js/order_detail.js?v={{Msg "seo" "version"}}"></script>
-    <!-- footer -->
-    <script>
-        var orderId = {{.T.orderId}}
-        $(function(){
-                $("#public-nav").css("background","#fff");
-                $(".logo img").attr("src","/images/swordfish/sf_01_new.png");
-                setTimeout(function () {
-                    selcetIndexNav(6);
-                },500);
-            haslogin({{.T.logid}});
-            $("#myModal").hide();
-            $(document).off("keydown");
-            $('.refund_select').on('change',function(){
-                var val = $(this).find("option:selected").val();
-                if(val){
-                    $('.submit_btn').removeAttr('disabled');
-                }
-            })
-            // 查看凭证
-            $('#myModal').on('show.bs.modal', function () {
-                var $this = $(this);
-                var $modal_dialog = $this.find('.modal-dialog');
-                $this.css('display', 'block');
-                $modal_dialog.css({
-                    'margin-top': Math.max(0, ($(window).height() - $modal_dialog.height()) / 2)
-                });
-            });
-            $('.submit_btn').click(function(){
-                $('.toast').show();
-                setTimeout(function() {
-                    $('.toast').hide();
-                }, 3000);
-            })
-        })
-    </script>
-</body>
-</html>
+			text-decoration: none;
+		}
+    </style>
+</head>
+<body>
+{{include "/common/pchead.html"}}
+    <!-- header -->
+    <!-- main  START -->
+    <div class="order_detail" id="order_detail">
+        <div class="w order_crumb">
+            <a href="#" onclick="window.location.href='/front/dataExport/toMyOrder'">我的订单</a><em> > </em>
+            <a href="#" class="active">订单详情</a>
+        </div>
+        <div class="w order_main">
+            <!-- greenBg 为绿色背景及边框 redBg为红色背景及边框 -->
+            <div class="o_m_thead greenBg">
+                <p class="order_id"></p>
+                <p class="clearfix order_state">
+                    <span class="refund_wait_verify">
+                    <span class="redFont hide" id="status_refund_verify">退款审核中</span>
+                    <span class="greenFont hide" id="status_refunded">已退款</span>
+
+                    </span>
+                    <!--greenFont为绿色字体 redFont为红色字体 -->
+                    <span class="greenFont hide" id="status_success">已完成</span>
+                    <span class="redFont hide" id="status_wait_pay">待付款</span>
+                    <span class="redFont hide" id="status_verify">转账审核中</span>
+                    <span class="greenFont hide" id="status_cancelled">已取消</span>
+                    <span class="redFont hide" id="status_no_transfer_received">未收到转账!</span>
+                    <span class="service_number hide" id="service_num" style="margin-left: 20px" >客服电话:400-108-6670</span>
+                    <!-- 当订单状态为待付款时显示去支付 -->
+                    <a class="go_pay" style="display: none">去支付</a>
+                    <a class="openinvoice" style="display: none">开发票</a>
+                    <a class="lookinvoice" style="display: none">查看发票</a>
+                </p>
+            </div>
+            <div class="o_m_tbody">
+                <!-- 订单信息 -->
+                <div class="b_list">
+                    <div class="list_thead">
+                        <span class="fl">订单信息</span>  
+                        <!-- 当退款状态时显示订单编号 -->
+                    </div>
+                    <div class="clearfix list_tbody">
+                        <div class="fl tb_left" id="order_info_left">
+                        </div>
+                        <div class="fl tb_right" id="order_info_right">
+                        </div>
+                    </div>
+                </div>
+                <!-- 支付信息 -->
+                <div class="b_list">
+                    <div class="list_thead">支付信息</div>
+                    <div class="clearfix list_tbody">
+                        <div class="fl tb_left" id="pay_info_left">
+                        </div>
+                        <div class="fl tb_right" id="pay_info_right">
+                            <!-- <p>支付单号:201808112020123668449975621302148</p> -->
+                        </div>
+                    </div>
+                    <!-- 中间虚线 -->
+                    <div class="line"></div>
+                    <div class="clearfix list_tbody">
+                        <div class="fl tb_left" id = "price_info">
+                        </div>
+                        <div class="fl tb_right" id="discount_info">
+
+                        </div>
+                    </div>
+                </div>
+                <!-- 发票信息 -->
+				<div style="display: none;">
+					<div class="b_list" id="invoice_list" style="display: none">
+						<div class="list_thead">发票信息</div>
+						<div class="clearfix list_tbody">
+							<div class="fl tb_left" id="invoice_info_left">
+							</div>
+							<div class="fl tb_right"id="invoice_info_right">
+							</div>
+						</div>
+						<!-- 中间虚线 -->
+						<div class="line"></div>
+						<div class="clearfix list_tbody">
+							<div class="fl tb_left" id="invoice_details">
+							</div>
+							<div class="fl tb_right" id="buyer_information">
+							</div>
+						</div>
+					</div>
+                </div>
+                <!-- 退款操作 -->
+                <!-- <div class="b_list">
+                    <div class="list_thead">退款操作</div>
+                    <div class="clearfix list_tbody">
+                        <div class="fl tb_left" style="border: 0;">
+                            <div class="refund">
+                                <span class="refund_label">退款金额:</span>
+                                <span class="refund_value">¥12788</span>
+                            </div>
+                            <div class="refund">
+                                <span class="refund_label">退款原因:</span>
+                                <select class="refund_select" name="" id="">
+                                    <option disabled  selected="selected" style='display:none;'>请选择退款原因</option>
+                                    <option value="时间冲突">时间冲突</option>
+                                    <option value="信息填写有误">信息填写有误</option>
+                                </select>
+                            </div>
+                            <div class="refund refund_handle">
+                                <span class="refund_label"></span>
+                                <span class="refund_btn">
+                                    <button class="submit_btn" disabled>提交申请</button>
+                                    <button class="cancel_btn">取消</button>
+                                </span>
+                            </div>
+                        </div>
+                    </div>
+                </div> -->
+            </div>
+        </div>
+        <!-- 凭证 -->
+        <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
+             aria-hidden="true">
+            <div class="modal-dialog">
+                <div class="modal-content" style="border-radius: 0;">
+                    <img src="" alt="" style="width: 100%;height: 100%;">
+                </div>
+            </div>
+        </div>
+        <!-- toast提示框 -->
+        <div class="toast">
+            <i class="iconfont icon-zhifuwancheng"></i>
+            <span>提交成功</span>
+        </div>
+    </div>
+    <!-- main END -->
+    {{include "/common/pcbottom.html"}}
+    {{include "/common/baiducc.html"}}
+    <script src="{{Msg "seo" "cdn"}}/course/js/jquery-2.1.4.min.js?v={{Msg "seo" "version"}}"></script>
+    <script src="{{Msg "seo" "cdn"}}/course/js/bootstrap.min.js?v={{Msg "seo" "version"}}"></script>
+    <script src="{{Msg "seo" "cdn"}}/course/js/order_detail.js?v={{Msg "seo" "version"}}"></script>
+    <!-- footer -->
+    <script>
+        var orderId = {{.T.orderId}}
+        $(function(){
+                $("#public-nav").css("background","#fff");
+                $(".logo img").attr("src","/images/swordfish/sf_01_new.png");
+                setTimeout(function () {
+                    selcetIndexNav(6);
+                },500);
+            haslogin({{.T.logid}});
+            $("#myModal").hide();
+            $(document).off("keydown");
+            $('.refund_select').on('change',function(){
+                var val = $(this).find("option:selected").val();
+                if(val){
+                    $('.submit_btn').removeAttr('disabled');
+                }
+            })
+            // 查看凭证
+            $('#myModal').on('show.bs.modal', function () {
+                var $this = $(this);
+                var $modal_dialog = $this.find('.modal-dialog');
+                $this.css('display', 'block');
+                $modal_dialog.css({
+                    'margin-top': Math.max(0, ($(window).height() - $modal_dialog.height()) / 2)
+                });
+            });
+            $('.submit_btn').click(function(){
+                $('.toast').show();
+                setTimeout(function() {
+                    $('.toast').hide();
+                }, 3000);
+            })
+            $(".openinvoice").on("click",function(){
+                 window.open("/front/course/applyInvoice?orderCode="+orderId,'_self');
+            })
+            $(".lookinvoice").on("click",function(){
+                window.open("/front/course/viewInvoice?orderCode"+orderId,'_self');
+            })
+        })
+    </script>
+</body>
+</html>

+ 75 - 26
src/web/templates/course/pc/paySuccess.html

@@ -135,37 +135,69 @@
 		<script type="text/javascript">
 			$(function(){
 				var orderCode = getParam("code");
+				var pageName = getParam("pageName");
 				if(orderCode !== ""){
-					$.ajax({
-						type: 'get',
-						url: '/jypay/course/reserve/orderInfo?t='+new Date().getTime(),
-						data: {"orderCode":orderCode},
-						async: false,
-						dataType: 'json',
-						success: function(r){
-							if(r.success){
-								var orderMoney = r.data.orderMoney / 100;
-								var order_code = r.data.orderCode;
-								var payWay = "微信";
-								var payTime = r.data.payTime.split(" ")[0].split("-");
-								var payTimes = payTime[0] + "年" + payTime[1] + "月" + payTime[2] + "日";
-								var payHtml = r.data.payWay;
-								if(payHtml === "ali_pc"){
-									payWay = "支付宝";
-								}else if (payHtml === "transferAccounts"){
-                                    payWay = "公对公转账";
-
-                                }
-								$("#orderMoney").text("¥"+ orderMoney);
-								$("#orderCode").text(order_code);
-								$("#payTime").text(payTimes);
-								$("#payWay").text(payWay);
+					if(pageName = "数据报告"){
+						$.ajax({
+							type: 'get',
+							url: '/datareport/api/orderDetail?t='+new Date().getTime(),
+							data: {"ordercode":orderCode,"all":true},
+							async: false,
+							dataType: 'json',
+							success: function(r){
+								if(r.data){
+									$(".c_t_tips").text("我们会在三个工作日内将数据报告发送至"+ r.data.productInfo.email +"邮箱,请您耐心等待。")
+									var orderMoney = r.data.orderInfo.payMoney / 100;
+									var order_code = r.data.orderInfo.ordercode;
+									var payWay = "微信";
+									var payTime = formatDate(r.data.orderInfo.payTime*1000).split(" ")[0].split("-");;
+									var payTimes = payTime[0] + "年" + payTime[1] + "月" + payTime[2] + "日";
+									var payHtml = r.data.orderInfo.payWay;
+									if(payHtml === "ali_pc"){
+										payWay = "支付宝";
+									}
+									$("#orderMoney").text("¥"+ orderMoney);
+									$("#orderCode").text(order_code);
+									$("#payTime").text(payTimes);
+									$("#payWay").text(payWay);
+								}
+							}
+						})
+					}else{
+						$.ajax({
+							type: 'get',
+							url: '/jypay/course/reserve/orderInfo?t='+new Date().getTime(),
+							data: {"orderCode":orderCode},
+							async: false,
+							dataType: 'json',
+							success: function(r){
+								if(r.success){
+									var orderMoney = r.data.orderMoney / 100;
+									var order_code = r.data.orderCode;
+									var payWay = "微信";
+									var payTime = r.data.payTime.split(" ")[0].split("-");
+									var payTimes = payTime[0] + "年" + payTime[1] + "月" + payTime[2] + "日";
+									var payHtml = r.data.payWay;
+									if(payHtml === "ali_pc"){
+										payWay = "支付宝";
+									}else if (payHtml === "transferAccounts"){
+						                payWay = "公对公转账";
+						            }
+									$("#orderMoney").text("¥"+ orderMoney);
+									$("#orderCode").text(order_code);
+									$("#payTime").text(payTimes);
+									$("#payWay").text(payWay);
+								}
 							}
-						}
-					})
+						})
+					}
 				}
                 var orderCode = getParam("code");
                 $('.check_order').on('click', function () {
+					if(pageName = "数据报告"){
+						window.location.replace("/front/datareport/jyOrderDetail/"+ orderCode);
+						return
+					}
                     window.location.replace("/front/course/orderDetail?orderId="+ orderCode);
                 })
 				function getParam(name) {
@@ -186,6 +218,23 @@
 				selcetIndexNav(6);
 				haslogin({{.T.logid}});
 			})
+			function formatDate(date,hms) {
+				if(date ===null || date==="" || date === 0){
+					return "-"
+				}
+				var date = new Date(date);
+				var YY = date.getFullYear() + '-';
+				var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+				var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
+				var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
+				var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
+				var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
+				if(!hms){
+					return YY + MM + DD + " " + hh + mm + ss
+				}else{
+					return YY + MM + DD
+				}
+			}
 		</script>
 		{{include "/common/baiducc.html"}}
     </body>

+ 244 - 0
src/web/templates/order/pc/datareport/detail.html

@@ -0,0 +1,244 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>订单详情</title>
+	<script>
+		var myPageNavIsNormal = true;
+	</script>
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/bootstrap.min.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/reset_pc.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/order_detail.css?v={{Msg "seo" "version"}}">
+    {{include "/common/pnc.html"}}
+    <link href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "vebrsion"}}" rel="stylesheet">
+    <link href="{{Msg "seo" "cdn"}}/css/dev2/reset_pc.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+    <link rel="stylesheet" type="text/css" href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}" />
+    <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}3"></script>
+    <!--[if lt IE 9]>
+            <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.3/html5shiv.js"></script>
+            <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
+        <![endif]-->
+    <style>
+		.filter_data{
+			box-sizing: border-box;
+			padding-left: 30px;
+			width: 50%;
+		}
+		.filter_data p{
+			font-size: 14px;
+			margin-bottom: 10px;
+		}
+		#order_detail {
+		    line-height: 1;
+		    padding-top: 76px;
+		    padding-bottom: 0px !important;
+		    background-color: #fff;
+		}
+    </style>
+</head>
+<body>
+	{{include "/common/pchead.html"}}
+    <!-- header -->
+    <!-- main  START -->
+    <div class="order_detail" id="order_detail">
+        <div class="w order_crumb">
+            <a href="#" onclick="window.location.href='/front/dataExport/toMyOrder'">我的订单</a><em> > </em>
+            <a href="#" class="active">订单详情</a>
+        </div>
+        <div class="w order_main">
+            <!-- greenBg 为绿色背景及边框 redBg为红色背景及边框 -->
+            <div id="bg" class="o_m_thead greenBg">
+                <p class="order_id"></p>
+                <p class="clearfix order_state">
+                    <!--greenFont为绿色字体 redFont为红色字体 -->
+                    <span class="greenFont hide" id="status_success">已完成</span>
+                    <span class="redFont hide" id="status_wait_pay">待付款</span>
+                    <span class="greenFont hide" id="status_cancelled">已取消</span>
+					
+					<!-- 当状态为已完成时显示开发票 或 查看发票 -->
+					<a class="go_pay payOrder" style="display: none;">去支付</a>
+					<a class="openinvoice go_pay" style="display: none;">开发票</a>
+					<a class="lookinvoice go_pay" style="display: none;">查看发票</a>
+                </p>
+            </div>
+			
+			<!-- ------订单类型为VIP订阅、商机管理时展示的字段 --------->
+			            <div class="o_m_tbody">
+			                <div class="b_list">
+			                    <div class="list_thead">
+			                        <span class="fl">购买信息</span> 
+			                    </div>
+			                    <div class="clearfix list_tbody">
+			                        <div class="filter_data" style="width: 100%;">
+			                            <p><span class="dq_text">报告名称</span>:<span class="bgmc"></span></p>
+			                            <p><span class="hy_text">邮箱地址</span>:<span class="yxdz"></span></p> 
+			                            <p><span class="zq_text">手机号</span>:<span class="sjh"></span></p>
+			                            <p><span class="yxrq_text">公司名称</span>:<span class="gsmc"></span></p>
+										<p><span class="yxrq_text">发布日期</span>:<span class="fbrq"></span></p>
+			                        </div>
+			                    </div>
+			                </div>
+			                <div class="b_list">
+			                    <div class="list_thead">
+			                        <span class="fl">订单信息</span>  
+			                    </div>
+			                    <div class="clearfix list_tbody">
+			                        <div class="filter_data" style="float: left;">
+			                            <p>订单编号:<span class="order_code"></span></p>
+			                            <p>下单时间:<span class="order_time"></span></p>
+			                            <p class="pay_time_p" style="display: none;">支付时间:<span class="pay_time"></span></p>
+			                            <p class="pay_way_p" style="display:none">支付方式:<span class="pay_way"></span></p>
+			                            <p class="pay_num_p" style="display:none">支付单号:<span class="pay_num"></span></p>
+										<p>产品类型:数据报告<span class="vip_type"></span></p>
+			                        </div>
+									<div class="filter_data" style="float: left;border-left: 1px solid #ccc;">
+										<p>报告售价:<span class="price"></span></p>
+										<p>报告原价:<span class="before_price"></span></p>
+										<p>活动优惠:<span class="hdyh"></span></p>
+										<p>实付金额:<span class="pay_money"></span></p>
+									</div>
+			                    </div>
+			                </div>
+			            </div>
+
+    </div>
+	<div style="margin-top: 20px;"></div>
+    <!-- main END -->
+	{{include "/common/pcbottom.html"}}
+	{{include "/common/baiducc.html"}}
+    <script src="{{Msg "seo" "cdn"}}/order/js/jquery-2.1.4.min.js?v={{Msg "seo" "version"}}"></script>
+    <script src="{{Msg "seo" "cdn"}}/order/js/bootstrap.min.js?v={{Msg "seo" "version"}}"></script>
+    <!-- footer -->
+    <script>
+        $(function(){
+			$("#public-nav").css("background","#fff");
+			$(".logo img").attr("src","/images/swordfish/sf_01_new.png");
+			$(".public-nav").css("border-bottom", "1px solid #e0e0e0");
+			$("section[id='drder']").css("padding-top", "80px");
+			selcetIndexNav(6);
+			haslogin({{.T.logid}});
+			
+			var orderCode = {{.T.orderId}};
+			$(".order_id").text("订单编号:"+orderCode);
+			$.post("/datareport/api/orderDetail",{"ordercode":orderCode,"all":"true"},function(r){
+					if (r.data){
+						//订单信息
+						$(".order_code").text(orderCode);
+						if(r.data.orderInfo.createTime) {
+							$(".order_time").text(formatDate(r.data.orderInfo.createTime * 1000));
+						}
+						var price = r.data.orderInfo.payMoney/100;
+						var s_price = r.data.productInfo.beforePrice/100;
+						var yh = s_price - price;
+						$(".bgmc").text(r.data.productInfo.productName);
+						$(".yxdz").text(r.data.productInfo.email);
+						$(".sjh").text(r.data.productInfo.phone);
+						$(".gsmc").text(r.data.productInfo.entName);
+						$(".fbrq").text(formatDate(r.data.productInfo.releaseTime * 1000,true));
+						$(".price").text(price);
+						$(".before_price").text(s_price);
+						$(".hdyh").text("-"+ yh);
+						if(r.data.orderInfo.state==1){
+							$("#status_success").removeClass("hide");
+							$(".pay_time_p").css("display","");
+							if(r.data.orderInfo.payTime) $(".pay_time").text(formatDate(r.data.orderInfo.payTime * 1000));
+							//支付方式
+							if(r.data.orderInfo.payWay.indexOf("wx")>-1){
+								$(".pay_way_p").css("display","");
+								$(".pay_way").text("微信支付");
+							}else if(r.data.orderInfo.payWay.indexOf("ali")>-1){
+								$(".pay_way").text("支付宝支付");
+								$(".pay_way_p").css("display","");
+							}
+							$(".pay_num_p").css("display","");
+							if(r.data.orderInfo.paymentId) $(".pay_num").text(r.data.orderInfo.paymentId);
+							//发票
+							if(r.data.orderInfo.applybillStatus==0){
+								$(".openinvoice").css("display","");
+							}else{
+								$(".lookinvoice").css("display","");
+							}
+							$(".pay_money").text("¥"+price+"元");
+						}
+						if(r.data.orderInfo.state==-2){
+							$("#status_cancelled").removeClass("hide");
+							$("#bg").addClass("greenBg").removeClass("redBg");
+							if (r.data.orderInfo.payMoney){
+								$(".pay_money").text("¥"+price+"元");
+							}else{
+								$(".pay_money").text("-");
+							}
+						}
+						if(r.data.orderInfo.state==0){
+							$("#status_wait_pay").removeClass("hide");
+							$("#bg").addClass("redBg").removeClass("greenBg");
+							$(".pay_money").text("-");
+							$(".payOrder").show();
+						}
+					}
+			})
+			
+			
+			$(".openinvoice").on("click",function(){
+				$.post("/subscribepay/orderListDetails/isOver",{"order_code":orderCode},function(r){
+					var hash = escape("VIP订阅");
+					if(r.status!=1){
+						window.open("/front/order/invoicetimeOut",'_self');
+					}else{
+						window.open("/front/order/invoice/"+orderCode,'_self');
+					}
+				})
+			})
+			$(".lookinvoice").on("click",function(){
+				window.open("/front/order/check_invoice/"+orderCode,'_self');
+			})
+			$(".payOrder").on("click", function(){
+				location.href = "/front/datareport/orderPay?code="+ orderCode;
+			})
+        })
+		
+		/******* 获取url参数(正则)********/
+		function getParam(name) {
+		    var search = document.location.search;
+		    // alert(search);
+		    var pattern = new RegExp("[?&]" + name + "\=([^&]+)", "g");
+		    var matcher = pattern.exec(search);
+		    var items = null;
+		    if (null != matcher) {
+		        try {
+		            items = decodeURIComponent(decodeURIComponent(matcher[1]));
+		        } catch (e) {
+		            try {
+		                items = decodeURIComponent(matcher[1]);
+		            } catch (e) {
+		                items = matcher[1];
+		            }
+		        }
+		    }
+		    return items;
+		};
+		
+		function formatDate(date,hms) {
+			if(date ===null || date==="" || date === 0){
+				return "-"
+			}
+			var date = new Date(date);
+			var YY = date.getFullYear() + '-';
+			var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
+			var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
+			var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
+			var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
+			var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
+			if(!hms){
+				return YY + MM + DD + " " + hh + mm + ss
+			}else{
+				return YY + MM + DD
+			}
+		}
+    </script>
+</body>
+</html>

+ 181 - 0
src/web/templates/order/pc/orderPay.html

@@ -0,0 +1,181 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>订单支付</title>
+    {{include "/common/pnc.html"}}
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/iconfont/iconfont.css?v={{Msg "seo" "venrsion"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/order_pay.css?v={{Msg "seo" "venrsion"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "venrsion"}}" rel="stylesheet">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/reset_pc.css?v={{Msg "seo" "venrsion"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}"/>
+    <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}"></script>
+</head>
+<body>
+<!-- header -->
+{{include "/common/pchead.html"}}
+<!-- main  START -->
+<section id="drder">
+    <div class="order_pay visib_" id="order_pay">
+        <div class="w op_crumb">
+            <a onclick="window.location.href='/front/dataExport/toMyOrder'">我的订单</a><em> > </em>
+            <a onclick="location.reload()" class="active">去支付</a>
+        </div>
+        <div class="w op_main">
+            <div class="clearfix top">
+                <div class="t_left">订单已提交成功,请尽快支付</div>
+                <div class="t_right">
+                    <p class="t_right_number">订单编号:{{.T.orderCode}}</p>
+                    <p class="t_right_money">应付总额:<strong>¥-</strong></p>
+                </div>
+            </div>
+            <!-- 支付方式 -->
+            <div class="clearfix middle">
+                <div class="pay_box">
+                    <div class="fl pay_title">支付方式</div>
+                    <div class="fl pay_tab">
+                        <div class="tab_item wx"><img src="/order/image/wxpay.png" alt=""> 微信支付</div>
+                        <div class="tab_item zfb"><img src="/order/image/alipay.png" alt=""> 支付宝</div>
+                    </div>
+                </div>
+                <div class="pay_content visib_">
+                    <div class="con" style="display: none;">
+                        <div class="m_code">
+                            <div class="warn visib_">距离二维码过期还有<em></em>秒,过期后请重新刷新页面获取二维码</div>
+                            <div class="qrcode_box">
+                                <img src="/order/image/qrcode.png" alt="">
+                            </div>
+                            <div class="tips">
+                                <img src="/order/image/smallCode.png" alt="">
+                                <span>使用手机微信扫描二维码支付</span>
+                            </div>
+                        </div>
+                        <div class="m_phone">
+                            <img src="/order/image/telphone.png" alt="">
+                        </div>
+                    </div>
+                    <div class="con" style="display: none;">
+                        <div class="m_code">
+                            <div class="warn">距离二维码过期还有<em></em>秒,过期后请重新刷新页面获取二维码</div>
+                            <div class="qrcode_box">
+                                <img src="/order/image/qrcode.png" alt="">
+                            </div>
+                            <div class="tips">
+                                <img src="/order/image/smallCode.png" alt="">
+                                <span>使用手机支付宝扫描二维码支付</span>
+                            </div>
+                        </div>
+                        <div class="m_phone">
+                            <img src="/order/image/zhifubao.png" alt="">
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!-- main END -->
+</section>
+<!-- footer -->
+{{include "/common/pcbottom.html"}}
+{{include "/common/baiducc.html"}}
+<script>
+    haslogin({{.T.logid}});
+    var orderCode ={{.T.orderCode}}
+        $(function () {
+            //nav样式
+            $("#public-nav").css("background", "#fff");
+            $(".logo img").attr("src", "/images/swordfish/sf_01_new.png");
+            $(".public-nav").css("border-bottom", "1px solid #e0e0e0");
+            $("section[id='drder']").css("padding-top", "80px");
+            //获取支付信息
+            getPayCode("");
+            //支付方式切换
+            $(".fl.pay_tab .tab_item").on("click",function () {
+                if($(this).hasClass("active")){
+                    return
+                }
+                $(this).addClass("active").siblings().removeClass("active");
+                $(".pay_content .con").hide();
+                if($(this).hasClass("wx")){
+                    getPayCode("wx_pc");
+                }else{
+                    getPayCode("ali_pc");
+                }
+            });
+
+            //获取支付串儿
+            function getPayCode(payway) {
+                $.ajax({
+                    type: 'post',
+                    url: '/jypay/pc/getPayCode?t=' + new Date().getTime(),
+                    data: {"orderCode": orderCode, "payway": payway},
+                    async: false,
+                    dataType: 'json',
+                    success: function (r) {
+                        if (r.data) {
+                            // payway timeout res money
+                            $(".t_right_money strong").text("¥" + parseInt(r.data.money) / 100);
+                            if (r.data.payway === "wx_pc") {
+                                $(".wx").addClass("active");
+                                $(".pay_content .con").eq(0).show();
+                                $(".pay_content .con").eq(0).find(".qrcode_box").html("<img src='data:image/png;base64," + r.data.res + "'>");
+                            } else if (r.data.payway === "ali_pc") {
+                                $(".zfb").addClass("active");
+                                $(".pay_content .con").eq(1).show();
+                                $(".pay_content .con").eq(1).find(".qrcode_box").html("<iframe id='alicode' src='" + r.data.res + "' style='width: 300px;height:280px;border:none;padding-left: 27px;padding-top: 26px;'></iframe>");
+                            }
+                            //计时
+                            showCode(r.data.timeout);
+                            $(".order_pay").removeClass("visib_");
+                        } else {
+                            alert("请求有误")
+                        }
+                    }
+                })
+            }
+            //计时
+            var interval;
+            function showCode(timeout) {
+                if (interval) {
+                    clearInterval(interval);
+                }
+                interval = setInterval(function () {
+                    var h = Math.floor(timeout / 60 / 60 % 24);
+                    var m = Math.floor(timeout / 60 % 60);
+                    var s = Math.floor(timeout % 60);
+                    var text = "";
+
+                    text += PrefixInteger(h, 2) + ":";
+                    text += PrefixInteger(m, 2) + ":";
+                    text += PrefixInteger(s, 2);
+                    $(".warn em").text(text);
+                    $(".warn").removeClass("visib_");
+                    if (timeout <= 0) {
+                        $(".warn").text("二维码已过期,请刷新页面获取新二维码");
+                        clearInterval(interval);
+                    }
+                    timeout--;
+                    //查询支付知否完成
+                    if (timeout % 3 === 0) {
+                        $.post("/jypay/isPaySuccess", {
+                            code: orderCode
+                        }, function (r) {
+                            if (r.success) {
+                                //页面跳转
+                                window.location.href="/front/{{.T.orderType}}/paySuccess/{{.T.orderCode}}?payway="+r.pay_way+"&payTime="+r.payTime+"&email="+r.email;
+                            }
+                        })
+                    }
+                }, 1000);
+                $(".pay_content").removeClass("visib_");
+            }
+            function PrefixInteger(num, length) {
+                return ("00" + num).substr(-length);
+            }
+        })
+</script>
+</body>
+
+</html>

+ 71 - 0
src/web/templates/order/pc/paySuccess.html

@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>支付成功</title>
+    {{include "/common/pnc.html"}}
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/reset_pc.css?v={{Msg "seo" "version"}}">
+    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/order/css/pay_success.css?v={{Msg "seo" "version"}}">
+    <!--[if lt IE 9]>
+    <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.3/html5shiv.js"></script>
+    <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
+    <![endif]-->
+    <link href="{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "venrsion"}}" rel="stylesheet">
+    <link rel="stylesheet" type="text/css"
+          href="{{Msg "seo" "cdn"}}/pccss/public-nav-1200.css?v={{Msg "seo" "version"}}"/>
+    <script type="text/javascript" src="{{Msg "seo" "cdn"}}/js/public-nav.js?v={{Msg "seo" "version"}}23"></script>
+</head>
+<body>
+<!-- header -->
+{{include "/common/pchead.html"}}
+<!-- main  START -->
+<div class="pay_success">
+    <div class="w ps_header">支付成功</div>
+    <div class="w ps_content">
+        <div class="c_top">
+            <div class="c_t_status">
+                <img src="/order/image/pay_success.png" alt="">
+                <p>支付成功!</p>
+            </div>
+            {{if eq .T.orderType "datareport"}}
+                <p class="c_t_tips">我们会在三个工作日内将数据报告发送至{{.T.email}}邮箱,请您耐心等待。</p>
+            {{end}}
+            <p class="c_t_price" id="orderMoney">¥2046</p>
+        </div>
+        <div class="c_bottom">
+            <p class="order_item">
+                <span>订单编号</span>
+                <span id="orderCode">{{.T.orderCode}}</span>
+            </p>
+            <p class="order_item">
+                <span>支付时间</span>
+                <span id="payTime">{{.T.payTime}}</span>
+            </p>
+            <p class="order_item">
+                <span>支付方式</span>
+                <span id="payWay">{{.T.payway}}</span>
+            </p>
+            {{if eq .T.orderType "datareport"}}
+                <a  class="check_order" href="/front/{{.T.orderType}}/jyOrderDetail/{{.T.orderCode}}">查看订单</a>
+            {{else if eq .T.orderType "vip"}}
+                <a  class="check_order" href="/front/vipOrder/vipOrderDetail?order_code={{.T.orderCode}}">查看订单</a>
+            {{else if eq .T.orderType "entniche"}}
+                <a  class="check_order" href="/front/entniche/entnicheOrderDetail?order_code={{.T.orderCode}}">查看订单</a>
+            {{end}}
+        </div>
+    </div>
+</div>
+{{include "/common/pcbottom.html"}}
+<script type="text/javascript">
+    var myPageNavIsNormal=true;
+    $(function () {
+        $("#public-nav").css("background", "#fff");
+        $(".logo img").attr("src", "/images/swordfish/sf_01_new.png");
+        haslogin({{.T.logid}});
+    });
+</script>
+{{include "/common/baiducc.html"}}
+</body>
+</html>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 580 - 523
src/web/templates/pc/myOrder.html


+ 17 - 6
src/web/templates/weixin/dataExport/dataExport_payOrder.html

@@ -172,6 +172,21 @@
         </div>
     </main>
     <div class="fixed-bottom-box" id="bottombox">
+        <div class="price">
+            <div class="totalnum">
+                合计:
+            </div>
+            <div class="pricenum">
+                <div class="pay_bef">
+                    <span>原价:¥</span>
+                    <span class="pay_before"></span>
+                </div>
+                <div class="pay_dis">
+                    <span class="bef_text">¥</span>
+                    <strong class="pay_discount"></strong>
+                </div>
+            </div>
+        </div>
         <div class="weui-cells weui-cells_checkbox radio-form">
             <label class="weui-cell weui-check__label" for="s11">
                 <div class="weui-cell__hd">
@@ -183,10 +198,6 @@
                 </div>
             </label>
         </div>
-        <div class="price">
-            <span class="pay_before"></span>
-            <strong class="pay_discount"></strong>
-        </div>
         <div class="form-btn j-button-group">
             <button class="btn prew dataPreview j-button-cancel" style="flex:none;line-height: normal;">预览数据</button>
             <button class="btn enter toPay j-button-confirm" style="flex:none;line-height: normal;" disabled="disabled">确认支付</button>
@@ -859,8 +870,8 @@
         }
         shouldPay = shouldPay > orderMinPrice ? shouldPay : orderMinPrice;
         beforePay = beforePay > orderMinPrice ? beforePay : orderMinPrice;
-        $(".pay_discount").text("¥" + shouldPay);
-        $(".pay_before").text("¥" + beforePay)
+        $(".pay_discount").text(shouldPay);
+        $(".pay_before").text(beforePay)
     }
 
     //

+ 8 - 5
src/web/templates/weixin/dataExport/dataExport_paySuccess.html

@@ -41,15 +41,18 @@
 			$(function(){
 				$(".email").text(email);
 				$(".orderCode").text(orderCode);
-				payTime =  payTime.split("-")[0]+"年"+payTime.split("-")[1]+"月"+payTime.split("-")[2]+"日";
+        if(payTime){
+          payTime =  payTime.split(" ")[0]
+				  payTime =  payTime.split("-")[0]+"年"+payTime.split("-")[1]+"月"+payTime.split("-")[2]+"日";
+        }else{
+          var now =new Date();
+          payTime = now.getFullYear()+"年"+now.getMonth()+"月"+now.getDate()+"日";
+        }
+       
 				$(".payTime").text(payTime);
 			})
 			function detail(){
-				//if (window.location.href.indexOf("detail")>0){
-				//	window.history.back(-1);
-				//}else{
 					window.location.href="/weixin/pay/wxToOrderDetail?orderCode={{.T.orderCode}}"
-				//}
 			}
 		</script>
 	</head>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 178 - 194
src/web/templates/weixin/dataExport/dataExport_toMyOrder.html


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.