Browse Source

微信模板消息修改

wangchuanjin 2 years ago
parent
commit
ef5b93b95d

+ 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": {

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

@@ -1,1006 +1,993 @@
 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)
+					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
+					} 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)
+					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,
+						},
+					}
+					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("定时任务,到期提醒,推送消息结束")
+	})
 }
 
 //检测大会员到期时间 定时任务
 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,