소스 검색

fenzhihebing

luwenna 3 년 전
부모
커밋
b7fa72be45
30개의 변경된 파일879개의 추가작업 그리고 535개의 파일을 삭제
  1. 0 1
      README.md
  2. 10 9
      src/config.json
  3. 4 14
      src/jfw/front/follow.go
  4. 35 82
      src/jfw/front/front.go
  5. 1 1
      src/jfw/front/login.go
  6. 1 0
      src/jfw/front/shorturl.go
  7. 1 0
      src/jfw/front/swordfish.go
  8. 104 3
      src/jfw/front/vipsubscribe.go
  9. 49 25
      src/jfw/modules/app/src/app/front/vipsubscribe.go
  10. 3 3
      src/jfw/modules/bigmember/src/service/report/report.go
  11. 19 26
      src/jfw/modules/subscribepay/src/config/config.go
  12. 1 1
      src/jfw/modules/subscribepay/src/entity/areaPack.go
  13. 6 9
      src/jfw/modules/subscribepay/src/entity/dataReportStruct.go
  14. 2 1
      src/jfw/modules/subscribepay/src/entity/member.go
  15. 1 1
      src/jfw/modules/subscribepay/src/entity/subscribeVip.go
  16. 3 10
      src/jfw/modules/subscribepay/src/main.go
  17. 41 21
      src/jfw/modules/subscribepay/src/message.json
  18. 1 1
      src/jfw/modules/subscribepay/src/report/report.go
  19. 3 3
      src/jfw/modules/subscribepay/src/service/orderListDetails.go
  20. 2 2
      src/jfw/modules/subscribepay/src/service/vipSubscribePay.go
  21. 3 2
      src/jfw/modules/subscribepay/src/timetask.json
  22. 334 100
      src/jfw/modules/subscribepay/src/timetask/timetask.go
  23. 2 1
      src/jfw/modules/subscribepay/src/util/dataExportExcel.go
  24. 7 0
      src/jfw/modules/subscribepay/src/util/db.go
  25. 204 104
      src/jfw/modules/subscribepay/src/util/msgremind.go
  26. 9 0
      src/jfw/modules/subscribepay/src/util/util.go
  27. 0 86
      src/jfw/modules/subscribepay/src/util/wxtplmsgcustom.go
  28. 2 0
      src/web/staticres/common-module/order-list/js/order-detail.js
  29. 15 14
      src/web/templates/weixin/historypush.html
  30. 16 15
      src/web/templates/weixin/wxinfocontent_rec.html

+ 0 - 1
README.md

@@ -4,4 +4,3 @@ weixin sdk https://github.com/wizjin/weixin
 web用xweb框架
 v4.6.2.4
 免费用户体验&超级订阅及大会员改版
-

+ 10 - 9
src/config.json

@@ -20,12 +20,12 @@
         "entListFollow": "/jylab/followent/entList",
         "pcmyfollow": "/follow/set/list/%s",
         "feedback": "/swordfish/feedback",
-        "wxpushfollowlist": "/follow/notice/%s/%s",
+        "wxpushfollowlist": "/follow/notice/%s/%s?advertcode=%s",
         "community": "http://www.myfans.cc/30a78e9b78",
         "quickly": "http://mp.weixin.qq.com/s?__biz=MzIyNTM1NDUyNw==&mid=100000001&idx=1&sn=58e6008f0577d529a56c9ed78724decf&scene=0#wechat_redirect",
         "useskill": "http://mp.weixin.qq.com/mp/homepage?__biz=MzIyNTM1NDUyNw==&hid=1&sn=f9e98da1975f85011ee138a4ee5cfbe8#wechat_redirect",
         "about": "/swordfish/about?flag=1",
-        "followset": "/follow/set/%s/%s",
+        "followset": "/follow/set/%s/%s?advertcode=%s",
         "myfeedbacks": "/swordfish/myFeedbacks",
         "zqluckdraw": "/active/zqLuckdraw",
         "followent": "/jylab/followent/entList",
@@ -37,13 +37,13 @@
         "sealSend": "/active/seal/sealMsg",
         "futureIndex": "/active/future/index",
         "keysetIndex": "/wxkeyset/keyset/index?tiptext=%s",
-        "followEntDetail": "/jylab/followent/detail/%s",
+        "followEntDetail": "/jylab/followent/detail/%s?advertcode=%s",
         "mymenu": "/front/wxMyOrder/myMenu?msg=4",
-		"historypush": "/swordfish/newhistorypush?times=%s&msg=1",
+		"historypush": "/swordfish/newhistorypush?times=%s&advertcode=%s&msg=1",
 		"msgremind": "/front/vipsubscribe/msgremind?%s",
 		"treasurebox":"/jyTreasureBox/treasureBox?msg=3",
-		"vipreport":"/subscribepay/report/wxtplmsg?start=%s&end=%s&pushcount=%s",
-		"viphomepage":"/front/vipsubscribe/introducePage",
+		"vipreport":"/subscribepay/report/wxtplmsg?start=%s&end=%s&pushcount=%s&advertcode=%s",
+		"viphomepage":"/front/vipsubscribe/introducePage?advertcode=%s",
 		"viphomepage_new":"/front/vipsubscribe/vipsubscribe_new",
 		"liveAcitve":"/active/livePage/index",
 		"bigMember":"/big/wx/page/landingPage",
@@ -52,8 +52,9 @@
 		"docsMobile":"/page_docs_mobile/home",
 		"pointsMobile":"/page_points_mobile/home",
 		"bidedoc":"/weixin/frontPage/bidedoc/sess/index",
-		"memberreport_experience":"/bigmember/report/openpushmsg?t=wx_experience&start=%s&end=%s&pushcount=%s",
-		"chanpartner":"/weixin/frontPage/partner/sess/partner?p=wxmeun"
+		"memberreport_experience":"/bigmember/report/openpushmsg?t=wx_experience&start=%s&end=%s&pushcount=%s&advertcode=%s",
+		"chanpartner":"/weixin/frontPage/partner/sess/partner?p=wxmeun",
+		"datareport":"/datareport/page/order/detail/%s?advertcode=%s"
     },
     "jy_activeset": {
         "activitystartcode": "3201000000",
@@ -238,7 +239,7 @@
         "shareTimesUpperLimitR": 4000,
         "shareTimesUpperLimitIrr": 1000
     },
-    "cookiedomain": "web-jydev-ws.jianyu360.cn",
+    "cookiedomain": "wcj.jydev.jianyu360.com",
     "pcHelper": {
         "subscribeTokenTimeout": 15,
         "version": "V2.5.1"

+ 4 - 14
src/jfw/front/follow.go

@@ -871,19 +871,9 @@ func (m *Follow) AllNotice() error {
 }
 func (m *Follow) Notice(id, followId string) error {
 	defer util.Catch()
-	//userid := util.ObjToString(m.GetSession("userId"))
-	var query map[string]interface{}
-	if len(id) == 19 {
-		query = map[string]interface{}{
-			"l_date": util.Int64All(id) / 1000000000,
-			//"s_userid":   userid,
-			"s_followid": followId,
-		}
-	} else {
-		query = map[string]interface{}{
-			"_id": StringTOBsonId(id),
-			//"s_userid": userid,
-		}
+	query := map[string]interface{}{
+		"_id":      StringTOBsonId(id),
+		"s_userid": util.ObjToString(m.GetSession("userId")),
 	}
 	data, ok := public.MQFW.FindOneByField("jy_pushproject", query, `{"s_followid":-1,"s_title":1,"s_projectcode":1,"s_projectname":1,"a_relationinfo":1,"a_visited":1}`)
 	if ok && data != nil && len(*data) > 0 {
@@ -907,7 +897,7 @@ func (m *Follow) Notice(id, followId string) error {
 				go public.MQFW.UpdateById("jy_pushproject", id, map[string]interface{}{
 					"$addToSet": map[string]interface{}{"a_visited": firstMap["s_id"]},
 				})
-				return m.Redirect("/article/content/" + util.ObjToString(firstMap["s_id"]) + ".html")
+				return m.Redirect("/article/content/" + util.ObjToString(firstMap["s_id"]) + ".html?advertcode=" + m.GetString("advertcode"))
 			}
 			(*data)["a_relationinfo"] = relationinfo
 		}

+ 35 - 82
src/jfw/front/front.go

@@ -1,12 +1,12 @@
 package front
 
 import (
-	"encoding/hex"
 	"fmt"
 	"jfw/config"
 	"jfw/jyutil"
 	"jfw/public"
 	"jfw/qrmanager"
+	"jfw/tag"
 	"jfw/wx"
 	"log"
 	"math/rand"
@@ -140,8 +140,6 @@ type Front struct {
 	dataService xweb.Mapper `xweb:"/front/dataService.html"`
 	//打赏页面
 	payIndex xweb.Mapper `xweb:"/weixin/pay/index"` //微信打赏
-	//订阅付费消息提醒中转
-	msgremind xweb.Mapper `xweb:"/front/vipsubscribe/msgremind"`
 	//获取打赏标语
 	rewardText xweb.Mapper `xweb:"/front/rewardText"`
 	//生成二维码
@@ -152,6 +150,8 @@ type Front struct {
 	orderSource xweb.Mapper `xweb:"/front/order/source"`
 
 	reloadTo xweb.Mapper `xweb:"/front/reloadTo/(.*)"` //前端页面跳转
+	//根据广告位代码获取广告
+	getAdByCode xweb.Mapper `xweb:"/front/getAdByCode"`
 }
 
 var sewx util.SimpleEncrypt //微信的加密方法
@@ -798,10 +798,10 @@ func FindUserAndCreateSess(openid string, sess *httpsession.Session, typ string,
 	}, sess, typ, flag)
 }
 
-func FindUserAndCreateSessById(userId primitive.ObjectID, sess *httpsession.Session) (bool, *map[string]interface{}, map[string]interface{}) {
+func FindUserAndCreateSessById(userId primitive.ObjectID, sess *httpsession.Session, flag bool) (bool, *map[string]interface{}, map[string]interface{}) {
 	return CreateSession(map[string]interface{}{
 		"_id": userId,
-	}, sess, "pc", true)
+	}, sess, "pc", flag)
 }
 
 func CreateSession(q map[string]interface{}, sess *httpsession.Session, typ string, flag bool) (bool, *map[string]interface{}, map[string]interface{}) {
@@ -851,7 +851,12 @@ func (m *Front) Sess(ostr string) error {
 	str := strings.Split(sewx.DecodeString(strs[0]), ",")
 	if len(str) == 4 {
 		openid := str[0]
-		ok, _, _ := FindUserAndCreateSess(openid, m.Session(), "wx", false)
+		ok := false
+		if str[1] == "_id" {
+			ok, _, _ = FindUserAndCreateSessById(mgdb.StringTOBsonId(openid), m.Session(), false)
+		} else {
+			ok, _, _ = FindUserAndCreateSess(openid, m.Session(), "wx", false)
+		}
 		if ok {
 			actionurl := util.ObjToString(urlMap[str[3]])
 			if actionurl != "" {
@@ -861,9 +866,13 @@ func (m *Front) Sess(ostr string) error {
 					} else {
 						//支持多个参数%s..
 						actionurl = fmt.Sprintf(actionurl, func(tmps []string) []interface{} {
-							res := make([]interface{}, len(tmps))
-							for k, v := range tmps {
-								res[k] = v
+							res := make([]interface{}, strings.Count(actionurl, "%s"))
+							for k, _ := range res {
+								if k < len(tmps) {
+									res[k] = tmps[k]
+								} else {
+									res[k] = ""
+								}
 							}
 							return res
 						}(strs[1:])...)
@@ -1506,79 +1515,6 @@ func (s *Front) StaticPage(pagename string) error {
 	return s.Render("/staticpage/" + pagename)
 }
 
-//
-func (f *Front) Msgremind() error {
-	param := map[string]string{}
-	if array := strings.Split(f.Url(), "?"); len(array) == 2 {
-		decode, _ := hex.DecodeString(array[1])
-		for _, v := range strings.Split(string(decode), "&") {
-			if vv := strings.Split(v, "="); len(vv) == 2 {
-				param[vv[0]] = vv[1]
-			}
-		}
-	}
-	userId, _ := f.GetSession("userId").(string)
-	if userId == "" {
-		return f.Render("_error.html")
-	}
-	user, ok := public.MQFW.FindById("user", userId, `{"i_vip_status":1,"l_vip_endtime":1}`)
-	i_vip_status := util.IntAll((*user)["i_vip_status"])
-	if !ok || user == nil || len(*user) == 0 {
-		return f.Render("_error.html")
-	}
-	myLastOrderCode := func(user_id string) string {
-		order := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
-			"user_id":      user_id,
-			"order_status": 1,
-			"product_type": "VIP订阅",
-		}, "id,order_code", "pay_time desc")
-		if order != nil && len(*order) > 0 {
-			return util.ObjToString((*order)["order_code"])
-		} else {
-			return ""
-		}
-	}
-	t := param["type"]
-	if t == "unpaid" { //未支付 已支付
-		return f.Redirect("/front/vipsubscribe/toOrderDetailPage?orderCode=" + param["ordercode"])
-	} else if t == "paid" {
-		if i_vip_status > 0 {
-			return f.Redirect("/front/vipsubscribe/toSubVipSetPage")
-		} else {
-			return f.Redirect("/front/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId))
-		}
-	} else if t == "ontrial_soonexprie" || t == "ontrial_expried" || t == "soonexprie" || t == "expried" { //试用即将到期 试用已到期 即将到期 已到期
-		if t == "ontrial_soonexprie" || t == "ontrial_expried" {
-			if i_vip_status == 2 {
-				return f.Redirect("/front/vipsubscribe/toSubVipSetPage")
-			} else {
-				return f.Redirect("/front/vipsubscribe/vipsubscribe_new")
-			}
-		} else if t == "soonexprie" || t == "expried" {
-			now_unix := time.Now().Unix()
-			l_vip_endtime := util.Int64All((*user)["l_vip_endtime"])
-			if now_unix < l_vip_endtime-259200 {
-				//已续费
-				return f.Redirect("/front/vipsubscribe/toSubVipSetPage")
-			} else {
-				if now_unix > l_vip_endtime {
-					//未续费已到期,跳转到再次购买页面
-					return f.Redirect("/front/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId))
-				} else {
-					//未续费未到期,跳转到续费页面
-					return f.Redirect("/front/vipsubscribe/vipsubscribe_renew")
-				}
-			}
-		}
-	} else if t == "buyerclass" { //公共资源交易提醒
-		if i_vip_status > 0 { //vip未到期
-			return f.Redirect("/front/vipsubscribe/toSubVipSetPage")
-		} else if i_vip_status < 0 { //vip已到期
-			return f.Redirect("/front/vipsubscribe/introducePage")
-		}
-	}
-	return f.Render("_error.html")
-}
 func (f *Front) Downloadapppage(from string) error {
 	f.T["from"] = from
 	f.T["source"] = f.GetString("source")
@@ -1634,3 +1570,20 @@ func encodeURIComponent(str string) string {
 	r = strings.Replace(r, "+", "%20", -1)
 	return r
 }
+
+//
+func (f *Front) GetAdByCode() {
+	m := map[string]interface{}{}
+	if ad_name := f.GetString("ad_name"); ad_name != "" {
+		ad_names := strings.Split(ad_name, ",")
+		ad_indexs := strings.Split(f.GetString("ad_index"), ",")
+		for k, v := range ad_names {
+			index := -1
+			if k < len(ad_indexs) {
+				index = util.IntAll(ad_indexs[k])
+			}
+			m[v] = tag.Ad(v, index)
+		}
+	}
+	f.ServeJson(m)
+}

+ 1 - 1
src/jfw/front/login.go

@@ -309,7 +309,7 @@ func afterLogin(phone string, session *httpsession.Session) (bool, *map[string]i
 	if user == nil || len(user) == 0 {
 		return false, nil, nil
 	}
-	return FindUserAndCreateSessById(user["_id"].(primitive.ObjectID), session)
+	return FindUserAndCreateSessById(user["_id"].(primitive.ObjectID), session, true)
 }
 
 //

+ 1 - 0
src/jfw/front/shorturl.go

@@ -309,6 +309,7 @@ func (s *Short) Article(stype, id string) error {
 					}
 				}
 			}
+			s.T["advertcode"] = s.GetString("advertcode")
 			content, _ := s.Render4Cache("/weixin/wxinfocontent_rec.html", &s.T)
 			return s.SetBody(content)
 		}

+ 1 - 0
src/jfw/front/swordfish.go

@@ -2088,6 +2088,7 @@ func (f *Front) Newhistorypush() error {
 	if config.ActiveConfig.Live_Active_End > time.Now().Unix() && time.Now().Unix() > config.ActiveConfig.Live_Preheat_Start {
 		f.T["LiveState"] = true
 	}
+	f.T["advertcode"] = f.GetString("advertcode")
 	return f.Render("/weixin/historypush.html", &f.T)
 }
 

+ 104 - 3
src/jfw/front/vipsubscribe.go

@@ -1,6 +1,7 @@
 package front
 
 import (
+	"encoding/hex"
 	"fmt"
 	"jfw/config"
 	"jfw/jyutil"
@@ -11,6 +12,7 @@ import (
 	"qfw/util"
 	"qfw/util/jy"
 	"qfw/util/redis"
+	"strings"
 	"time"
 
 	"github.com/go-xweb/xweb"
@@ -56,6 +58,8 @@ type Subscribepay struct {
 	//超级订阅改版公共url
 	pcViewPage xweb.Mapper `xweb:"/vipsubscribe/pc/page/(.*)"` //超级订阅pc
 	wxViewPage xweb.Mapper `xweb:"/vipsubscribe/wx/page/(.*)"` //超级订阅wx
+	//订阅付费消息提醒中转
+	msgremind xweb.Mapper `xweb:"/front/vipsubscribe/msgremind"`
 }
 
 func init() {
@@ -221,12 +225,12 @@ func (s *Subscribepay) Introduce() error {
 		if s.GetString("disWord") != "" {
 			//分销识别 直接VIP续费
 			if util.IntAll((*m)["i_vip_status"]) == 1 { //试用用户
-				return s.Redirect("/front/vipsubscribe/vipsubscribe_new?disWord=" + s.GetString("disWord"))
+				return s.Redirect("/front/vipsubscribe/vipsubscribe_new?disWord=" + s.GetString("disWord") + "&advertcode=" + s.GetString("advertcode"))
 			} else {
-				return s.Redirect("/front/vipsubscribe/vipsubscribe_renew?disWord=" + s.GetString("disWord"))
+				return s.Redirect("/front/vipsubscribe/vipsubscribe_renew?disWord=" + s.GetString("disWord") + "&advertcode=" + s.GetString("advertcode"))
 			}
 		}
-		return s.Redirect("/front/vipsubscribe/toSubVipSetPage")
+		return s.Redirect("/front/vipsubscribe/toSubVipSetPage?advertcode=" + s.GetString("advertcode"))
 	}
 	s.T["notShowTrial"] = util.IntAll((*obj)["i_trial"]) == -1 || (*m)["i_vip_status"] != nil
 	s.T["signature"] = wx.SignJSSDK(s.Site() + s.Url())
@@ -424,4 +428,101 @@ func (this *Subscribepay) PcViewPage(htmlName string) error {
 func (this *Subscribepay) WxViewPage(htmlName string) error {
 	this.T["logid"] = config.Seoconfig["bigmember"].(string)
 	return this.Render("/vipsubscribe/wx/page_"+htmlName+".html", &this.T)
+//
+func (s *Subscribepay) Msgremind() error {
+	param := map[string]string{}
+	if array := strings.Split(s.Url(), "?"); len(array) == 2 {
+		decode, _ := hex.DecodeString(array[1])
+		for _, v := range strings.Split(string(decode), "&") {
+			if vv := strings.Split(v, "="); len(vv) == 2 {
+				param[vv[0]] = vv[1]
+			}
+		}
+	}
+	t := param["type"]
+	advertcode := param["advertcode"]
+	if t == "unpaid" { //未支付 已支付
+		return s.Redirect("/front/vipsubscribe/toOrderDetailPage?orderCode=" + param["ordercode"] + "&advertcode=" + advertcode)
+	} else if t == "bigmember_unpaid" {
+		return s.Redirect("/front/wxMyOrder/memberDetail/" + param["ordercode"] + "?advertcode=" + advertcode)
+	} else if t == "unknow_unpaid" {
+		return s.Redirect("/weixin/pay/toMyWxOrder")
+	}
+	userId, _ := s.GetSession("userId").(string)
+	if userId == "" {
+		return s.Render("_error.html")
+	}
+	user, ok := public.MQFW.FindById("user", userId, `{"i_vip_status":1,"l_vip_endtime":1,"i_member_status":1,"i_member_endtime":1}`)
+	if !ok || user == nil || len(*user) == 0 {
+		return s.Render("_error.html")
+	}
+	myLastOrderCode := func(user_id string) string {
+		order := public.Mysql.FindOne("dataexport_order", map[string]interface{}{
+			"user_id":      user_id,
+			"order_status": 1,
+			"product_type": "VIP订阅",
+		}, "id,order_code", "pay_time desc")
+		if order != nil && len(*order) > 0 {
+			return util.ObjToString((*order)["order_code"])
+		} else {
+			return ""
+		}
+	}
+	i_vip_status := util.IntAll((*user)["i_vip_status"])
+	if t == "bigmember_soonexprie" || t == "bigmember_expried" { //大会员即将到期、已到期
+		now_unix := time.Now().Unix()
+		i_member_endtime := util.Int64All((*user)["i_member_endtime"])
+		if now_unix < i_member_endtime-259200 {
+			//已续费
+			return s.Redirect("/big/wx/page/landingPage?advertcode=" + advertcode)
+		} else {
+			if now_unix > i_member_endtime {
+				//未续费已到期,跳转到再次购买页面
+				return s.Redirect("/big/wx/page/buy_commit?meal=sj&mid=&advertcode=" + advertcode)
+			} else {
+				//未续费未到期,跳转到续费页面
+				return s.Redirect("/big/wx/page/landingPage?advertcode=" + advertcode)
+			}
+		}
+	} else if t == "paid" {
+		if i_vip_status > 0 {
+			return s.Redirect("/front/vipsubscribe/toSubVipSetPage?advertcode=" + advertcode)
+		} else {
+			return s.Redirect("/front/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId) + "&advertcode=" + advertcode)
+		}
+	} else if t == "bigmember_paid" {
+		if util.IntAll((*user)["i_member_status"]) > 0 {
+			return s.Redirect("/big/wx/page/open_app?type=1&advertcode=" + advertcode)
+		} else {
+			return s.Redirect("/big/wx/page/landingPage?advertcode=" + advertcode)
+		}
+	} else if t == "soonexprie" || t == "expried" { //即将到期 已到期
+		now_unix := time.Now().Unix()
+		l_vip_endtime := util.Int64All((*user)["l_vip_endtime"])
+		if now_unix < l_vip_endtime-259200 {
+			//已续费
+			return s.Redirect("/front/vipsubscribe/toSubVipSetPage?advertcode=" + advertcode)
+		} else {
+			if now_unix > l_vip_endtime {
+				//未续费已到期,跳转到再次购买页面
+				return s.Redirect("/front/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId) + "&advertcode=" + advertcode)
+			} else {
+				//未续费未到期,跳转到续费页面
+				return s.Redirect("/front/vipsubscribe/vipsubscribe_renew?advertcode=" + advertcode)
+			}
+		}
+	} else if t == "ontrial_soonexprie" || t == "ontrial_expried" { //试用即将到期 试用已到期
+		if i_vip_status == 2 {
+			return s.Redirect("/front/vipsubscribe/toSubVipSetPage?advertcode=" + advertcode)
+		} else {
+			return s.Redirect("/front/vipsubscribe/vipsubscribe_new?advertcode=" + advertcode)
+		}
+	} else if t == "buyerclass" { //公共资源交易提醒
+		if i_vip_status > 0 { //vip未到期
+			return s.Redirect("/front/vipsubscribe/toSubVipSetPage?advertcode=" + advertcode)
+		} else if i_vip_status < 0 { //vip已到期
+			return s.Redirect("/front/vipsubscribe/introducePage?advertcode=" + advertcode)
+		}
+	}
+	return s.Render("_error.html")
 }

+ 49 - 25
src/jfw/modules/app/src/app/front/vipsubscribe.go

@@ -280,12 +280,19 @@ func (f *Subscribepay) Msgremind() error {
 			}
 		}
 	}
+	t := param["type"]
+	if t == "unpaid" { //未支付 已支付
+		return f.Redirect("/jyapp/vipsubscribe/toOrderDetailPage?orderCode=" + param["ordercode"])
+	} else if t == "bigmember_unpaid" {
+		return f.Redirect("/jyapp/big/page/orderdetail_member?order_code=" + param["ordercode"])
+	} else if t == "unknow_unpaid" {
+		return f.Redirect("/jyapp/front/myOrder/toMyOrder")
+	}
 	userId, _ := f.GetSession("userId").(string)
 	if userId == "" {
 		return f.Render("_error.html")
 	}
-	user, ok := public.MQFW.FindById("user", userId, `{"i_vip_status":1,"l_vip_endtime":1}`)
-	i_vip_status := util.IntAll((*user)["i_vip_status"])
+	user, ok := public.MQFW.FindById("user", userId, `{"i_vip_status":1,"l_vip_endtime":1,"i_member_status":1,"i_member_endtime":1}`)
 	if !ok || user == nil || len(*user) == 0 {
 		return f.Render("_error.html")
 	}
@@ -301,38 +308,55 @@ func (f *Subscribepay) Msgremind() error {
 			return ""
 		}
 	}
-	t := param["type"]
-	if t == "unpaid" { //未支付 已支付
-		return f.Redirect("/jyapp/vipsubscribe/toOrderDetailPage?orderCode=" + param["ordercode"])
+	i_vip_status := util.IntAll((*user)["i_vip_status"])
+	if t == "bigmember_soonexprie" || t == "bigmember_expried" { //大会员即将到期、已到期
+		now_unix := time.Now().Unix()
+		i_member_endtime := util.Int64All((*user)["i_member_endtime"])
+		if now_unix < i_member_endtime-259200 {
+			//已续费
+			return f.Redirect("/jyapp/big/page/main_root")
+		} else {
+			if now_unix > i_member_endtime {
+				//未续费已到期,跳转到再次购买页面
+				return f.Redirect("/jyapp/big/page/buy_commit?meal=sj&mid=")
+			} else {
+				//未续费未到期,跳转到续费页面
+				return f.Redirect("/jyapp/big/page/main_root")
+			}
+		}
 	} else if t == "paid" {
 		if i_vip_status > 0 {
 			return f.Redirect("/jyapp/vipsubscribe/toSubVipSetPage")
 		} else {
 			return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId))
 		}
-	} else if t == "ontrial_soonexprie" || t == "ontrial_expried" || t == "soonexprie" || t == "expried" { //试用即将到期 试用已到期 即将到期 已到期
-		if t == "ontrial_soonexprie" || t == "ontrial_expried" {
-			if i_vip_status == 2 {
-				return f.Redirect("/jyapp/vipsubscribe/toSubVipSetPage")
-			} else {
-				return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_new")
-			}
-		} else if t == "soonexprie" || t == "expried" {
-			now_unix := time.Now().Unix()
-			l_vip_endtime := util.Int64All((*user)["l_vip_endtime"])
-			if now_unix < l_vip_endtime-259200 {
-				//已续费
-				return f.Redirect("/jyapp/vipsubscribe/toSubVipSetPage")
+	} else if t == "bigmember_paid" {
+		if util.IntAll((*user)["i_member_status"]) > 0 {
+			return f.Redirect("/jyapp/big/page/main_root")
+		} else {
+			return f.Redirect("/jyapp/big/page/buy_commit?meal=sj&mid=")
+		}
+	} else if t == "soonexprie" || t == "expried" { //即将到期 已到期
+		now_unix := time.Now().Unix()
+		l_vip_endtime := util.Int64All((*user)["l_vip_endtime"])
+		if now_unix < l_vip_endtime-259200 {
+			//已续费
+			return f.Redirect("/jyapp/vipsubscribe/toSubVipSetPage")
+		} else {
+			if now_unix > l_vip_endtime {
+				//未续费已到期,跳转到再次购买页面
+				return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId))
 			} else {
-				if now_unix > l_vip_endtime {
-					//未续费已到期,跳转到再次购买页面
-					return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_new?orderCode=" + myLastOrderCode(userId))
-				} else {
-					//未续费未到期,跳转到续费页面
-					return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_renew")
-				}
+				//未续费未到期,跳转到续费页面
+				return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_renew")
 			}
 		}
+	} else if t == "ontrial_soonexprie" || t == "ontrial_expried" { //试用即将到期 试用已到期
+		if i_vip_status == 2 {
+			return f.Redirect("/jyapp/vipsubscribe/toSubVipSetPage")
+		} else {
+			return f.Redirect("/jyapp/vipsubscribe/vipsubscribe_new")
+		}
 	}
 	return f.Render("_error.html")
 }

+ 3 - 3
src/jfw/modules/bigmember/src/service/report/report.go

@@ -514,10 +514,10 @@ func (r *Report) Openpushmsg() error {
 	}
 	if r.GetString("t") == "wx_experience" {
 		if !isFree(userId) {
-			return r.Redirect("/swordfish/about")
+			return r.Redirect("/swordfish/about?advertcode=" + r.GetString("advertcode"))
 		}
 		go tipover(userId, pushspace_experience_member_statistic)
-		return r.Redirect(fmt.Sprintf("/big/wx/page/report_detail_%s?t=wx_experience&f=push&type=free&start=%d&end=%d&pushcount=%d", tp, start, end, pushcount))
+		return r.Redirect(fmt.Sprintf("/big/wx/page/report_detail_%s?t=wx_experience&f=push&type=free&start=%d&end=%d&pushcount=%d&advertcode=%s", tp, start, end, pushcount, r.GetString("advertcode")))
 	} else if r.GetString("t") == "app_experience" {
 		if !isFree(userId) {
 			return r.Redirect("/jyapp/free/swordfish/about")
@@ -527,7 +527,7 @@ func (r *Report) Openpushmsg() error {
 	} else {
 		go tipover(userId, pushspace_member_statistic)
 		//return r.Redirect(fmt.Sprintf("/jyapp/big/page/bigvip_subreport_%s?f=push&start=%d&end=%d&pushcount=%d", tp, start, end, pushcount))
-		return r.Redirect(fmt.Sprintf("/vipreport/page/subreport.html?f=push&type=member&start=%d&end=%d", start, end))
+		return r.Redirect(fmt.Sprintf("/vipreport/page/subreport.html?f=push&type=member&start=%d&end=%d&advertcode=%s", start, end, r.GetString("advertcode")))
 	}
 }
 

+ 19 - 26
src/jfw/modules/subscribepay/src/config/config.go

@@ -79,7 +79,8 @@ type timeTaskConfig struct {
 		//未支付订单提醒
 		AfterOrder            int64 //下单后n小时提醒
 		BeforeExpire          int64 //n小时自动关闭提醒
-		Duration              int   //定时任务时间间隔
+		RemindDuration        int   //定时任务时间间隔
+		LoadOrderDuration     int   //定时任务时间间隔
 		LiveActiveAfterOrder  int64 //直播活动下单后n小时提醒
 		LiveActiveAfterOrders int64 //直播活动下单后n小时提醒(2次提醒)
 	}
@@ -92,23 +93,28 @@ type timeTaskConfig struct {
 	ProvinceExpire                 string //省份订阅包
 }
 type messageConfig struct {
-	WxTpl_OnTrial_SoonExpire *WxTplMsg //试用即将到期
-	WxTpl_OnTrial_Expired    *WxTplMsg //试用已到期
-	WxTpl_SoonExpire         *WxTplMsg //即将到期
-	WxTpl_Expired            *WxTplMsg //已到期
-	WxTpl_Unpaid             *WxTplMsg //未支付订单
-	WxTpl_PaySuccess         *WxTplMsg //支付成功
-	WxTpl_DataReport         *WxTplMsg //数据报告
+	WxTpl_OnTrial_SoonExpire   *WxTplMsg //微信-超级订阅-试用即将到期
+	WxTpl_OnTrial_Expired      *WxTplMsg //微信-超级订阅-试用已到期
+	WxTpl_SoonExpire           *WxTplMsg //微信-超级订阅-即将到期
+	WxTpl_Expired              *WxTplMsg //微信-超级订阅-已到期
+	WxTpl_BigMember_SoonExpire *WxTplMsg //微信-大会员-即将到期
+	WxTpl_BigMember_Expired    *WxTplMsg //微信-大会员-已到期
+	WxTpl_Unpaid               *WxTplMsg //未支付订单
+	WxTpl_PaySuccess           *WxTplMsg //支付成功
+	WxTpl_DataReport           *WxTplMsg //数据报告
+	App_OnTrial_SoonExpire     string    //app-超级订阅-试用即将到期
+	App_OnTrial_Expired        string    //app-超级订阅-试用已到期
+	App_SoonExpire             string    //app-超级订阅-即将到期
+	App_Expired                string    //app-超级订阅-已到期
+	App_BigMember_SoonExpire   string    //app-大会员-即将到期
+	App_BigMember_Expired      string    //app-大会员-已到期
+	App_Unpaid                 string    //app-订单未支付
+	App_PaySuccess             string    //app-订单支付成功
 }
 
 type WxTplMsg struct {
 	Id       string
 	First    *qrpc.TmplItem
-	Second   *qrpc.TmplItem
-	Third    *qrpc.TmplItem
-	Fourth   *qrpc.TmplItem
-	Fifth    *qrpc.TmplItem
-	Sixth    *qrpc.TmplItem
 	Keyword1 *qrpc.TmplItem
 	Keyword2 *qrpc.TmplItem
 	Keyword3 *qrpc.TmplItem
@@ -273,13 +279,6 @@ var WxPayConf map[string]interface{}
 
 var Wxoauth, Wxoauthinfo string
 var AutoMergeTimeStamp int64
-var (
-	WxTpl_OnTrial_SoonExpire_SceneCode string
-	WxTpl_OnTrial_Expired_SceneCode    string
-	WxTpl_SoonExpire_SceneCode         string
-	WxTpl_Expired_SceneCode            string
-	WxTpl_DataReport_SceneCode         string
-)
 
 func init() {
 	//程序配置文件
@@ -319,10 +318,4 @@ func init() {
 		panic(err)
 	}
 	AutoMergeTimeStamp = time.Unix()
-	//
-	WxTpl_OnTrial_SoonExpire_SceneCode = MessageConfig.WxTpl_OnTrial_SoonExpire.First.Value
-	WxTpl_OnTrial_Expired_SceneCode = MessageConfig.WxTpl_OnTrial_Expired.First.Value
-	WxTpl_SoonExpire_SceneCode = MessageConfig.WxTpl_SoonExpire.First.Value
-	WxTpl_Expired_SceneCode = MessageConfig.WxTpl_Expired.First.Value
-	WxTpl_DataReport_SceneCode = MessageConfig.WxTpl_DataReport.First.Value
 }

+ 1 - 1
src/jfw/modules/subscribepay/src/entity/areaPack.go

@@ -3,9 +3,9 @@ package entity
 import (
 	"encoding/json"
 	"fmt"
-	"jfw/modules/common/src/qfw/util/jy"
 	"log"
 	qutil "qfw/util"
+	"qfw/util/jy"
 	"time"
 	"util"
 )

+ 6 - 9
src/jfw/modules/subscribepay/src/entity/dataReportStruct.go

@@ -6,6 +6,7 @@ import (
 	"errors"
 	"fmt"
 	"log"
+	. "p"
 	"pay"
 	qutil "qfw/util"
 	frpc "qfw/util/rpc"
@@ -167,21 +168,17 @@ func sendtemp(openid, order_coded, product_type, pay_time string) {
 	if openid == "" || order_coded == "" || product_type == "" || pay_time == "" {
 		fmt.Println("数据报告模板参数异常")
 	} else {
-		wxTplMsgErr := (&util.WxTplMsgCustom{}).DataReport()
-		if wxTplMsgErr != nil {
-			log.Println(wxTplMsgErr)
-		}
+		util.DataReport_WTMCS.Reload()
+		wtmc := util.DataReport_WTMCS.Get(config.MessageConfig.WxTpl_DataReport.First.Value)
 		ok, status := frpc.WxPush(config.Config.Weixinrpc, "WeiXinRpc.SendDataReportMsg", &frpc.NotifyMsg{
 			Openid:  openid,
-			Title:   config.MessageConfig.WxTpl_DataReport.First.Value,
+			Title:   wtmc.FirstData,
 			Detail:  product_type, //产品类型
 			Service: order_coded,  //订单编号
 			Date:    pay_time,     //支付时间
 			Remark:  "数据报告将以电子版形式发送至您的邮箱,请注意垃圾邮件过滤,感谢您的光临",
-			Url:     config.Config.WebDomain + "/datareport/page/order/detail/" + order_coded,
+			Url:     config.Config.WebDomain + "/front/sess/" + Se.EncodeString(openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",datareport") + "__" + order_coded + "__" + wtmc.AdvertCode,
 		})
-		if !ok {
-			fmt.Println("数据报告", order_coded, ok, status)
-		}
+		log.Println("数据报告", order_coded, ok, status, wtmc.AdvertCode, wtmc.FirstData)
 	}
 }

+ 2 - 1
src/jfw/modules/subscribepay/src/entity/member.go

@@ -23,7 +23,7 @@ func (m *memberStruct) PayCallBack(param *CallBackParam) bool {
 	} else { //支付宝微信回调
 		query["out_trade_no"] = param.OutTradeno
 	}
-	orderdata := util.Mysql.FindOne("dataexport_order", query, "id,filter,order_status,user_id,vip_type", "")
+	orderdata := util.Mysql.FindOne("dataexport_order", query, "id,filter,order_code,order_status,user_id,vip_type,prepay_time", "")
 	if orderdata == nil {
 		return false
 	}
@@ -56,6 +56,7 @@ func (m *memberStruct) PayCallBack(param *CallBackParam) bool {
 			})
 			log.Println("update:", update)
 			if update {
+				util.MsgRemind.BigMemberPaySuccess(qutil.IntAll((*orderdata)["id"]), qutil.ObjToString((*orderdata)["order_code"]), qutil.ObjToString((*orderdata)["user_id"]), qutil.ObjToString((*orderdata)["prepay_time"]), qutil.IntAllDef((*orderdata)["vip_type"], -1))
 				//取消其他订单
 				go PayCancel(userId, "大会员", "")
 			}

+ 1 - 1
src/jfw/modules/subscribepay/src/entity/subscribeVip.go

@@ -757,7 +757,7 @@ func PayCancel(userId, product_type, entname string) bool {
 				}, bson.M{
 					"order_status": -2,
 				}) {
-					util.MsgRemind.Delete(qutil.IntAll(v["id"]))
+					//util.MsgRemind.Delete(qutil.IntAll(v["id"]))
 					//卡卷取消绑定
 					userLotteryId := qutil.ObjToString(v["d_relation_id"])
 					if userLotteryId != "" || discountId != "" {

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

@@ -16,17 +16,10 @@ import (
 	"github.com/go-xweb/xweb"
 )
 
-func init() {
-	wxTplMsgExpiredErr := (&util.WxTplMsgCustom{}).Expired()
-	if wxTplMsgExpiredErr != nil {
-		log.Println(wxTplMsgExpiredErr)
-	}
-	wxTplMsgDataReportErr := (&util.WxTplMsgCustom{}).DataReport()
-	if wxTplMsgDataReportErr != nil {
-		log.Println(wxTplMsgDataReportErr)
-	}
-}
 func main() {
+	util.OnTrial_WTMCS.Reload()
+	util.Formal_WTMCS.Reload()
+	util.DataReport_WTMCS.Reload()
 	go func() {
 		frpc := new(rpcfollow.JyPayRpc)
 		rpc.Register(frpc)

+ 41 - 21
src/jfw/modules/subscribepay/src/message.json

@@ -48,40 +48,52 @@
 			"value":"超级订阅"
 		},
 		"remark": {
-			"value":"如已续费,请忽略此信息。"
+			"value":"如已购买,请忽略此信息。"
 		}
 	},
-	"WxTpl_Unpaid": {
-		"id": "kDYkiU8GlkScTLOUcpO7T99wbI8UJUelasPzyOJTn0s",
+	"WxTpl_BigMember_SoonExpire": {
+		"id": "_kQ-lk4LLPY_3gPWd1XKjRX3o-exDwoAPETBCaw53hg",
 		"first":{
-			"value":"您的订单 %s 处于未支付状态,为了使您获取更多招标信息,请您及时付款。",
+			"value":"003",
 			"color":"#FE737A"
 		},
-		"second":{
-			"value":"您的订单 %s 还未支付,现在支付立省%s元,全年仅此一次,错过不再有,请及时付款。",
-			"color":"#FE737A"
+		"keyword2": {
+			"value":"-"
 		},
-		"third":{
-			"value":"您的订单 %s 还未支付,已有%s人享受超级订阅 6 折活动,现在支付立省%s元,全年仅此一次,错过不再有,请及时付款。",
-			"color":"#FE737A"
+		"keyword3": {
+			"value":"大会员"
 		},
-		"fourth":{
-			"value":"您的订单 %s 还未支付,将在 2 小时后关闭,现在支付享超级订阅 6 折活动,立省%s元,全年仅此一次,错过不再有,请及时付款。",
+		"remark": {
+			"value":"如已续费,请忽略此信息。"
+		}
+	},
+	"WxTpl_BigMember_Expired": {
+		"id": "_kQ-lk4LLPY_3gPWd1XKjRX3o-exDwoAPETBCaw53hg",
+		"first":{
+			"value":"004",
 			"color":"#FE737A"
 		},
-		"fifth":{
-			"value":"您的订单 %s 还未支付,请及时付款。",
-			"color":"#FE737A"
+		"keyword2": {
+			"value":"-"
 		},
-		"sixth":{
-			"value":"您的订单 %s 还未支付,将在 2 小时后关闭,请及时付款。",
+		"keyword3": {
+			"value":"大会员"
+		},
+		"remark": {
+			"value":"如已购买,请忽略此信息。"
+		}
+	},
+	"WxTpl_Unpaid": {
+		"id": "kDYkiU8GlkScTLOUcpO7T99wbI8UJUelasPzyOJTn0s",
+		"first":{
+			"value":"001",
 			"color":"#FE737A"
 		},
 		"keyword3": {
 			"value":"%s元"
 		},
 		"keyword4": {
-			"value":"超级订阅%s"
+			"value":"%s"
 		},
 		"remark": {
 			"value":"订单将在%.0f小时后自动关闭,请及时支付。"
@@ -90,10 +102,10 @@
 	"WxTpl_PaySuccess": {
 		"id": "FLiFtUSALz4vfz7G8D7Riuicm0l0asg5zVxn_eE7t5k",
 		"first":{
-			"value":"您的订单 %s 已支付成功,剑鱼标讯将为您提供更多精准招标信息,感谢您的购买!"
+			"value":"002"
 		},
 		"keyword1": {
-			"value":"超级订阅%s"
+			"value":"%s"
 		}
 	},
 	"WxTpl_DataReport": {
@@ -101,5 +113,13 @@
 		"first":{
 			"value":"001"
 		}
-	}
+	},
+	"App_OnTrial_SoonExpire":"您试用的超级订阅服务即将到期,如需获取更多精准招标信息,请及时购买。",
+	"App_OnTrial_Expired":"您试用的超级订阅服务已到期,如需获取更多精准招标信息,请及时购买。",
+	"App_SoonExpire":"您的超级订阅服务即将到期,为了不影响您所获取更全面的招标信息,请您及时续费。",
+	"App_Expired":"您的超级订阅服务已到期,如需获取更多精准招标信息,请再次购买。",
+	"App_BigMember_SoonExpire":"您的大会员服务即将到期,为了不影响您所获取更全面的招标信息,请您及时续费。",
+	"App_BigMember_Expired":"您的大会员服务已到期,如需获取更多精准招标信息,请再次购买。",
+	"App_Unpaid":"您的订单 %s 处于未支付状态,为了使您获取更多招标信息,请您及时付款。",
+	"App_PaySuccess":"您的订单 %s 已支付成功,剑鱼标讯将为您提供更多精准招标信息,感谢您的购买!"
 }

+ 1 - 1
src/jfw/modules/subscribepay/src/report/report.go

@@ -442,7 +442,7 @@ func (r *Report) Wxtplmsg() error {
 	userId, _ := r.GetSession("userId").(string)
 	pushcount, _ := r.GetInteger("pushcount")
 	go tipover(userId, "pushspace_statistic")
-	return r.Redirect(fmt.Sprintf("/vipreport/page/reportdetail.html?f=push&type=vip&start=%s&end=%s&pushcount=%d", r.GetString("start"), r.GetString("end"), pushcount))
+	return r.Redirect(fmt.Sprintf("/vipreport/page/reportdetail.html?f=push&type=vip&start=%s&end=%s&pushcount=%d&advertcode=%s", r.GetString("start"), r.GetString("end"), pushcount, r.GetString("advertcode")))
 }
 
 func (r *Report) Starttime() {

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

@@ -267,9 +267,9 @@ func (o *OrderListDetails) DeleteOrder() error {
 				//删除订单
 				boo = util.Mysql.Update(tableName_order, queryMap, map[string]interface{}{"del_status": 1, "del_time": qutil.FormatDate(&now, qutil.Date_Full_Layout)})
 			}
-			if boo {
-				util.MsgRemind.Delete(qutil.IntAll((*order)["id"]))
-			}
+			// if boo {
+			// 	util.MsgRemind.Delete(qutil.IntAll((*order)["id"]))
+			// }
 		}
 
 		o.ServeJson(map[string]interface{}{

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

@@ -351,7 +351,7 @@ func (this *SubVipPayOrder) CreateOrder() {
 			}
 		}
 		//支付提醒
-		util.MsgRemind.Add(qutil.IntAll(orderid), totalfee, qutil.If(orderType == 5, 1, -1).(int), 0, ordercode, userId, now.Unix())
+		//util.MsgRemind.Add(qutil.IntAll(orderid), totalfee, qutil.If(orderType == 5, 1, -1).(int), 0, ordercode, userId, now.Unix())
 		return &entity.FuncResult{true, nil, map[string]interface{}{"code": ordercode}}
 	}()
 	if r.Err != nil {
@@ -535,7 +535,7 @@ func (this *SubVipPayOrder) Renew() {
 			}
 		}
 		//支付提醒
-		util.MsgRemind.Add(qutil.IntAll(orderid), totalfee, -1, 0, ordercode, userId, now.Unix())
+		//util.MsgRemind.Add(qutil.IntAll(orderid), totalfee, -1, 0, ordercode, userId, now.Unix())
 		return &entity.FuncResult{true, nil, map[string]interface{}{"code": ordercode}}
 	}()
 	if r.Err != nil {

+ 3 - 2
src/jfw/modules/subscribepay/src/timetask.json

@@ -1,12 +1,13 @@
 {
-	"isRun":false,
+	"isRun":true,
 	"expireRemind": "10:00",
 	"syncVipUpgrade": "00:00",
 	"checkIsExpire": "00:00",
 	"unpaidRemind": {
 		"afterOrder": 7200,
 		"beforeExpire": 7200,
-		"duration": 10,
+		"remindDuration": 10,
+		"loadOrderDuration": 8,
 		"liveActiveAfterOrder": 3600,
 		"liveActiveAfterOrders": 86400
 	},

+ 334 - 100
src/jfw/modules/subscribepay/src/timetask/timetask.go

@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"log"
 	. "mongodb"
+	. "p"
 	"pay"
 	qutil "qfw/util"
 	"qfw/util/jy"
@@ -33,6 +34,7 @@ func Run() {
 		go checkMemberServiceIsExpire()
 		go SendDataExportMailForPayed()
 		go updateDataExportStatus()
+		go bigMemberExpireRemind()
 		go updateProvincePackageStatus() //省份流量包
 	}
 }
@@ -276,7 +278,7 @@ func checkIsExpire() {
 		it := sess.DB("qfw").C("user").Find(map[string]interface{}{
 			"i_appid": 2,
 			"i_vip_status": map[string]interface{}{
-				"$in": []int{1, 2},
+				"$gt": 0,
 			},
 			"l_vip_endtime": map[string]interface{}{
 				"$lte": now_unix + threeday,
@@ -295,6 +297,9 @@ func checkIsExpire() {
 						"i_vip_subtips":    0,
 						"i_vip_fastimport": 0,
 					},
+					"$unset": map[string]interface{}{
+						"i_vip_expire_tip_retry": "",
+					},
 				})
 				if delSess != nil {
 					for _, pushColl := range []string{"pushspace", "pushspace_temp", "pushspace_vip", "pushspace_project"} {
@@ -314,6 +319,9 @@ func checkIsExpire() {
 					"$set": map[string]interface{}{
 						"i_vip_expire_tip": 1,
 					},
+					"$unset": map[string]interface{}{
+						"i_vip_expire_tip_retry": "",
+					},
 				})
 				log.Println("用户", _id, i_vip_status, l_vip_endtime, "修改即将到期状态", updateOk)
 			}
@@ -328,9 +336,9 @@ func expireRemind() {
 	crontab(false, TimeTaskConfig.ExpireRemind, func() {
 		defer qutil.Catch()
 		log.Println("定时任务,到期提醒,开始推送消息")
-		if wxTplMsgErr := (&util.WxTplMsgCustom{}).Expired(); wxTplMsgErr != nil {
-			log.Println(wxTplMsgErr)
-		}
+		now_unix := time.Now().Unix()
+		util.OnTrial_WTMCS.Reload()
+		util.Formal_WTMCS.Reload()
 		sess := util.MQFW.GetMgoConn()
 		for {
 			if sess != nil {
@@ -343,109 +351,142 @@ func expireRemind() {
 		it := sess.DB("qfw").C("user").Find(map[string]interface{}{
 			"i_appid": 2,
 			"i_vip_expire_tip": map[string]interface{}{
-				"$in": []int{1, 2},
+				"$gt": 0,
 			},
 		}).Select(map[string]interface{}{
-			"s_m_openid":       1,
-			"s_jpushid":        1,
-			"s_opushid":        1,
-			"s_appponetype":    1,
-			"s_nickname":       1,
-			"i_ispush":         1,
-			"i_vip_status":     1,
-			"l_vip_starttime":  1,
-			"l_vip_endtime":    1,
-			"i_vip_expire_tip": 1,
+			"s_m_openid":             1,
+			"s_jpushid":              1,
+			"s_opushid":              1,
+			"s_appponetype":          1,
+			"s_nickname":             1,
+			"i_ispush":               1,
+			"i_vip_status":           1,
+			"l_vip_starttime":        1,
+			"l_vip_endtime":          1,
+			"i_vip_expire_tip":       1,
+			"i_vip_expire_tip_retry": 1,
 		}).Iter()
 		for m := make(map[string]interface{}); it.Next(&m); {
-			_id := BsonIdToSId(m["_id"])
-			log.Println("发送消息", _id)
-			i_vip_status := qutil.IntAll(m["i_vip_status"])
 			i_vip_expire_tip := qutil.IntAll(m["i_vip_expire_tip"])
-			wxPushOk, appPushOk := false, false
 			if i_vip_expire_tip != 1 && i_vip_expire_tip != 2 {
 				continue
 			}
-			l_vip_starttime := qutil.Int64All(m["l_vip_starttime"])
+			_id := BsonIdToSId(m["_id"])
 			l_vip_endtime := qutil.Int64All(m["l_vip_endtime"])
+			if l_vip_endtime-now_unix > threeday && i_vip_expire_tip == 1 {
+				log.Println("即将到期提醒,结束时间大于三天,过滤掉", _id, l_vip_endtime)
+				continue
+			}
+			i_vip_status := qutil.IntAll(m["i_vip_status"])
+			wxPushOk, appPushOk := false, false
+			l_vip_starttime := qutil.Int64All(m["l_vip_starttime"])
 			s_m_openid := qutil.ObjToString(m["s_m_openid"])
 			isPushWx := qutil.IntAllDef(m["i_ispush"], 1)
 			s_jpushid := qutil.ObjToString(m["s_jpushid"])
 			s_opushid := qutil.ObjToString(m["s_opushid"])
 			s_appponetype := qutil.ObjToString(m["s_appponetype"])
 			log.Println("到期提醒,推送消息", _id, "i_vip_status", i_vip_status, "l_vip_starttime", l_vip_starttime, "l_vip_endtime", l_vip_endtime, "i_vip_expire_tip", i_vip_expire_tip, "s_m_openid", s_m_openid, "isPushWx", isPushWx, "s_appponetype", s_appponetype, "s_jpushid", s_jpushid, "s_opushid", s_opushid)
-			tp := ""
-			tplId, first_value, first_color, keyword1_value, keyword2_value, keyword3_value, keyword4_value, remark := "", "", "", "", "", "", "", ""
-			switch i_vip_status {
-			case 1, -1:
-				if i_vip_expire_tip == 1 {
-					tp = "ontrial_soonexprie"
-					tplId = MessageConfig.WxTpl_OnTrial_SoonExpire.Id
-					first_value = MessageConfig.WxTpl_OnTrial_SoonExpire.First.Value
-					first_color = MessageConfig.WxTpl_OnTrial_SoonExpire.First.Color
-					remark = MessageConfig.WxTpl_OnTrial_SoonExpire.Remark.Value
-				} else if i_vip_expire_tip == 2 {
-					tp = "ontrial_expried"
-					tplId = MessageConfig.WxTpl_OnTrial_Expired.Id
-					first_value = MessageConfig.WxTpl_OnTrial_Expired.First.Value
-					first_color = MessageConfig.WxTpl_OnTrial_Expired.First.Color
-					remark = MessageConfig.WxTpl_OnTrial_Expired.Remark.Value
+			if isPushWx == 1 && s_m_openid != "" { //微信推送
+				tp := ""
+				tplId, first_color, keyword1_value, keyword2_value, keyword3_value, keyword4_value, remark := "", "", "", "", "", "", ""
+				var wtmc *WxTplMsgCustom
+				switch i_vip_status {
+				case 1, -1:
+					if i_vip_expire_tip == 1 {
+						tp = "ontrial_soonexprie"
+						tplId = MessageConfig.WxTpl_OnTrial_SoonExpire.Id
+						wtmc = util.OnTrial_WTMCS.Get(MessageConfig.WxTpl_OnTrial_SoonExpire.First.Value)
+						first_color = MessageConfig.WxTpl_OnTrial_SoonExpire.First.Color
+						remark = MessageConfig.WxTpl_OnTrial_SoonExpire.Remark.Value
+					} else if i_vip_expire_tip == 2 {
+						tp = "ontrial_expried"
+						tplId = MessageConfig.WxTpl_OnTrial_Expired.Id
+						wtmc = util.OnTrial_WTMCS.Get(MessageConfig.WxTpl_OnTrial_Expired.First.Value)
+						first_color = MessageConfig.WxTpl_OnTrial_Expired.First.Color
+						remark = MessageConfig.WxTpl_OnTrial_Expired.Remark.Value
+					}
+					keyword1_value = qutil.ObjToString(m["s_nickname"])
+					keyword2_value = qutil.FormatDateByInt64(&l_vip_endtime, qutil.Date_Short_Layout)
+					break
+				case 2, -2:
+					if i_vip_expire_tip == 1 {
+						tp = "soonexprie"
+						tplId = MessageConfig.WxTpl_SoonExpire.Id
+						wtmc = util.Formal_WTMCS.Get(MessageConfig.WxTpl_SoonExpire.First.Value)
+						first_color = MessageConfig.WxTpl_SoonExpire.First.Color
+						keyword2_value = MessageConfig.WxTpl_SoonExpire.Keyword2.Value
+						keyword3_value = MessageConfig.WxTpl_SoonExpire.Keyword3.Value
+						remark = MessageConfig.WxTpl_SoonExpire.Remark.Value
+					} else if i_vip_expire_tip == 2 {
+						tp = "expried"
+						tplId = MessageConfig.WxTpl_Expired.Id
+						wtmc = util.Formal_WTMCS.Get(MessageConfig.WxTpl_Expired.First.Value)
+						first_color = MessageConfig.WxTpl_Expired.First.Color
+						keyword2_value = MessageConfig.WxTpl_Expired.Keyword2.Value
+						keyword3_value = MessageConfig.WxTpl_Expired.Keyword3.Value
+						remark = MessageConfig.WxTpl_Expired.Remark.Value
+					}
+					keyword1_value = qutil.ObjToString(m["s_nickname"])
+					keyword4_value = qutil.FormatDateByInt64(&l_vip_endtime, qutil.Date_Short_Layout)
+					break
+				default:
+					continue
 				}
-				keyword1_value = qutil.ObjToString(m["s_nickname"])
-				keyword2_value = qutil.FormatDateByInt64(&l_vip_endtime, qutil.Date_Short_Layout)
-				break
-			case 2, -2:
-				if i_vip_expire_tip == 1 {
-					tp = "soonexprie"
-					tplId = MessageConfig.WxTpl_SoonExpire.Id
-					first_value = MessageConfig.WxTpl_SoonExpire.First.Value
-					first_color = MessageConfig.WxTpl_SoonExpire.First.Color
-					keyword2_value = MessageConfig.WxTpl_SoonExpire.Keyword2.Value
-					keyword3_value = MessageConfig.WxTpl_SoonExpire.Keyword3.Value
-					remark = MessageConfig.WxTpl_SoonExpire.Remark.Value
-				} else if i_vip_expire_tip == 2 {
-					tp = "expried"
-					tplId = MessageConfig.WxTpl_Expired.Id
-					first_value = MessageConfig.WxTpl_Expired.First.Value
-					first_color = MessageConfig.WxTpl_Expired.First.Color
-					keyword2_value = MessageConfig.WxTpl_Expired.Keyword2.Value
-					keyword3_value = MessageConfig.WxTpl_Expired.Keyword3.Value
-					remark = MessageConfig.WxTpl_Expired.Remark.Value
+				if wtmc != nil {
+					tmplData := map[string]*qrpc.TmplItem{
+						"first": &qrpc.TmplItem{
+							Value: wtmc.FirstData,
+							Color: first_color,
+						},
+						"keyword1": &qrpc.TmplItem{
+							Value: keyword1_value,
+						},
+						"keyword2": &qrpc.TmplItem{
+							Value: keyword2_value,
+						},
+						"keyword3": &qrpc.TmplItem{
+							Value: keyword3_value,
+						},
+						"keyword4": &qrpc.TmplItem{
+							Value: keyword4_value,
+						},
+						"remark": &qrpc.TmplItem{
+							Value: remark,
+						},
+					}
+					wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
+						OpenId:   s_m_openid,
+						TplId:    tplId,
+						TmplData: tmplData,
+						Url:      Config.WebDomain + "/front/sess/" + util.Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s&advertcode=%s", tp, wtmc.AdvertCode))),
+					})
+					log.Println("到期提醒,微信推送", _id, wxPushOk, wtmc.AdvertCode, wtmc.FirstData)
 				}
-				keyword1_value = qutil.ObjToString(m["s_nickname"])
-				keyword4_value = qutil.FormatDateByInt64(&l_vip_endtime, qutil.Date_Short_Layout)
-				break
 			}
-			if isPushWx == 1 && s_m_openid != "" { //微信推送
-				tmplData := map[string]*qrpc.TmplItem{
-					"first": &qrpc.TmplItem{
-						Value: first_value,
-						Color: first_color,
-					},
-					"keyword1": &qrpc.TmplItem{
-						Value: keyword1_value,
-					},
-					"keyword2": &qrpc.TmplItem{
-						Value: keyword2_value,
-					},
-					"keyword3": &qrpc.TmplItem{
-						Value: keyword3_value,
-					},
-					"keyword4": &qrpc.TmplItem{
-						Value: keyword4_value,
-					},
-					"remark": &qrpc.TmplItem{
-						Value: remark,
-					},
+			if !wxPushOk && (m["s_opushid"] != nil || m["s_jpushid"] != nil) { //app推送
+				tp, app_descript := "", ""
+				switch i_vip_status {
+				case 1, -1:
+					if i_vip_expire_tip == 1 {
+						tp = "ontrial_soonexprie"
+						app_descript = MessageConfig.App_OnTrial_SoonExpire
+					} else if i_vip_expire_tip == 2 {
+						tp = "ontrial_expried"
+						app_descript = MessageConfig.App_OnTrial_Expired
+					}
+					break
+				case 2, -2:
+					if i_vip_expire_tip == 1 {
+						tp = "soonexprie"
+						app_descript = MessageConfig.App_SoonExpire
+					} else if i_vip_expire_tip == 2 {
+						tp = "expried"
+						app_descript = MessageConfig.App_Expired
+					}
+					break
+				default:
+					continue
 				}
-				wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
-					OpenId:   s_m_openid,
-					TplId:    tplId,
-					TmplData: tmplData,
-					Url:      Config.WebDomain + "/front/sess/" + util.Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s", tp))),
-				})
-				log.Println("到期提醒,微信推送", _id, wxPushOk)
-			} else if m["s_opushid"] != nil || m["s_jpushid"] != nil { //app推送
 				appPushOk = qrpc.AppPush(Config.AppPushServiceRpc, map[string]interface{}{
 					"phoneType":   m["s_appponetype"],
 					"otherPushId": m["s_opushid"],
@@ -453,17 +494,23 @@ func expireRemind() {
 					"url":         "/jyapp/free/sess/" + util.Se_Topnet.EncodeString(_id+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s", tp))),
 					"userId":      _id,
 					"type":        "vipNotice",
-					"descript":    first_value,
+					"descript":    app_descript,
 					"title":       "剑鱼提醒",
 				})
 				log.Println("到期提醒,app推送", _id, appPushOk)
 			}
-			if wxPushOk || appPushOk {
+			if wxPushOk || appPushOk || qutil.IntAll(m["i_vip_expire_tip_retry"]) >= 2 {
 				util.MQFW.UpdateById("user", _id, map[string]interface{}{
 					"$set": map[string]interface{}{
 						"i_vip_expire_tip": 0,
 					},
 				})
+			} else if i_vip_expire_tip == 2 {
+				util.MQFW.UpdateById("user", _id, map[string]interface{}{
+					"$inc": map[string]interface{}{
+						"i_vip_expire_tip_retry": 1,
+					},
+				})
 			}
 			m = make(map[string]interface{})
 		}
@@ -487,41 +534,77 @@ func checkMemberIsExpire() {
 			time.Sleep(time.Minute)
 			sess = util.MQFW.GetMgoConn()
 		}
+		delSess := util.Mgo_log.GetMgoConn()
+		delSessErrCount := 0
+		for {
+			if delSessErrCount == 10 {
+				break
+			} else if delSess != nil {
+				defer util.Mgo_log.DestoryMongoConn(delSess)
+				break
+			}
+			delSessErrCount++
+			time.Sleep(5 * time.Second)
+			delSess = util.Mgo_log.GetMgoConn()
+		}
 		it := sess.DB("qfw").C("user").Find(map[string]interface{}{
 			"i_appid": 2,
 			"i_member_status": map[string]interface{}{
 				"$gt": 0,
 			},
 			"i_member_endtime": map[string]interface{}{
-				"$lte": now_unix,
+				"$lte": now_unix + threeday,
 			},
-		}).Select(map[string]interface{}{"i_member_status": 1, "i_member_endtime": 1}).Iter()
+		}).Select(map[string]interface{}{"i_member_status": 1, "i_member_endtime": 1, "i_member_expire_tip": 1}).Iter()
 		for m := make(map[string]interface{}); it.Next(&m); {
 			_id := BsonIdToSId(m["_id"])
 			i_member_endtime := qutil.Int64All(m["i_member_endtime"])
 			i_member_status := qutil.IntAll(m["i_member_status"])
+			i_member_expire_tip := qutil.IntAll(m["i_member_expire_tip"])
 			if i_member_endtime <= now_unix {
 				util.MQFW.UpdateById("user", _id, map[string]interface{}{
 					"$set": map[string]interface{}{
-						"i_member_status": -i_member_status,
+						"i_member_status":     -i_member_status,
+						"i_member_expire_tip": 2,
 					},
 					"$unset": map[string]interface{}{
-						"i_mainaccount":       "",
-						"i_pay_sub_num":       "",
-						"i_free_sub_num":      "",
-						"i_member_sub_status": "",
-						"s_member_mainid":     "",
+						"i_member_expire_tip_retry": "",
+						"i_mainaccount":             "",
+						"i_pay_sub_num":             "",
+						"i_free_sub_num":            "",
+						"i_member_sub_status":       "",
+						"s_member_mainid":           "",
 					},
 				})
+				if delSess != nil {
+					for _, pushColl := range []string{"pushspace_member", "pushspace_member_temp", "pushspace_member_wait", "pushspace_member_project"} {
+						_, err := delSess.DB("push").C(pushColl).RemoveAll(map[string]interface{}{"userid": _id})
+						if err != nil {
+							log.Println("用户", _id, "大会员已到期删除", pushColl, "表数据出错", err)
+						} else {
+							log.Println("用户", _id, "大会员已到期删除", pushColl, "表数据")
+						}
+					}
+				}
 				//大会员用户服务表
 				if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET a.i_frequency = 0 , a.i_status = -1, a.l_updatetime=?  WHERE a.s_userid = ?`, now_time, _id) < 0 {
-					log.Println(_id, "跟新到期用户服务表出错")
+					log.Println(_id, "新到期用户服务表出错")
 				} else {
 					if !jy.ClearBigVipUserPower(_id) {
 						log.Println("清除 redis 大会员服务详情 缓存失败:", _id)
 					}
 					clearBigVipUserPower(_id)
 				}
+			} else if i_member_endtime-now_unix <= threeday && i_member_expire_tip != 1 {
+				updateOk := util.MQFW.UpdateById("user", _id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_member_expire_tip": 1,
+					},
+					"$unset": map[string]interface{}{
+						"i_member_expire_tip_retry": "",
+					},
+				})
+				log.Println("用户", _id, i_member_status, i_member_endtime, "修改大会员即将到期状态", updateOk)
 			}
 			m = make(map[string]interface{})
 		}
@@ -529,6 +612,157 @@ func checkMemberIsExpire() {
 	})
 }
 
+//大会员即将到期或者已到期发推送消息
+func bigMemberExpireRemind() {
+	crontab(false, TimeTaskConfig.ExpireRemind, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,大会员到期提醒,开始推送消息")
+		now_unix := time.Now().Unix()
+		util.Formal_WTMCS.Reload()
+		sess := util.MQFW.GetMgoConn()
+		for {
+			if sess != nil {
+				defer util.MQFW.DestoryMongoConn(sess)
+				break
+			}
+			time.Sleep(time.Minute)
+			sess = util.MQFW.GetMgoConn()
+		}
+		it := sess.DB("qfw").C("user").Find(map[string]interface{}{
+			"i_appid": 2,
+			"i_member_expire_tip": map[string]interface{}{
+				"$in": []int{1, 2},
+			},
+		}).Select(map[string]interface{}{
+			"s_m_openid":          1,
+			"s_jpushid":           1,
+			"s_opushid":           1,
+			"s_appponetype":       1,
+			"s_nickname":          1,
+			"i_ispush":            1,
+			"i_member_status":     1,
+			"i_member_starttime":  1,
+			"i_member_endtime":    1,
+			"i_member_expire_tip": 1,
+		}).Iter()
+		for m := make(map[string]interface{}); it.Next(&m); {
+			i_member_expire_tip := qutil.IntAll(m["i_member_expire_tip"])
+			if i_member_expire_tip != 1 && i_member_expire_tip != 2 {
+				continue
+			}
+			_id := BsonIdToSId(m["_id"])
+			i_member_endtime := qutil.Int64All(m["i_member_endtime"])
+			if i_member_endtime-now_unix > threeday && i_member_endtime == 1 {
+				log.Println("大会员即将到期提醒,结束时间大于三天,过滤掉", _id, i_member_endtime)
+				continue
+			}
+			i_member_status := qutil.IntAll(m["i_member_status"])
+			wxPushOk, appPushOk := false, false
+			i_member_starttime := qutil.Int64All(m["i_member_starttime"])
+			s_m_openid := qutil.ObjToString(m["s_m_openid"])
+			isPushWx := qutil.IntAllDef(m["i_ispush"], 1)
+			s_jpushid := qutil.ObjToString(m["s_jpushid"])
+			s_opushid := qutil.ObjToString(m["s_opushid"])
+			s_appponetype := qutil.ObjToString(m["s_appponetype"])
+			log.Println("大会员到期提醒,推送消息", _id, "i_member_status", i_member_status, "i_member_starttime", i_member_starttime, "i_member_endtime", i_member_endtime, "i_member_expire_tip", i_member_expire_tip, "s_m_openid", s_m_openid, "isPushWx", isPushWx, "s_appponetype", s_appponetype, "s_jpushid", s_jpushid, "s_opushid", s_opushid)
+			if isPushWx == 1 && s_m_openid != "" { //微信推送
+				//tp := ""
+				tplId, first_color, keyword1_value, keyword2_value, keyword3_value, keyword4_value, remark := "", "", "", "", "", "", ""
+				var wtmc *WxTplMsgCustom
+				if i_member_status > 0 {
+					//tp = "bigmember_soonexprie"
+					tplId = MessageConfig.WxTpl_BigMember_SoonExpire.Id
+					wtmc = util.Formal_WTMCS.Get(MessageConfig.WxTpl_BigMember_SoonExpire.First.Value)
+					first_color = MessageConfig.WxTpl_BigMember_SoonExpire.First.Color
+					keyword2_value = MessageConfig.WxTpl_BigMember_SoonExpire.Keyword2.Value
+					keyword3_value = MessageConfig.WxTpl_BigMember_SoonExpire.Keyword3.Value
+					remark = MessageConfig.WxTpl_BigMember_SoonExpire.Remark.Value
+				} else if i_member_status < 0 {
+					//tp = "bigmember_expried"
+					tplId = MessageConfig.WxTpl_BigMember_Expired.Id
+					wtmc = util.Formal_WTMCS.Get(MessageConfig.WxTpl_BigMember_Expired.First.Value)
+					first_color = MessageConfig.WxTpl_BigMember_Expired.First.Color
+					keyword2_value = MessageConfig.WxTpl_BigMember_Expired.Keyword2.Value
+					keyword3_value = MessageConfig.WxTpl_BigMember_Expired.Keyword3.Value
+					remark = MessageConfig.WxTpl_BigMember_Expired.Remark.Value
+				} else {
+					continue
+				}
+				if wtmc != nil {
+					keyword1_value = qutil.ObjToString(m["s_nickname"])
+					keyword4_value = qutil.FormatDateByInt64(&i_member_endtime, qutil.Date_Short_Layout)
+					tmplData := map[string]*qrpc.TmplItem{
+						"first": &qrpc.TmplItem{
+							Value: wtmc.FirstData,
+							Color: first_color,
+						},
+						"keyword1": &qrpc.TmplItem{
+							Value: keyword1_value,
+						},
+						"keyword2": &qrpc.TmplItem{
+							Value: keyword2_value,
+						},
+						"keyword3": &qrpc.TmplItem{
+							Value: keyword3_value,
+						},
+						"keyword4": &qrpc.TmplItem{
+							Value: keyword4_value,
+						},
+						"remark": &qrpc.TmplItem{
+							Value: remark,
+						},
+					}
+					wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
+						OpenId:   s_m_openid,
+						TplId:    tplId,
+						TmplData: tmplData,
+						//Url:      Config.WebDomain + "/front/sess/" + util.Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s&advertcode=%s", tp, wtmc.AdvertCode))),
+					})
+					log.Println("大会员到期提醒,微信推送", _id, wxPushOk, wtmc.AdvertCode, wtmc.FirstData)
+				}
+			}
+			if !wxPushOk && (m["s_opushid"] != nil || m["s_jpushid"] != nil) { //app推送
+				tp, app_descript := "", ""
+				if i_member_status > 0 {
+					tp = "bigmember_soonexprie"
+					app_descript = MessageConfig.App_BigMember_SoonExpire
+				} else if i_member_status < 0 {
+					tp = "bigmember_expried"
+					app_descript = MessageConfig.App_BigMember_Expired
+				} else {
+					continue
+				}
+				appPushOk = qrpc.AppPush(Config.AppPushServiceRpc, map[string]interface{}{
+					"phoneType":   m["s_appponetype"],
+					"otherPushId": m["s_opushid"],
+					"jgPushId":    m["s_jpushid"],
+					"url":         "/jyapp/free/sess/" + util.Se_Topnet.EncodeString(_id+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s", tp))),
+					"userId":      _id,
+					"type":        "vipNotice",
+					"descript":    app_descript,
+					"title":       "剑鱼提醒",
+				})
+				log.Println("大会员到期提醒,app推送", _id, appPushOk)
+			}
+			if wxPushOk || appPushOk || qutil.IntAll(m["i_member_expire_tip_retry"]) >= 2 {
+				util.MQFW.UpdateById("user", _id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_member_expire_tip": 0,
+					},
+				})
+			} else {
+				util.MQFW.UpdateById("user", _id, map[string]interface{}{
+					"$inc": map[string]interface{}{
+						"i_member_expire_tip_retry": 1,
+					},
+				})
+			}
+			m = make(map[string]interface{})
+		}
+		log.Println("定时任务,大会员到期提醒,推送消息结束")
+	})
+}
+
 //查看是否有大会员用户定时开启会员
 func checkMemberIsStart() {
 	crontab(true, TimeTaskConfig.MemberIsStart, func() {
@@ -603,7 +837,7 @@ func updateBigMemberService(userId string, now_unix int64) {
 
 //大会员用户服务表  用户服务是否需要开启或关闭
 func checkMemberServiceIsExpire() {
-	crontab(true, TimeTaskConfig.MemberServiceIsExpire, func() {
+	crontab(false, TimeTaskConfig.MemberServiceIsExpire, func() {
 		defer qutil.Catch()
 		log.Println("定时任务,更新大会员服务表状态开始")
 		now_unix := time.Now().Unix()

+ 2 - 1
src/jfw/modules/subscribepay/src/util/dataExportExcel.go

@@ -5,12 +5,13 @@ import (
 	"config"
 	"errors"
 	"fmt"
-	"github.com/tealeg/xlsx"
 	"io"
 	"os"
 	qutil "qfw/util"
 	"strings"
 	"time"
+
+	"github.com/tealeg/xlsx"
 )
 
 var (

+ 7 - 0
src/jfw/modules/subscribepay/src/util/db.go

@@ -3,6 +3,7 @@ package util
 import (
 	. "config"
 	mg "mongodb"
+	. "p"
 	qutil "qfw/util"
 	"qfw/util/elastic"
 	"qfw/util/mysql"
@@ -93,4 +94,10 @@ func init() {
 		Password:    Config.Mongolog.Password,
 	}
 	Mgo_log.InitPool()
+	//
+	OnTrial_WTMCS = NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_OnTrial_SoonExpire.Id, MessageConfig.WxTpl_OnTrial_SoonExpire.First.Value, MessageConfig.WxTpl_OnTrial_Expired.First.Value)
+	Formal_WTMCS = NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_Expired.Id, MessageConfig.WxTpl_SoonExpire.First.Value, MessageConfig.WxTpl_Expired.First.Value, MessageConfig.WxTpl_BigMember_SoonExpire.First.Value, MessageConfig.WxTpl_BigMember_Expired.First.Value)
+	DataReport_WTMCS = NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_DataReport.Id, MessageConfig.WxTpl_DataReport.First.Value)
+	PaySuccess_WTMCS = NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_PaySuccess.Id, MessageConfig.WxTpl_PaySuccess.First.Value)
+	Unpaid_WTMCS = NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_Unpaid.Id, MessageConfig.WxTpl_Unpaid.First.Value)
 }

+ 204 - 104
src/jfw/modules/subscribepay/src/util/msgremind.go

@@ -30,10 +30,11 @@ type unpaidOrder struct {
 	orderId      int    //订单id
 	orderCode    string //订单编号
 	userId       string //用户id
-	prepayTime   int64  //下单时间
+	createTime   int64  //下单时间
 	remindStatus int    //1-下单时间2小时提醒 2-剩余2小时自动关闭时再次提醒
 	vipType      int    //-1:直接购买 0:试用 1:续费 2:升级
 	orderMoney   int    //订单金额
+	productType  string
 }
 
 /*新的订单存库以后,再存入内存中
@@ -43,41 +44,43 @@ type unpaidOrder struct {
  *@param remindStatus 1-下单时间2小时提醒 2-剩余2小时自动关闭时再次提醒
  *@param orderCode 订单编号
  *@param userId 用户id
- *@param prepayTime 购买时间
+ *@param createTime 购买时间
+ *@param productType 产品类型
  */
-func (m *msgRemind) Add(orderId, orderMoney, vipType, remindStatus int, orderCode, userId string, prepayTime int64) {
-	log.Println("未支付待提醒订单加入", orderId, orderCode, userId, prepayTime)
+func (m *msgRemind) add(orderId, orderMoney, vipType, remindStatus int, orderCode, userId string, createTime int64, productType string) {
+	log.Println("未支付待提醒订单加入", orderId, orderCode, userId, createTime)
 	m.unpaidOrders.Store(orderId, &unpaidOrder{
 		orderCode:    orderCode,
 		userId:       userId,
-		prepayTime:   prepayTime,
+		createTime:   createTime,
 		orderId:      orderId,
 		orderMoney:   orderMoney,
 		vipType:      vipType,
 		remindStatus: remindStatus,
+		productType:  productType,
 	})
 }
 
 /*删除待提醒的订单
  *@param orderId 订单id
  */
-func (m *msgRemind) Delete(orderId int) {
+func (m *msgRemind) delete(orderId int) {
 	log.Println("删除待提醒的订单", orderId)
 	m.unpaidOrders.Delete(orderId)
 }
 
 /*
- *订单支付成功以后,消息通知处理
+ *超级订阅订单支付成功以后,消息通知处理
  *@param orderId 订单id
  *@param orderCode 订单编号
  *@param userId 用户id
- *@param prepayTime 购买时间
+ *@param createTime 购买时间
  *@param vipType -1:直接购买 0:试用 1:续费 2:升级
  */
-func (m *msgRemind) PaySuccess(orderId int, orderCode, userId, prepayTime string, vipType int) {
+func (m *msgRemind) PaySuccess(orderId int, orderCode, userId, createTime string, vipType int) {
 	go func() {
 		defer util.Catch()
-		log.Println("支付成功以后,消息提醒处理", orderId, orderCode, userId, prepayTime)
+		log.Println("超级订阅支付成功以后,消息提醒处理", orderId, orderCode, userId, createTime)
 		m.unpaidOrders.Delete(orderId)
 		user, ok := MQFW.FindById("user", userId, `{"s_m_openid":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"i_ispush":1,"l_vip_endtime":1}`)
 		if !ok || user == nil || len(*user) == 0 {
@@ -88,34 +91,40 @@ func (m *msgRemind) PaySuccess(orderId int, orderCode, userId, prepayTime string
 		s_jpushid, _ := (*user)["s_jpushid"].(string)
 		s_opushid, _ := (*user)["s_opushid"].(string)
 		s_appponetype, _ := (*user)["s_appponetype"].(string)
-		log.Println("支付成功,推送消息", userId, "s_m_openid", s_m_openid, "s_jpushid", s_jpushid, "s_opushid", s_opushid, "s_appponetype", s_appponetype)
+		log.Println("超级订阅支付成功,推送消息", userId, "s_m_openid", s_m_openid, "s_jpushid", s_jpushid, "s_opushid", s_opushid, "s_appponetype", s_appponetype)
+		wxPushOk := false
 		if isPushWx == 1 && s_m_openid != "" {
 			l_vip_endtime := (*user)["l_vip_endtime"]
 			expireTime := util.FormatDateWithObj(&l_vip_endtime, util.Date_Short_Layout)
-			wxPushOk, _ := qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
-				OpenId: s_m_openid,
-				TplId:  MessageConfig.WxTpl_PaySuccess.Id,
-				TmplData: map[string]*qrpc.TmplItem{
-					"first": &qrpc.TmplItem{
-						Value: fmt.Sprintf(MessageConfig.WxTpl_PaySuccess.First.Value, orderCode),
-					},
-					"keyword1": &qrpc.TmplItem{
-						Value: fmt.Sprintf(MessageConfig.WxTpl_PaySuccess.Keyword1.Value, m.getVipType(vipType)),
-					},
-					"keyword2": &qrpc.TmplItem{
-						Value: orderCode,
-					},
-					"keyword3": &qrpc.TmplItem{
-						Value: strings.Split(prepayTime, " ")[0],
-					},
-					"keyword4": &qrpc.TmplItem{
-						Value: expireTime,
+			PaySuccess_WTMCS.Reload()
+			wtmc := PaySuccess_WTMCS.Get(MessageConfig.WxTpl_PaySuccess.First.Value)
+			if wtmc != nil {
+				wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
+					OpenId: s_m_openid,
+					TplId:  MessageConfig.WxTpl_PaySuccess.Id,
+					TmplData: map[string]*qrpc.TmplItem{
+						"first": &qrpc.TmplItem{
+							Value: strings.ReplaceAll(wtmc.FirstData, "@订单号", orderCode),
+						},
+						"keyword1": &qrpc.TmplItem{
+							Value: fmt.Sprintf(MessageConfig.WxTpl_PaySuccess.Keyword1.Value, "超级订阅"+m.getVipType(vipType)),
+						},
+						"keyword2": &qrpc.TmplItem{
+							Value: orderCode,
+						},
+						"keyword3": &qrpc.TmplItem{
+							Value: strings.Split(createTime, " ")[0],
+						},
+						"keyword4": &qrpc.TmplItem{
+							Value: expireTime,
+						},
 					},
-				},
-				Url: Config.WebDomain + "/front/sess/" + Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=paid"))),
-			})
-			log.Println("支付成功,微信推送", userId, wxPushOk)
-		} else if s_opushid != "" || s_jpushid != "" {
+					Url: Config.WebDomain + "/front/sess/" + Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=paid&advertcode=%s", wtmc.AdvertCode))),
+				})
+				log.Println("超级订阅支付成功,微信推送", userId, wxPushOk, wtmc.AdvertCode, wtmc.FirstData)
+			}
+		}
+		if !wxPushOk && (s_opushid != "" || s_jpushid != "") {
 			appPushOk := qrpc.AppPush(Config.AppPushServiceRpc, map[string]interface{}{
 				"phoneType":   s_appponetype,
 				"otherPushId": s_opushid,
@@ -123,22 +132,92 @@ func (m *msgRemind) PaySuccess(orderId int, orderCode, userId, prepayTime string
 				"url":         "/jyapp/free/sess/" + Se_Topnet.EncodeString(userId+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=paid"))),
 				"userId":      userId,
 				"type":        "vipNotice",
-				"descript":    fmt.Sprintf(MessageConfig.WxTpl_PaySuccess.First.Value, orderCode),
+				"descript":    fmt.Sprintf(MessageConfig.App_PaySuccess, orderCode),
 				"title":       "剑鱼提醒",
 			})
-			log.Println("支付成功,app推送", userId, appPushOk)
+			log.Println("超级订阅支付成功,app推送", userId, appPushOk)
 		}
 	}()
 }
 
 /*
- *订单支付成功以后,消息通知处理
+ *大会员订单支付成功以后,消息通知处理
  *@param orderId 订单id
  *@param orderCode 订单编号
  *@param userId 用户id
- *@param prepayTime 购买时间
+ *@param createTime 购买时间
  *@param vipType -1:直接购买 0:试用 1:续费 2:升级
  */
+func (m *msgRemind) BigMemberPaySuccess(orderId int, orderCode, userId, createTime string, vipType int) {
+	go func() {
+		defer util.Catch()
+		log.Println("大会员支付成功以后,消息提醒处理", orderId, orderCode, userId, createTime)
+		m.unpaidOrders.Delete(orderId)
+		user, ok := MQFW.FindById("user", userId, `{"s_m_openid":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"i_ispush":1,"l_vip_endtime":1}`)
+		if !ok || user == nil || len(*user) == 0 {
+			return
+		}
+		isPushWx := util.IntAllDef((*user)["i_ispush"], 1)
+		s_m_openid, _ := (*user)["s_m_openid"].(string)
+		s_jpushid, _ := (*user)["s_jpushid"].(string)
+		s_opushid, _ := (*user)["s_opushid"].(string)
+		s_appponetype, _ := (*user)["s_appponetype"].(string)
+		log.Println("大会员支付成功,推送消息", userId, "s_m_openid", s_m_openid, "s_jpushid", s_jpushid, "s_opushid", s_opushid, "s_appponetype", s_appponetype)
+		wxPushOk := false
+		if isPushWx == 1 && s_m_openid != "" {
+			l_vip_endtime := (*user)["l_vip_endtime"]
+			expireTime := util.FormatDateWithObj(&l_vip_endtime, util.Date_Short_Layout)
+			PaySuccess_WTMCS.Reload()
+			wtmc := PaySuccess_WTMCS.Get(MessageConfig.WxTpl_PaySuccess.First.Value)
+			if wtmc != nil {
+				wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
+					OpenId: s_m_openid,
+					TplId:  MessageConfig.WxTpl_PaySuccess.Id,
+					TmplData: map[string]*qrpc.TmplItem{
+						"first": &qrpc.TmplItem{
+							Value: strings.ReplaceAll(wtmc.FirstData, "@订单号", orderCode),
+						},
+						"keyword1": &qrpc.TmplItem{
+							Value: fmt.Sprintf(MessageConfig.WxTpl_PaySuccess.Keyword1.Value, "大会员"+m.getVipType(vipType)),
+						},
+						"keyword2": &qrpc.TmplItem{
+							Value: orderCode,
+						},
+						"keyword3": &qrpc.TmplItem{
+							Value: strings.Split(createTime, " ")[0],
+						},
+						"keyword4": &qrpc.TmplItem{
+							Value: expireTime,
+						},
+					},
+					//Url: Config.WebDomain + "/front/sess/" + Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=bigmember_paid&&advertcode=%s", wtmc.AdvertCode))),
+				})
+				log.Println("大会员支付成功,微信推送", userId, wxPushOk, wtmc.AdvertCode, wtmc.FirstData)
+			}
+		}
+		if !wxPushOk && (s_opushid != "" || s_jpushid != "") {
+			appPushOk := qrpc.AppPush(Config.AppPushServiceRpc, map[string]interface{}{
+				"phoneType":   s_appponetype,
+				"otherPushId": s_opushid,
+				"jgPushId":    s_jpushid,
+				"url":         "/jyapp/free/sess/" + Se_Topnet.EncodeString(userId+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=bigmember_paid"))),
+				"userId":      userId,
+				"type":        "vipNotice",
+				"descript":    fmt.Sprintf(MessageConfig.App_PaySuccess, orderCode),
+				"title":       "剑鱼提醒",
+			})
+			log.Println("大会员支付成功,app推送", userId, appPushOk)
+		}
+	}()
+}
+
+/*
+ *订单支付成功以后,消息通知处理
+ *@param orderId 订单id
+ *@param userId 用户id
+ *@param price 价格
+ *@param product 产品类型
+ */
 func (m *msgRemind) DistributionSuccess(orderId int, userId string, price int, product string) {
 	go func() {
 		priceFloat := decimal.NewFromFloat(float64(price)).Div(decimal.NewFromFloat(float64(100)))
@@ -214,29 +293,30 @@ func (m *msgRemind) getVipType(vipType int) string {
 }
 
 func (m *msgRemind) run() {
-	duration := TimeTaskConfig.UnpaidRemind.Duration
+	duration := TimeTaskConfig.UnpaidRemind.RemindDuration
 	if duration == 0 {
 		duration = 10
 	}
 	log.Println("未支付订单定时任务run after", duration, "m")
 	time.AfterFunc(time.Duration(duration)*time.Minute, func() {
 		defer util.Catch()
+		Unpaid_WTMCS.Reload()
 		m.unpaidOrders.Range(func(k interface{}, v interface{}) bool {
 			orderId, _ := k.(int)
 			unpaidOrder, _ := v.(*unpaidOrder)
 			if Mysql.CountBySql("select count(1) as count from dataexport_order where id=? and order_status=0 and del_status=0 and (remind_status<>2 or remind_status is null)", orderId) == 0 {
+				m.delete(orderId)
 				log.Println("未支付订单状态发生变化,不推送消息", unpaidOrder.userId, orderId, unpaidOrder.orderCode)
 				return true
 			}
 			now_unix := time.Now().Unix()
 			remind_status := 0
 			//剩余2小时
-			if unpaidOrder.remindStatus != 2 && unpaidOrder.prepayTime+m.getExpireTime() > now_unix && now_unix >= unpaidOrder.prepayTime+m.getExpireTime()-TimeTaskConfig.UnpaidRemind.BeforeExpire {
+			if unpaidOrder.remindStatus != 2 && unpaidOrder.createTime+m.getExpireTime() > now_unix && now_unix >= unpaidOrder.createTime+m.getExpireTime()-TimeTaskConfig.UnpaidRemind.BeforeExpire {
 				remind_status = 2
-			} else if unpaidOrder.remindStatus == 0 && now_unix > unpaidOrder.prepayTime+TimeTaskConfig.UnpaidRemind.AfterOrder { //下单时间后2小时未支付
+			} else if unpaidOrder.remindStatus == 0 && now_unix > unpaidOrder.createTime+TimeTaskConfig.UnpaidRemind.AfterOrder { //下单时间后2小时未支付
 				remind_status = 1
-			}
-			if remind_status == 0 {
+			} else {
 				return true
 			}
 			user, ok := MQFW.FindById("user", unpaidOrder.userId, `{"s_m_openid":1,"s_jpushid":1,"s_opushid":1,"s_appponetype":1,"i_ispush":1}`)
@@ -250,46 +330,61 @@ func (m *msgRemind) run() {
 			s_appponetype, _ := (*user)["s_appponetype"].(string)
 			log.Println("未支付订单,推送消息", unpaidOrder.userId, orderId, unpaidOrder.orderCode, "remind_status", remind_status, "i_ispush", isPushWx, "s_m_openid", s_m_openid, "s_jpushid", s_jpushid, "s_opushid", s_opushid, "s_appponetype", s_appponetype)
 			wxPushOk, appPushOk := false, false
+			t := ""
+			productType := unpaidOrder.productType
+			if productType == "VIP订阅" {
+				productType = "超级订阅"
+				t = "unpaid"
+			} else if productType == "大会员" {
+				t = "bigmember_unpaid"
+			} else {
+				t = "unknow_unpaid"
+			}
 			if isPushWx == 1 && s_m_openid != "" {
-				tmplData := map[string]*qrpc.TmplItem{
-					"first": &qrpc.TmplItem{
-						Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.First.Value, unpaidOrder.orderCode),
-						Color: MessageConfig.WxTpl_Unpaid.First.Color,
-					},
-					"keyword1": &qrpc.TmplItem{
-						Value: util.FormatDateByInt64(&unpaidOrder.prepayTime, util.Date_Short_Layout),
-					},
-					"keyword2": &qrpc.TmplItem{
-						Value: unpaidOrder.orderCode,
-					},
-					"keyword3": &qrpc.TmplItem{
-						Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Keyword3.Value, fmt.Sprintf("%.2f", float64(unpaidOrder.orderMoney)/100)),
-					},
-					"keyword4": &qrpc.TmplItem{
-						Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Keyword4.Value, m.getVipType(unpaidOrder.vipType)),
-					},
-				}
-				if remind_status == 2 {
-					tmplData["remark"] = &qrpc.TmplItem{
-						Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Remark.Value, math.Ceil(float64(TimeTaskConfig.UnpaidRemind.BeforeExpire)/3600)),
+				wtmc := Unpaid_WTMCS.Get(MessageConfig.WxTpl_Unpaid.First.Value)
+				if wtmc != nil {
+
+					tmplData := map[string]*qrpc.TmplItem{
+						"first": &qrpc.TmplItem{
+							Value: strings.ReplaceAll(wtmc.FirstData, "@订单号", unpaidOrder.orderCode),
+							Color: MessageConfig.WxTpl_Unpaid.First.Color,
+						},
+						"keyword1": &qrpc.TmplItem{
+							Value: util.FormatDateByInt64(&unpaidOrder.createTime, util.Date_Short_Layout),
+						},
+						"keyword2": &qrpc.TmplItem{
+							Value: unpaidOrder.orderCode,
+						},
+						"keyword3": &qrpc.TmplItem{
+							Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Keyword3.Value, fmt.Sprintf("%.2f", float64(unpaidOrder.orderMoney)/100)),
+						},
+						"keyword4": &qrpc.TmplItem{
+							Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Keyword4.Value, productType+m.getVipType(unpaidOrder.vipType)),
+						},
 					}
+					if remind_status == 2 {
+						tmplData["remark"] = &qrpc.TmplItem{
+							Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Remark.Value, math.Ceil(float64(TimeTaskConfig.UnpaidRemind.BeforeExpire)/3600)),
+						}
+					}
+					wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
+						OpenId:   s_m_openid,
+						TplId:    MessageConfig.WxTpl_Unpaid.Id,
+						TmplData: tmplData,
+						Url:      Config.WebDomain + "/front/sess/" + Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s&ordercode=%s&advertcode=%s", t, unpaidOrder.orderCode, wtmc.AdvertCode))),
+					})
+					log.Println("未支付订单,微信推送", unpaidOrder.userId, orderId, unpaidOrder.orderCode, wxPushOk, wtmc.AdvertCode, wtmc.FirstData)
 				}
-				wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
-					OpenId:   s_m_openid,
-					TplId:    MessageConfig.WxTpl_Unpaid.Id,
-					TmplData: tmplData,
-					Url:      Config.WebDomain + "/front/sess/" + Se_Topnet.EncodeString(s_m_openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=unpaid&ordercode=%s", unpaidOrder.orderCode))),
-				})
-				log.Println("未支付订单,微信推送", unpaidOrder.userId, orderId, unpaidOrder.orderCode, wxPushOk)
-			} else if s_opushid != "" || s_jpushid != "" {
+			}
+			if !wxPushOk && (s_opushid != "" || s_jpushid != "") {
 				appPushOk = qrpc.AppPush(Config.AppPushServiceRpc, map[string]interface{}{
 					"phoneType":   s_appponetype,
 					"otherPushId": s_opushid,
 					"jgPushId":    s_jpushid,
-					"url":         "/jyapp/free/sess/" + Se_Topnet.EncodeString(unpaidOrder.userId+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=unpaid&ordercode=%s", unpaidOrder.orderCode))),
+					"url":         "/jyapp/free/sess/" + Se_Topnet.EncodeString(unpaidOrder.userId+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",msgremind") + "__" + hex.EncodeToString([]byte(fmt.Sprintf("type=%s&ordercode=%s", t, unpaidOrder.orderCode))),
 					"userId":      unpaidOrder.userId,
 					"type":        "vipNotice",
-					"descript":    fmt.Sprintf(MessageConfig.WxTpl_Unpaid.First.Value, unpaidOrder.orderCode),
+					"descript":    fmt.Sprintf(MessageConfig.App_Unpaid, unpaidOrder.orderCode),
 					"title":       "剑鱼提醒",
 				})
 				log.Println("未支付订单,app推送", unpaidOrder.userId, orderId, unpaidOrder.orderCode, appPushOk)
@@ -312,12 +407,42 @@ func (m *msgRemind) run() {
 		m.run()
 	})
 }
+func (m *msgRemind) loadOrder() {
+	defer util.Catch()
+	log.Println("开始加载72小时内的订单到内存中。。。")
+	startTime := time.Unix(time.Now().Unix()-MsgRemind.getExpireTime(), 0)
+	startTimes := util.FormatDate(&startTime, util.Date_Full_Layout)
+	list := Mysql.SelectBySql("select id,order_code,order_money,user_id,create_time,remind_status,vip_type,product_type from dataexport_order where order_money>0 and create_time>=? and product_type in ('VIP订阅','大会员') and order_status=0 and del_status=0 and (remind_status<>2 or remind_status is null)", startTimes)
+	if list == nil {
+		log.Println("加载72小时内的订单到内存中失败")
+		return
+	}
+	for _, v := range *list {
+		order_code, _ := v["order_code"].(string)
+		user_id, _ := v["user_id"].(string)
+		create_time, _ := v["create_time"].(string)
+		if order_code == "" || user_id == "" || create_time == "" {
+			continue
+		}
+		createTime, err := time.ParseInLocation(util.Date_Full_Layout, create_time, time.Local)
+		if err != nil {
+			continue
+		}
+		MsgRemind.add(util.IntAll(v["id"]), util.IntAll(v["order_money"]), util.IntAllDef(v["vip_type"], -1), util.IntAll(v["remind_status"]), order_code, user_id, createTime.Unix(), util.ObjToString(v["product_type"]))
+	}
+	log.Println("加载72小时内的订单到内存中结束。。。", len(*list))
+	duration := TimeTaskConfig.UnpaidRemind.LoadOrderDuration
+	if duration == 0 {
+		duration = 8
+	}
+	time.AfterFunc(time.Duration(duration)*time.Minute, m.loadOrder)
+}
 func (m *msgRemind) gc() {
-	time.AfterFunc(5*time.Minute, func() {
+	time.AfterFunc(3*time.Minute, func() {
 		defer util.Catch()
 		m.unpaidOrders.Range(func(k interface{}, v interface{}) bool {
 			unpaidOrder, _ := v.(*unpaidOrder)
-			if time.Now().Unix() > unpaidOrder.prepayTime+m.getExpireTime() {
+			if time.Now().Unix() > unpaidOrder.createTime+m.getExpireTime() {
 				m.unpaidOrders.Delete(k)
 			}
 			return true
@@ -327,33 +452,8 @@ func (m *msgRemind) gc() {
 }
 func init() {
 	if TimeTaskConfig.IsRun {
-		go func() {
-			defer util.Catch()
-			log.Println("开始加载72小时内的订单到内存中。。。")
-			startTime := time.Unix(time.Now().Unix()-MsgRemind.getExpireTime(), 0)
-			startTimes := util.FormatDate(&startTime, util.Date_Full_Layout)
-			list := Mysql.SelectBySql("select id,order_code,order_money,user_id,prepay_time,remind_status,vip_type from dataexport_order where order_money>0 and prepay_time>=? and product_type='VIP订阅' and order_status=0 and del_status=0 and (remind_status<>2 or remind_status is null)", startTimes)
-			if list == nil {
-				log.Println("加载72小时内的订单到内存中失败")
-				return
-			}
-			for _, v := range *list {
-				order_code, _ := v["order_code"].(string)
-				user_id, _ := v["user_id"].(string)
-				prepay_time, _ := v["prepay_time"].(string)
-				if order_code == "" || user_id == "" || prepay_time == "" {
-					continue
-				}
-				prepayTime, err := time.ParseInLocation(util.Date_Full_Layout, prepay_time, time.Local)
-				if err != nil {
-					continue
-				}
-				orderId := util.IntAll(v["id"])
-				MsgRemind.Add(orderId, util.IntAll(v["order_money"]), util.IntAllDef(v["vip_type"], -1), util.IntAll(v["remind_status"]), order_code, user_id, prepayTime.Unix())
-			}
-			log.Println("加载72小时内的订单到内存中结束。。。", len(*list))
-		}()
+		MsgRemind.loadOrder()
+		MsgRemind.run()
+		MsgRemind.gc()
 	}
-	MsgRemind.run()
-	MsgRemind.gc()
 }

+ 9 - 0
src/jfw/modules/subscribepay/src/util/util.go

@@ -1,9 +1,18 @@
 package util
 
 import (
+	. "p"
 	qutil "qfw/util"
 )
 
+var (
+	OnTrial_WTMCS    *WxTplMsgCustoms
+	Formal_WTMCS     *WxTplMsgCustoms
+	DataReport_WTMCS *WxTplMsgCustoms
+	PaySuccess_WTMCS *WxTplMsgCustoms
+	Unpaid_WTMCS     *WxTplMsgCustoms
+)
+
 func ConfirmIntArr(arr []interface{}) []int {
 	tmp := make([]int, 0)
 	for _, v := range arr {

+ 0 - 86
src/jfw/modules/subscribepay/src/util/wxtplmsgcustom.go

@@ -1,86 +0,0 @@
-package util
-
-import (
-	. "config"
-	"errors"
-	"log"
-	. "qfw/util/rpc"
-	"strings"
-)
-
-type WxTplMsgCustom struct {
-}
-
-/* 获取自定义模板消息
- * @Param tplId 模板消息id
- * @Param sceneCode 场景代码
- */
-func (w *WxTplMsgCustom) Get(tplId string, sceneCode ...string) map[string]*TmplItem {
-	param := []interface{}{tplId}
-	wh := []string{}
-	for _, v := range sceneCode {
-		param = append(param, v)
-		wh = append(wh, "?")
-	}
-	list := Mysql.SelectBySql(`select firstdata,sceneCode from scene a 
-	inner join template_message b on (a.templateId=b.id and b.templateId=? and a.sceneCode in (`+strings.Join(wh, ",")+`) and a.state=1 and a.isTest=1)`, param...)
-	m := map[string]*TmplItem{}
-	if list != nil {
-		for _, v := range *list {
-			sceneCode, _ := v["sceneCode"].(string)
-			sceneCode = strings.TrimSpace(sceneCode)
-			//
-			firstdata, _ := v["firstdata"].(string)
-			firstdata = strings.TrimSpace(firstdata)
-			//
-			m[sceneCode] = &TmplItem{
-				Value: firstdata,
-			}
-		}
-	}
-	return m
-}
-
-//超级订阅试用即将到期、超级订阅试用已到期、超级订阅即将到期、超级订阅已到期
-func (w *WxTplMsgCustom) Expired() error {
-	//试用-微信模板消息自定义
-	onTrial_WxTplMsg := w.Get(MessageConfig.WxTpl_OnTrial_SoonExpire.Id, WxTpl_OnTrial_SoonExpire_SceneCode, WxTpl_OnTrial_Expired_SceneCode)
-	//试用-即将到期
-	if onTrial_WxTplMsg[WxTpl_OnTrial_SoonExpire_SceneCode] == nil {
-		return errors.New("试用-即将到期,微信模板消息异常")
-	}
-	MessageConfig.WxTpl_OnTrial_SoonExpire.First.Value = onTrial_WxTplMsg[WxTpl_OnTrial_SoonExpire_SceneCode].Value
-	log.Println("试用-即将到期,微信模板消息first_data", MessageConfig.WxTpl_OnTrial_SoonExpire.First.Value)
-	//试用-已到期
-	if onTrial_WxTplMsg[WxTpl_OnTrial_Expired_SceneCode] == nil {
-		return errors.New("试用-已到期,微信模板消息异常")
-	}
-	MessageConfig.WxTpl_OnTrial_Expired.First.Value = onTrial_WxTplMsg[WxTpl_OnTrial_Expired_SceneCode].Value
-	log.Println("试用-已到期,微信模板消息first_data", MessageConfig.WxTpl_OnTrial_Expired.First.Value)
-	//购买-微信模板消息自定义
-	wxTplMsg := w.Get(MessageConfig.WxTpl_Expired.Id, WxTpl_SoonExpire_SceneCode, WxTpl_Expired_SceneCode)
-	//即将到期
-	if wxTplMsg[WxTpl_SoonExpire_SceneCode] == nil {
-		return errors.New("即将到期,微信模板消息异常")
-	}
-	MessageConfig.WxTpl_SoonExpire.First.Value = wxTplMsg[WxTpl_SoonExpire_SceneCode].Value
-	log.Println("即将到期,微信模板消息first_data", MessageConfig.WxTpl_SoonExpire.First.Value)
-	//已到期
-	if wxTplMsg[WxTpl_Expired_SceneCode] == nil {
-		return errors.New("已到期,微信模板消息异常")
-	}
-	MessageConfig.WxTpl_Expired.First.Value = wxTplMsg[WxTpl_Expired_SceneCode].Value
-	log.Println("已到期,微信模板消息first_data", MessageConfig.WxTpl_Expired.First.Value)
-	return nil
-}
-
-//数据报告
-func (w *WxTplMsgCustom) DataReport() error {
-	wxTplMsg := w.Get(MessageConfig.WxTpl_DataReport.Id, WxTpl_DataReport_SceneCode)
-	if wxTplMsg[WxTpl_DataReport_SceneCode] == nil {
-		return errors.New("数据报告,微信模板消息异常")
-	}
-	MessageConfig.WxTpl_DataReport.First.Value = wxTplMsg[WxTpl_DataReport_SceneCode].Value
-	log.Println("数据报告,微信模板消息first_data", MessageConfig.WxTpl_DataReport.First.Value)
-	return nil
-}

+ 2 - 0
src/web/staticres/common-module/order-list/js/order-detail.js

@@ -266,6 +266,8 @@ var vm = new Vue({
       var headerImgUrl = ''
       if (productType === '省份订阅包') {
         headerImgUrl = assetsConf.areaPackLink.imgMap.headerImg[platform]
+      }else if (productType === '数据流量包') {
+        headerImgUrl = assetsConf.dataPackLink.imgMap.headerImg[platform]
       }
 
       return headerImgUrl

+ 15 - 14
src/web/templates/weixin/historypush.html

@@ -2117,23 +2117,24 @@
     })
 </script>
 <div id="advertscript" class="hidden adv-wxpush-center">
-    {{$s:=(Ad "jy-wxpush-middle" -1)}}
     <script>
-        var ADList ={{$s}}
+        var ADList ={{Ad (or .T.advertcode "jy-wxpush-middle") -1}}
         var random = Math.floor(Math.random() * ADList.length);
-        var AD = ADList[random];
-        var ADHtml = "<span class=\"closeadv-bg\"></span>"
-            + "<img src=\"/images/close_heidi.png\" class=\"closeadv\" onclick=\"closeadv(this)\">";
-        if (AD.s_pic) {
-            if (AD.s_link) {
-                ADHtml += "<div onclick='adv_statistics(this)' adv_name='微信推送历史页-中部'><a datahref='" + AD.s_link + "'><img src='" + AD.s_pic + "'/></a></div>"
-            } else {
-                ADHtml += "<img src='" + AD.s_pic + "'/>"
-            }
-        } else {
-            ADHtml += AD.s_script
+        if(ADList.length > random){
+          var AD = ADList[random];
+          var ADHtml = "<span class=\"closeadv-bg\"></span>"
+              + "<img src=\"/images/close_heidi.png\" class=\"closeadv\" onclick=\"closeadv(this)\">";
+          if (AD.s_pic) {
+              if (AD.s_link) {
+                  ADHtml += "<div onclick='adv_statistics(this)' adv_name='微信推送历史页-中部'><a datahref='" + AD.s_link + "'><img src='" + AD.s_pic + "'/></a></div>"
+              } else {
+                  ADHtml += "<img src='" + AD.s_pic + "'/>"
+              }
+          } else {
+              ADHtml += AD.s_script
+          }
+          $("#advertscript").html(ADHtml);
         }
-        $("#advertscript").html(ADHtml);
         var mergedlist = []
         var merge_industry = ["国土","林业","环保","卫生","工商","质监","食药","安监","地震","公安","文化","旅游","银监","保监"]
         function checkmerge(state) {

+ 16 - 15
src/web/templates/weixin/wxinfocontent_rec.html

@@ -1069,22 +1069,23 @@ pre {
 			<img src="{{.T.advertImg}}"/>
 		</div>
 		<div  onclick="adv_statistics(this)" class="adv-wxcontent-bottom" adv_name="微信快照页-底部" id="C1">
-			{{$s:=(Ad "jy-wxcontent-bottom" -1)}}
 			<script>
-				var ADList={{$s}}
-				var random=Math.floor(Math.random()*ADList.length)
-				var AD=ADList[random]
-				var ADHtml="";
-				if(AD.s_pic){
-					if(AD.s_link){
-						ADHtml="<a dataHref='"+AD.s_link+"'><img id='wx-article-content-ft-advImg' src='"+AD.s_pic+"'/></a>"
-					}else{
-						ADHtml="<img id='wx-article-content-ft-advImg' src='"+AD.s_pic+"'/>"
-					}
-				}else{
-					ADHtml=AD.s_script
-				}
-				$("#C1").append(ADHtml);
+        var ADList ={{Ad (or .T.advertcode "jy-wxcontent-bottom") -1}}
+        var random=Math.floor(Math.random()*ADList.length)
+				if(ADList.length > random){
+  				var AD=ADList[random]
+  				var ADHtml="";
+  				if(AD.s_pic){
+  					if(AD.s_link){
+  						ADHtml="<a dataHref='"+AD.s_link+"'><img id='wx-article-content-ft-advImg' src='"+AD.s_pic+"'/></a>"
+  					}else{
+  						ADHtml="<img id='wx-article-content-ft-advImg' src='"+AD.s_pic+"'/>"
+  					}
+  				}else{
+  					ADHtml=AD.s_script
+  				}
+  				$("#C1").append(ADHtml);
+        }
 			</script>
 		</div>
 	</div>