Эх сурвалжийг харах

Merge branch 'feature/v4.8.12' into feature/v4.8.12-zyh

张雨涵 2 жил өмнө
parent
commit
0a54a1cfcc
36 өөрчлөгдсөн 1670 нэмэгдсэн , 1763 устгасан
  1. 2 1
      src/jfw/filter/pcfilter.go
  2. 49 60
      src/jfw/front/front.go
  3. 1 1
      src/jfw/jyutil/classroomiInfo.go
  4. 26 8
      src/jfw/jyutil/jyutil.go
  5. 7 7
      src/jfw/modules/bigmember/src/service/use/use.go
  6. 14 4
      src/jfw/modules/publicapply/src/customer/service/service.go
  7. 7 7
      src/jfw/modules/subscribepay/src/config/config.go
  8. 179 179
      src/jfw/modules/subscribepay/src/entity/dataReportStruct.go
  9. 3 21
      src/jfw/modules/subscribepay/src/message.json
  10. 124 123
      src/jfw/modules/subscribepay/src/rpcfollow/share.go
  11. 921 938
      src/jfw/modules/subscribepay/src/timetask/timetask.go
  12. 1 1
      src/jfw/modules/subscribepay/src/util/db.go
  13. 8 7
      src/jfw/modules/subscribepay/src/util/msgremind.go
  14. 2 2
      src/web/staticres/common-module/consult-dialog/js/index.js
  15. 1 2
      src/web/staticres/css/pc.css
  16. 5 3
      src/web/staticres/js/superSearch.js
  17. 0 13
      src/web/staticres/site/common/css/pc-school-head.css
  18. 1 1
      src/web/staticres/site/page/helpCenter/css/index.css
  19. 4 1
      src/web/staticres/site/page/helpCenter/css/summary.css
  20. 0 2
      src/web/staticres/site/page/industryInfo/css/industry_content.css
  21. 199 0
      src/web/templates/common/pc-login-dialog.html
  22. 3 171
      src/web/templates/common/pchead.html
  23. 1 1
      src/web/templates/dataMarket/index.html
  24. 1 1
      src/web/templates/frontRouter/pc/share/sess/index.html
  25. 1 1
      src/web/templates/frontRouter/pc/solution/free/index.html
  26. 1 1
      src/web/templates/pc/jyblogdetail.html
  27. 3 127
      src/web/templates/site/common/pc-school-head.html
  28. 1 1
      src/web/templates/site/page/helpCenter/detail.html
  29. 3 3
      src/web/templates/site/page/helpCenter/index.html
  30. 35 24
      src/web/templates/site/page/industryInfo/class.html
  31. 2 2
      src/web/templates/site/page/industryInfo/index.html
  32. 42 32
      src/web/templates/site/page/jySchool/class.html
  33. 17 5
      src/web/templates/site/page/jySchool/index.html
  34. 1 1
      src/web/templates/site/page/jySchool/search.html
  35. 1 1
      src/web/templates/site/page/jySchool/strategy.html
  36. 4 11
      src/web/templates/site/page/jyblogdetail.html

+ 2 - 1
src/jfw/filter/pcfilter.go

@@ -62,7 +62,8 @@ func (this *pcFilter) Do() bool {
 			} else {
 				//与redis中的session不一致 本账号退出登录
 				redis.Del("session", sessid)
-				http.SetCookie(this.W, this.cookie("", "userid_secure"))
+				//http.SetCookie(this.W, this.cookie("", "userid_secure"))
+				jyutil.ClearCookie(this.W, fmt.Sprintf("%s,%s", jyutil.SKCookieName, jyutil.KeepLoginCookieName))
 			}
 		}
 	} else {

+ 49 - 60
src/jfw/front/front.go

@@ -9,7 +9,6 @@ import (
 	"jy/src/jfw/wx"
 	"log"
 	"math/rand"
-	"net/http"
 	"net/url"
 	"regexp"
 	"strconv"
@@ -74,18 +73,20 @@ type Front struct {
 	pcAjaxReq          xweb.Mapper `xweb:"/front/pcAjaxReq"`
 	myFeedbacks        xweb.Mapper `xweb:"/swordfish/myFeedbacks"`
 	wxerr              xweb.Mapper `xweb:"/mob/err"`
-	getRecomKWs        xweb.Mapper `xweb:"/member/getRecomKWs"`          //获取推荐关键词
-	behaviorRecord     xweb.Mapper `xweb:"/member/behaviorRecord"`       //记录用户点击的关键词
-	tSGuide            xweb.Mapper `xweb:"/front/tenderSubscribe/guide"` //引导页
-	transfer           xweb.Mapper `xweb:"/front/transfer"`              //原文链接中转
-
-	jyCms             xweb.Mapper `xweb:"/jyCms/(.*)/index([^.]*).html"` //剑鱼栏目列表页
-	encrypt           xweb.Mapper `xweb:"/share/encrypt"`                //分享三级页加密
-	newhistorypush    xweb.Mapper `xweb:"/swordfish/newhistorypush"`     //新的历时推送记录
-	historypush       xweb.Mapper `xweb:"/swordfish/historypush"`        //历时推送记录
-	historypushPaging xweb.Mapper `xweb:"/swordfish/historypush/paging"` //历时推送记录--分页
-	aboutus           xweb.Mapper `xweb:"/front/aboutus.html"`           //关于我们
-	busicooperation   xweb.Mapper `xweb:"/front/busicooperation.html"`   //商务合作
+	getRecomKWs        xweb.Mapper `xweb:"/member/getRecomKWs"`           //获取推荐关键词
+	behaviorRecord     xweb.Mapper `xweb:"/member/behaviorRecord"`        //记录用户点击的关键词
+	tSGuide            xweb.Mapper `xweb:"/front/tenderSubscribe/guide"`  //引导页
+	transfer           xweb.Mapper `xweb:"/front/transfer"`               //原文链接中转
+	jyblog             xweb.Mapper `xweb:"/jyblog/index([^.]*).html"`     //剑鱼标讯博客
+	jybdetail          xweb.Mapper `xweb:"/jyblog/([^.]*).html"`          //剑鱼标讯博客三级页
+	blogpraise         xweb.Mapper `xweb:"/jyblog/blogpraise"`            //剑鱼标讯博客三级页点赞
+	jyCms              xweb.Mapper `xweb:"/jyCms/(.*)/index([^.]*).html"` //剑鱼栏目列表页
+	encrypt            xweb.Mapper `xweb:"/share/encrypt"`                //分享三级页加密
+	newhistorypush     xweb.Mapper `xweb:"/swordfish/newhistorypush"`     //新的历时推送记录
+	historypush        xweb.Mapper `xweb:"/swordfish/historypush"`        //历时推送记录
+	historypushPaging  xweb.Mapper `xweb:"/swordfish/historypush/paging"` //历时推送记录--分页
+	aboutus            xweb.Mapper `xweb:"/front/aboutus.html"`           //关于我们
+	busicooperation    xweb.Mapper `xweb:"/front/busicooperation.html"`   //商务合作
 
 	/********************wxkeyset:v1.8**************************/
 	wxKeysetAjaxReq xweb.Mapper `xweb:"/wxkeyset/ajaxReq"`           //订阅词ajax请求
@@ -164,24 +165,25 @@ func init() {
 	urlMap = config.Sysconfig["redirect"].(map[string]interface{})
 }
 
-// 前端页面加载
+//前端页面加载
 func (this *Front) ReloadTo(href string) {
 	this.T["transfer"] = fmt.Sprintf("%s/%s", config.Sysconfig["webdomain"].(string), href)
 	this.Render("/pc/reloadTo.html", &this.T)
 }
 
-// 获取打赏标语
+//获取打赏标语
 func (this *Front) RewardText() {
 	rewardText, _ := getRewardText()
 	this.Write(rewardText)
 	return
 }
 
+//
 func (f *Front) Hp() error {
 	return f.Redirect("/")
 }
 
-// 二维码图片
+//二维码图片
 func (f *Front) Qr() error {
 	w := f.ResponseWriter
 	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
@@ -194,7 +196,7 @@ func (f *Front) Qr() error {
 	return err
 }
 
-// 二维码图片
+//二维码图片
 func (f *Front) Hpshare() error {
 	w := f.ResponseWriter
 	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
@@ -235,6 +237,7 @@ func (p *Front) PayIndex() error {
 	return p.Render("/weixin/pay.html", &p.T)
 }
 
+//
 func (f *Front) RecInof() error {
 	var msg = ""
 	var flag = true
@@ -357,7 +360,7 @@ func (f *Front) RecInof() error {
 	return nil
 }
 
-// 更新取到的权重最低的字段到bidding表
+//更新取到的权重最低的字段到bidding表
 func updateLastWrongField(id, result string) {
 	if result == "" {
 		return
@@ -369,7 +372,7 @@ func updateLastWrongField(id, result string) {
 	})
 }
 
-// 轮询查登录状态
+//轮询查登录状态
 func (f *Front) AjaxPolling() {
 	reqType, _ := f.GetInteger("reqType")
 	if reqType == 1 {
@@ -416,7 +419,7 @@ func (f *Front) AjaxPolling() {
 	}
 }
 
-// 广告服务
+//广告服务
 func (f *Front) Advservices() error {
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {
@@ -427,12 +430,12 @@ func (f *Front) Advservices() error {
 	return f.Render("/pc/advservices.html", &f.T)
 }
 
-// 移动端专题推广
+//移动端专题推广
 func (f *Front) Mobtopics() error {
 	return f.Render("/active/mobtopics.html")
 }
 
-// 移动端专题推广
+//移动端专题推广
 func (f *Front) Extension(page string) error {
 	//今日头条和百度推广用的同一个页面,如以后有变动,需拆分成两个。
 	if page != "tengxun" {
@@ -441,7 +444,7 @@ func (f *Front) Extension(page string) error {
 	return f.Render("/active/ext-" + page + ".html")
 }
 
-// SEM推广
+//SEM推广
 func (f *Front) Topics() error {
 	f.T["logid"] = config.Seoconfig["jySEMtgy"].(string)
 	userId, _ := f.GetSession("userId").(string)
@@ -482,6 +485,7 @@ func (f *Front) Topics() error {
 	return f.Render("/pc/landingpage.html", &f.T)
 }
 
+//
 func (f *Front) Notin() error {
 	refer := "/"
 	tmp := f.Header("Referer")
@@ -503,6 +507,7 @@ func (f *Front) Notin() error {
 	return f.Render("/pc/notin.html", &f.T)
 }
 
+//
 func (f *Front) Followinfo() error {
 	var pid = f.GetString("pid")
 	var kid = f.GetString("kid")
@@ -587,6 +592,7 @@ func (f *Front) Followinfo() error {
 	return nil
 }
 
+//
 func (f *Front) Login(key string) error {
 	shareid := se.DecodeString(key)
 	openid := redis.GetStr("sso", "p_usershare_"+shareid)
@@ -609,7 +615,7 @@ func (f *Front) Login(key string) error {
 	return nil
 }
 
-// 用户是否登录
+//用户是否登录
 func (f *Front) HasSign() error {
 	sessVal := f.Session().GetMultiple()
 	if userId, _ := sessVal["mgoUserId"].(string); userId != "" {
@@ -662,31 +668,11 @@ func (f *Front) SignOut() error {
 		config.Middleground.PowerCheckCenter.DelCheckRedis("10000", positionId)
 	}
 	f.Session().Clear()
-	f.ClearCookie(fmt.Sprintf("%s,%s", jyutil.SKCookieName, jyutil.KeepLoginCookieName))
+	jyutil.ClearCookie(f.ResponseWriter, fmt.Sprintf("%s,%s", jyutil.SKCookieName, jyutil.KeepLoginCookieName))
 	f.ServeJson("ok")
 	return nil
 }
 
-// ClearCookie 清楚前端cookie 缓存
-func (f *Front) ClearCookie(name string) {
-	if name == "" {
-		name = jyutil.SKCookieName
-	}
-	for _, nk := range strings.Split(name, ",") {
-		if nk != "" {
-			http.SetCookie(f.ResponseWriter, &http.Cookie{
-				Name:     nk,
-				Value:    "",
-				Path:     "/",
-				HttpOnly: false,
-				MaxAge:   -1,
-				Expires:  time.Now().Add(-1),
-				Domain:   httpsession.Domain,
-			})
-		}
-	}
-}
-
 // GetLoginNum 微信公众号获取数字
 func (f *Front) GetLoginNum(prestr string) error {
 	var oid = f.GetString("oid")
@@ -704,7 +690,7 @@ func (f *Front) GetLoginNum(prestr string) error {
 	return nil
 }
 
-// 一键报告
+//一键报告
 func (m *Front) Onekey() error {
 	defer util.Catch()
 	fkid := encrypt.DecodeArticleId2ByCheck(m.GetString("fkid"))[0]
@@ -770,6 +756,7 @@ func (m *Front) Onekey() error {
 	return nil
 }
 
+//
 func (m *Front) Encrypt() error {
 	defer util.Catch()
 	id := m.GetString("id")
@@ -792,11 +779,12 @@ func (m *Front) Encrypt() error {
 	return nil
 }
 
+//
 func (m *Front) Wxerr() error {
 	return m.Render("/_err.html")
 }
 
-// 查找用户并创建session
+//查找用户并创建session
 func FindUserAndCreateSess(openid string, sess *httpsession.Session, typ string, flag, isSwitchToBestIdentity bool) (bool, *map[string]interface{}, map[string]interface{}) {
 	return CreateSession(map[string]interface{}{
 		"s_m_openid": openid,
@@ -860,7 +848,7 @@ func CreateSession(q map[string]interface{}, sess *httpsession.Session, typ stri
 
 var bindUrl = "/front/account/phone/bind?mode=mergeBind"
 
-// 微信跳转创建session
+//微信跳转创建session
 func (m *Front) Sess(ostr string) error {
 	defer util.Catch()
 	if strings.Contains(ostr, "&") {
@@ -978,7 +966,7 @@ func (m *Front) Sess(ostr string) error {
 	return nil
 }
 
-// 删除模板缓存
+//删除模板缓存
 func (d *Front) Delc(url string) {
 	defer util.Catch()
 	d.App.TemplateMgr.CacheDelete(strings.Replace(url, "GG", "/", 1))
@@ -989,12 +977,12 @@ func (m *Front) Viewdemo() {
 	m.Redirect("/swordfish/guide/-1")
 }
 
-// 剑鱼标讯用户协议
+//剑鱼标讯用户协议
 func (m *Front) Wxprotocol() error {
 	return m.Render("/weixin/wxprotocol.html")
 }
 
-// 推送列表
+//推送列表
 func (m *Front) WxpushListInfo(_id string) error {
 	return m.Redirect("/swordfish/historypush")
 }
@@ -1074,7 +1062,7 @@ func (m *Front) Isrecord(name string) {
 	}
 }
 
-// 招标订阅向导
+//招标订阅向导
 func (f *Front) TSGuide() error {
 	defer util.Catch()
 	userid := util.ObjToString(f.GetSession("userId"))
@@ -1177,12 +1165,12 @@ func isInTSguide(userid string) bool {
 	return false
 }
 
-// 查看原文中转
+//查看原文中转
 func (f *Front) Transfer() error {
 	return f.Redirect(f.GetString("url"))
 }
 
-// 关于我们
+//关于我们
 func (f *Front) Aboutus() error {
 	code := f.GetString("code")
 	if mobileReg.MatchString(f.UserAgent()) {
@@ -1200,7 +1188,7 @@ func (f *Front) Aboutus() error {
 	return f.SetBody(content)
 }
 
-// 商务合作
+//商务合作
 func (f *Front) Busicooperation() error {
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {
@@ -1230,7 +1218,7 @@ func (f *Front) Gethotkey() error {
 	return nil
 }
 
-// redis存储用户搜索关键词 企业 项目信息
+//redis存储用户搜索关键词 企业 项目信息
 func (f *Front) Rediskw() error {
 	skw := f.GetString("skw")
 	num := f.GetString("num")
@@ -1297,7 +1285,7 @@ func (f *Front) DownloadJyApp() error {
 	return f.Redirect(getDownloadUri(code, source, domain+apkurl))
 }
 
-// 获取app下载地址,不通code对应不通渠道的app包
+//获取app下载地址,不通code对应不通渠道的app包
 func getDownloadUri(code, source, download string) string {
 	jyapp := config.Sysconfig["jyapp"].(map[string]interface{})
 	channelMap := jyapp["channelDir"].(map[string]interface{})
@@ -1389,7 +1377,7 @@ func (f *Front) LimitSearchText() {
 	f.Write("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">" + fmt.Sprintf(public.Lst.Msg, status, public.Lst.Count, public.Lst.TimeOut, public.Lst.TotalPage))
 }
 
-// 设置js css 版本号,修改以后记得同步更新seo.json中的值
+//设置js css 版本号,修改以后记得同步更新seo.json中的值
 func (f *Front) SetSeoVersion() {
 	//!@111qqq@! md5=51a3b7b4ed3cf140
 	if f.GetString("p") != "51a3b7b4ed3cf140" {
@@ -1517,6 +1505,7 @@ func (f *Front) YmResult() error {
 
 }
 
+//
 func (f *Front) JylabShareTimeline() {
 	userid := util.ObjToString(f.GetSession("userId"))
 	if userid == "" {
@@ -1542,8 +1531,7 @@ func (f *Front) JylabShareTimeline() {
 	}
 }
 
-/*
-*
+/**
 成功分享后 更改分享相关信息
 
 shareType - 分享类型 1-详情页 2-推送列表 3-实验室
@@ -1628,6 +1616,7 @@ func encodeURIComponent(str string) string {
 	return r
 }
 
+//
 func (f *Front) GetAdByCode() {
 	m := map[string]interface{}{}
 	if ad_name := f.GetString("ad_name"); ad_name != "" {

+ 1 - 1
src/jfw/jyutil/classroomiInfo.go

@@ -346,7 +346,7 @@ func GuidelineAndInformation(t, s string, num int) *[]map[string]interface{} {
 
 // SPic 图片链接处理
 func SPic(sPic string) string {
-	if sPic != "" {
+	if sPic != "" && !strings.HasPrefix(sPic, "http") {
 		if strings.HasPrefix(sPic, "/") &&
 			strings.HasSuffix(util.InterfaceToStr(config.Seoconfig["jyadd"]), "/") {
 			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + sPic[1:]

+ 26 - 8
src/jfw/jyutil/jyutil.go

@@ -1,15 +1,13 @@
 package jyutil
 
 import (
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jypkg/compatible"
 	"encoding/json"
 	"fmt"
 	"io/ioutil"
 	"jy/src/jfw/config"
 	"log"
-
-	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-	"app.yhyue.com/moapp/jypkg/compatible"
-
 	"net"
 	"net/http"
 	"reflect"
@@ -34,11 +32,30 @@ var (
 		Key: "mGlAgnIBB8bx2nch",
 		Iv:  "1389461544135476",
 	}
-	EsDoc               = public.EsDoc
 	KeepLoginTimeKey    = "keeplogin_%s"
 	KeepLoginCookieName = "klcn_value"
 )
 
+// ClearCookie 清楚前端cookie 缓存
+func ClearCookie(w http.ResponseWriter, name string) {
+	if name == "" {
+		name = SKCookieName
+	}
+	for _, nk := range strings.Split(name, ",") {
+		if nk != "" {
+			http.SetCookie(w, &http.Cookie{
+				Name:     nk,
+				Value:    "",
+				Path:     "/",
+				HttpOnly: false,
+				MaxAge:   -1,
+				Expires:  time.Now().Add(-1),
+				Domain:   httpsession.Domain,
+			})
+		}
+	}
+}
+
 // SetCookieValueForAutoLogin 为延长用户登录时间 往cookie 中加入标识,在过滤器判断是否自动登录
 func SetCookieValueForAutoLogin(rw http.ResponseWriter, baseUserId int64) {
 	log.Println("-----111--------;", rw.Header())
@@ -92,7 +109,7 @@ func FindMyShareId(activecode, openid string) string {
 	return shareid
 }
 
-// 获取用户openid
+//获取用户openid
 func Getopenid(code string) (openid string) {
 	defer util.Catch()
 	recturl := fmt.Sprintf(config.Wxoauthinfo, code)
@@ -109,6 +126,7 @@ func Getopenid(code string) (openid string) {
 	return
 }
 
+//
 func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[string]interface{}) {
 	person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"i_ispush":1,"i_unlimited":1,"s_jyname":1,"base_user_id":1}`)
 	sessionVal := make(map[string]interface{})
@@ -149,7 +167,7 @@ func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[strin
 	return person, sessionVal
 }
 
-// value 用户sessionid
+//value 用户sessionid
 func LoginRedisKey(userid string) string {
 	return fmt.Sprintf("login_%s", userid)
 }
@@ -185,7 +203,7 @@ func (a SortBy) Less(i, j int) bool {
 }
 
 // ture  倒序3, 2, 1
-// fmt.Println(m)
+//fmt.Println(m)
 func SortData(data interface{}, sortkey string, reverse bool) {
 	//func SortData(data interface{}, sortkey string, reverse bool) {
 	var db []map[string]interface{}

+ 7 - 7
src/jfw/modules/bigmember/src/service/use/use.go

@@ -515,12 +515,12 @@ func (u *Use) Equity() {
 			if data.Data.Member.Pid != "" {
 				userid = data.Data.Member.Pid //如果是子账号 则根据主账号id查询
 				isSubCount = true
-				o_member_jy := &map[string]interface{}{}
-				o_member_jy, _ = db.Mgo.FindOneByField("user", map[string]interface{}{
+				oMemberJy := &map[string]interface{}{}
+				oMemberJy, _ = db.Mgo.FindOneByField("user", map[string]interface{}{
 					"_id": mongodb.StringTOBsonId(userid),
 				}, `{"o_member_jy":1}`)
-				if o_member_jy != nil && len(*o_member_jy) > 0 {
-					(*person)["o_member_jy"] = o_member_jy
+				if oMemberJy != nil && len(*oMemberJy) > 0 {
+					(*person)["o_member_jy"] = oMemberJy
 				}
 			}
 			headimage := strings.Replace(qu.ObjToString((*person)["s_headimageurl"]), "http://", "https://", 1)
@@ -537,9 +537,9 @@ func (u *Use) Equity() {
 			if res != nil || len(*res) > 0 {
 				companyname = qu.ObjToStringDef((*res)["entname"], "")
 				if (*person)["o_member_jy"] != nil {
-					o_member_jy := (*person)["o_member_jy"].(map[string]interface{})
-					if o_member_jy["o_industry"] != nil {
-						industry, _ = o_member_jy["o_industry"].(map[string]interface{})
+					oMemberJy := qu.ObjToMap((*person)["o_member_jy"])
+					if *oMemberJy != nil && (*oMemberJy)["o_industry"] != nil {
+						industry, _ = (*oMemberJy)["o_industry"].(map[string]interface{})
 					} else {
 						industry = nil
 					}

+ 14 - 4
src/jfw/modules/publicapply/src/customer/service/service.go

@@ -1,7 +1,9 @@
 package service
 
 import (
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	"encoding/json"
+	"jy/src/jfw/modules/publicapply/src/config"
 	"jy/src/jfw/modules/publicapply/src/customer/entity"
 
 	. "app.yhyue.com/moapp/jybase/api"
@@ -48,7 +50,8 @@ func (this *ServiceStruct) Exclude() {
 		if cotion.Name == "" {
 			return Result{Data: nil, Error_msg: Error_msg_1003}
 		}
-		cotion.UserId = userId
+		userInfo := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+		cotion.UserId = qu.If(userInfo.Pid != "", userInfo.Pid, userId).(string)
 		return Result{Data: cotion.Exclude()}
 	}()
 	this.ServeJson(r)
@@ -63,8 +66,12 @@ func (this *ServiceStruct) CstList() {
 		if this.Method() != "POST" {
 			return Result{Data: nil, Error_msg: Error_msg_1005}
 		}
+		if userId == "" {
+			return Result{Data: nil, Error_msg: Error_msg_1001}
+		}
 		cotion := entity.NewCustomerOperation()
-		cotion.UserId = userId
+		userInfo := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+		cotion.UserId = qu.If(userInfo.Pid != "", userInfo.Pid, userId).(string)
 		cotion.Session = this.Session()
 		cotion.EntId = entId
 		entUserId := qu.IntAll(this.GetSession("entUserId")) //获取企业id
@@ -95,6 +102,9 @@ func (this *ServiceStruct) CstAtt() {
 		if this.Method() != "POST" {
 			return Result{Data: nil, Error_msg: Error_msg_1005}
 		}
+		if userId == "" {
+			return Result{Data: nil, Error_msg: Error_msg_1001}
+		}
 		if string(this.Body()) == "" {
 			return Result{Data: nil, Error_msg: Error_msg_1003}
 		}
@@ -104,9 +114,9 @@ func (this *ServiceStruct) CstAtt() {
 		if !cotion.B && cotion.Name == "" {
 			return Result{Data: nil, Error_msg: Error_msg_1003}
 		}
-		cotion.UserId = userId
+		userInfo := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+		cotion.UserId = qu.If(userInfo.Pid != "", userInfo.Pid, userId).(string)
 		cotion.EntId = entId
-		cotion.UserId = userId
 		cotion.Session = this.Session()
 		msg := cotion.CheckPower()
 		if !cotion.B && msg != "" {

+ 7 - 7
src/jfw/modules/subscribepay/src/config/config.go

@@ -168,13 +168,13 @@ type messageConfig struct {
 }
 
 type WxTplMsg struct {
-	Id       string
-	First    *qrpc.TmplItem
-	Keyword1 *qrpc.TmplItem
-	Keyword2 *qrpc.TmplItem
-	Keyword3 *qrpc.TmplItem
-	Keyword4 *qrpc.TmplItem
-	Remark   *qrpc.TmplItem
+	Id             string
+	First          *qrpc.TmplItem
+	SoonCloseFirst *qrpc.TmplItem
+	Keyword1       *qrpc.TmplItem
+	Keyword2       *qrpc.TmplItem
+	Keyword3       *qrpc.TmplItem
+	Keyword4       *qrpc.TmplItem
 }
 type Invoice struct {
 	Invoice_manager           string

+ 179 - 179
src/jfw/modules/subscribepay/src/entity/dataReportStruct.go

@@ -1,21 +1,22 @@
 package entity
 
 import (
-        "encoding/json"
-        "errors"
-        "fmt"
-        "go.mongodb.org/mongo-driver/bson/primitive"
-        "jy/src/jfw/modules/subscribepay/src/config"
-        "jy/src/jfw/modules/subscribepay/src/pay"
-        "jy/src/jfw/modules/subscribepay/src/util"
-        "log"
-        "strconv"
-        "time"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/pay"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"log"
+	"strconv"
+	"time"
 
-        qutil "app.yhyue.com/moapp/jybase/common"
-        . "app.yhyue.com/moapp/jybase/date"
-        frpc "app.yhyue.com/moapp/jybase/rpc"
-        . "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+
+	qutil "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	frpc "app.yhyue.com/moapp/jybase/rpc"
+	. "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
 )
 
 // 数据报告
@@ -24,184 +25,183 @@ type dataReportStruct struct{}
 var JyDataReportStruct dataReportStruct
 
 func (this *dataReportStruct) PayCallBack(param *CallBackParam) (update bool) {
-        orderdata := util.Mysql.FindOne("dataexport_order", param.GetPaySuccessOrderQuery(), "id,order_money,order_status,create_time,user_mail,user_openid,product_type,order_code,filter,dis_word,user_id", "")
-        if orderdata != nil {
-                now := time.Now()
-                order_status := qutil.IntAll((*orderdata)["order_status"])
-                if order_status == 0 {
-                        payTime := FormatDate(&now, Date_Full_Layout)
-                        update = util.Mysql.Update("dataexport_order", map[string]interface{}{
-                                "id": (*orderdata)["id"],
-                        }, map[string]interface{}{
-                                "pay_money":    param.CashFee,
-                                "pay_time":     payTime,
-                                "order_status": 1,
-                                //支付成功后更新成支付成功的out_trade_no 避免多人支付重复刷新字段
-                                "out_trade_no": param.OutTradeno,
-                        })
-                        if update {
-                                //发送数据
-                                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)
-                                /*if qutil.ObjToString((*orderdata)["dis_word"]) != "" {
-                                	suffix := qutil.ObjToString((*orderdata)["dis_word"])[len(qutil.ObjToString((*orderdata)["dis_word"]))-3 : len(qutil.ObjToString((*orderdata)["dis_word"]))]
-                                	if suffix == suffix_msgt {
-                                		go OtherDisWordRecode(qutil.IntAll((*orderdata)["id"]), qutil.IntAll((*orderdata)["order_money"]), "数据报告", qutil.ObjToString((*orderdata)["dis_word"]), qutil.ObjToString((*orderdata)["user_id"]), qutil.ObjToString((*orderdata)["create_time"]))
-                                	} else {
-                                		go DisWordRecode(qutil.IntAll((*orderdata)["id"]), qutil.IntAll((*orderdata)["order_money"]), "数据报告", qutil.ObjToString((*orderdata)["dis_word"]))
-                                	}
-                                }*/
-                        }
-                }
-        }
-        return
+	orderdata := util.Mysql.FindOne("dataexport_order", param.GetPaySuccessOrderQuery(), "id,order_money,order_status,create_time,user_mail,user_openid,product_type,order_code,filter,dis_word,user_id", "")
+	if orderdata != nil {
+		now := time.Now()
+		order_status := qutil.IntAll((*orderdata)["order_status"])
+		if order_status == 0 {
+			payTime := FormatDate(&now, Date_Full_Layout)
+			update = util.Mysql.Update("dataexport_order", map[string]interface{}{
+				"id": (*orderdata)["id"],
+			}, map[string]interface{}{
+				"pay_money":    param.CashFee,
+				"pay_time":     payTime,
+				"order_status": 1,
+				//支付成功后更新成支付成功的out_trade_no 避免多人支付重复刷新字段
+				"out_trade_no": param.OutTradeno,
+			})
+			if update {
+				//发送数据
+				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)
+				/*if qutil.ObjToString((*orderdata)["dis_word"]) != "" {
+					suffix := qutil.ObjToString((*orderdata)["dis_word"])[len(qutil.ObjToString((*orderdata)["dis_word"]))-3 : len(qutil.ObjToString((*orderdata)["dis_word"]))]
+					if suffix == suffix_msgt {
+						go OtherDisWordRecode(qutil.IntAll((*orderdata)["id"]), qutil.IntAll((*orderdata)["order_money"]), "数据报告", qutil.ObjToString((*orderdata)["dis_word"]), qutil.ObjToString((*orderdata)["user_id"]), qutil.ObjToString((*orderdata)["create_time"]))
+					} else {
+						go DisWordRecode(qutil.IntAll((*orderdata)["id"]), qutil.IntAll((*orderdata)["order_money"]), "数据报告", qutil.ObjToString((*orderdata)["dis_word"]))
+					}
+				}*/
+			}
+		}
+	}
+	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
-        }
-        _, userErr := primitive.ObjectIDFromHex(param.Userid)
-        buy_subject := 1
-        entId := 0
-        if userErr != nil {
-                //雇员标识
-                positionData := util.InfoMysql.FindOne("base_position", map[string]interface{}{"id": param.Userid}, "ent_id", "")
-                if positionData != nil {
-                        entId = qutil.IntAll((*positionData)["ent_id"])
-                }
-                buy_subject = 2
-        }
-        distributionChannel, _ := util.GetJyOrderChannel(qutil.ObjToString(param.Detail["disWord"]), "")
-        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":          FormatDate(&now, Date_Full_Layout),
-                "prepay_time":          FormatDate(&now, 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),                    //订单详情
-                "dis_word":             param.Detail["disWord"],               //分销口令
-                "distribution_channel": distributionChannel,                   //销售渠道
-                "order_channel":        util.GetRpcOrderChannel(param.PayWay), //下单渠道
-                "audit_status":         3,
-                "buy_subject":          buy_subject,
-                "ent_id":               entId, //默认审核通过
-        })
-        if orderId <= 0 {
-                err = errors.New("订单插入失败")
-                return
-        }
-        return
+	//插入数据库
+	now := time.Now()
+	ordercode = pay.GetOrderCode(param.Userid)
+	detailByte, marshalErr := json.Marshal(param.Detail)
+	if marshalErr != nil {
+		err = marshalErr
+		return
+	}
+	_, userErr := primitive.ObjectIDFromHex(param.Userid)
+	buy_subject := 1
+	entId := 0
+	if userErr != nil {
+		//雇员标识
+		positionData := util.InfoMysql.FindOne("base_position", map[string]interface{}{"id": param.Userid}, "ent_id", "")
+		if positionData != nil {
+			entId = qutil.IntAll((*positionData)["ent_id"])
+		}
+		buy_subject = 2
+	}
+	distributionChannel, _ := util.GetJyOrderChannel(qutil.ObjToString(param.Detail["disWord"]), "")
+	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":          FormatDate(&now, Date_Full_Layout),
+		"prepay_time":          FormatDate(&now, 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),                    //订单详情
+		"dis_word":             param.Detail["disWord"],               //分销口令
+		"distribution_channel": distributionChannel,                   //销售渠道
+		"order_channel":        util.GetRpcOrderChannel(param.PayWay), //下单渠道
+		"audit_status":         3,
+		"buy_subject":          buy_subject,
+		"ent_id":               entId, //默认审核通过
+	})
+	if orderId <= 0 {
+		err = errors.New("订单插入失败")
+		return
+	}
+	return
 }
 
 // 更新订单
 func (this *dataReportStruct) FlushOrder(param frpc.JyPayOrderChangeParam) (string, error) {
-        productSign, ok := pay.PayWayAndSign["datareport"][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"]))
+	productSign, ok := pay.PayWayAndSign["datareport"][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, param.OrderCode)
-        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":  FormatDate(&now, 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
+	//创建支付串
+	tradeno, prepayid, payParam, payErr := pay.CreateOrderPay(price, productSign, param.Ip, param.Openid, param.PayWay, param.OrderCode)
+	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":  FormatDate(&now, 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
+	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 {
-                util.DataReport_WTMCS.Reload()
-                wtmc := util.DataReport_WTMCS.Get(config.MessageConfig.WxTpl_DataReport.First.Value)
-                if wtmc == nil {
-                        fmt.Println("数据报告模板参数异常")
-                        return
-                }
-                ok, status := frpc.WxPush(config.Config.Weixinrpc, "WeiXinRpc.SendDataReportMsg", &frpc.NotifyMsg{
-                        Openid:  openid,
-                        Title:   wtmc.FirstData,
-                        Detail:  product_type, //产品类型
-                        Service: order_coded,  //订单编号
-                        Date:    pay_time,     //支付时间
-                        Remark:  "数据报告将以电子版形式发送至您的邮箱,请注意垃圾邮件过滤,感谢您的光临",
-                        Url:     config.Config.WebDomain + "/front/sess/" + Se.EncodeString(openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",datareport") + "__" + order_coded + "__" + wtmc.AdvertCode,
-                })
-                log.Println("数据报告", order_coded, ok, status, wtmc.AdvertCode, wtmc.FirstData)
-        }
+	if openid == "" || order_coded == "" || product_type == "" || pay_time == "" {
+		fmt.Println("数据报告模板参数异常")
+	} else {
+		util.DataReport_WTMCS.Reload()
+		wtmc := util.DataReport_WTMCS.Get(config.MessageConfig.WxTpl_DataReport.First.Value)
+		if wtmc == nil {
+			fmt.Println("数据报告模板参数异常")
+			return
+		}
+		ok, status := frpc.WxPush(config.Config.Weixinrpc, "WeiXinRpc.SendDataReportMsg", &frpc.NotifyMsg{
+			Openid:  openid,
+			Title:   wtmc.FirstData,
+			Detail:  product_type, //产品类型
+			Service: order_coded,  //订单编号
+			Date:    pay_time,     //支付时间
+			Url:     config.Config.WebDomain + "/front/sess/" + Se.EncodeString(openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",datareport") + "__" + order_coded + "__" + wtmc.AdvertCode,
+		})
+		log.Println("数据报告", order_coded, ok, status, wtmc.AdvertCode, wtmc.FirstData)
+	}
 }

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

@@ -4,9 +4,6 @@
 		"first":{
 			"value":"001",
 			"color":"#FE737A"
-		},
-		"remark": {
-			"value":"感谢您的试用,如已购买,请忽略此信息。"
 		}
 	},
 	"WxTpl_OnTrial_Expired": {
@@ -14,9 +11,6 @@
 		"first":{
 			"value":"002",
 			"color":"#FE737A"
-		},
-		"remark": {
-			"value":"感谢您的试用,如已购买,请忽略此信息。"
 		}
 	},
 	"WxTpl_SoonExpire": {
@@ -30,9 +24,6 @@
 		},
 		"keyword3": {
 			"value":"超级订阅"
-		},
-		"remark": {
-			"value":"如已续费,请忽略此信息。"
 		}
 	},
 	"WxTpl_Expired": {
@@ -46,9 +37,6 @@
 		},
 		"keyword3": {
 			"value":"超级订阅"
-		},
-		"remark": {
-			"value":"如已购买,请忽略此信息。"
 		}
 	},
 	"WxTpl_BigMember_SoonExpire": {
@@ -62,9 +50,6 @@
 		},
 		"keyword3": {
 			"value":"大会员"
-		},
-		"remark": {
-			"value":"如已续费,请忽略此信息。"
 		}
 	},
 	"WxTpl_BigMember_Expired": {
@@ -78,9 +63,6 @@
 		},
 		"keyword3": {
 			"value":"大会员"
-		},
-		"remark": {
-			"value":"如已购买,请忽略此信息。"
 		}
 	},
 	"WxTpl_Unpaid": {
@@ -89,14 +71,14 @@
 			"value":"001",
 			"color":"#FE737A"
 		},
+		"soonCloseFirst":{
+			"value":"002"
+		},
 		"keyword3": {
 			"value":"%s元"
 		},
 		"keyword4": {
 			"value":"%s"
-		},
-		"remark": {
-			"value":"订单将在%.0f小时后自动关闭,请及时支付。"
 		}
 	},
 	"WxTpl_PaySuccess": {

+ 124 - 123
src/jfw/modules/subscribepay/src/rpcfollow/share.go

@@ -1,136 +1,137 @@
 package rpcfollow
 
 import (
-    "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
-    "encoding/json"
-    "jy/src/jfw/modules/subscribepay/src/config"
-    "jy/src/jfw/modules/subscribepay/src/entity"
-    "jy/src/jfw/modules/subscribepay/src/util"
-    "time"
+	"encoding/json"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/entity"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"time"
 
-    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-    "go.mongodb.org/mongo-driver/bson/primitive"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
 
-    qu "app.yhyue.com/moapp/jybase/common"
-    . "app.yhyue.com/moapp/jybase/date"
-    frpc "app.yhyue.com/moapp/jybase/rpc"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	frpc "app.yhyue.com/moapp/jybase/rpc"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 )
 
 //用户分享完成后,分享者和被分享者订单处理
-func (s *JyPayRpc) ShareFissionNew(p *frpc.JYShareUserIdsRes, r *frpc.JYShareResp, sessVal map[string]interface{}) error {
-    if len(p.ShareUserInfo) > 0 {
-        errArr := []interface{}{}
-        for _, ps := range p.ShareUserInfo {
-            userId := ps.UserId
-            _, err := primitive.ObjectIDFromHex(userId)
-            if err != nil {
-                continue
-            }
-            data := util.Compatible.Select(userId, `{"i_vip_status":1,"l_vip_starttime":1,"l_vip_endtime":1,"o_vipjy":1,"i_shareCount":1,"s_m_openid":1}`)
-            if data != nil && len(*data) > 0 {
-                now := time.Now()
-                vip_status := qu.IntAll((*data)["i_vip_status"])
-                nowDay := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 59, now.Location()).Unix() //当前晚上23:59:59
-                endtime := qu.Int64All(qu.If(qu.Int64All((*data)["l_vip_endtime"]) < nowDay, nowDay, qu.Int64All((*data)["l_vip_endtime"])))
-                //更新user表
-                setMap := map[string]interface{}{}
-                var updateMap = map[string]interface{}{}
-                endT := time.Unix(endtime, 0).AddDate(0, 0, ps.TimeExpand)
-                types := 2 //默认开通权益
-                if vip_status == 2 {
-                    types = 1 //仅延长周期
-                    //超级订阅用户
-                    updateMap = map[string]interface{}{
-                        "l_vip_endtime": endT.Unix(),
-                    }
-                } else if vip_status <= 0 {
-                    var (
-                        area      = map[string]interface{}{"北京": []string{}}
-                        areaCount = 1
-                    )
-                    //22年双十一预热福利---2021年至今的免费用户
-                    if ps.Remark == "22年双十一预热福利" {
-                        //活动赠送7天  全国  超级订阅
-                        area = map[string]interface{}{}
-                        areaCount = -1
-                    }
-                    //非超级订阅用户
-                    updateMap = map[string]interface{}{
-                        "i_vip_status":                     2,
-                        "l_vip_starttime":                  now.Unix(),
-                        "l_vip_endtime":                    endT.Unix(),
-                        "o_vipjy.o_area":                   area,
-                        "o_vipjy.o_buyset.areacount":       areaCount,
-                        "o_vipjy.o_buyset.buyerclasscount": -1,
-                        "o_vipjy.o_buyset.upgrade":         1,
-                        "o_vipjy.o_buyset.newcitys":        []string{},
-                    }
-                    if vip_status == 0 {
-                        updateMap["o_vipjy.i_trial"] = -1
-                        updateMap["o_vipjy.a_buyerclass"] = []string{}
-                    }
-                }
-                setMap["$set"] = updateMap
-                if !util.Compatible.Update(userId, setMap) {
-                    errArr = append(errArr, map[string]interface{}{
-                        "code":   -3,
-                        "msg":    "更新用户超级订阅状态失败",
-                        "userId": userId,
-                    })
-                }
-                positionId := util.MongoIdToPositionId(userId)
-                jy.ClearBigVipUserPower(positionId)
-                config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                    PositionId: positionId,
-                    AppId:      "10000",
-                })
-                config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qu.Int64All(positionId))
-                st, et := "", ""
-                st = time.Unix(endtime, 0).Format(Date_Full_Layout)
-                et = endT.Format(Date_Full_Layout)
-                if !entity.Order(userId, st, et, types, ps.TimeExpand, ps.Remark) {
-                    r.Error_code = -2
-                    errArr = append(errArr, map[string]interface{}{
-                        "code":   -2,
-                        "msg":    "保存记录失败",
-                        "userId": userId,
-                    })
-                }
-            } else {
-                r.Error_code = -1
-                errArr = append(errArr, map[string]interface{}{
-                    "code":   -1,
-                    "msg":    "mgo获取用户信息失败",
-                    "userId": userId,
-                })
-            }
-        }
-        if len(errArr) > 0 {
-            b, _ := json.Marshal(errArr)
-            r.Data = b
-        }
-    }
-    return nil
+func (s *JyPayRpc) ShareFissionNew(p *frpc.JYShareUserIdsRes, r *frpc.JYShareResp) error {
+	if len(p.ShareUserInfo) > 0 {
+		errArr := []interface{}{}
+		for _, ps := range p.ShareUserInfo {
+			userId := ps.UserId
+			_, err := primitive.ObjectIDFromHex(userId)
+			if err != nil {
+				continue
+			}
+			data := util.Compatible.Select(userId, `{"i_vip_status":1,"l_vip_starttime":1,"l_vip_endtime":1,"o_vipjy":1,"i_shareCount":1,"s_m_openid":1}`)
+			if data != nil && len(*data) > 0 {
+				now := time.Now()
+				vip_status := qu.IntAll((*data)["i_vip_status"])
+				nowDay := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 59, now.Location()).Unix() //当前晚上23:59:59
+				endtime := qu.Int64All(qu.If(qu.Int64All((*data)["l_vip_endtime"]) < nowDay, nowDay, qu.Int64All((*data)["l_vip_endtime"])))
+				//更新user表
+				setMap := map[string]interface{}{}
+				var updateMap = map[string]interface{}{}
+				endT := time.Unix(endtime, 0).AddDate(0, 0, ps.TimeExpand)
+				types := 2 //默认开通权益
+				if vip_status == 2 {
+					types = 1 //仅延长周期
+					//超级订阅用户
+					updateMap = map[string]interface{}{
+						"l_vip_endtime": endT.Unix(),
+					}
+				} else if vip_status <= 0 {
+					var (
+						area      = map[string]interface{}{"北京": []string{}}
+						areaCount = 1
+					)
+					//22年双十一预热福利---2021年至今的免费用户
+					if ps.Remark == "22年双十一预热福利" {
+						//活动赠送7天  全国  超级订阅
+						area = map[string]interface{}{}
+						areaCount = -1
+					}
+					//非超级订阅用户
+					updateMap = map[string]interface{}{
+						"i_vip_status":                     2,
+						"l_vip_starttime":                  now.Unix(),
+						"l_vip_endtime":                    endT.Unix(),
+						"o_vipjy.o_area":                   area,
+						"o_vipjy.o_buyset.areacount":       areaCount,
+						"o_vipjy.o_buyset.buyerclasscount": -1,
+						"o_vipjy.o_buyset.upgrade":         1,
+						"o_vipjy.o_buyset.newcitys":        []string{},
+					}
+					if vip_status == 0 {
+						updateMap["o_vipjy.i_trial"] = -1
+						updateMap["o_vipjy.a_buyerclass"] = []string{}
+					}
+				}
+				setMap["$set"] = updateMap
+				if !util.Compatible.Update(userId, setMap) {
+					errArr = append(errArr, map[string]interface{}{
+						"code":   -3,
+						"msg":    "更新用户超级订阅状态失败",
+						"userId": userId,
+					})
+				}
+				positionId := util.MongoIdToPositionId(userId)
+				jy.ClearBigVipUserPower(positionId)
+				config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+					PositionId: positionId,
+					AppId:      "10000",
+				})
+				config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qu.Int64All(positionId))
+				st, et := "", ""
+				st = time.Unix(endtime, 0).Format(Date_Full_Layout)
+				et = endT.Format(Date_Full_Layout)
+				if !entity.Order(userId, st, et, types, ps.TimeExpand, ps.Remark) {
+					r.Error_code = -2
+					errArr = append(errArr, map[string]interface{}{
+						"code":   -2,
+						"msg":    "保存记录失败",
+						"userId": userId,
+					})
+				}
+			} else {
+				r.Error_code = -1
+				errArr = append(errArr, map[string]interface{}{
+					"code":   -1,
+					"msg":    "mgo获取用户信息失败",
+					"userId": userId,
+				})
+			}
+		}
+		if len(errArr) > 0 {
+			b, _ := json.Marshal(errArr)
+			r.Data = b
+		}
+	}
+	return nil
 }
 
 //获取用户权益信息
 func (s *JyPayRpc) GetUserPowerInfo(p *frpc.JYShareUserIdsRes, r *frpc.JYShareResp, session *httpsession.Session) error {
-    if len(p.ShareUserInfo) > 0 {
-        ps := p.ShareUserInfo[0]
-        bigBaseMsg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
-        if bigBaseMsg == nil {
-            r.Error_code = -1
-            r.Error_msg = ps.UserId
-            r.Data = map[string]interface{}{
-                "code":   -1,
-                "msg":    "获取用户权益详情失败",
-                "userId": ps.UserId,
-            }
-        } else {
-            data, _ := json.Marshal(*bigBaseMsg)
-            r.Data = data
-        }
-    }
-    return nil
+	if len(p.ShareUserInfo) > 0 {
+		ps := p.ShareUserInfo[0]
+		bigBaseMsg := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
+		if bigBaseMsg == nil {
+			r.Error_code = -1
+			r.Error_msg = ps.UserId
+			r.Data = map[string]interface{}{
+				"code":   -1,
+				"msg":    "获取用户权益详情失败",
+				"userId": ps.UserId,
+			}
+		} else {
+			data, _ := json.Marshal(*bigBaseMsg)
+			r.Data = data
+		}
+	}
+	return nil
 }

+ 921 - 938
src/jfw/modules/subscribepay/src/timetask/timetask.go

@@ -1,1006 +1,989 @@
 package timetask
 
 import (
-    "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
-    "encoding/hex"
-    "fmt"
-    "jy/src/jfw/modules/subscribepay/src/config"
-    . "jy/src/jfw/modules/subscribepay/src/config"
-    "jy/src/jfw/modules/subscribepay/src/pay"
-    "jy/src/jfw/modules/subscribepay/src/util"
-    "log"
-    "strconv"
-    "strings"
-    "time"
+	"encoding/hex"
+	"fmt"
+	"jy/src/jfw/modules/subscribepay/src/config"
+	. "jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/pay"
+	"jy/src/jfw/modules/subscribepay/src/util"
+	"log"
+	"strconv"
+	"strings"
+	"time"
 
-    qutil "app.yhyue.com/moapp/jybase/common"
-    . "app.yhyue.com/moapp/jybase/date"
-    . "app.yhyue.com/moapp/jybase/mongodb"
-    "app.yhyue.com/moapp/jybase/redis"
-    qrpc "app.yhyue.com/moapp/jybase/rpc"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
-    p "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
+	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
+
+	qutil "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/date"
+	. "app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jybase/redis"
+	qrpc "app.yhyue.com/moapp/jybase/rpc"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	p "bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
 )
 
 const (
-    threeday = 259200
+	threeday = 259200
 )
 
 func Run() {
-    if TimeTaskConfig.IsRun {
-        for _, v := range []Identity{&Personal{}, &Ent{}} {
-            go checkIsExpire(v)
-            go checkMemberIsExpire(v)
-            go updateProvincePackageStatus(v) //省份流量包
-        }
-        go bigMemberExpireRemind()
-        go syncVipUpgrade()
-        go updateDataExportStatus()
-        go SendDataExportMailForPayed()
-        go courseTask()
-        go expireRemind()
-        go checkMemberIsStart()
-        go checkMemberServiceIsExpire()
-        go updateTimeLimitActitityOrderStatus() //修改限时活动的订单状态
-    }
+	if TimeTaskConfig.IsRun {
+		for _, v := range []Identity{&Personal{}, &Ent{}} {
+			go checkIsExpire(v)
+			go checkMemberIsExpire(v)
+			go updateProvincePackageStatus(v) //省份流量包
+		}
+		go bigMemberExpireRemind()
+		go syncVipUpgrade()
+		go updateDataExportStatus()
+		go SendDataExportMailForPayed()
+		go courseTask()
+		go expireRemind()
+		go checkMemberIsStart()
+		go checkMemberServiceIsExpire()
+		go updateTimeLimitActitityOrderStatus() //修改限时活动的订单状态
+	}
 }
 
 //省份流量包到期时间 定时任务
 func updateProvincePackageStatus(i Identity) {
-    crontab(true, TimeTaskConfig.ProvinceExpire, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,开始更新省份订阅包状态开始")
-        now_unix := time.Now().Unix()
-        sess := util.MQFW.GetMgoConn()
-        for {
-            if sess != nil {
-                defer util.MQFW.DestoryMongoConn(sess)
-                break
-            }
-            time.Sleep(time.Minute)
-            sess = util.MQFW.GetMgoConn()
-        }
-        query := i.SubsetQuery(2)
-        query["o_jy.i_ppstatus"] = map[string]interface{}{
-            "$gt": -1,
-        }
-        query["o_jy.l_areaEnd_p"] = map[string]interface{}{
-            "$lte": now_unix,
-        }
-        it := sess.DB("qfw").C(i.SubsetColl()).Find(query).Select(map[string]interface{}{"o_jy.i_ppstatus": 1, "o_jy.l_areaEnd_p": 1}).Iter()
-        for m := make(map[string]interface{}); it.Next(&m); {
-            _id := BsonIdToSId(m["_id"])
-            if util.MQFW.UpdateById(i.SubsetColl(), _id, map[string]interface{}{
-                "$set": map[string]interface{}{
-                    "o_jy.i_ppstatus":    -1,
-                    "o_jy.i_areapackTip": 1,
-                },
-            }) {
-                positionId := util.MongoIdToPositionId(_id)
-                ok := jy.ClearBigVipUserPower(positionId)
-                config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                    PositionId: positionId,
-                    AppId:      "10000",
-                })
-                config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-                if !ok {
-                    log.Println("清除 redis省份订阅包服务详情 缓存失败:", _id)
-                }
-            } else {
-                log.Println("更新user表 省份订阅包状态失败:", _id)
-            }
-            m = make(map[string]interface{})
-        }
-        log.Println("定时任务,更新省份订阅包状态结束")
-    })
+	crontab(true, TimeTaskConfig.ProvinceExpire, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,开始更新省份订阅包状态开始")
+		now_unix := time.Now().Unix()
+		sess := util.MQFW.GetMgoConn()
+		for {
+			if sess != nil {
+				defer util.MQFW.DestoryMongoConn(sess)
+				break
+			}
+			time.Sleep(time.Minute)
+			sess = util.MQFW.GetMgoConn()
+		}
+		query := i.SubsetQuery(2)
+		query["o_jy.i_ppstatus"] = map[string]interface{}{
+			"$gt": -1,
+		}
+		query["o_jy.l_areaEnd_p"] = map[string]interface{}{
+			"$lte": now_unix,
+		}
+		it := sess.DB("qfw").C(i.SubsetColl()).Find(query).Select(map[string]interface{}{"o_jy.i_ppstatus": 1, "o_jy.l_areaEnd_p": 1}).Iter()
+		for m := make(map[string]interface{}); it.Next(&m); {
+			_id := BsonIdToSId(m["_id"])
+			if util.MQFW.UpdateById(i.SubsetColl(), _id, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"o_jy.i_ppstatus":    -1,
+					"o_jy.i_areapackTip": 1,
+				},
+			}) {
+				positionId := util.MongoIdToPositionId(_id)
+				ok := jy.ClearBigVipUserPower(positionId)
+				config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+					PositionId: positionId,
+					AppId:      "10000",
+				})
+				config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+				if !ok {
+					log.Println("清除 redis省份订阅包服务详情 缓存失败:", _id)
+				}
+			} else {
+				log.Println("更新user表 省份订阅包状态失败:", _id)
+			}
+			m = make(map[string]interface{})
+		}
+		log.Println("定时任务,更新省份订阅包状态结束")
+	})
 }
 
 //定时更新超过72小时订单
 func updateDataExportStatus() {
-    crontabByTicker(true, TimeTaskConfig.UpdateDEStatus, func() {
-        log.Println("定时任务,开始更新超时订单状态")
-        create_time := time.Now()
-        create_time_stamp := create_time.Unix()
-        start_time_stamp := create_time.Unix()
-        order_countdown := Config.OrderCountdown //配置文件读取
-        if strings.Contains(qutil.ObjToString(order_countdown), "h") {
-            onehour, _ := time.ParseDuration(qutil.ObjToString(order_countdown))
-            create_time_stamp = create_time.Add(-onehour).Unix()
-            start_time_stamp = create_time.Add(-onehour).AddDate(0, 0, -1).Unix()
-        } else {
-            i_countdown := qutil.IntAll(order_countdown)
-            create_time_stamp = create_time.AddDate(0, 0, -i_countdown).Unix()
-            start_time_stamp = create_time.AddDate(0, 0, -i_countdown).AddDate(0, 0, -1).Unix()
-        }
-        over_time := FormatDateByInt64(&create_time_stamp, Date_Full_Layout)
-        start_time := FormatDateByInt64(&start_time_stamp, Date_Full_Layout)
-        log.Println("over_time:", over_time, "start_time:", start_time)
-        //查询未支付超时订单(仅用户自主下单、销售代用户下单的订单)
-        wooList := util.Mysql.SelectBySql(`SELECT * FROM dataexport_order  WHERE order_status = 0 AND  create_time < ? AND create_time > ? AND (is_backstage_order = 0 or (is_backstage_order=1 AND order_channel ='xdqd04'))`, over_time, start_time)
-        if wooList != nil && len(*wooList) != 0 {
-            for _, v := range *wooList {
-                if v["order_code"] != nil {
-                    //订单编号
-                    order_code, _ := v["order_code"].(string)
-                    productType := 0 //取消卡券的时候 需要这个参数  商品类型0普通的1线上课程
-                    if product_type, _ := v["product_type"].(string); product_type != "中标必听课" {
-                        productType = 1
-                    }
-                    flag := false
-                    //仅用户自主下单、销售代用户下单的订单 可以取消
-                    cancelOrder := qutil.IntAll(v["is_backstage_order"]) == 0 || (qutil.IntAll(v["is_backstage_order"]) == 1 && qutil.ObjToString(v["order_channel"]) == "xdqd04")
-                    if qutil.IntAll(v["order_status"]) == 0 && cancelOrder && qutil.ObjToString(v["pay_way"]) != "transferAccounts" { //未支付状态下 删除订单需要先关闭订单
-                        flag = pay.CloseDataExportOrder(qutil.ObjToString(v["pay_way"]), qutil.ObjToString(v["out_trade_no"]), qutil.ObjToString(v["prepay_time"]))
-                    }
-                    if flag || (!(qutil.IntAll(v["course_status"]) == 2 || qutil.IntAll(v["course_status"]) == 4)) && qutil.ObjToString(v["pay_way"]) == "transferAccounts" && cancelOrder { //对公转账非审核中 和 转账成功 状态下超时取消订单
-                        queryMap := map[string]interface{}{
-                            "order_code": order_code,
-                        }
-                        flag = util.Mysql.Update("dataexport_order", queryMap, map[string]interface{}{"order_status": -2})
-                    }
-                    // discountId := ""
-                    // var filter map[string]interface{}
-                    // //关闭未支付订单
-                    // if err := json.Unmarshal([]byte(qutil.ObjToString(v["filter"])), &filter); err != nil {
-                    // 	log.Println("filter.json.Unmarshal出错", err)
-                    // } else {
-                    // 	if filter["discountId"] != nil {
-                    // 		discountId = strconv.Itoa(qutil.IntAll(filter["discountId"]))
-                    // 	}
-                    // }
-                    if !flag {
-                        log.Println("mysql 订单更新失败", order_code)
-                    } else {
-                        //解除卡卷绑定
-                        //用户领取卡卷的记录id
-                        userLotteryId, _ := v["d_relation_id"].(string)
-                        if userLotteryId != "" {
-                            //用户id
-                            userId, _ := v["user_id"].(string)
-                            go func(userId, userLotteryId, order_code string) {
-                                if !util.UpdateCouponState(userId, userLotteryId, "", "", order_code, qutil.ObjToString(v["product_type"]), "0", 0, productType) {
-                                    log.Println(fmt.Sprintf("单号%s-解绑失败-卡卷%s", order_code, userLotteryId))
-                                }
-                            }(userId, userLotteryId, order_code)
-                        }
-                    }
-                }
-            }
-        }
-        log.Println("定时任务,更新超时订单状态结束")
-    })
+	crontabByTicker(true, TimeTaskConfig.UpdateDEStatus, func() {
+		log.Println("定时任务,开始更新超时订单状态")
+		create_time := time.Now()
+		create_time_stamp := create_time.Unix()
+		start_time_stamp := create_time.Unix()
+		order_countdown := Config.OrderCountdown //配置文件读取
+		if strings.Contains(qutil.ObjToString(order_countdown), "h") {
+			onehour, _ := time.ParseDuration(qutil.ObjToString(order_countdown))
+			create_time_stamp = create_time.Add(-onehour).Unix()
+			start_time_stamp = create_time.Add(-onehour).AddDate(0, 0, -1).Unix()
+		} else {
+			i_countdown := qutil.IntAll(order_countdown)
+			create_time_stamp = create_time.AddDate(0, 0, -i_countdown).Unix()
+			start_time_stamp = create_time.AddDate(0, 0, -i_countdown).AddDate(0, 0, -1).Unix()
+		}
+		over_time := FormatDateByInt64(&create_time_stamp, Date_Full_Layout)
+		start_time := FormatDateByInt64(&start_time_stamp, Date_Full_Layout)
+		log.Println("over_time:", over_time, "start_time:", start_time)
+		//查询未支付超时订单(仅用户自主下单、销售代用户下单的订单)
+		wooList := util.Mysql.SelectBySql(`SELECT * FROM dataexport_order  WHERE order_status = 0 AND  create_time < ? AND create_time > ? AND (is_backstage_order = 0 or (is_backstage_order=1 AND order_channel ='xdqd04'))`, over_time, start_time)
+		if wooList != nil && len(*wooList) != 0 {
+			for _, v := range *wooList {
+				if v["order_code"] != nil {
+					//订单编号
+					order_code, _ := v["order_code"].(string)
+					productType := 0 //取消卡券的时候 需要这个参数  商品类型0普通的1线上课程
+					if product_type, _ := v["product_type"].(string); product_type != "中标必听课" {
+						productType = 1
+					}
+					flag := false
+					//仅用户自主下单、销售代用户下单的订单 可以取消
+					cancelOrder := qutil.IntAll(v["is_backstage_order"]) == 0 || (qutil.IntAll(v["is_backstage_order"]) == 1 && qutil.ObjToString(v["order_channel"]) == "xdqd04")
+					if qutil.IntAll(v["order_status"]) == 0 && cancelOrder && qutil.ObjToString(v["pay_way"]) != "transferAccounts" { //未支付状态下 删除订单需要先关闭订单
+						flag = pay.CloseDataExportOrder(qutil.ObjToString(v["pay_way"]), qutil.ObjToString(v["out_trade_no"]), qutil.ObjToString(v["prepay_time"]))
+					}
+					if flag || (!(qutil.IntAll(v["course_status"]) == 2 || qutil.IntAll(v["course_status"]) == 4)) && qutil.ObjToString(v["pay_way"]) == "transferAccounts" && cancelOrder { //对公转账非审核中 和 转账成功 状态下超时取消订单
+						queryMap := map[string]interface{}{
+							"order_code": order_code,
+						}
+						flag = util.Mysql.Update("dataexport_order", queryMap, map[string]interface{}{"order_status": -2})
+					}
+					// discountId := ""
+					// var filter map[string]interface{}
+					// //关闭未支付订单
+					// if err := json.Unmarshal([]byte(qutil.ObjToString(v["filter"])), &filter); err != nil {
+					// 	log.Println("filter.json.Unmarshal出错", err)
+					// } else {
+					// 	if filter["discountId"] != nil {
+					// 		discountId = strconv.Itoa(qutil.IntAll(filter["discountId"]))
+					// 	}
+					// }
+					if !flag {
+						log.Println("mysql 订单更新失败", order_code)
+					} else {
+						//解除卡卷绑定
+						//用户领取卡卷的记录id
+						userLotteryId, _ := v["d_relation_id"].(string)
+						if userLotteryId != "" {
+							//用户id
+							userId, _ := v["user_id"].(string)
+							go func(userId, userLotteryId, order_code string) {
+								if !util.UpdateCouponState(userId, userLotteryId, "", "", order_code, qutil.ObjToString(v["product_type"]), "0", 0, productType) {
+									log.Println(fmt.Sprintf("单号%s-解绑失败-卡卷%s", order_code, userLotteryId))
+								}
+							}(userId, userLotteryId, order_code)
+						}
+					}
+				}
+			}
+		}
+		log.Println("定时任务,更新超时订单状态结束")
+	})
 }
 
 //每天夜里12点 根据课程结束时间 更新课程状态 并 更新mysql预定此课程订单的状态为已取消
 func courseTask() {
-    crontab(true, TimeTaskConfig.CourseTask, func() {
-        log.Println("定时任务,开始更新课程状态")
-        now_unix := time.Now().Unix()
-        sess := util.MQFW.GetMgoConn()
-        defer util.MQFW.DestoryMongoConn(sess)
-        //i_status :  0是保存未发布 1是已发布 -1是已下线
-        it := sess.DB("qfw").C("jy_course").Find(map[string]interface{}{
-            "i_status": 1,
-            "l_starttime": map[string]interface{}{
-                "$lte": now_unix,
-            },
-        }).Select(map[string]interface{}{"i_status": 1, "l_endtime": 1}).Iter()
-        for m := make(map[string]interface{}); it.Next(&m); {
-            _id := BsonIdToSId(m["_id"])
-            util.MQFW.UpdateById("jy_course", _id, map[string]interface{}{
-                "$set": map[string]interface{}{
-                    "i_status": -1,
-                },
-            })
-            go func(id string) { //更新已预订此课程订单的状态为已取消
-                var updateSql = `UPDATE dataexport_order  SET order_status = -2 WHERE order_status = 0 AND product_type = '招投标课程' AND filter_id = '` + id + `'`
-                i := util.Mysql.UpdateOrDeleteBySql(updateSql)
-                if i < 0 {
-                    log.Println("mysql 订单更新失败", id)
-                }
-            }(_id)
-            m = make(map[string]interface{})
-        }
-        log.Println("定时任务,更新课程状态结束")
-    })
+	crontab(true, TimeTaskConfig.CourseTask, func() {
+		log.Println("定时任务,开始更新课程状态")
+		now_unix := time.Now().Unix()
+		sess := util.MQFW.GetMgoConn()
+		defer util.MQFW.DestoryMongoConn(sess)
+		//i_status :  0是保存未发布 1是已发布 -1是已下线
+		it := sess.DB("qfw").C("jy_course").Find(map[string]interface{}{
+			"i_status": 1,
+			"l_starttime": map[string]interface{}{
+				"$lte": now_unix,
+			},
+		}).Select(map[string]interface{}{"i_status": 1, "l_endtime": 1}).Iter()
+		for m := make(map[string]interface{}); it.Next(&m); {
+			_id := BsonIdToSId(m["_id"])
+			util.MQFW.UpdateById("jy_course", _id, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"i_status": -1,
+				},
+			})
+			go func(id string) { //更新已预订此课程订单的状态为已取消
+				var updateSql = `UPDATE dataexport_order  SET order_status = -2 WHERE order_status = 0 AND product_type = '招投标课程' AND filter_id = '` + id + `'`
+				i := util.Mysql.UpdateOrDeleteBySql(updateSql)
+				if i < 0 {
+					log.Println("mysql 订单更新失败", id)
+				}
+			}(_id)
+			m = make(map[string]interface{})
+		}
+		log.Println("定时任务,更新课程状态结束")
+	})
 }
 
 //vip升级 下个月生效 同步
 func syncVipUpgrade() {
-    crontab(true, TimeTaskConfig.SyncVipUpgrade, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,开始同步vip升级数据")
-        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("vip_upgrade").Find(map[string]interface{}{
-            "l_validtime": map[string]interface{}{
-                "$lte": time.Now().Unix(),
-            },
-            "i_isvalid": map[string]interface{}{
-                "$ne": 1,
-            },
-        }).Select(map[string]interface{}{"s_userid": 1, "o_area": 1, "a_buyerclass": 1, "o_buyset": 1}).Iter()
-        for m := make(map[string]interface{}); it.Next(&m); {
-            _id := BsonIdToSId(m["_id"])
-            s_userid := qutil.ObjToString(m["s_userid"])
-            if s_userid == "" {
-                log.Println("定时任务,同步vip升级数据有问题,userid是空", _id)
-                continue
-            }
-            o_area, _ := m["o_area"].(map[string]interface{})
-            o_buyset, _ := m["o_buyset"].(map[string]interface{})
-            a_buyerclass, _ := m["a_buyerclass"].([]interface{})
-            updateOk := false
-            if IsObjectIdHex(s_userid) {
-                updateOk = util.Compatible.Update(s_userid, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "o_vipjy.o_area":       o_area,
-                        "o_vipjy.a_buyerclass": a_buyerclass,
-                        "o_vipjy.o_buyset":     o_buyset,
-                    },
-                })
-            } else {
-                updateOk = util.MQFW.Update("entniche_user", map[string]interface{}{
-                    "i_type":   2,
-                    "i_userid": qutil.IntAll(s_userid),
-                }, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "o_vipjy.o_area":       o_area,
-                        "o_vipjy.a_buyerclass": a_buyerclass,
-                        "o_vipjy.o_buyset":     o_buyset,
-                    },
-                }, false, false)
-            }
-            if updateOk {
-                util.MQFW.UpdateById("vip_upgrade", _id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "l_synctime": time.Now().Unix(),
-                        "i_isvalid":  1,
-                    },
-                })
-                log.Println("定时任务,同步vip升级数据成功", _id)
-                positionId := util.MongoIdToPositionId(_id)
-                go jy.ClearBigVipUserPower(positionId)
-                go config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                    PositionId: positionId,
-                    AppId:      "10000",
-                })
-                go config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-            } else {
-                log.Println("定时任务,同步vip升级数据更新用户表失败", _id)
-            }
-            m = make(map[string]interface{})
-        }
-        log.Println("定时任务,同步vip升级数据结束")
-    })
+	crontab(true, TimeTaskConfig.SyncVipUpgrade, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,开始同步vip升级数据")
+		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("vip_upgrade").Find(map[string]interface{}{
+			"l_validtime": map[string]interface{}{
+				"$lte": time.Now().Unix(),
+			},
+			"i_isvalid": map[string]interface{}{
+				"$ne": 1,
+			},
+		}).Select(map[string]interface{}{"s_userid": 1, "o_area": 1, "a_buyerclass": 1, "o_buyset": 1}).Iter()
+		for m := make(map[string]interface{}); it.Next(&m); {
+			_id := BsonIdToSId(m["_id"])
+			s_userid := qutil.ObjToString(m["s_userid"])
+			if s_userid == "" {
+				log.Println("定时任务,同步vip升级数据有问题,userid是空", _id)
+				continue
+			}
+			o_area, _ := m["o_area"].(map[string]interface{})
+			o_buyset, _ := m["o_buyset"].(map[string]interface{})
+			a_buyerclass, _ := m["a_buyerclass"].([]interface{})
+			updateOk := false
+			if IsObjectIdHex(s_userid) {
+				updateOk = util.Compatible.Update(s_userid, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"o_vipjy.o_area":       o_area,
+						"o_vipjy.a_buyerclass": a_buyerclass,
+						"o_vipjy.o_buyset":     o_buyset,
+					},
+				})
+			} else {
+				updateOk = util.MQFW.Update("entniche_user", map[string]interface{}{
+					"i_type":   2,
+					"i_userid": qutil.IntAll(s_userid),
+				}, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"o_vipjy.o_area":       o_area,
+						"o_vipjy.a_buyerclass": a_buyerclass,
+						"o_vipjy.o_buyset":     o_buyset,
+					},
+				}, false, false)
+			}
+			if updateOk {
+				util.MQFW.UpdateById("vip_upgrade", _id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"l_synctime": time.Now().Unix(),
+						"i_isvalid":  1,
+					},
+				})
+				log.Println("定时任务,同步vip升级数据成功", _id)
+				positionId := util.MongoIdToPositionId(_id)
+				go jy.ClearBigVipUserPower(positionId)
+				go config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+					PositionId: positionId,
+					AppId:      "10000",
+				})
+				go config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+			} else {
+				log.Println("定时任务,同步vip升级数据更新用户表失败", _id)
+			}
+			m = make(map[string]interface{})
+		}
+		log.Println("定时任务,同步vip升级数据结束")
+	})
 }
 
 //每天0点 检查试用、vip服务是否到期
 func checkIsExpire(iy Identity) {
-    crontab(true, TimeTaskConfig.CheckIsExpire, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,开始更新vip状态")
-        now_unix := time.Now().Unix()
-        sess := util.MQFW.GetMgoConn()
-        for {
-            if sess != nil {
-                defer util.MQFW.DestoryMongoConn(sess)
-                break
-            }
-            time.Sleep(time.Minute)
-            sess = util.MQFW.GetMgoConn()
-        }
-        query := iy.UserQuery()
-        query["i_vip_status"] = map[string]interface{}{
-            "$gt": 0,
-        }
-        query["l_vip_endtime"] = map[string]interface{}{
-            "$lte": now_unix + threeday,
-        }
-        count, err := sess.DB("qfw").C(iy.UserColl()).Find(query).Count()
-        log.Println("当前时间:", FormatDateByInt64(&now_unix, Date_Full_Layout), "数据总量:", count, "--err:", err)
-        var i int64 = 0
-        it := sess.DB("qfw").C(iy.UserColl()).Find(query).Select(iy.UserField(map[string]interface{}{"i_vip_status": 1, "l_vip_endtime": 1, "i_vip_expire_tip": 1})).Iter()
-        for m := make(map[string]interface{}); it.Next(&m); {
-            i++
-            _id := BsonIdToSId(m["_id"])
-            l_vip_endtime := qutil.Int64All(m["l_vip_endtime"])
-            i_vip_status := qutil.IntAll(m["i_vip_status"])
-            i_vip_expire_tip := qutil.IntAll(m["i_vip_expire_tip"])
-            if l_vip_endtime <= now_unix {
-                ok := util.MQFW.UpdateById(iy.UserColl(), _id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "i_vip_status":     -i_vip_status,
-                        "i_vip_expire_tip": 2,
-                        "i_vip_subtips":    0,
-                        "i_vip_fastimport": 0,
-                    },
-                    "$unset": map[string]interface{}{
-                        "i_vip_expire_tip_retry": "",
-                    },
-                })
-                if !ok {
-                    log.Println("用户:", _id, " 更新vip状态异常")
-                }
-                go iy.DelVipSubPush(m)
-                positionId := util.MongoIdToPositionId(_id)
-                go jy.ClearBigVipUserPower(positionId)
-                go config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                    PositionId: positionId,
-                    AppId:      "10000",
-                })
-                go config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-                log.Println("用户", _id, i_vip_status, l_vip_endtime, "修改已到期状态")
-                redis.Del("other", "p1_indexMessage_"+_id) //清除redis中vip状态
-                filePackKey := fmt.Sprintf(jy.FilePackNumKey, _id, fmt.Sprint(time.Now().Month()))
-                redis.Del(jy.PowerCacheDb, filePackKey) //清除redis中附件下载包次数
-                vipFileUploadNumKey := fmt.Sprintf(jy.VipFileUploadNumKey, _id, fmt.Sprint(time.Now().Month()))
-                redis.Del(jy.PowerCacheDb, vipFileUploadNumKey) //清除redis中vip使用次数
-            } else if l_vip_endtime-now_unix <= threeday && i_vip_expire_tip != 1 {
-                updateOk := util.MQFW.UpdateById(iy.UserColl(), _id, map[string]interface{}{
-                    "$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)
-            }
-            m = make(map[string]interface{})
-        }
-        if i != count {
-            log.Println("更新vip状态有异常,已处理:", i, "总量:", count)
-        }
-        log.Println("已处理:", i, "总量:", count)
-        log.Println("定时任务,更新vip状态结束")
-    })
+	crontab(true, TimeTaskConfig.CheckIsExpire, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,开始更新vip状态")
+		now_unix := time.Now().Unix()
+		sess := util.MQFW.GetMgoConn()
+		for {
+			if sess != nil {
+				defer util.MQFW.DestoryMongoConn(sess)
+				break
+			}
+			time.Sleep(time.Minute)
+			sess = util.MQFW.GetMgoConn()
+		}
+		query := iy.UserQuery()
+		query["i_vip_status"] = map[string]interface{}{
+			"$gt": 0,
+		}
+		query["l_vip_endtime"] = map[string]interface{}{
+			"$lte": now_unix + threeday,
+		}
+		count, err := sess.DB("qfw").C(iy.UserColl()).Find(query).Count()
+		log.Println("当前时间:", FormatDateByInt64(&now_unix, Date_Full_Layout), "数据总量:", count, "--err:", err)
+		var i int64 = 0
+		it := sess.DB("qfw").C(iy.UserColl()).Find(query).Select(iy.UserField(map[string]interface{}{"i_vip_status": 1, "l_vip_endtime": 1, "i_vip_expire_tip": 1})).Iter()
+		for m := make(map[string]interface{}); it.Next(&m); {
+			i++
+			_id := BsonIdToSId(m["_id"])
+			l_vip_endtime := qutil.Int64All(m["l_vip_endtime"])
+			i_vip_status := qutil.IntAll(m["i_vip_status"])
+			i_vip_expire_tip := qutil.IntAll(m["i_vip_expire_tip"])
+			if l_vip_endtime <= now_unix {
+				ok := util.MQFW.UpdateById(iy.UserColl(), _id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_vip_status":     -i_vip_status,
+						"i_vip_expire_tip": 2,
+						"i_vip_subtips":    0,
+						"i_vip_fastimport": 0,
+					},
+					"$unset": map[string]interface{}{
+						"i_vip_expire_tip_retry": "",
+					},
+				})
+				if !ok {
+					log.Println("用户:", _id, " 更新vip状态异常")
+				}
+				go iy.DelVipSubPush(m)
+				positionId := util.MongoIdToPositionId(_id)
+				go jy.ClearBigVipUserPower(positionId)
+				go config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+					PositionId: positionId,
+					AppId:      "10000",
+				})
+				go config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+				log.Println("用户", _id, i_vip_status, l_vip_endtime, "修改已到期状态")
+				redis.Del("other", "p1_indexMessage_"+_id) //清除redis中vip状态
+				filePackKey := fmt.Sprintf(jy.FilePackNumKey, _id, fmt.Sprint(time.Now().Month()))
+				redis.Del(jy.PowerCacheDb, filePackKey) //清除redis中附件下载包次数
+				vipFileUploadNumKey := fmt.Sprintf(jy.VipFileUploadNumKey, _id, fmt.Sprint(time.Now().Month()))
+				redis.Del(jy.PowerCacheDb, vipFileUploadNumKey) //清除redis中vip使用次数
+			} else if l_vip_endtime-now_unix <= threeday && i_vip_expire_tip != 1 {
+				updateOk := util.MQFW.UpdateById(iy.UserColl(), _id, map[string]interface{}{
+					"$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)
+			}
+			m = make(map[string]interface{})
+		}
+		if i != count {
+			log.Println("更新vip状态有异常,已处理:", i, "总量:", count)
+		}
+		log.Println("已处理:", i, "总量:", count)
+		log.Println("定时任务,更新vip状态结束")
+	})
 }
 
 //即将到期或者已到期发推送消息
 func expireRemind() {
-    crontab(false, TimeTaskConfig.ExpireRemind, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,到期提醒,开始推送消息")
-        now_unix := time.Now().Unix()
-        util.OnTrial_WTMCS.Reload()
-        util.Formal_WTMCS.Reload()
-        doFunc := func(m map[string]interface{}) {
-            i_vip_expire_tip := qutil.IntAll(m["i_vip_expire_tip"])
-            if i_vip_expire_tip != 1 && i_vip_expire_tip != 2 {
-                return
-            }
-            _id := qutil.ObjToString(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)
-                return
-            }
-            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)
-            if isPushWx == 1 && s_m_openid != "" { //微信推送
-                tp := ""
-                tplId, first_color, keyword1_value, keyword2_value, keyword3_value, keyword4_value, remark := "", "", "", "", "", "", ""
-                var wtmc *p.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 = FormatDateByInt64(&l_vip_endtime, Date_Short_Layout)
-                    return
-                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 = FormatDateByInt64(&l_vip_endtime, Date_Short_Layout)
-                    return
-                default:
-                    return
-                }
-                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(_id+qutil.If(IsObjectIdHex(_id), ",_id,", ",entUserId,").(string)+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 := "", ""
-                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
-                    }
-                    return
-                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
-                    }
-                    return
-                default:
-                    return
-                }
-                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+qutil.If(IsObjectIdHex(_id), ",_id,", ",entUserId,").(string)+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_vip_expire_tip_retry"]) >= 2 {
-                util.Compatible.UpdateByEntUserId(_id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "i_vip_expire_tip": 0,
-                    },
-                })
-            } else if i_vip_expire_tip == 2 {
-                util.Compatible.UpdateByEntUserId(_id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "i_vip_expire_tip_retry": 1,
-                    },
-                })
-            }
-        }
-        field := 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,
-            "i_vip_expire_tip_retry": 1,
-        }
-        (&Personal{}).LoadVipUsers(field, doFunc)
-        (&Ent{}).LoadVipUsers(field, doFunc)
-        log.Println("定时任务,到期提醒,推送消息结束")
-    })
+	crontab(false, TimeTaskConfig.ExpireRemind, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,到期提醒,开始推送消息")
+		now_unix := time.Now().Unix()
+		util.OnTrial_WTMCS.Reload()
+		util.Formal_WTMCS.Reload()
+		doFunc := func(m map[string]interface{}) {
+			i_vip_expire_tip := qutil.IntAll(m["i_vip_expire_tip"])
+			if i_vip_expire_tip != 1 && i_vip_expire_tip != 2 {
+				return
+			}
+			_id := qutil.ObjToString(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)
+				return
+			}
+			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)
+			if isPushWx == 1 && s_m_openid != "" { //微信推送
+				tp := ""
+				tplId, first_color, keyword1_value, keyword2_value, keyword3_value, keyword4_value := "", "", "", "", "", ""
+				var wtmc *p.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
+					} 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
+					}
+					keyword1_value = qutil.ObjToString(m["s_nickname"])
+					keyword2_value = FormatDateByInt64(&l_vip_endtime, Date_Short_Layout)
+				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
+					} 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
+					}
+					keyword1_value = qutil.ObjToString(m["s_nickname"])
+					keyword4_value = FormatDateByInt64(&l_vip_endtime, Date_Short_Layout)
+				default:
+					return
+				}
+				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,
+						},
+					}
+					wxPushOk, _ = qrpc.WxSendTmplMsg(Config.Weixinrpc, &qrpc.WxTmplMsg{
+						OpenId:   s_m_openid,
+						TplId:    tplId,
+						TmplData: tmplData,
+						Url:      Config.WebDomain + "/front/sess/" + util.Se_Topnet.EncodeString(_id+qutil.If(IsObjectIdHex(_id), ",_id,", ",entUserId,").(string)+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 := "", ""
+				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
+					}
+				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
+					}
+				default:
+					return
+				}
+				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+qutil.If(IsObjectIdHex(_id), ",_id,", ",entUserId,").(string)+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_vip_expire_tip_retry"]) >= 2 {
+				util.Compatible.UpdateByEntUserId(_id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_vip_expire_tip": 0,
+					},
+				})
+			} else if i_vip_expire_tip == 2 {
+				util.Compatible.UpdateByEntUserId(_id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_vip_expire_tip_retry": 1,
+					},
+				})
+			}
+		}
+		field := 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,
+			"i_vip_expire_tip_retry": 1,
+		}
+		(&Personal{}).LoadVipUsers(field, doFunc)
+		(&Ent{}).LoadVipUsers(field, doFunc)
+		log.Println("定时任务,到期提醒,推送消息结束")
+	})
 }
 
 //检测大会员到期时间 定时任务
 func checkMemberIsExpire(i Identity) {
-    crontab(true, TimeTaskConfig.MemberExpire, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,开始更新大会员状态")
-        now_unix := time.Now().Unix()
-        now_time := FormatDateByInt64(&now_unix, Date_Full_Layout)
-        sess := util.MQFW.GetMgoConn()
-        for {
-            if sess != nil {
-                defer util.MQFW.DestoryMongoConn(sess)
-                break
-            }
-            time.Sleep(time.Minute)
-            sess = util.MQFW.GetMgoConn()
-        }
-        query := i.UserQuery()
-        query["i_member_status"] = map[string]interface{}{
-            "$gt": 0,
-        }
-        query["i_member_endtime"] = map[string]interface{}{
-            "$lte": now_unix + threeday,
-        }
-        it := sess.DB("qfw").C(i.UserColl()).Find(query).Select(i.UserField(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(i.UserColl(), _id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "i_member_status":     -i_member_status,
-                        "i_member_expire_tip": 2,
-                    },
-                    "$unset": map[string]interface{}{
-                        "i_member_expire_tip_retry": "",
-                        "i_mainaccount":             "",
-                        "i_pay_sub_num":             "",
-                        "i_free_sub_num":            "",
-                        "i_member_sub_status":       "",
-                        "s_member_mainid":           "",
-                    },
-                })
-                go i.DelBigMemberSubPush(m)
-                //大会员用户服务表
-                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, "更新到期用户服务表出错")
-                } else {
-                    positionId := util.MongoIdToPositionId(_id)
-                    ok := jy.ClearBigVipUserPower(positionId)
-                    config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                        PositionId: positionId,
-                        AppId:      "10000",
-                    })
-                    go config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-                    if !ok {
-                        log.Println("清除 redis 大会员服务详情 缓存失败:", _id)
-                    }
-                }
-            } else if i_member_endtime-now_unix <= threeday && i_member_expire_tip != 1 {
-                updateOk := util.MQFW.UpdateById(i.UserColl(), _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{})
-        }
-        log.Println("定时任务,更新大会员状态结束")
-    })
+	crontab(true, TimeTaskConfig.MemberExpire, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,开始更新大会员状态")
+		now_unix := time.Now().Unix()
+		now_time := FormatDateByInt64(&now_unix, Date_Full_Layout)
+		sess := util.MQFW.GetMgoConn()
+		for {
+			if sess != nil {
+				defer util.MQFW.DestoryMongoConn(sess)
+				break
+			}
+			time.Sleep(time.Minute)
+			sess = util.MQFW.GetMgoConn()
+		}
+		query := i.UserQuery()
+		query["i_member_status"] = map[string]interface{}{
+			"$gt": 0,
+		}
+		query["i_member_endtime"] = map[string]interface{}{
+			"$lte": now_unix + threeday,
+		}
+		it := sess.DB("qfw").C(i.UserColl()).Find(query).Select(i.UserField(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(i.UserColl(), _id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_member_status":     -i_member_status,
+						"i_member_expire_tip": 2,
+					},
+					"$unset": map[string]interface{}{
+						"i_member_expire_tip_retry": "",
+						"i_mainaccount":             "",
+						"i_pay_sub_num":             "",
+						"i_free_sub_num":            "",
+						"i_member_sub_status":       "",
+						"s_member_mainid":           "",
+					},
+				})
+				go i.DelBigMemberSubPush(m)
+				//大会员用户服务表
+				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, "更新到期用户服务表出错")
+				} else {
+					positionId := util.MongoIdToPositionId(_id)
+					ok := jy.ClearBigVipUserPower(positionId)
+					config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+						PositionId: positionId,
+						AppId:      "10000",
+					})
+					go config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+					if !ok {
+						log.Println("清除 redis 大会员服务详情 缓存失败:", _id)
+					}
+				}
+			} else if i_member_endtime-now_unix <= threeday && i_member_expire_tip != 1 {
+				updateOk := util.MQFW.UpdateById(i.UserColl(), _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{})
+		}
+		log.Println("定时任务,更新大会员状态结束")
+	})
 }
 
 //大会员即将到期或者已到期发推送消息
 func bigMemberExpireRemind() {
-    crontab(false, TimeTaskConfig.ExpireRemind, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,大会员到期提醒,开始推送消息")
-        now_unix := time.Now().Unix()
-        util.Formal_WTMCS.Reload()
-        doFunc := func(m map[string]interface{}) {
-            i_member_expire_tip := qutil.IntAll(m["i_member_expire_tip"])
-            if i_member_expire_tip != 1 && i_member_expire_tip != 2 {
-                return
-            }
-            _id := qutil.ObjToString(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)
-                return
-            }
-            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 *p.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 {
-                    return
-                }
-                if wtmc != nil {
-                    keyword1_value = qutil.ObjToString(m["s_nickname"])
-                    keyword4_value = FormatDateByInt64(&i_member_endtime, 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 {
-                    return
-                }
-                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+qutil.If(IsObjectIdHex(_id), ",_id,", ",entUserId,").(string)+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.Compatible.Update(_id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "i_member_expire_tip": 0,
-                    },
-                })
-            } else {
-                util.Compatible.Update(_id, map[string]interface{}{
-                    "$inc": map[string]interface{}{
-                        "i_member_expire_tip_retry": 1,
-                    },
-                })
-            }
-        }
-        field := 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,
-            "i_member_expire_tip_retry": 1,
-        }
-        (&Personal{}).LoadBigMemberUsers(field, doFunc)
-        (&Ent{}).LoadBigMemberUsers(field, doFunc)
-        log.Println("定时任务,大会员到期提醒,推送消息结束")
-    })
+	crontab(false, TimeTaskConfig.ExpireRemind, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,大会员到期提醒,开始推送消息")
+		now_unix := time.Now().Unix()
+		util.Formal_WTMCS.Reload()
+		doFunc := func(m map[string]interface{}) {
+			i_member_expire_tip := qutil.IntAll(m["i_member_expire_tip"])
+			if i_member_expire_tip != 1 && i_member_expire_tip != 2 {
+				return
+			}
+			_id := qutil.ObjToString(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)
+				return
+			}
+			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 := "", "", "", "", "", ""
+				var wtmc *p.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
+				} 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
+				} else {
+					return
+				}
+				if wtmc != nil {
+					keyword1_value = qutil.ObjToString(m["s_nickname"])
+					keyword4_value = FormatDateByInt64(&i_member_endtime, 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,
+						},
+					}
+					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 {
+					return
+				}
+				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+qutil.If(IsObjectIdHex(_id), ",_id,", ",entUserId,").(string)+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.Compatible.Update(_id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_member_expire_tip": 0,
+					},
+				})
+			} else {
+				util.Compatible.Update(_id, map[string]interface{}{
+					"$inc": map[string]interface{}{
+						"i_member_expire_tip_retry": 1,
+					},
+				})
+			}
+		}
+		field := 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,
+			"i_member_expire_tip_retry": 1,
+		}
+		(&Personal{}).LoadBigMemberUsers(field, doFunc)
+		(&Ent{}).LoadBigMemberUsers(field, doFunc)
+		log.Println("定时任务,大会员到期提醒,推送消息结束")
+	})
 }
 
 //查看是否有大会员用户定时开启会员
 func checkMemberIsStart() {
-    crontab(true, TimeTaskConfig.MemberIsStart, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,开始更新大会员状态-定时开启会员状态")
-        now_unix := time.Now().Unix()
-        sess := util.MQFW.GetMgoConn()
-        for {
-            if sess != nil {
-                defer util.MQFW.DestoryMongoConn(sess)
-                break
-            }
-            time.Sleep(time.Minute)
-            sess = util.MQFW.GetMgoConn()
-        }
-        //定时开启大会员  i_member_status<0 && i_member_endtime 结束时间大于当前时间 && i_member_starttime 开始时间小于当前时间
-        it := sess.DB("qfw").C("user").Find(map[string]interface{}{
-            "i_appid": 2,
-            "i_member_status": map[string]interface{}{
-                "$lt": 0,
-            },
-            "$and": []map[string]interface{}{
-                map[string]interface{}{
-                    "i_member_endtime": map[string]interface{}{
-                        "$gte": now_unix,
-                    },
-                },
-                map[string]interface{}{
-                    "i_member_starttime": map[string]interface{}{
-                        "$lte": now_unix,
-                    },
-                },
-            },
-        }).Select(map[string]interface{}{"i_member_status": 1, "i_member_endtime": 1, "i_member_starttime": 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_starttime := qutil.Int64All(m["i_member_starttime"])
-            i_member_status := qutil.IntAll(m["i_member_status"])
-            if i_member_endtime > now_unix && i_member_starttime < now_unix {
-                util.Compatible.Update(_id, map[string]interface{}{
-                    "$set": map[string]interface{}{
-                        "i_member_status": -i_member_status,
-                    },
-                })
-                //大会员用户服务表更新
-                updateBigMemberService(_id, now_unix)
-                positionId := util.MongoIdToPositionId(_id)
-                ok := jy.ClearBigVipUserPower(positionId)
-                config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                    PositionId: positionId,
-                    AppId:      "10000",
-                })
-                config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-                if !ok {
-                    log.Println("清除 redis 大会员服务详情 缓存失败:", _id)
-                }
-            }
-            m = make(map[string]interface{})
-        }
-        log.Println("定时任务,更新大会员状态结束-定时开启会员状态")
-    })
+	crontab(true, TimeTaskConfig.MemberIsStart, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,开始更新大会员状态-定时开启会员状态")
+		now_unix := time.Now().Unix()
+		sess := util.MQFW.GetMgoConn()
+		for {
+			if sess != nil {
+				defer util.MQFW.DestoryMongoConn(sess)
+				break
+			}
+			time.Sleep(time.Minute)
+			sess = util.MQFW.GetMgoConn()
+		}
+		//定时开启大会员  i_member_status<0 && i_member_endtime 结束时间大于当前时间 && i_member_starttime 开始时间小于当前时间
+		it := sess.DB("qfw").C("user").Find(map[string]interface{}{
+			"i_appid": 2,
+			"i_member_status": map[string]interface{}{
+				"$lt": 0,
+			},
+			"$and": []map[string]interface{}{
+				map[string]interface{}{
+					"i_member_endtime": map[string]interface{}{
+						"$gte": now_unix,
+					},
+				},
+				map[string]interface{}{
+					"i_member_starttime": map[string]interface{}{
+						"$lte": now_unix,
+					},
+				},
+			},
+		}).Select(map[string]interface{}{"i_member_status": 1, "i_member_endtime": 1, "i_member_starttime": 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_starttime := qutil.Int64All(m["i_member_starttime"])
+			i_member_status := qutil.IntAll(m["i_member_status"])
+			if i_member_endtime > now_unix && i_member_starttime < now_unix {
+				util.Compatible.Update(_id, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"i_member_status": -i_member_status,
+					},
+				})
+				//大会员用户服务表更新
+				updateBigMemberService(_id, now_unix)
+				positionId := util.MongoIdToPositionId(_id)
+				ok := jy.ClearBigVipUserPower(positionId)
+				config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+					PositionId: positionId,
+					AppId:      "10000",
+				})
+				config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+				if !ok {
+					log.Println("清除 redis 大会员服务详情 缓存失败:", _id)
+				}
+			}
+			m = make(map[string]interface{})
+		}
+		log.Println("定时任务,更新大会员状态结束-定时开启会员状态")
+	})
 }
 
 //大会员更新用户服务表
 func updateBigMemberService(userId string, now_unix int64) {
-    now_time := FormatDateByInt64(&now_unix, Date_Full_Layout)
-    userServiceList := util.Mysql.SelectBySql(`select * from  `+jy.BigmemberUserPowerTable+` where s_userid=? AND i_status = 1 AND l_starttime < ? AND l_endtime > ?`, userId, now_time, now_time)
-    if len(*userServiceList) > 0 {
-        for _, v := range *userServiceList {
-            var serviceid = v["s_serviceid"]
-            if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET  a.i_status = 0 , a.l_updatetime=? WHERE a.s_userid = ? AND a.s_serviceid = ? `, now_time, userId, serviceid) < 0 {
-                log.Println(userId, "开启大会员用户服务表出错")
-            }
-        }
-    }
+	now_time := FormatDateByInt64(&now_unix, Date_Full_Layout)
+	userServiceList := util.Mysql.SelectBySql(`select * from  `+jy.BigmemberUserPowerTable+` where s_userid=? AND i_status = 1 AND l_starttime < ? AND l_endtime > ?`, userId, now_time, now_time)
+	if len(*userServiceList) > 0 {
+		for _, v := range *userServiceList {
+			var serviceid = v["s_serviceid"]
+			if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET  a.i_status = 0 , a.l_updatetime=? WHERE a.s_userid = ? AND a.s_serviceid = ? `, now_time, userId, serviceid) < 0 {
+				log.Println(userId, "开启大会员用户服务表出错")
+			}
+		}
+	}
 }
 
 //大会员用户服务表  用户服务是否需要开启或关闭
 func checkMemberServiceIsExpire() {
-    crontab(false, TimeTaskConfig.MemberServiceIsExpire, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,更新大会员服务表状态开始")
-        now_unix := time.Now().Unix()
-        now_time := FormatDateByInt64(&now_unix, Date_Full_Layout)
-        //待使用服务更新状态 wait & 服务到期更新状态 overdue
-        wooList := util.Mysql.SelectBySql(`SELECT * FROM `+jy.BigmemberUserPowerTable+` a WHERE (a.i_status = 1 AND a.l_starttime < ? AND a.l_endtime > ?) OR (a.i_status = 0 AND  a.l_endtime < ?)`, now_time, now_time, now_time)
-        if len(*wooList) > 0 {
-            // log.Println(len(*wooList), "-----:", wooList)
-            var useridMap = map[string]bool{}
-            for _, v := range *wooList {
-                var starttime int64 = -1
-                var endtime int64 = -1
-                var serviceid = v["s_serviceid"]
-                var userid = v["s_userid"]
-                if !useridMap[userid.(string)] {
-                    useridMap[userid.(string)] = true
-                }
-                if thisTime, err := time.ParseInLocation(Date_Full_Layout, v["l_starttime"].(string), time.Local); err == nil {
-                    starttime = thisTime.Unix()
-                }
-                if thisTime, err := time.ParseInLocation(Date_Full_Layout, v["l_endtime"].(string), time.Local); err == nil {
-                    endtime = thisTime.Unix()
-                }
-                if starttime < now_unix && endtime > now_unix {
-                    if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET  a.i_status = 0, a.l_updatetime=? WHERE a.s_userid = ? AND a.s_serviceid = ? `, now_time, userid, serviceid) < 0 {
-                        log.Println(userid, "开启大会员用户服务表出错")
-                    }
-                } else if endtime < now_unix {
-                    if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET a.i_frequency = 0 , a.i_status = -1, a.l_updatetime=? WHERE a.s_userid = ? AND a.s_serviceid = ?`, now_time, userid, serviceid) < 0 {
-                        log.Println(userid, "关闭大会员用户服务表出错")
-                    }
-                }
-            }
-            // log.Println("useridMap:", useridMap)
-            if useridMap != nil && len(useridMap) > 0 {
-                for k, _ := range useridMap {
-                    positionId := util.MongoIdToPositionId(k)
-                    ok := jy.ClearBigVipUserPower(positionId)
-                    config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-                        PositionId: positionId,
-                        AppId:      "10000",
-                    })
-                    config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-                    if !ok {
-                        log.Println("清除 redis 大会员服务详情 缓存失败:", k)
-                    }
+	crontab(false, TimeTaskConfig.MemberServiceIsExpire, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,更新大会员服务表状态开始")
+		now_unix := time.Now().Unix()
+		now_time := FormatDateByInt64(&now_unix, Date_Full_Layout)
+		//待使用服务更新状态 wait & 服务到期更新状态 overdue
+		wooList := util.Mysql.SelectBySql(`SELECT * FROM `+jy.BigmemberUserPowerTable+` a WHERE (a.i_status = 1 AND a.l_starttime < ? AND a.l_endtime > ?) OR (a.i_status = 0 AND  a.l_endtime < ?)`, now_time, now_time, now_time)
+		if len(*wooList) > 0 {
+			// log.Println(len(*wooList), "-----:", wooList)
+			var useridMap = map[string]bool{}
+			for _, v := range *wooList {
+				var starttime int64 = -1
+				var endtime int64 = -1
+				var serviceid = v["s_serviceid"]
+				var userid = v["s_userid"]
+				if !useridMap[userid.(string)] {
+					useridMap[userid.(string)] = true
+				}
+				if thisTime, err := time.ParseInLocation(Date_Full_Layout, v["l_starttime"].(string), time.Local); err == nil {
+					starttime = thisTime.Unix()
+				}
+				if thisTime, err := time.ParseInLocation(Date_Full_Layout, v["l_endtime"].(string), time.Local); err == nil {
+					endtime = thisTime.Unix()
+				}
+				if starttime < now_unix && endtime > now_unix {
+					if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET  a.i_status = 0, a.l_updatetime=? WHERE a.s_userid = ? AND a.s_serviceid = ? `, now_time, userid, serviceid) < 0 {
+						log.Println(userid, "开启大会员用户服务表出错")
+					}
+				} else if endtime < now_unix {
+					if util.Mysql.UpdateOrDeleteBySql(`UPDATE `+jy.BigmemberUserPowerTable+` a SET a.i_frequency = 0 , a.i_status = -1, a.l_updatetime=? WHERE a.s_userid = ? AND a.s_serviceid = ?`, now_time, userid, serviceid) < 0 {
+						log.Println(userid, "关闭大会员用户服务表出错")
+					}
+				}
+			}
+			// log.Println("useridMap:", useridMap)
+			if useridMap != nil && len(useridMap) > 0 {
+				for k, _ := range useridMap {
+					positionId := util.MongoIdToPositionId(k)
+					ok := jy.ClearBigVipUserPower(positionId)
+					config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+						PositionId: positionId,
+						AppId:      "10000",
+					})
+					config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+					if !ok {
+						log.Println("清除 redis 大会员服务详情 缓存失败:", k)
+					}
 
-                }
-            }
-        }
-        log.Println("定时任务,更新大会员服务表状态结束")
-    })
+				}
+			}
+		}
+		log.Println("定时任务,更新大会员服务表状态结束")
+	})
 }
 
 func updateTimeLimitActitityOrderStatus() { //修改限时活动的订单状态
-    crontabByTicker(true, TimeTaskConfig.UpdateTimeLimitActivityOrderStatus, func() {
-        defer qutil.Catch()
-        log.Println("定时任务,更新限时活动订单状态开始")
-        now := time.Now().Add(-time.Duration(config.Config.ActivityOrderCountdown) * time.Minute)
-        //获取倒计时时间
-        starttime := now.Format(Date_Full_Layout)
-        limitTime := 20 //默认二十秒
-        if strings.Contains(TimeTaskConfig.UpdateTimeLimitActivityOrderStatus, "s") {
-            cStr := strings.Split(TimeTaskConfig.UpdateTimeLimitActivityOrderStatus, "s")[0]
-            limitTime, _ = strconv.Atoi(cStr)
-        }
-        endtime := now.Add(-time.Duration(limitTime) * time.Second).Format(Date_Full_Layout)
-        data := util.Mysql.SelectBySql(`select * from dataexport_order where order_status =0 and  expiration_time>=? and expiration_time<? and is_backstage_order = 0`, starttime, endtime)
-        log.Println(fmt.Sprintf(`select * from dataexport_order where order_status =0 and  expiration_time<%s and expiration_time>=%s`, starttime, endtime))
-        if data != nil && len(*data) > 0 {
-            for _, v := range *data {
-                //订单编号
-                order_code, _ := v["order_code"].(string)
-                productType := 0 //取消卡券的时候 需要这个参数  商品类型0普通的1线上课程
-                if product_type, _ := v["product_type"].(string); product_type != "中标必听课" {
-                    productType = 1
-                }
-                flag := false
-                if qutil.IntAll(v["order_status"]) == 0 && qutil.IntAll(v["is_backstage_order"]) == 0 && qutil.ObjToString(v["pay_way"]) != "transferAccounts" { //未支付状态下 删除订单需要先关闭订单
-                    flag = pay.CloseDataExportOrder(qutil.ObjToString(v["pay_way"]), qutil.ObjToString(v["out_trade_no"]), qutil.ObjToString(v["prepay_time"]))
-                }
-                if flag || (!(qutil.IntAll(v["course_status"]) == 2 || qutil.IntAll(v["course_status"]) == 4)) && qutil.ObjToString(v["pay_way"]) == "transferAccounts" && qutil.IntAll(v["is_backstage_order"]) == 0 { //对公转账非审核中 和 转账成功 状态下超时取消订单
-                    queryMap := map[string]interface{}{
-                        "order_code": order_code,
-                    }
-                    flag = util.Mysql.Update("dataexport_order", queryMap, map[string]interface{}{"order_status": -2})
-                }
+	crontabByTicker(true, TimeTaskConfig.UpdateTimeLimitActivityOrderStatus, func() {
+		defer qutil.Catch()
+		log.Println("定时任务,更新限时活动订单状态开始")
+		now := time.Now().Add(-time.Duration(config.Config.ActivityOrderCountdown) * time.Minute)
+		//获取倒计时时间
+		starttime := now.Format(Date_Full_Layout)
+		limitTime := 20 //默认二十秒
+		if strings.Contains(TimeTaskConfig.UpdateTimeLimitActivityOrderStatus, "s") {
+			cStr := strings.Split(TimeTaskConfig.UpdateTimeLimitActivityOrderStatus, "s")[0]
+			limitTime, _ = strconv.Atoi(cStr)
+		}
+		endtime := now.Add(-time.Duration(limitTime) * time.Second).Format(Date_Full_Layout)
+		data := util.Mysql.SelectBySql(`select * from dataexport_order where order_status =0 and  expiration_time>=? and expiration_time<? and is_backstage_order = 0`, starttime, endtime)
+		log.Println(fmt.Sprintf(`select * from dataexport_order where order_status =0 and  expiration_time<%s and expiration_time>=%s`, starttime, endtime))
+		if data != nil && len(*data) > 0 {
+			for _, v := range *data {
+				//订单编号
+				order_code, _ := v["order_code"].(string)
+				productType := 0 //取消卡券的时候 需要这个参数  商品类型0普通的1线上课程
+				if product_type, _ := v["product_type"].(string); product_type != "中标必听课" {
+					productType = 1
+				}
+				flag := false
+				if qutil.IntAll(v["order_status"]) == 0 && qutil.IntAll(v["is_backstage_order"]) == 0 && qutil.ObjToString(v["pay_way"]) != "transferAccounts" { //未支付状态下 删除订单需要先关闭订单
+					flag = pay.CloseDataExportOrder(qutil.ObjToString(v["pay_way"]), qutil.ObjToString(v["out_trade_no"]), qutil.ObjToString(v["prepay_time"]))
+				}
+				if flag || (!(qutil.IntAll(v["course_status"]) == 2 || qutil.IntAll(v["course_status"]) == 4)) && qutil.ObjToString(v["pay_way"]) == "transferAccounts" && qutil.IntAll(v["is_backstage_order"]) == 0 { //对公转账非审核中 和 转账成功 状态下超时取消订单
+					queryMap := map[string]interface{}{
+						"order_code": order_code,
+					}
+					flag = util.Mysql.Update("dataexport_order", queryMap, map[string]interface{}{"order_status": -2})
+				}
 
-                if !flag {
-                    log.Println("mysql 订单更新失败", order_code)
-                } else {
-                    //解除卡卷绑定
-                    //用户领取卡卷的记录id
-                    userLotteryId, _ := v["d_relation_id"].(string)
-                    if userLotteryId != "" {
-                        //用户id
-                        userId, _ := v["user_id"].(string)
-                        go func(userId, userLotteryId, order_code string) {
-                            if !util.UpdateCouponState(userId, userLotteryId, "", "", order_code, qutil.ObjToString(v["product_type"]), "0", 0, productType) {
-                                log.Println(fmt.Sprintf("单号%s-解绑失败-卡卷%s", order_code, userLotteryId))
-                            }
-                        }(userId, userLotteryId, order_code)
-                    }
-                }
-            }
-        }
-        log.Println("定时任务,更新限时活动订单结束")
-    })
+				if !flag {
+					log.Println("mysql 订单更新失败", order_code)
+				} else {
+					//解除卡卷绑定
+					//用户领取卡卷的记录id
+					userLotteryId, _ := v["d_relation_id"].(string)
+					if userLotteryId != "" {
+						//用户id
+						userId, _ := v["user_id"].(string)
+						go func(userId, userLotteryId, order_code string) {
+							if !util.UpdateCouponState(userId, userLotteryId, "", "", order_code, qutil.ObjToString(v["product_type"]), "0", 0, productType) {
+								log.Println(fmt.Sprintf("单号%s-解绑失败-卡卷%s", order_code, userLotteryId))
+							}
+						}(userId, userLotteryId, order_code)
+					}
+				}
+			}
+		}
+		log.Println("定时任务,更新限时活动订单结束")
+	})
 }
 
-
-
 //
 func crontab(flag bool, c string, f func()) {
-    array := strings.Split(c, ":")
-    if len(array) != 2 {
-        log.Fatalln("定时任务参数错误!", c)
-    }
-    if flag {
-        go f()
-    }
-    now := time.Now()
-    t := time.Date(now.Year(), now.Month(), now.Day(), qutil.IntAll(array[0]), qutil.IntAll(array[1]), 0, 0, time.Local)
-    if t.Before(now) {
-        t = t.AddDate(0, 0, 1)
-    }
-    timer := time.NewTimer(t.Sub(now))
-    for {
-        select {
-        case <-timer.C:
-            go f()
-            timer.Reset(24 * time.Hour)
-        }
-    }
+	array := strings.Split(c, ":")
+	if len(array) != 2 {
+		log.Fatalln("定时任务参数错误!", c)
+	}
+	if flag {
+		go f()
+	}
+	now := time.Now()
+	t := time.Date(now.Year(), now.Month(), now.Day(), qutil.IntAll(array[0]), qutil.IntAll(array[1]), 0, 0, time.Local)
+	if t.Before(now) {
+		t = t.AddDate(0, 0, 1)
+	}
+	timer := time.NewTimer(t.Sub(now))
+	for {
+		select {
+		case <-timer.C:
+			go f()
+			timer.Reset(24 * time.Hour)
+		}
+	}
 }
 
 //
 func crontabByTicker(flag bool, c string, f func()) {
-    if c == "0" {
-        log.Println("定时任务参数有误:", c)
-        return
-    }
-    countdown := 5 * 60
-    if strings.Contains(c, "h") {
-        cStr := strings.Split(c, "h")[0]
-        countdown, _ = strconv.Atoi(cStr)
-        countdown = countdown * 60 * 60
-    } else if strings.Contains(c, "s") {
-        cStr := strings.Split(c, "s")[0]
-        countdown, _ = strconv.Atoi(cStr)
-        countdown = countdown
-    } else {
-        countdown, _ = strconv.Atoi(c)
-        countdown = countdown * 60
-    }
-    if flag {
-        go f()
-    }
-    ticker := time.NewTicker(time.Duration(countdown) * time.Second)
-    go func(t *time.Ticker) {
-        for {
-            select {
-            case <-t.C:
-                go f()
-                fmt.Println("get ticker", time.Now().Format("2006-01-02 15:04:05"))
-            }
-        }
-    }(ticker)
+	if c == "0" {
+		log.Println("定时任务参数有误:", c)
+		return
+	}
+	countdown := 5 * 60
+	if strings.Contains(c, "h") {
+		cStr := strings.Split(c, "h")[0]
+		countdown, _ = strconv.Atoi(cStr)
+		countdown = countdown * 60 * 60
+	} else if strings.Contains(c, "s") {
+		cStr := strings.Split(c, "s")[0]
+		countdown, _ = strconv.Atoi(cStr)
+		countdown = countdown
+	} else {
+		countdown, _ = strconv.Atoi(c)
+		countdown = countdown * 60
+	}
+	if flag {
+		go f()
+	}
+	ticker := time.NewTicker(time.Duration(countdown) * time.Second)
+	go func(t *time.Ticker) {
+		for {
+			select {
+			case <-t.C:
+				go f()
+				fmt.Println("get ticker", time.Now().Format("2006-01-02 15:04:05"))
+			}
+		}
+	}(ticker)
 }

+ 1 - 1
src/jfw/modules/subscribepay/src/util/db.go

@@ -134,7 +134,7 @@ func init() {
 	Formal_WTMCS = p.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 = p.NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_DataReport.Id, MessageConfig.WxTpl_DataReport.First.Value)
 	PaySuccess_WTMCS = p.NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_PaySuccess.Id, MessageConfig.WxTpl_PaySuccess.First.Value)
-	Unpaid_WTMCS = p.NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_Unpaid.Id, MessageConfig.WxTpl_Unpaid.First.Value)
+	Unpaid_WTMCS = p.NewWxTplMsgCustoms(Mysql, MessageConfig.WxTpl_Unpaid.Id, MessageConfig.WxTpl_Unpaid.First.Value, MessageConfig.WxTpl_Unpaid.SoonCloseFirst.Value)
 	Compatible = compatible.NewCompatible(&MQFW, BaseMysql, Mysql, Middleground)
 	//活动 权益码等
 	ActivityMysql = &mysql.Mysql{

+ 8 - 7
src/jfw/modules/subscribepay/src/util/msgremind.go

@@ -15,6 +15,7 @@ import (
 	util "app.yhyue.com/moapp/jybase/common"
 	. "app.yhyue.com/moapp/jybase/date"
 	qrpc "app.yhyue.com/moapp/jybase/rpc"
+	"bp.jydev.jianyu360.cn/BaseService/pushpkg/p"
 	"github.com/shopspring/decimal"
 	"go.mongodb.org/mongo-driver/bson"
 )
@@ -342,12 +343,17 @@ func (m *msgRemind) run() {
 				t = "unknow_unpaid"
 			}
 			if isPushWx == 1 && s_m_openid != "" {
-				wtmc := Unpaid_WTMCS.Get(MessageConfig.WxTpl_Unpaid.First.Value)
+				var wtmc *p.WxTplMsgCustom
+				if remind_status == 2 {
+					wtmc = Unpaid_WTMCS.Get(MessageConfig.WxTpl_Unpaid.SoonCloseFirst.Value)
+				} else {
+					wtmc = Unpaid_WTMCS.Get(MessageConfig.WxTpl_Unpaid.First.Value)
+				}
 				if wtmc != nil {
 					expireTime := unpaidOrder.createTime + m.getExpireTime()
 					tmplData := map[string]*qrpc.TmplItem{
 						"first": &qrpc.TmplItem{
-							Value: strings.ReplaceAll(wtmc.FirstData, "@订单号", unpaidOrder.orderCode),
+							Value: strings.ReplaceAll(strings.ReplaceAll(wtmc.FirstData, "@订单号", unpaidOrder.orderCode), "@剩余时间", fmt.Sprintf("%.0f", math.Ceil(float64(TimeTaskConfig.UnpaidRemind.BeforeExpire)/3600))),
 							Color: MessageConfig.WxTpl_Unpaid.First.Color,
 						},
 						"keyword1": &qrpc.TmplItem{
@@ -363,11 +369,6 @@ func (m *msgRemind) run() {
 							Value: fmt.Sprintf(MessageConfig.WxTpl_Unpaid.Keyword4.Value, FormatDateByInt64(&expireTime, Date_Short_Layout)),
 						},
 					}
-					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,

+ 2 - 2
src/web/staticres/common-module/consult-dialog/js/index.js

@@ -32,10 +32,10 @@ var consultDialog = new Vue({
                   if (res.data) {
                       let customers = res.data.customers
                       customers.forEach(ele => {
-                          if (ele.remark == '客户经理') {
+                          if (ele.vip == false) {
                               this_.img = ele.wxer
 
-                          } else if (ele.remark == '专属客服') {
+                          } else if (ele.vip == true) {
                               this_.vip_img = ele.wxer
 
                           }

+ 1 - 2
src/web/staticres/css/pc.css

@@ -5040,7 +5040,6 @@ h6 {
   line-height: 24px;
   color: #686868;
   cursor: pointer;
-  margin-bottom: 32px;
 }
 
 .login-dig-top-back-box span {
@@ -5290,7 +5289,7 @@ h6 {
 }
 
 .login-dig-footer-box p.passTip{
-  margin-top: 100px;
+	margin-top: 100px;
 }
 
 .guide-intro-dialog{

+ 5 - 3
src/web/staticres/js/superSearch.js

@@ -724,9 +724,11 @@ function getInputTime(){
 		endtime = $.trim(endtime);
     // 处理endtime,endtime取当日23:59:59
     // 将enttime时间戳加1天并减去1秒(单位用s来计算)
-    var day1 = 24 * 60 * 60 * 1
-    var seconds1 = 1
-    endtime = Number(endtime) + day1 - seconds1
+    //var day1 = 24 * 60 * 60
+    //var seconds1 = 1
+    //endtime = Number(endtime) + day1 - seconds1
+    //电脑端保存的刷选 结束时间+1天没问题,因为结束时间是当前0点;移动端保存刷选的结束时间是当前23点59分59秒,再+1天会延长到第二天 23点59分58秒;
+    // 这块放后端处理:搜索的时候默认到当天23点59分59秒;
 	}else{
 		endtime = "";
 	}

+ 0 - 13
src/web/staticres/site/common/css/pc-school-head.css

@@ -676,19 +676,6 @@ white-space: nowrap;
   align-items: center;
   justify-content: space-between;
 }
-.go-register {
-  display: inline-block;
-  color: #2CB7CA;
-  font-size: 14px;
-  line-height: 24px;
-  margin-left: 112px;
-  margin-top: 12px;
-  text-align: center;
-  cursor: pointer;
-}
-.go-register:hover{
-text-decoration: underline;
-}
 #public-nav form{
   display: flex;
   height: 64px;

+ 1 - 1
src/web/staticres/site/page/helpCenter/css/index.css

@@ -223,7 +223,7 @@
 .hot-handel .video-card:nth-child(3n) {
   margin-right: 0;
 }
-.hot-handel .video-card:nth-child(n + 3) {
+.hot-handel .video-card:nth-child(n + 4) {
   margin-top: 20px;
 }
 .hot-handel .video-card-body{

+ 4 - 1
src/web/staticres/site/page/helpCenter/css/summary.css

@@ -202,4 +202,7 @@ summary.active a{
   line-height: 36px;
   color: #1D1D1D;
 }
-details summary::-webkit-details-marker { display:none; }
+details summary::-webkit-details-marker { display:none; }
+strong{
+  font-weight: bold;
+}

+ 0 - 2
src/web/staticres/site/page/industryInfo/css/industry_content.css

@@ -57,8 +57,6 @@
 }
 .industry_info .scroll_main{
   margin-top: 20px;
-  height: 576px;
-  overflow-y: auto;
   overflow-x: hidden;
 }
 .industry_info h2 {

+ 199 - 0
src/web/templates/common/pc-login-dialog.html

@@ -0,0 +1,199 @@
+<!-- 剑鱼pc登录弹窗html接口模板 -->
+<!-- 依赖于pc公共头部样式以及 pc.css、bootstrap.css、bootstrap.js、jquery.js、login.js -->
+<div
+  class="modal fade bidLogin"
+  id="bidLogin"
+  tabindex="-1"
+  role="dialog"
+  aria-labelledby="bidLogin"
+  aria-hidden="true"
+>
+  <div class="modal-dialog login-dig-box is-show" style="max-width: 720px; height: 584px; width: auto; display: flex">
+    <div class="ad_space">
+      <div class="active-tip-group" style="display: none">
+        <img src="" alt="二维码" />
+      </div>
+    </div>
+    <div class="new_login">
+      <div class="login-dig-icon-close" onclick="closeLoginDig()"></div>
+      <img class="logo" src="/images/swordfish/sf_01_new.png" alt="logo" style="display: block" />
+      <div class="bind-phone-head" style="display: none">
+        <h3 class="bind-phone-title">绑定手机号</h3>
+        <p class="bind-phone-tip">为了给您提供更好的服务,请绑定手机号!</p>
+      </div>
+      <div class="login-dig-tabbar-navbar" style="">
+        <span name="code" class="is-active">验证码登录</span>
+        <span name="pass" class="">密码登录</span>
+        <div class="line-box"></div>
+      </div>
+      <!-- <div class="login-dig-tabbar-navbar" data-name="bind-phone" style="display: none;">
+          <span name="phone" class="is-active">手机号绑定</span>
+          <div class="line-box"></div>
+      </div> -->
+      <div class="login-dig-tabbar-content login-module-card sms-login is-active" data-name="code" style="">
+        <div class="login-dig-input-box" data-error="手机号码输入错误">
+          <i class="login-dig-icon-phone"></i>
+          <input autocomplete="off" name="verify_phone" type="tel" placeholder="输入手机号码" maxlength="11" />
+        </div>
+        <div class="login-dig-input-box" data-error="图形验证码输入错误">
+          <i class="login-dig-icon-guard"></i>
+          <input autocomplete="off" name="verify_code" type="text" placeholder="输入图形验证码" maxlength="4" />
+          <div class="after-input-box">
+            <img data-name="verfiy-login" class="verify-img" src="/front/landpage/captcha" alt="verify" />
+          </div>
+        </div>
+        <div class="login-dig-input-box" data-error="短信验证码输入错误">
+          <i class="login-dig-icon-guard"></i>
+          <input
+            autocomplete="off"
+            name="verify_sms"
+            class="enter-action-login"
+            type="text"
+            placeholder="输入短信验证码"
+            maxlength="6"
+          />
+          <div class="after-input-box">
+            <span data-name="verify_get_sms" class="l-get-sms is-stop">获取验证码</span>
+          </div>
+        </div>
+        <button class="login-dig-submit-button" name="verify_submit" disabled="true">登录</button>
+        <div class="footer-action-container">
+          <div class="auto-login-container no-selected">
+            <div class="auto-login-checkbox"></div>
+            <label for="autoLogin">下次自动登录</label>
+            <div class="icon-tip-container">
+              <div class="icon-tip"></div>
+              <div class="j-tooltip" style="display: none">为了确保你的信息安全,不建议在公共设备上勾选此项。</div>
+            </div>
+          </div>
+          <!-- <a class="go-register" href="/phone/register" >立即注册</a> -->
+          <div class="go-register" onclick="openLoginDigForReg(true)">立即注册</div>
+        </div>
+      </div>
+      <div class="login-dig-tabbar-content login-module-card password-login" data-name="pass">
+        <div class="login-dig-input-box" data-error="手机号码输入错误">
+          <i class="login-dig-icon-phone"></i>
+          <input
+            autocomplete="off"
+            class="enter-action-login"
+            name="pass_phone"
+            type="tel"
+            placeholder="输入手机号码"
+            maxlength="11"
+          />
+        </div>
+        <div class="login-dig-input-box" data-error="密码输入错误">
+          <i class="login-dig-icon-pass"></i>
+          <input
+            autocomplete="off"
+            class="enter-action-login"
+            name="pass_pass"
+            type="password"
+            placeholder="输入密码"
+          />
+        </div>
+        <button class="login-dig-submit-button" name="pass_submit" disabled="true">登录</button>
+        <div class="footer-action-container f-box right-box">
+          <div class="auto-login-container no-selected">
+            <div class="auto-login-checkbox"></div>
+            <label for="autoLogin">下次自动登录</label>
+            <div class="icon-tip-container">
+              <div class="icon-tip"></div>
+              <div class="j-tooltip" style="display: none">为了确保你的信息安全,不建议在公共设备上勾选此项。</div>
+            </div>
+          </div>
+          <div class="login-right-actions">
+            <div class="forget-pass-link" onclick="openLoginDigForReg(true)">立即注册</div>
+            <span class="login-splitter"></span>
+            <a class="forget-pass-link" href="/phone/forgetPwd">忘记密码?</a>
+            <!-- <a class="forget-pass-link" style="color: #2ABED1!important;" href="/phone/register">立即注册</a> -->
+          </div>
+        </div>
+      </div>
+      <div class="login-dig-wx-qrcode-box login-module-card wx-qr-login" style="display: none">
+        <div class="wx-tip">
+          <div class="wx-logo"><i class="login-dig-icon-wx"></i></div>
+          <span>微信扫码登录</span>
+        </div>
+        <!-- <img class="wx-qrcode" src="/images/swordfish/sf_01_new.png" alt="logo" style="display: block;"> -->
+        <img class="wx-qrcode" id="layerImg-login" src="/front/share/10" />
+        <div class="footer-action-container">
+          <div class="auto-login-container no-selected">
+            <div class="auto-login-checkbox"></div>
+            <label for="autoLogin">下次自动登录</label>
+            <div class="icon-tip-container">
+              <div class="icon-tip"></div>
+              <div class="j-tooltip" style="display: none">为了确保你的信息安全,不建议在公共设备上勾选此项。</div>
+            </div>
+          </div>
+        </div>
+        <div class="login-dig-top-back-box" style="display: none" onclick="openLoginDigForWx(false)">
+          <i class="login-dig-icon-blue-back"></i>
+          <span>验证码/密码登录</span>
+        </div>
+      </div>
+      <div class="login-dig-reg register-form-box" style="display: none">
+        <div class="login-dig-input-box" data-error="手机号码输入错误">
+          <i class="login-dig-icon-phone"></i>
+          <input autocomplete="off" name="register_phone" type="tel" placeholder="输入手机号码" maxlength="11" />
+        </div>
+        <div class="login-dig-input-box" data-error="图形验证码输入错误">
+          <i class="login-dig-icon-guard"></i>
+          <input autocomplete="off" name="register_code" type="text" placeholder="输入图形验证码" maxlength="4" />
+          <div class="after-input-box">
+            <img data-name="verfiy-login" class="verify-img" src="/front/landpage/captcha" alt="verify" />
+          </div>
+        </div>
+        <div class="login-dig-input-box" data-error="短信验证码输入错误">
+          <i class="login-dig-icon-guard"></i>
+          <input autocomplete="off" name="register_sms" type="text" placeholder="输入短信验证码" maxlength="6" />
+          <div class="after-input-box">
+            <span data-name="register_get_sms" class="l-get-sms is-stop">获取验证码</span>
+          </div>
+        </div>
+        <div class="login-dig-input-box" data-error="公司名称最少4个字">
+          <i class="login-dig-icon-ent"></i>
+          <input maxlength="30" autocomplete="off" name="verify_entname" type="text" placeholder="输入公司名称" />
+          <div class="autocomplete-box">
+            <ul>
+              <li>xxxxxx</li>
+            </ul>
+          </div>
+        </div>
+        <div class="login-dig-input-box" data-error="邮箱输入错误">
+          <i class="login-dig-icon-email"></i>
+          <input autocomplete="off" class="register_email" type="text" placeholder="输入电子邮箱" />
+        </div>
+        <!-- <div class="login-dig-input-box" data-error="邮箱输入错误">
+          <i class="login-dig-icon-email"></i>
+          <input autocomplete="off" name="register_email" type="text" placeholder="输入电子邮箱">
+        </div> -->
+        <div class="ad_small_space">
+          <img src="{{Msg "seo" "cdn"}}/images/pc/register_email.png?v={{Msg "seo" "version"}}" alt="">
+        </div>
+        <button class="login-dig-submit-button reg-dig-submit-button" name="register_submit_phone" disabled="true">
+          立即注册
+        </button>
+        <!-- <button class="reg-dig-submit-button" name="verify_register" disabled="true">立即注册</button> -->
+        <div class="back-login" onclick="backLogin(false)">
+          <i class="login-dig-icon-blue-back"></i>
+          <span>登录</span>
+        </div>
+      </div>
+      <!-- <div class="login-dig-footer-box" data-name="bind-phone" name="tip-bind-phone" style="display: none;">
+          <p>为了确保您账号的安全性与唯一性,在您购买剑鱼标讯任意功能前,请先绑定手机号,以便后期维护。</p>
+      </div> -->
+      <div class="login-dig-footer-box">
+        <div class="login-dig-text-split" style=""><i></i><span>使用微信扫码登录</span><i></i></div>
+        <div class="wx-logo-box" onclick="openLoginDigForWx(true)" style="">
+          <div class="wx-logo"><i class="login-dig-icon-wx"></i></div>
+        </div>
+        <p>
+          未注册用户验证后自动注册,注册即代表同意
+          <a href="/front/staticPage/permission_rules.html">《剑鱼标讯用户使用许可协议》</a>
+          <a href="/front/staticPage/privacy_rules.html">《剑鱼标讯隐私政策》</a>
+        </p>
+      </div>
+    </div>
+  </div>
+</div>

+ 3 - 171
src/web/templates/common/pchead.html

@@ -90,177 +90,9 @@
     </div>
 </section>
 
-<div class="modal fade bidLogin" id="bidLogin" tabindex="-1" role="dialog" aria-labelledby="bidLogin"
-  aria-hidden="true">
-  <div class="modal-dialog login-dig-box is-show" style="max-width:720px;height:584px;width: auto;display: flex;">
-    <div class="ad_space">
-      <div class="active-tip-group" style="display: none;">
-        <img src="" alt="二维码">
-      </div>
-    </div>
-    <div class="new_login">
-      <div class="login-dig-icon-close" onclick="closeLoginDig()"></div>
-      <img class="logo" src="/images/swordfish/sf_01_new.png" alt="logo" style="display: block;">
-      <div class="bind-phone-head" style="display: none;">
-          <h3 class="bind-phone-title">绑定手机号</h3>
-          <p class="bind-phone-tip">为了给您提供更好的服务,请绑定手机号!</p>
-      </div>
-      <div class="login-dig-tabbar-navbar" style="">
-          <span name="code" class="is-active">验证码登录</span>
-          <span name="pass" class="">密码登录</span>
-          <div class="line-box"></div>
-      </div>
-      <!-- <div class="login-dig-tabbar-navbar" data-name="bind-phone" style="display: none;">
-          <span name="phone" class="is-active">手机号绑定</span>
-          <div class="line-box"></div>
-      </div> -->
-      <div class="login-dig-tabbar-content login-module-card sms-login is-active" data-name="code" style="">
-          <div class="login-dig-input-box" data-error="手机号码输入错误">
-              <i class="login-dig-icon-phone"></i>
-              <input autocomplete="off" name="verify_phone" type="tel" placeholder="输入手机号码" maxlength="11">
-          </div>
-          <div class="login-dig-input-box" data-error="图形验证码输入错误">
-              <i class="login-dig-icon-guard"></i>
-              <input autocomplete="off" name="verify_code" type="text" placeholder="输入图形验证码" maxlength="4">
-              <div class="after-input-box">
-                  <img data-name="verfiy-login" class="verify-img" src="/front/landpage/captcha" alt="verify">
-              </div>
-          </div>
-          <div class="login-dig-input-box" data-error="短信验证码输入错误">
-              <i class="login-dig-icon-guard"></i>
-              <input autocomplete="off" name="verify_sms" class="enter-action-login" type="text" placeholder="输入短信验证码" maxlength="6">
-              <div class="after-input-box">
-                  <span data-name="verify_get_sms" class="l-get-sms is-stop">获取验证码</span>
-              </div>
-          </div>
-          <button class="login-dig-submit-button" name="verify_submit" disabled="true">登录</button>
-          <div class="footer-action-container">
-            <div class="auto-login-container no-selected">
-              <div class="auto-login-checkbox"></div>
-              <label for="autoLogin">下次自动登录</label>
-              <div class="icon-tip-container">
-                <div class="icon-tip"></div>
-                <div class="j-tooltip" style="display: none">为了确保你的信息安全,不建议在公共设备上勾选此项。</div>
-              </div>
-            </div>
-            <!-- <a class="go-register" href="/phone/register" >立即注册</a> -->
-            <div class="go-register" onclick="openLoginDigForReg(true)" >立即注册</div>
-          </div>
-      </div>
-      <div class="login-dig-tabbar-content login-module-card password-login" data-name="pass">
-          <div class="login-dig-input-box" data-error="手机号码输入错误">
-              <i class="login-dig-icon-phone"></i>
-              <input autocomplete="off" class="enter-action-login" name="pass_phone" type="tel" placeholder="输入手机号码" maxlength="11">
-          </div>
-          <div class="login-dig-input-box" data-error="密码输入错误">
-              <i class="login-dig-icon-pass"></i>
-              <input autocomplete="off" class="enter-action-login" name="pass_pass" type="password" placeholder="输入密码">
-          </div>
-          <button class="login-dig-submit-button" name="pass_submit" disabled="true">登录</button>
-          <div class="footer-action-container f-box right-box">
-            <div class="auto-login-container no-selected">
-              <div class="auto-login-checkbox"></div>
-              <label for="autoLogin">下次自动登录</label>
-              <div class="icon-tip-container">
-                <div class="icon-tip"></div>
-                <div class="j-tooltip" style="display: none">为了确保你的信息安全,不建议在公共设备上勾选此项。</div>
-              </div>
-            </div>
-            <div class="login-right-actions">
-              <div class="forget-pass-link" onclick="openLoginDigForReg(true)">立即注册</div>
-              <span class="login-splitter"></span>
-              <a class="forget-pass-link" href="/phone/forgetPwd">忘记密码?</a>
-              <!-- <a class="forget-pass-link" style="color: #2ABED1!important;" href="/phone/register">立即注册</a> -->
-            </div>
-          </div>
-      </div>
-      <div class="login-dig-wx-qrcode-box login-module-card wx-qr-login" style="display: none;">
-        <div class="wx-tip">
-          <div class="wx-logo"><i class="login-dig-icon-wx"></i></div>
-          <span>微信扫码登录</span>
-        </div>
-        <!-- <img class="wx-qrcode" src="/images/swordfish/sf_01_new.png" alt="logo" style="display: block;"> -->
-        <img class="wx-qrcode" id="layerImg-login" src="/front/share/10" />
-        <div class="footer-action-container">
-          <div class="auto-login-container no-selected">
-            <div class="auto-login-checkbox"></div>
-            <label for="autoLogin">下次自动登录</label>
-            <div class="icon-tip-container">
-              <div class="icon-tip"></div>
-              <div class="j-tooltip" style="display: none">为了确保你的信息安全,不建议在公共设备上勾选此项。</div>
-            </div>
-          </div>
-        </div>
-        <div class="login-dig-top-back-box" style="display: none;" onclick="openLoginDigForWx(false)">
-          <i class="login-dig-icon-blue-back"></i>
-          <span>验证码/密码登录</span>
-        </div>
-      </div>
-      <div class="login-dig-reg register-form-box" style="display: none;">
-        <div class="login-dig-input-box" data-error="手机号码输入错误">
-          <i class="login-dig-icon-phone"></i>
-          <input autocomplete="off" name="register_phone" type="tel" placeholder="输入手机号码" maxlength="11">
-        </div>
-        <div class="login-dig-input-box" data-error="图形验证码输入错误">
-            <i class="login-dig-icon-guard"></i>
-            <input autocomplete="off" name="register_code" type="text" placeholder="输入图形验证码" maxlength="4">
-            <div class="after-input-box">
-                <img data-name="verfiy-login" class="verify-img" src="/front/landpage/captcha" alt="verify">
-            </div>
-        </div>
-        <div class="login-dig-input-box" data-error="短信验证码输入错误">
-            <i class="login-dig-icon-guard"></i>
-            <input autocomplete="off" name="register_sms" type="text" placeholder="输入短信验证码" maxlength="6">
-            <div class="after-input-box">
-                <span data-name="register_get_sms" class="l-get-sms is-stop">获取验证码</span>
-            </div>
-        </div>
-        <div class="login-dig-input-box" data-error="公司名称最少4个字">
-          <i class="login-dig-icon-ent"></i>
-          <input maxlength="30" autocomplete="off" name="verify_entname" type="text" placeholder="输入公司名称">
-          <div class="autocomplete-box">
-            <ul>
-              <li>xxxxxx</li>
-            </ul>
-          </div>
-        </div>
-        <div class="login-dig-input-box" data-error="邮箱输入错误">
-          <i class="login-dig-icon-email"></i>
-          <input autocomplete="off" class="register_email" type="text" placeholder="输入电子邮箱">
-        </div>
-        <!-- <div class="login-dig-input-box" data-error="邮箱输入错误">
-          <i class="login-dig-icon-email"></i>
-          <input autocomplete="off" name="register_email" type="text" placeholder="输入电子邮箱">
-        </div> -->
-        <div class="ad_small_space">
-          <img src="{{Msg "seo" "cdn"}}/images/pc/register_email.png?v={{Msg "seo" "version"}}" alt="">
-        </div>
-        <button class="login-dig-submit-button reg-dig-submit-button" name="register_submit_phone" disabled="true">立即注册</button>
-        <!-- <button class="reg-dig-submit-button" name="verify_register" disabled="true">立即注册</button> -->
-        <div class="back-login" onclick="backLogin(false)">
-          <i class="login-dig-icon-blue-back"></i>
-          <span>登录</span>
-        </div>
-    </div>
-      <!-- <div class="login-dig-footer-box" data-name="bind-phone" name="tip-bind-phone" style="display: none;">
-          <p>为了确保您账号的安全性与唯一性,在您购买剑鱼标讯任意功能前,请先绑定手机号,以便后期维护。</p>
-      </div> -->
-      <div class="login-dig-footer-box">
-          <div class="login-dig-text-split" style="">
-              <i></i><span>使用微信扫码登录</span><i></i>
-          </div>
-          <div class="wx-logo-box" onclick="openLoginDigForWx(true)" style="">
-              <div class="wx-logo"><i class="login-dig-icon-wx"></i></div>
-          </div>
-          <p>
-              未注册用户验证后自动注册,注册即代表同意
-              <a href="/front/staticPage/permission_rules.html">《剑鱼标讯用户使用许可协议》</a>
-              <a href="/front/staticPage/privacy_rules.html">《剑鱼标讯隐私政策》</a>
-          </p>
-      </div>
-    </div>
-  </div>
-</div>
+<!-- pc登录弹窗html结构 -->
+{{include "/common/pc-login-dialog.html"}}
+
 <script src='{{Msg "seo" "cdn"}}/js/dateFunc.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/message.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/public-pc/js/header-nav.js?v={{Msg "seo" "version"}}'></script>

+ 1 - 1
src/web/templates/dataMarket/index.html

@@ -5,7 +5,7 @@
   <meta name="viewport"
         content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
-  <title>数据市场_剑鱼标讯,专业招标大数据服务平台</title>
+  <title>数据市场-剑鱼标讯</title>
   <meta name="Keywords" content="招标数据,中标数据,采购数据,结构化数据"/>
   <meta name="Description" content="剑鱼标讯提供完整的结构化数据导出和定制化合作,提供招标信息相关的项目名称、项目编号、项目范围等多达30个字段,帮助企业通过数据分析市场、获取商机、辅助企业战略决策。。"/>
   <meta content="数据市场" theme="light" name="enable-header"/>

+ 1 - 1
src/web/templates/frontRouter/pc/share/sess/index.html

@@ -24,7 +24,7 @@
         name="format-detection"
     />
     <meta
-        content="剑鱼文库"
+        content=""
         theme="light"
         name="enable-header"
     />

+ 1 - 1
src/web/templates/frontRouter/pc/solution/free/index.html

@@ -1,7 +1,7 @@
 <html>
 <head>
   <meta charset="UTF-8">
-  <title>解决方案_剑鱼标讯,专业招标大数据服务平台</title>
+  <title>解决方案-剑鱼标讯</title>
   <meta name="Keywords" content="招标数据,中标数据,采购数据,结构化数据"/>
   <meta name="Description" content="剑鱼标讯提供完整的结构化数据导出和定制化合作,提供招标信息相关的项目名称、项目编号、项目范围等多达30个字段,帮助企业通过数据分析市场、获取商机、辅助企业战略决策。。"/>
   <meta content="电信行业解决方案" theme="light" name="enable-header"/>

+ 1 - 1
src/web/templates/pc/jyblogdetail.html

@@ -187,7 +187,7 @@ $(function(){
 	//
 	$(".jyb_ddetail img").each(function(){
 		var imgsrc = $(this).attr("src");
-		if(imgsrc.indexOf("://") < 0){
+		if(!(imgsrc.indexOf("http") ===0 || imgsrc.indexOf("data:image/png;base64,")===0)){
 			$(this).attr("src",{{Msg "seo" "jyadd"}}+imgsrc)
 		}
 	})

+ 3 - 127
src/web/templates/site/common/pc-school-head.html

@@ -65,133 +65,9 @@
   </div>
 </section>
 
-<div class="modal fade bidLogin" id="bidLogin" tabindex="-1" role="dialog" aria-labelledby="bidLogin"
-  aria-hidden="true">
-  <div class="modal-dialog login-dig-box is-show" style="max-width:720px;height:584px;width: auto;display: flex;">
-    <div class="ad_space">
-      <div class="active-tip-group" style="display: none;">
-        <img src="" alt="二维码">
-      </div>
-    </div>
-    <div class="new_login">
-      <div class="login-dig-icon-close" onclick="closeLoginDig()"></div>
-      <img class="logo" src="/images/swordfish/sf_01_new.png" alt="logo" style="display: block;">
-      <div class="bind-phone-head" style="display: none;">
-        <h3 class="bind-phone-title">绑定手机号</h3>
-        <p class="bind-phone-tip">为了给您提供更好的服务,请绑定手机号!</p>
-      </div>
-      <div class="login-dig-tabbar-navbar" style="">
-        <span name="code" class="is-active">验证码登录</span>
-        <span name="pass" class="">密码登录</span>
-        <div class="line-box"></div>
-      </div>
-      <div class="login-dig-tabbar-content is-active" data-name="code" style="">
-        <div class="login-dig-input-box" data-error="手机号码输入错误">
-          <i class="login-dig-icon-phone"></i>
-          <input autocomplete="off" name="verify_phone" type="tel" placeholder="输入手机号码" maxlength="11">
-        </div>
-        <div class="login-dig-input-box" data-error="图形验证码输入错误">
-          <i class="login-dig-icon-guard"></i>
-          <input autocomplete="off" name="verify_code" type="text" placeholder="输入图形验证码" maxlength="4">
-          <div class="after-input-box">
-            <img data-name="verfiy-login" class="verify-img" src="/front/landpage/captcha" alt="verify">
-          </div>
-        </div>
-        <div class="login-dig-input-box" data-error="短信验证码输入错误">
-          <i class="login-dig-icon-guard"></i>
-          <input autocomplete="off" name="verify_sms" type="text" placeholder="输入短信验证码" maxlength="6">
-          <div class="after-input-box">
-            <span data-name="verify_get_sms" class="l-get-sms is-stop">获取验证码</span>
-          </div>
-        </div>
-        <button class="login-dig-submit-button" name="verify_submit" disabled="true">登录</button>
-        <div class="go-register" onclick="openLoginDigForReg(true)">立即注册</div>
-      </div>
-      <div class="login-dig-tabbar-content" data-name="pass">
-        <div class="login-dig-input-box" data-error="手机号码输入错误">
-          <i class="login-dig-icon-phone"></i>
-          <input autocomplete="off" name="pass_phone" type="tel" placeholder="输入手机号码" maxlength="11">
-        </div>
-        <div class="login-dig-input-box" data-error="密码输入错误">
-          <i class="login-dig-icon-pass"></i>
-          <input autocomplete="off" name="pass_pass" type="password" placeholder="输入密码">
-        </div>
-        <button class="login-dig-submit-button" name="pass_submit" disabled="true">登录</button>
-        <div class="f-box right-box">
-          <a class="forget-pass-link" href="/phone/forgetPwd">忘记密码?</a>
-          <div style="color: #2ABED1!important;" class="forget-pass-link" onclick="openLoginDigForReg(true)">立即注册</div>
-        </div>
-      </div>
-      <div class="login-dig-wx-qrcode-box" style="display: none;">
-        <div class="wx-tip">
-          <div class="wx-logo"><i class="login-dig-icon-wx"></i></div>
-          <span>微信扫码登录</span>
-        </div>
-        <!-- <img class="wx-qrcode" src="/images/swordfish/sf_01_new.png" alt="logo" style="display: block;"> -->
-        <img class="wx-qrcode" id="layerImg-login" src="/front/share/10" />
-        <div class="login-dig-top-back-box" style="display: none;" onclick="openLoginDigForWx(false)">
-          <i class="login-dig-icon-blue-back"></i>
-          <span>验证码/密码登录</span>
-        </div>
-      </div>
-      <div class="login-dig-reg register-form-box" style="display: none;">
-        <div class="login-dig-input-box" data-error="手机号码输入错误">
-          <i class="login-dig-icon-phone"></i>
-          <input autocomplete="off" name="register_phone" type="tel" placeholder="输入手机号码" maxlength="11">
-        </div>
-        <div class="login-dig-input-box" data-error="图形验证码输入错误">
-          <i class="login-dig-icon-guard"></i>
-          <input autocomplete="off" name="register_code" type="text" placeholder="输入图形验证码" maxlength="4">
-          <div class="after-input-box">
-            <img data-name="verfiy-login" class="verify-img" src="/front/landpage/captcha" alt="verify">
-          </div>
-        </div>
-        <div class="login-dig-input-box" data-error="短信验证码输入错误">
-          <i class="login-dig-icon-guard"></i>
-          <input autocomplete="off" name="register_sms" type="text" placeholder="输入短信验证码" maxlength="6">
-          <div class="after-input-box">
-            <span data-name="register_get_sms" class="l-get-sms is-stop">获取验证码</span>
-          </div>
-        </div>
-        <div class="login-dig-input-box" data-error="公司名称最少4个字">
-          <i class="login-dig-icon-ent"></i>
-          <input maxlength="30" autocomplete="off" name="verify_entname" type="text" placeholder="输入公司名称">
-          <div class="autocomplete-box">
-            <ul>
-              <li></li>
-            </ul>
-          </div>
-        </div>
-        <div class="login-dig-input-box" data-error="邮箱输入错误">
-          <i class="login-dig-icon-email"></i>
-          <input autocomplete="off" class="register_email" type="text" placeholder="输入电子邮箱">
-        </div>
-        <div class="ad_small_space">
-          <img src='{{Msg "seo" "cdn"}}/images/pc/register_email.png?v={{Msg "seo" "version"}}' alt="">
-        </div>
-        <button class="login-dig-submit-button reg-dig-submit-button" name="register_submit_phone"
-          disabled="true">立即注册</button>
-        <div class="back-login" onclick="backLogin(false)">
-          <i class="login-dig-icon-blue-back"></i>
-          <span>登录</span>
-        </div>
-      </div>
-      <div class="login-dig-footer-box">
-        <div class="login-dig-text-split" style="">
-          <i></i><span>使用微信扫码登录</span><i></i>
-        </div>
-        <div class="wx-logo-box" onclick="openLoginDigForWx(true)" style="">
-          <div class="wx-logo"><i class="login-dig-icon-wx"></i></div>
-        </div>
-        <p>
-          未注册用户验证后自动注册,注册即代表同意
-          <a href="/front/staticPage/permission_rules.html">《剑鱼标讯用户使用许可协议》</a>
-          <a href="/front/staticPage/privacy_rules.html">《剑鱼标讯隐私政策》</a>
-        </p>
-      </div>
-    </div>
-  </div>
-</div>
+<!-- pc登录弹窗html结构 -->
+{{include "/common/pc-login-dialog.html"}}
+
 <script src='{{Msg "seo" "cdn"}}/js/dateFunc.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/js/message.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/site/common/js/pc-school-head.js?v={{Msg "seo" "version"}}'></script>

+ 1 - 1
src/web/templates/site/page/helpCenter/detail.html

@@ -46,7 +46,7 @@
 
     $(".s-content img").each(function(){
       var imgsrc = $(this).attr("src");
-      if(imgsrc.indexOf("://") < 0){
+      if(!(imgsrc.indexOf("http") ===0 || imgsrc.indexOf("data:image/png;base64,")===0)){
         $(this).attr("src",{{Msg "seo" "jyadd"}}+imgsrc)
       }
     })

+ 3 - 3
src/web/templates/site/page/helpCenter/index.html

@@ -2,7 +2,7 @@
 <html lang="zh">
   <head>
   <meta charset="UTF-8" />
-  <title>帮助中心</title>
+  <title>帮助中心-剑鱼标讯</title>
   <meta name="Keywords" content='{{Msg "seo" "qfw.swordfish.key"}}'/>
   <meta name="Description" content='{{Msg "seo" "qfw.swordfish.description"}}'/>
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
@@ -31,7 +31,7 @@
               <div class="card">
                 <div class="card-body">
                   <div class="list-title">
-                    <img src='{{Msg "seo" "cdn"}}/site/page/helpCenter/image/{{$v.Code}}.png?v={{Msg "seo" "version"}}' alt="{{$v.Name}}">
+                    <img src='/site/page/helpCenter/image/{{$v.Code}}.png?v={{Msg "seo" "version"}}' alt="{{$v.Name}}">
                     <h4>{{$v.Name}}</h4>
                   </div>
                   <div class="list-middle">
@@ -131,7 +131,7 @@
       $(".hot-container img.v-thumbnail").each(function(){
         var imgsrc = $(this).attr("src");
         console.log("xx",imgsrc)
-        if(imgsrc.indexOf("://") < 0){
+        if(!(imgsrc.indexOf("http") ===0 || imgsrc.indexOf("data:image/png;base64,")===0)){
           $(this).attr("src",{{Msg "seo" "jyadd"}}+imgsrc)
         }
       })

+ 35 - 24
src/web/templates/site/page/industryInfo/class.html

@@ -2,9 +2,17 @@
 <html lang="zh">
 <head>
   <meta charset="UTF-8" />
-  <title>行业资讯</title>
-  <meta name="Keywords" content='{{Msg "seo" "qfw.swordfish.key"}}'/>
-  <meta name="Description" content='{{Msg "seo" "qfw.swordfish.description"}}'/>
+  {{if .T.nav}}
+    {{range $k,$v:= .T.nav}}
+      {{if eq (len $.T.nav) (Add $k 1)}}
+          <title>{{$v.Name}}-剑鱼标讯</title>
+      {{end}}
+    {{end}}
+  {{else}}
+    <title>剑鱼标讯</title>
+  {{end}}
+  <meta name="Keywords" content=''/>
+  <meta name="Description" content=''/>
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
   <meta name="format-detection" content="tephone=no" />
   <meta content="行业资讯" theme="light" name="enable-header"/>
@@ -25,10 +33,10 @@
   <div class="page-school-main w1200">
     <!--    导航-->
     <div class="school-bread">
+      {{if .T.nav}}
       <div class="bread-crumb" id="bread-crumb">
-        {{$lenNav := len .T.nav}}
         {{range $k,$v:= .T.nav}}
-          {{if ne $lenNav (Add $k 1)}}
+          {{if ne (len $.T.nav) (Add $k 1)}}
             <a href="{{$v.Href}}">{{$v.Name}}</a>
             <span>></span>
           {{else}}
@@ -36,11 +44,12 @@
           {{end}}
         {{end}}
       </div>
+      {{end}}
     </div>
     <!--    广告位-->
     {{range $k,$v:=Ad "jy-pc-school-top" -1 .Host}}
     <div class="school-in-header">
-      <img src="{{Msg "seo" "cdn"}}{{$v.S_pic}}" alt="">
+      <img src="{{$v.S_pic}}" alt="">
     </div>
     {{end}}
     <div class="school_tabs">
@@ -54,28 +63,30 @@
       </div>
       <div class="school_tabs_content" label="建筑工程" name="建筑工程">
         <article>
-          {{range $k,$v := .T.list}}
-          <div class="art_list">
-            <div class="art_l_left">
-              <div class="art_l_l_title ellipsis" onclick="window.location.href='/jySite/{{$v._id}}.html'">
-                {{$v.s_title}}
-              </div>
-              <div class="art_l_l_content">
-                {{$v.s_description}}
+          {{if .T.list}}
+            {{range $k,$v := .T.list}}
+            <div class="art_list">
+              <div class="art_l_left">
+                <div class="art_l_l_title ellipsis" onclick="window.location.href='/jySite/{{$v._id}}.html'">
+                  {{$v.s_title}}
+                </div>
+                <div class="art_l_l_content">
+                  {{$v.s_description}}
+                </div>
+                <div class="art_l_l_data">
+                  <span class="data_date">{{ Replace $v.time "-" "." -1}}</span>
+                  <span class="viewnum">{{$v.i_viewnum}}<span class="viewnum_normal">次浏览</span></span>
+                </div>
               </div>
-              <div class="art_l_l_data">
-                <span class="data_date">{{ Replace $v.time "-" "." -1}}</span>
-                <span class="viewnum">{{$v.i_viewnum}}<span class="viewnum_normal">次浏览</span></span>
+              {{if ne $v.s_pic1 ""}}
+              <div class="art_l_right">
+                <img src="{{$v.s_pic1}}" alt="{{$v.s_title}}">
               </div>
-            </div>
-            {{if ne $v.s_pic1 ""}}
-            <div class="art_l_right">
-              <img src="{{$v.s_pic1}}" alt="{{$v.s_title}}">
+              {{end}}
             </div>
             {{end}}
-          </div>
+            {{include "/common/seo-pagination.html"}}
           {{end}}
-          {{include "/common/seo-pagination.html"}}
         </article>
         <aside>
           <div class="real_time_info_module swiper_module">
@@ -111,7 +122,7 @@
                 <div class="module_c_l_left">
                   <img src="{{$v.previewImgId}}" alt="">
                   <!-- 文件类型 -->
-                  <img class="subscript" src='{{Msg "seo" "cdn"}}/site/page/jySchool/image/{{$v.docFileType}}@2x.png?v={{Msg "seo" "version"}}' alt="">
+                  <img class="subscript" src='/site/page/jySchool/image/{{$v.docFileType}}@2x.png?v={{Msg "seo" "version"}}' alt="">
                 </div>
                 <div class="module_c_l_right">
                   <div class="m_c_l_r_title ellipsis-2" onclick="window.location.href='/swordfish/docs/content/{{$v.docId}}'">{{$v.docName}}</div>

+ 2 - 2
src/web/templates/site/page/industryInfo/index.html

@@ -2,7 +2,7 @@
 <html lang="zh">
   <head>
   <meta charset="UTF-8" />
-  <title>行业资讯</title>
+  <title>行业资讯-剑鱼标讯</title>
   <meta name="Keywords" content='{{Msg "seo" "qfw.swordfish.key"}}'/>
   <meta name="Description" content='{{Msg "seo" "qfw.swordfish.description"}}'/>
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
@@ -55,7 +55,7 @@
 
         {{range $k,$v:=Ad "jy-pc-school-top" -1 .Host}}
         <div class="school-in-header">
-          <img src="{{Msg "seo" "cdn"}}{{$v.S_pic}}" alt="">
+          <img src="{{$v.S_pic}}" alt="">
         </div>
         {{end}}
 

+ 42 - 32
src/web/templates/site/page/jySchool/class.html

@@ -2,9 +2,17 @@
 <html lang="zh">
   <head>
   <meta charset="UTF-8" />
-  <title>招投标攻略</title>
-  <meta name="Keywords" content='{{Msg "seo" "qfw.swordfish.key"}}'/>
-  <meta name="Description" content='{{Msg "seo" "qfw.swordfish.description"}}'/>
+  {{if .T.nav}}
+    {{range $k,$v:= .T.nav}}
+      {{if eq (len $.T.nav) (Add $k 1)}}
+      <title>{{$v.Name}}-剑鱼标讯</title>
+      {{end}}
+    {{end}}
+  {{else}}
+    <title>剑鱼标讯</title>
+  {{end}}
+  <meta name="Keywords" content=''/>
+  <meta name="Description" content=''/>
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
   <meta name="format-detection" content="tephone=no" />
   <meta content="招投标攻略" theme="light" name="enable-header"/>
@@ -20,25 +28,25 @@
   </head>
 	<body>
     {{include "/site/common/pc-school-head.html"}}
-
 		<section class="page-school-introduct-detail">
       <div class="page-school-main w1200">
         <div class="school-bread">
-          <div class="bread-crumb" id="bread-crumb">
-            {{$lenNav := len .T.nav}}
-            {{range $k,$v:= .T.nav}}
-              {{if ne $lenNav (Add $k 1)}}
-              <a href="{{$v.Href}}">{{$v.Name}}</a>
-              <span>></span>
-              {{else}}
-              <a href="{{$v.Href}}">{{$v.Name}}</a>
+          {{if .T.nav}}
+            <div class="bread-crumb" id="bread-crumb">
+              {{range $k,$v:= .T.nav}}
+                {{if ne (len $.T.nav) (Add $k 1)}}
+                <a href="{{$v.Href}}">{{$v.Name}}</a>
+                <span>></span>
+                {{else}}
+                <a href="{{$v.Href}}">{{$v.Name}}</a>
+                {{end}}
               {{end}}
-            {{end}}
-          </div>
+            </div>
+          {{end}}
         </div>
         {{range $k,$v:=Ad "jy-pc-school-top" -1 .Host}}
         <div class="school-in-header">
-          <img src="{{Msg "seo" "cdn"}}{{$v.S_pic}}" alt="">
+          <img src="{{$v.S_pic}}" alt="">
         </div>
         {{end}}
         <div class="school_tabs">
@@ -52,28 +60,30 @@
           </div>
           <div class="school_tabs_content" label="招标采购" name="招标采购">
             <article>
-              {{range $k,$v := .T.list}}
-              <div class="art_list">
-                <div class="art_l_left">
-                  <div class="art_l_l_title ellipsis" onclick="window.location.href='/jySite/{{$v._id}}.html'">
-                    {{$v.s_title}}
+              {{if .T.list}}
+                {{range $k,$v := .T.list}}
+                <div class="art_list">
+                  <div class="art_l_left">
+                    <div class="art_l_l_title ellipsis" onclick="window.location.href='/jySite/{{$v._id}}.html'">
+                      {{$v.s_title}}
+                    </div>
+                    <div class="art_l_l_content">
+                      {{$v.s_description}}
+                    </div>
+                    <div class="art_l_l_data">
+                      <span class="data_date">{{ Replace $v.time "-" "." -1}}</span>
+                      <span class="viewnum">{{$v.i_viewnum}}<span class="viewnum_normal">次浏览</span></span>
+                    </div>
                   </div>
-                  <div class="art_l_l_content">
-                    {{$v.s_description}}
+                  {{if ne $v.s_pic1 ""}}
+                  <div class="art_l_right">
+                    <img src="{{$v.s_pic1}}" alt="">
                   </div>
-                  <div class="art_l_l_data">
-                    <span class="data_date">{{ Replace $v.time "-" "." -1}}</span>
-                    <span class="viewnum">{{$v.i_viewnum}}<span class="viewnum_normal">次浏览</span></span>
-                  </div>
-                </div>
-                {{if ne $v.s_pic1 ""}}
-                <div class="art_l_right">
-                  <img src="{{$v.s_pic1}}" alt="">
+                  {{end}}
                 </div>
                 {{end}}
-              </div>
+                {{include "/common/seo-pagination.html"}}
               {{end}}
-              {{include "/common/seo-pagination.html"}}
             </article>
             <aside>
               <div class="real_time_info_module">

+ 17 - 5
src/web/templates/site/page/jySchool/index.html

@@ -2,7 +2,7 @@
 <html lang="zh">
   <head>
   <meta charset="UTF-8" />
-  <title>剑鱼学堂</title>
+  <title>剑鱼学堂-剑鱼标讯</title>
   <meta name="Keywords" content='{{Msg "seo" "qfw.swordfish.key"}}'/>
   <meta name="Description" content='{{Msg "seo" "qfw.swordfish.description"}}'/>
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
@@ -57,7 +57,7 @@
           {{range $k,$v := .T.hotCourse }}
           <div class="course-card" onclick="window.open('/jyxspc/courser-details?id={{$v._id}}')">
             <div class="card-img">
-              <img src='{{Msg "seo" "cdn"}}{{$v.s_picUrl2}}?v={{Msg "seo" "version"}}' alt="">
+              <img src='{{$v.s_picUrl2}}?v={{Msg "seo" "version"}}' alt="">
             </div>
             <div class="card-main">
               <div class="ellipsis-2 c-m-title"  title="{{$v.s_name}}">{{$v.s_name}}</div>
@@ -107,9 +107,9 @@
           {{range $k,$v := .T.newJyDoc }}
           <div class="doc-card" onclick="window.location.href='/swordfish/docs/content/{{$v.docId}}'">
             <div class="doc-img">
-              <img  class="img-bg" src='{{Msg "seo" "cdn"}}{{$v.previewImgId}}?v={{Msg "seo" "version"}}' alt="">
+              <img  class="img-bg" src='{{$v.previewImgId}}?v={{Msg "seo" "version"}}' alt="">
               <!-- 图片类型 doc@2x、excel@2x、pdf@2x、ppt@2x-->
-              <img class="img-type" src='{{Msg "seo" "cdn"}}/site/page/jySchool/image/{{$v.docFileType}}@2x.png?v={{Msg "seo" "version"}}' alt="">
+              <img class="img-type" src='/site/page/jySchool/image/{{$v.docFileType}}@2x.png?v={{Msg "seo" "version"}}' alt="">
             </div>
             <div class="doc-main">
               <div class="doc-title" title="{{$v.docName}}">{{$v.docName}}</div>
@@ -144,7 +144,7 @@
                 <div class="str-body">
                   {{range $m,$n := $v.list}}
                   <div class="s-b-item" onclick="window.location.href='/jySite/{{$n._id}}.html'">
-                    <img class="s-b-item-bg" src='{{Msg "seo" "cdn"}}{{$n.s_pic1}}?v={{Msg "seo" "version"}}' alt="{{$n.s_title}}">
+                    <img class="s-b-item-bg" src='{{$n.s_pic1}}?v={{Msg "seo" "version"}}' alt="{{$n.s_title}}">
                     <div class="s-b-item-bar">
                       <p class="ellipsis-2">{{$n.s_title}}</p>
                     </div>
@@ -170,6 +170,18 @@
     haslogin({{.T.logid}});
     var pageSchool = {
       init: function () {
+        var img = ''
+        if ($('.swiper-slide').hasClass('.swiper-slide-active')) {
+          img = document.getElementsByClassName('swiper-slide-active')[0].children[0];
+        } else {
+          img = document.getElementsByClassName('swiper-slide')[0].children[0];
+        }
+        var theme = $(img).attr('data-theme')
+        if (theme === 'dark') {
+          $('.msg-container').addClass('dark').removeClass('light')
+        } else {
+          $('.msg-container').addClass('light').removeClass('dark')
+        }
         this.lunBoFn()
       },
       lunBoFn: function () {

+ 1 - 1
src/web/templates/site/page/jySchool/search.html

@@ -35,7 +35,7 @@
 
         {{range $k,$v:=Ad "jy-pc-school-top" -1 .Host}}
         <div class="school-in-header">
-          <img src="{{Msg "seo" "cdn"}}{{$v.S_pic}}" alt="">
+          <img src="{{$v.S_pic}}" alt="">
         </div>
         {{end}}
         <div class="school_search">

+ 1 - 1
src/web/templates/site/page/jySchool/strategy.html

@@ -32,7 +32,7 @@
         </div>
         {{range $k,$v:=Ad "jy-pc-school-top" -1 .Host}}
         <div class="school-in-header">
-          <img src="{{Msg "seo" "cdn"}}{{$v.S_pic}}" alt="">
+          <img src="{{$v.S_pic}}" alt="">
         </div>
         {{end}}
         <div class="school-in-content">

+ 4 - 11
src/web/templates/site/page/jyblogdetail.html

@@ -2,16 +2,9 @@
 <html lang="zh">
 <head>
   <meta charset="UTF-8" />
-  {{if eq .T.pCode "ztbgl"}}
-  <title>招投标攻略</title>
-  {{else if eq .T.pCode "hyzx"}}
-  <title>行业资讯</title>
-  {{else}}
-  <title>剑鱼标讯</title>
-  {{end}}
-
-  <meta name="Keywords" content='{{Msg "seo" "qfw.swordfish.key"}}'/>
-  <meta name="Description" content='{{Msg "seo" "qfw.swordfish.description"}}'/>
+  <title>{{.T.data.s_title}}-剑鱼标讯</title>
+  <meta name="Keywords" content=''/>
+  <meta name="Description" content=''/>
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
   <meta name="format-detection" content="tephone=no" />
   {{if eq .T.pCode "ztbgl"}}
@@ -208,7 +201,7 @@
 
     $(".jyb_ddetail img").each(function(){
       var imgsrc = $(this).attr("src");
-      if(imgsrc.indexOf("://") < 0){
+      if(!(imgsrc.indexOf("http") ===0 || imgsrc.indexOf("data:image/png;base64,")===0)){
         $(this).attr("src",{{Msg "seo" "jyadd"}}+imgsrc)
       }
     })