xingzai 9 месяцев назад
Родитель
Сommit
8906c15f00

+ 6 - 0
controllers/activity.go

@@ -862,6 +862,12 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				//resp.PopupMsg = "<b>报名成功,已加入您的活动日程</b><br/>想要及时获取活动信息变更通知,请关注【查研观向小助手】公众号"
 				resp.PopupMsg = "<b>报名成功,已加入您的活动日程</b><br/>是否将活动日程加入您的系统日历,\n\n活动开始前获取手机日历提醒?"
 			}
+
+			// 如果是买方研选下的专家沙龙,同时推给内容组四人
+			if activityInfo.ActivityTypeId == 5 && activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+				go services.SendNeiRongZuActivitieSignTemplateMsg(user, activityInfo)
+				go services.SendNeiRongZuActivitieSignCategoryTemplateMsg(user, activityInfo)
+			}
 			go services.YanXuanActivityPointsBillSignupAdd(activityId, uid) // 用户报名添加到处理研选扣点
 		}
 	} else {

+ 30 - 2
models/activity.go

@@ -633,7 +633,35 @@ WHERE
 	AND a.publish_status = 1
 	AND a.activity_time <= ? AND a.activity_time >= NOW() 
 	AND s.is_cancel = 0
-	AND( a.activity_type_id IN (4,5,6) OR (a.activity_type_id = 3 AND a.is_limit_people = 1 )) 	GROUP BY s.id`
+	AND( a.activity_type_id IN (4,5,6,8) OR (a.activity_type_id = 3 AND a.is_limit_people = 1 )) 	GROUP BY s.id`
+	_, err = o.Raw(sql, endDate).QueryRows(&items)
+	return
+}
+
+// 买方研选会前一小时需要推送的Openid
+func GetActivitySendMsgListAllMfyx(endDate string) (items []*WxMsgCygxActivityList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT
+	s.id,
+	s.user_id,
+	s.fail_type,
+	cr.open_id,
+	a.activity_name,
+	a.activity_id,
+	a.activity_time
+FROM
+	cygx_activity AS a
+	INNER JOIN cygx_activity_signup AS s ON s.activity_id = a.activity_id
+	INNER JOIN cygx_mfyx_gzh_user_record AS cr ON cr.cygx_bind_account = s.mobile 
+WHERE
+	1 = 1 
+	AND s.is_send_wx_msg = 0 
+	AND s.do_fail_type = 0 
+	AND a.publish_status = 1
+  	AND a.chart_permission_id = 31 
+	AND a.activity_time = ? AND a.activity_time >= NOW() 
+	AND s.is_cancel = 0
+	AND a.activity_type_id IN (5,8) 	GROUP BY s.id`
 	_, err = o.Raw(sql, endDate).QueryRows(&items)
 	return
 }
@@ -1352,4 +1380,4 @@ WHERE
 	GROUP BY s.id`
 	_, err = o.Raw(sql, endDate).QueryRows(&items)
 	return
-}
+}

+ 1 - 1
models/company.go

@@ -284,7 +284,7 @@ func GetCompanyInteractionNumList() (items []*Company, err error) {
 }
 
 func GetCompanyProductCount(companyId, productId int) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM  company_product WHERE company_id = ? AND product_id = ? `
+	sql := ` SELECT COUNT(1) AS count FROM  company_product WHERE company_id = ? AND product_id = ?  AND  company_id  > 1  `
 	o := orm.NewOrmUsingDB("weekly_report")
 	err = o.Raw(sql, companyId, productId).QueryRow(&count)
 	return

+ 206 - 44
services/activity.go

@@ -71,6 +71,8 @@ func SendActivityBeginMsg(cont context.Context) (err error) {
 		//SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTimeText, v.Address, remark, openIdList, v.ActivityId)
 		SendWxMsgWithFrequencyBycategory(v.ActivityName, v.ActivityTime, openIdList, v.ActivityId)
 	}
+
+	go SendActivityBeginMsgMfyx() //买方研选推送会议开始消息提醒60分钟前
 	if len(signupIds) == 0 {
 		return
 	}
@@ -84,6 +86,44 @@ func SendActivityBeginMsg(cont context.Context) (err error) {
 	return
 }
 
+// 买方研选推送会议开始消息提醒60分钟前
+func SendActivityBeginMsgMfyx() (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("买方研选推送会议开始消息提醒60分钟前 SendActivityBeginMsgMfyx"+err.Error(), 2)
+			fmt.Println("发送失败,Err:", err.Error())
+		}
+	}()
+	endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
+	listActivity, err := models.GetActivitySendMsgListAllMfyx(endDate)
+	fmt.Println(len(listActivity))
+	//return
+	if err != nil {
+		fmt.Println("GetActivitySendMsgListAllMfyx Err:", err.Error())
+		return
+	}
+	if len(listActivity) == 0 {
+		return
+	}
+	//var remark = "点击查看活动详情"
+	var signupIds string
+	for _, v := range listActivity {
+		signupIds += strconv.Itoa(v.Id) + ","
+		openIdItem := new(models.OpenIdList)
+		openIdItem.OpenId = v.OpenId
+		openIdItem.UserId = v.UserId
+		openIdList := make([]*models.OpenIdList, 0)
+		openIdList = append(openIdList, openIdItem)
+		SendWxMsgWithFrequencyBycategoryMfyx(v.ActivityName, v.ActivityTime, openIdList, v.ActivityId)
+	}
+	if len(signupIds) == 0 {
+		return
+	}
+	signupIds = strings.TrimRight(signupIds, ",")
+	err = models.UPdateSendedMsgStatus(signupIds)
+	return
+}
+
 //func init() {
 //	SendActivityBeginMsgMeeting()
 //}
@@ -114,6 +154,101 @@ func SendActivityBeginMsgMeeting(cont context.Context) (err error) {
 	//var signupIds string
 	//var remark = "点击查看活动详情"
 
+	var activityIds []int
+	//同一时间举办的活动不多所以这里循环查询
+	for _, v := range listActivity {
+		activityIds = append(activityIds, v.ActivityId)
+		var mobiles []string
+		pars = make([]interface{}, 0)
+		condition = ` AND activity_id = ?  AND is_send_wx_msg = 0 `
+		pars = append(pars, v.ActivityId)
+		//获取设置消息提醒的用户列表
+		listxReminder, e := models.GetCygxReminderListByUser(condition, pars)
+		if e != nil {
+			err = errors.New("GetCygxReminderListByUser, Err: " + e.Error())
+			return
+		}
+		for _, vReminder := range listxReminder {
+			mobiles = append(mobiles, vReminder.Mobile)
+		}
+
+		pars = make([]interface{}, 0)
+		condition = ` AND do_fail_type = 0 AND activity_id  = ? AND signup_type = 1  AND is_send_wx_msg = 0 `
+		pars = append(pars, v.ActivityId)
+		//获取设置预约外呼的用户列表
+		listSignup, e := models.GetActivitySignupList(condition, pars)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetActivitySignupList, Err: " + e.Error())
+			return
+		}
+		for _, vSignup := range listSignup {
+			mobiles = append(mobiles, vSignup.Mobile)
+		}
+		//获取这些手机号对应的Openid
+		listOpenid, e := models.GetUserRecordListByMobileArr(mobiles)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			err = errors.New("GetUserRecordListByMobileArr, Err: " + e.Error())
+			return
+		}
+		openIdList := make([]*models.OpenIdList, 0)
+		for _, vOpenid := range listOpenid {
+			openIdItem := new(models.OpenIdList)
+			openIdItem.OpenId = vOpenid.OpenId
+			openIdItem.UserId = vOpenid.UserId
+			openIdList = append(openIdList, openIdItem)
+		}
+		//var reserveResults string
+		//var keyword2 string
+		//reserveResults = "--"
+		//keyword2 = "将在15分钟后开始"
+		//SendWxMsgWithFrequency(keyword2, v.ActivityName, reserveResults, v.ActivityTimeText, "--", remark, openIdList, v.ActivityId)
+		SendWxMsgWithFrequencyBycategory(v.ActivityName, v.ActivityTime, openIdList, v.ActivityId)
+
+		//如果是研选活动,发送研选类目模板消息
+		if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			//获取这些手机号对应的Openid
+			listOpenidMfyx, e := models.GetMfyxUserRecordListByMobileArr(mobiles)
+			if e != nil && e.Error() != utils.ErrNoRow() {
+				err = errors.New("GetUserRecordListByMobileArr, Err: " + e.Error())
+				return
+			}
+			openIdListMfyx := make([]*models.OpenIdList, 0)
+			for _, vOpenid := range listOpenidMfyx {
+				openIdItem := new(models.OpenIdList)
+				openIdItem.OpenId = vOpenid.OpenId
+				openIdItem.UserId = vOpenid.UserId
+				openIdListMfyx = append(openIdListMfyx, openIdItem)
+			}
+			SendWxMsgWithFrequencyBycategoryMfyx(v.ActivityName, v.ActivityTime, openIdListMfyx, v.ActivityId)
+		}
+	}
+	err = models.UpdateSendedMsgMeetingSendWxMsg(activityIds)
+	return
+}
+
+// 买方研选推送会议开始消息提醒15分钟前
+func SendActivityBeginMsgMeetingMfyx() (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("买方研选推送会议开始消息提醒15分钟前 失败 SendActivityBeginMsgMeetingMfyx Err:", err.Error()), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+	endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
+	condition = ` AND activity_time <= ? AND activity_time >= NOW()  AND  publish_status = 1 `
+	pars = append(pars, endDate)
+	listActivity, e := models.GetCygxActivityList(condition, pars, 0, 100000)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivityList, Err: " + e.Error())
+		return
+	}
+	if len(listActivity) == 0 {
+		return
+	}
+	//var signupIds string
+	//var remark = "点击查看活动详情"
+
 	var activityIds []int
 	//同一时间举办的活动不多所以这里循环查询
 	for _, v := range listActivity {
@@ -2112,9 +2247,10 @@ func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDet
 		return err
 	}
 	if sellerItemQy != nil {
-		openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
+		articleId := articleDetail.ArticleId
+		openIdList, e := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
 		if err != nil {
-			fmt.Println(err)
+			err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
 			return err
 		}
 		var keyword1 string
@@ -2122,7 +2258,23 @@ func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDet
 
 		keyword1 = articleDetail.Title
 		keyword2 = fmt.Sprint("互动:", sourceMsg, ",", user.RealName, "--", user.CompanyName)
-		SendWxMsgWithArticleUserRemind(keyword1, keyword2, openIdList, articleDetail.ArticleId)
+		SendWxMsgWithArticleUserRemind(keyword1, keyword2, openIdList, articleId)
+
+		if articleDetail.ArticleTypeId > 0 {
+			// 类目模版买方研选
+			openIdListMfyx, e := models.GetMfyxWxOpenIdByMobileList(sellerItemQy.Mobile)
+			if e != nil {
+				err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
+				return err
+			}
+			var redirectUrl string
+			keyword1 = utils.TruncateActivityNameString(user.RealName + "-" + user.CompanyName)
+			keyword2 = fmt.Sprint("互动提醒:", sourceMsg)
+			keyword3 := utils.TruncateActivityNameString(articleDetail.Title)
+			keyword4 := time.Now().Format(utils.FormatDateTimeMinute2)
+			redirectUrl = utils.WX_MSG_PATH_YX_ARTICLE_DETAIL + strconv.Itoa(articleId)
+			SendWxCategoryMsgWithActivityUserRemind(keyword1, keyword2, keyword3, keyword4, redirectUrl, openIdListMfyx, articleId)
+		}
 	}
 	return
 }
@@ -2142,12 +2294,6 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 		err = errors.New("GetUserRemind, Err: " + e.Error())
 		return
 	}
-	// 如果是买方研选下的专家沙龙,同时推给内容组四人
-
-	if activityDetail.ActivityTypeId == 5 && activityDetail.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-		go SendNeiRongZuActivitieSignTemplateMsg(user, activityDetail)
-		go SendNeiRongZuActivitieSignCategoryTemplateMsg(user, activityDetail)
-	}
 
 	//获取销售手机号
 	sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
@@ -2190,48 +2336,64 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 	keyword1 = activityDetail.ActivityName
 	keyword2 = fmt.Sprint("互动:", sourceMsg, ",", user.RealName, "--", user.CompanyName)
 	SendWxMsgWithActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
-	return
-}
 
-// 用户专项调研操作行为,模板消息推送
-func SpecialActivityUserRemind(user *models.WxUserItem, activityDetail *models.CygxActivitySpecialDetail, source int) (err error) {
-	defer func() {
-		if err != nil {
-			go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
-		}
-	}()
-	countUser, err := models.GetUserRemind(user.UserId)
-	if err != nil {
-		return err
-	}
-	if countUser == 0 {
-		return err
-	}
-	var sourceMsg string
-	if source == 1 {
-		sourceMsg = "预报名调研"
-	}
-	//获取销售手机号
-	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return err
-	}
-	if sellerItemQy != nil {
-		openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
-		if err != nil {
-			fmt.Println(err)
+	// 类目模版买方研选
+	if activityDetail.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		openIdListMfyx, e := models.GetMfyxWxOpenIdByMobileList(sellerItemQy.Mobile)
+		if e != nil {
+			err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
 			return err
 		}
-		var keyword1 string
-		var keyword2 string
-		keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:", sourceMsg)
-		keyword2 = activityDetail.ResearchTheme
-		SendWxMsgWithSpecialActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
+		var redirectUrl string
+		keyword1 = utils.TruncateActivityNameString(user.RealName + "-" + user.CompanyName)
+		keyword2 = fmt.Sprint("互动提醒:", sourceMsg)
+		keyword3 := utils.TruncateActivityNameString(activityDetail.ActivityName)
+		keyword4 := time.Now().Format(utils.FormatDateTimeMinute2)
+		redirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId)
+		SendWxCategoryMsgWithActivityUserRemind(keyword1, keyword2, keyword3, keyword4, redirectUrl, openIdListMfyx, activityDetail.ActivityId)
 	}
 	return
 }
 
+// 用户专项调研操作行为,模板消息推送
+//func SpecialActivityUserRemind(user *models.WxUserItem, activityDetail *models.CygxActivitySpecialDetail, source int) (err error) {
+//	defer func() {
+//		if err != nil {
+//			go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
+//			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+//		}
+//	}()
+//	countUser, err := models.GetUserRemind(user.UserId)
+//	if err != nil {
+//		return err
+//	}
+//	if countUser == 0 {
+//		return err
+//	}
+//	var sourceMsg string
+//	if source == 1 {
+//		sourceMsg = "预报名调研"
+//	}
+//	//获取销售手机号
+//	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		return err
+//	}
+//	if sellerItemQy != nil {
+//		openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
+//		if err != nil {
+//			fmt.Println(err)
+//			return err
+//		}
+//		var keyword1 string
+//		var keyword2 string
+//		keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:", sourceMsg)
+//		keyword2 = activityDetail.ResearchTheme
+//		SendWxMsgWithSpecialActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
+//	}
+//	return
+//}
+
 //func init() {
 //	DoActivityOnenIdWxTemplateMsg()
 //}

+ 9 - 9
services/order.go

@@ -76,14 +76,14 @@ func GetQueryOrderByOutTradeNoTask(cont context.Context) (err error) {
 	for _, v := range orderList {
 		tradeState, statusCode, itemResp := GetQueryOrderByOutTradeNo(v.OutTradeNo)
 		if tradeState == "SUCCESS" && statusCode == 200 {
-			go HandleOrderHandle(itemResp)
+			go HandleOrderByWechatPay(itemResp)
 		}
 	}
 	return
 }
 
 // 手动处理支付订单回调
-func HandleOrderHandle(itemCallback *Transaction) {
+func HandleOrderByWechatPay(itemCallback *Transaction) {
 	var err error
 	defer func() {
 		if err != nil {
@@ -206,12 +206,12 @@ func AddCygxOrderPayment(itemCallback *Transaction) {
 }
 
 // 定时任务处理退款回调
-func HandleOrderRefundHandleask(cont context.Context) (err error) {
-	//func HandleOrderRefundHandleask() (err error) {
+func HandleOrderRefundTask(cont context.Context) (err error) {
+	//func HandleOrderRefundTask() (err error) {
 	defer func() {
 		if err != nil {
 			fmt.Println(err)
-			go utils.SendAlarmMsg(fmt.Sprint("自动取消十分钟之内没有付款的的订单 CancelCygxOrder ,err:", err.Error()), 2)
+			go utils.SendAlarmMsg(fmt.Sprint("定时任务处理退款回调 HandleOrderRefundTask ,err:", err.Error()), 2)
 		}
 	}()
 	var condition string
@@ -232,23 +232,23 @@ func HandleOrderRefundHandleask(cont context.Context) (err error) {
 	for _, v := range orderList {
 		tradeState, statusCode, itemResp := GetQueryOrderByOutTradeNo(v.OutTradeNo)
 		if tradeState == "REFUND" && statusCode == 200 {
-			go HandleOrderRefundHandle(itemResp)
+			go HandleOrderRefundByWechatPay(itemResp)
 		}
 	}
 	return
 }
 
 // 处理退款订单回调
-func HandleOrderRefundHandle(itemCallback *Transaction) {
+func HandleOrderRefundByWechatPay(itemCallback *Transaction) {
 	var err error
 	defer func() {
 		if err != nil {
 			fmt.Println(err)
-			go utils.SendAlarmMsg(fmt.Sprint("处理退款订单回调信息失败 HandleOrderRefundHandle, err:", err.Error()), 2)
+			go utils.SendAlarmMsg(fmt.Sprint("处理退款订单回调信息失败 HandleOrderRefundByWechatPay, err:", err.Error()), 2)
 		}
 	}()
 	outTradeNo := itemCallback.OutTradeNo
-	orderDetail, e := order.GetCygxOrderDetailByOrderCode(outTradeNo)
+	orderDetail, e := order.GetCygxOrderDetailByOutTradeNo(outTradeNo)
 	if e != nil {
 		err = errors.New("GetCygxOrderDetailByOrderCode, Err: " + e.Error())
 		return

+ 8 - 8
services/task.go

@@ -144,14 +144,14 @@ func Task() {
 		sendMfyxActivityBeginMsg := task.NewTask("sendMfyxActivityBeginMsg", "0 */5 6-23 * * *", SendMfyxActivityBeginMsg) //会议前60分钟的提醒
 		task.AddTask("sendMfyxActivityBeginMsg", sendMfyxActivityBeginMsg)
 
-		//cancelCygxOrder := task.NewTask("CancelCygxOrder", "0 */1 * * * *", CancelCygxOrder)
-		//task.AddTask("十分钟内未付款的订单自动取消", cancelCygxOrder) //十分钟内未付款的订单自动取消
-		//
-		//getQueryOrderByOutTradeNoTask := task.NewTask("getQueryOrderByOutTradeNoTask", "0 */1 * * * *", GetQueryOrderByOutTradeNoTask)
-		//task.AddTask("定时任务主动获取订单支付状态", getQueryOrderByOutTradeNoTask) //定时任务主动获取订单支付状态
-		//
-		//handleOrderRefundHandleask := task.NewTask("HandleOrderRefundHandleask", "0 */1 * * * *", HandleOrderRefundHandleask)
-		//task.AddTask("定时任务处理退款回调", handleOrderRefundHandleask) //定时任务处理退款回调
+		cancelCygxOrder := task.NewTask("CancelCygxOrder", "0 */1 * * * *", CancelCygxOrder)
+		task.AddTask("十分钟内未付款的订单自动取消", cancelCygxOrder) //十分钟内未付款的订单自动取消
+
+		getQueryOrderByOutTradeNoTask := task.NewTask("getQueryOrderByOutTradeNoTask", "0 */1 * * * *", GetQueryOrderByOutTradeNoTask)
+		task.AddTask("定时任务主动获取订单支付状态", getQueryOrderByOutTradeNoTask) //定时任务主动获取订单支付状态
+
+		handleOrderRefundTask := task.NewTask("handleOrderRefundTask", "0 */1 * * * *", HandleOrderRefundTask)
+		task.AddTask("定时任务处理退款回调", handleOrderRefundTask) //定时任务处理退款回调
 	}
 
 	//if utils.RunMode != "release" {

+ 32 - 52
services/wechat_send_msg.go

@@ -27,79 +27,59 @@ func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle s
 		}
 	}()
 
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
 	keyword1 := realName + "【" + companyName + "】"
 	first := "您有一条新的访谈申请,请及时处理。"
 	keyword2 := mobile
 	keyword3 := time.Now().Format(utils.FormatDateTime)
 	keyword4 := articleTitle
-	fontColor := "#D9001B"
-	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
 
-	sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
+
+	redirectUrl := ""
+	sendInfo := new(SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	//sendInfo.Resource =
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	fmt.Println("send end")
 	return
 }
 
 // 访谈申请取消
 func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("访谈申请取消模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
 		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
 
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
-	first := realName + "-" + mobile + "【" + companyName + "】的访谈申请已取消,请留意。"
 	keyword1 := articleTitle
 	keyword2 := time.Now().Format(utils.FormatDateTime)
-	fontColor := "#D9001B"
-	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
 
-	sendMap["template_id"] = utils.WxMsgTemplateIdApplyCancelXzs
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
-	fmt.Println("send end")
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
+	redirectUrl := ""
+	sendInfo := new(SendWxTemplate)
+
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyCancelXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	//sendInfo.Resource =
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 

+ 62 - 0
services/wx_category_template_msg.go

@@ -723,6 +723,68 @@ func SendActivitieCancelSignCategoryTemplateMsg(user *models.WxUserItem, activit
 	return
 }
 
+// 发送用户操作活动消息提醒
+func SendWxCategoryMsgWithActivityUserRemind(keyWord1, keyWord2, keyWord3, keyWord4, redirectUrl string, openIdList []*models.OpenIdList, activityId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,SendWxCategoryMsgWithActivityUserRemind 文章ID:", activityId), 2)
+		}
+	}()
+	keyWord1 = utils.TruncateActivityNameString(keyWord1)
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keywords []string
+	keywords = append(keywords, keyWord1, keyWord2, keyWord3, keyWord4)
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+	sendInfo.RedirectTarget = 4
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 买方研选推送会议开始消息提醒60/15分钟前
+func SendWxMsgWithFrequencyBycategoryMfyx(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,SendWxCategoryMsgWithActivityUserRemind 文章ID:", activityId), 2)
+		}
+	}()
+	keyWord1 = utils.TruncateActivityNameString(keyWord1)
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keywords []string
+
+	keyWord2 = utils.StrTimeToTime(keyWord2).Format(utils.FormatDateTimeMinute2) //去掉时间格式后面的秒
+	keywords = append(keywords, keyWord1, keyWord2)
+	redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
+	sendInfo.RedirectTarget = 4
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
 // 活动模块END
 
 // 专栏模块

+ 219 - 317
services/wx_template_msg.go

@@ -207,232 +207,108 @@ func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openId
 }
 
 // 发送报告提问消息提醒
-func SendWxMsgWithArticleClassToAdmin(keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList, articleId int) (err error) {
+func SendWxMsgWithArticleClassToAdmin(keyword1, keyword2, keyword3, keyword4 string, openIdList []*models.OpenIdList, articleId int) (err error) {
 	if len(openIdList) == 0 {
 		return
 	}
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
+
+	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	//templateId := utils.TemplateIdByProductXzs
+	//sendMap := make(map[string]interface{})
+	//sendData := make(map[string]interface{})
+	//sendMap["template_id"] = templateId
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
+	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	//sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	//sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+	//sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+	//sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
+	//sendMap["data"] = sendData
+	//WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	var first string
-	first = keyWord1
-	keyword1 := keyWord2
-	keyword2 := keyWord3
-	keyword3 := keyWord4
-	keyword4 := ""
 
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.TemplateIdByProductXzs
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+
+	sendInfo.TemplateId = utils.TemplateIdByProductXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
 // 发送用户阅读报告消息提醒
-func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
+func SendWxMsgWithArticleUserRemind(keyword1, keyword2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
 	if len(openIdList) == 0 {
 		return
 	}
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-	var first string
-	first = keyWord1
-	//keyword1 := keyWord2
-	//keyword1 := keyWord2
-	remark := "点击查看报告详情"
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.WxMsgTemplateIdArticleUserRemind
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
-	return
-}
 
-// 发送用户操作活动消息提醒
-func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
-	if len(openIdList) == 0 {
-		return
-	}
-	var msg string
-	defer func() {
-		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
-		}
-	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	var first string
-	//first = keyWord1
-	//keyword1 := keyWord2
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.WxMsgTemplateIdArticleUserRemind
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+
+	sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
 	return
 }
 
-// 发送用户操作专项调研活动消息提醒
-func SendWxMsgWithSpecialActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
+// 发送用户操作活动消息提醒
+func SendWxMsgWithActivityUserRemind(keyword1, keyword2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
 	if len(openIdList) == 0 {
 		return
 	}
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
-		}
-	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-	var first string
-	first = keyWord1
-	keyword1 := keyWord2
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.WxMsgTemplateIdArticleUserRemind
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/specialDetail/specialDetail?id=" + strconv.Itoa(activityId)}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
-	return
-}
-
-// 活动带问提醒
-func SendActivityAskApplyTemplateMsg(applyName, applyTime, askContent, activityName string, activityId int, itemOpenid *models.OpenIdList) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+activityName, 2)
-		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
 		}
 	}()
 
-	var accessToken string
-	if utils.RunMode == "release" {
-		accessToken, err = models.GetWxAccessTokenByXzs()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	} else {
-		accessToken, err = models.GetWxAccessToken()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	}
-
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
-	first := "有新的客户提问"
-	keyword1 := applyName
-	keyword2 := "-"
-	keyword3 := applyTime
-	keyword4 := askContent
-	remark := activityName
-	fontColor := "#D9001B"
-	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
-	sendData["remark"] = map[string]interface{}{"value": remark, "color": fontColor}
-	if utils.RunMode == "release" {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
-	} else {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApply
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
-	fmt.Println("send end")
+	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
@@ -479,69 +355,69 @@ func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, r
 }
 
 // 专项产业调研模板消息推送
-func SendSpecialTemplateMsg(applyName, applyTime, mobile, activityName, resource string, itemOpenid *models.OpenIdList) (err error) {
-	var msg string
-	defer func() {
-		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			go utils.SendAlarmMsg("专项产业调研模板消息推送消息失败"+activityName, 2)
-		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
-	}()
-	var accessToken string
-	if utils.RunMode == "release" {
-		accessToken, err = models.GetWxAccessTokenByXzs()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	} else {
-		accessToken, err = models.GetWxAccessToken()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	}
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	var first string
-	if resource == "sale" {
-		first = "有客户对专项调研感兴趣"
-	} else {
-		first = "有5家公司预报名专项调研"
-	}
-
-	keyword1 := applyName
-	keyword2 := mobile
-	keyword3 := applyTime
-	keyword4 := activityName
-
-	fontColor := "#D9001B"
-	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
-	if utils.RunMode == "release" {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
-	} else {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApply
-	}
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
-	return
-}
+//func SendSpecialTemplateMsg(applyName, applyTime, mobile, activityName, resource string, itemOpenid *models.OpenIdList) (err error) {
+//	var msg string
+//	defer func() {
+//		if err != nil {
+//			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+//			go utils.SendAlarmMsg("专项产业调研模板消息推送消息失败"+activityName, 2)
+//		}
+//		if msg != "" {
+//			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+//		}
+//	}()
+//	var accessToken string
+//	if utils.RunMode == "release" {
+//		accessToken, err = models.GetWxAccessTokenByXzs()
+//		if err != nil {
+//			msg = "GetWxAccessToken Err:" + err.Error()
+//			return
+//		}
+//		if accessToken == "" {
+//			msg = "accessToken is empty"
+//			return
+//		}
+//	} else {
+//		accessToken, err = models.GetWxAccessToken()
+//		if err != nil {
+//			msg = "GetWxAccessToken Err:" + err.Error()
+//			return
+//		}
+//		if accessToken == "" {
+//			msg = "accessToken is empty"
+//			return
+//		}
+//	}
+//	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+//	sendMap := make(map[string]interface{})
+//	sendData := make(map[string]interface{})
+//	var first string
+//	if resource == "sale" {
+//		first = "有客户对专项调研感兴趣"
+//	} else {
+//		first = "有5家公司预报名专项调研"
+//	}
+//
+//	keyword1 := applyName
+//	keyword2 := mobile
+//	keyword3 := applyTime
+//	keyword4 := activityName
+//
+//	fontColor := "#D9001B"
+//	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
+//	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
+//	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
+//	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
+//	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
+//	if utils.RunMode == "release" {
+//		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
+//	} else {
+//		sendMap["template_id"] = utils.WxMsgTemplateIdApply
+//	}
+//	sendMap["data"] = sendData
+//	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
+//	return
+//}
 
 //弘则投资:
 //Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY  活动预约通知
@@ -615,101 +491,127 @@ func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int,
 }
 
 // 发送报告更新的消息给预约的用户
-func SendWxMsgWithArticleUpdate(first, keyWord1, keyWord2, keyWord3, keyWord4 string, item *models.OpenIdList, articleId int) (err error) {
-	var msg string
+func SendWxMsgWithArticleUpdate(first, keyword1, keyword2, keyword3, keyword4 string, item *models.OpenIdList, articleId int) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-	var openIdList []*models.OpenIdList
-	openIdList = append(openIdList, item)
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.TemplateIdByProductXzs
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId) + "&IsSendWx=1"}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
-	sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
-	sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": "点击查看报告详情", "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	//accessToken, err := models.GetWxAccessTokenByXzs()
+	//if err != nil {
+	//	msg = "GetWxAccessToken Err:" + err.Error()
+	//	return
+	//}
+	//if accessToken == "" {
+	//	msg = "accessToken is empty"
+	//	return
+	//}
+	//var openIdList []*models.OpenIdList
+	//openIdList = append(openIdList, item)
+	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	//templateId := utils.TemplateIdByProductXzs
+	//sendMap := make(map[string]interface{})
+	//sendData := make(map[string]interface{})
+	//sendMap["template_id"] = templateId
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId) + "&IsSendWx=1"}
+	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	//sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
+	//sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
+	//sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
+	//sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
+	//sendData["remark"] = map[string]interface{}{"value": "点击查看报告详情", "color": "#173177"}
+	//sendMap["data"] = sendData
+	//WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, item.OpenId)
+	redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.TemplateIdByProductXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
 // 周日下午4点半,推送全部活动
-func SendActivityOnenIdWxTemplateMsg(first, keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList) (err error) {
-	var msg string
+func SendActivityOnenIdWxTemplateMsg(first, keyword1, keyword2, keyword3, keyword4 string, openIdList []*models.OpenIdList) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("周日下午4点半,推送全部活"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送周日下午4点半,推送全部活模版消息失败,"), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
+	//accessToken, err := models.GetWxAccessTokenByXzs()
+	//if err != nil {
+	//	msg = "GetWxAccessToken Err:" + err.Error()
+	//	return
+	//}
+	//if accessToken == "" {
+	//	msg = "accessToken is empty"
+	//	return
+	//}
+	////var openIdList []*models.OpenIdList
+	////openIdList = append(openIdList, item)
+	//sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	//templateId := utils.WxMsgTemplateIdArticleUserRemind
+	//sendMap := make(map[string]interface{})
+	//sendData := make(map[string]interface{})
+	//sendMap["template_id"] = templateId
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
+	////sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
+	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	//sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
+	//sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
+	//sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
+	//sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
+	//sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
+	//sendMap["data"] = sendData
+	//WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+
+	openIdArr := make([]string, 0)
+
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	//var openIdList []*models.OpenIdList
-	//openIdList = append(openIdList, item)
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.WxMsgTemplateIdArticleUserRemind
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
-	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
-	sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
-	sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	redirectUrl := "pages/activity/activity"
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	//sendInfo.Resource =
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
 // 发送用户留言提醒
 // func SendCommentWxTemplateMsg(title, companyName, userName, sellerName, createTime, content string, openIdList []*models.OpenIdList, articleId int) (err error) {
+
 func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
-			go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+			go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId, "Err:", err.Error()), 2)
 		}
 	}()
 
 	companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
 	if e != nil {
+		err = errors.New("GetSellerDetailAllByCompanyId, Err: " + e.Error())
 		return
 	}
-	if companyItem == nil {
-		msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
-	}
+
 	var first string
 	var keyword1 string
 	var keyword2 string