|
@@ -0,0 +1,341 @@
|
|
|
+package services
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "hongze/hongze_cygx/models"
|
|
|
+ "hongze/hongze_cygx/utils"
|
|
|
+ "io/ioutil"
|
|
|
+ "net/http"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type SendWxCategoryTemplate struct {
|
|
|
+ WxAppId string `description:"公众号appId"`
|
|
|
+ Keywords []string `description:"模板消息keyword字段"`
|
|
|
+ TemplateId string `description:"模板id"`
|
|
|
+ RedirectUrl string `description:"跳转地址"`
|
|
|
+ RedirectTarget int `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序,3:查研观向,4:买方研选"`
|
|
|
+ Resource string `description:"资源唯一标识"`
|
|
|
+ SendType int `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
|
|
|
+ OpenIdArr []string `description:"消息接收者openid"`
|
|
|
+}
|
|
|
+
|
|
|
+// 推送类目模板消息
|
|
|
+func SendCategoryTemplateMsg(sendInfo *SendWxCategoryTemplate) (err error) {
|
|
|
+ postData, err := json.Marshal(sendInfo)
|
|
|
+ if err != nil {
|
|
|
+ go utils.SendAlarmMsg("SendCategoryTemplateMsg json.Marshal Err:"+err.Error(), 1)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ body := ioutil.NopCloser(strings.NewReader(string(postData)))
|
|
|
+ client := &http.Client{}
|
|
|
+ req, err := http.NewRequest("POST", utils.SendWxCategoryTemplateMsgUrl, body)
|
|
|
+ if err != nil {
|
|
|
+ go utils.SendAlarmMsg("SendCategoryTemplateMsg http.NewRequest Err:"+err.Error(), 1)
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ contentType := "application/json;charset=utf-8"
|
|
|
+ req.Header.Set("Content-Type", contentType)
|
|
|
+ req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
|
|
|
+ resp, err := client.Do(req)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("http client.Do Err:" + err.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+ b, err := ioutil.ReadAll(resp.Body)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ result := new(models.BaseResponse)
|
|
|
+ err = json.Unmarshal(b, &result)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if result.Ret != 200 {
|
|
|
+ err = errors.New(string(b))
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 帮我带问的问题,会前1小时发送
|
|
|
+func SendMfyxEmailFileForAskMsgResearch(cont context.Context) (err error) {
|
|
|
+ var msg string
|
|
|
+ //var touser string
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ go utils.SendAlarmMsg("发送附件模版消息失败", 2)
|
|
|
+ go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ }
|
|
|
+ if msg != "" {
|
|
|
+ go utils.SendAlarmMsg(msg, 2)
|
|
|
+ utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
|
|
|
+ condition := `AND a.activity_type_id = 1 AND a.chart_permission_id = 31 `
|
|
|
+ total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
|
|
|
+ if total == 0 {
|
|
|
+ fmt.Println("发送附件完成0")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ msg = "发送附件模版消息失败 Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
|
|
|
+ if err != nil {
|
|
|
+ msg = "发送附件模版消息失败 Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range listActivity {
|
|
|
+ activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
|
|
|
+ if activityInfo == nil {
|
|
|
+ msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ list, errFile := models.GetActivityMsgExport(v.ActivityId)
|
|
|
+ if errFile != nil {
|
|
|
+ msg = "获取失败,Err:" + errFile.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v2 := range list {
|
|
|
+ user, e := models.GetWxUserItemByUserId(v2.UserId)
|
|
|
+ if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ //获取销售信息
|
|
|
+ sellerItem, e := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
|
|
|
+ if e != nil && e.Error() != utils.ErrNoRow() {
|
|
|
+ err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //给所属销售推送消息
|
|
|
+ if sellerItem != nil && user != nil {
|
|
|
+ openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
|
|
|
+ openIdList := make([]*models.OpenIdList,0)
|
|
|
+ openIdList = append(openIdList, openIpItem)
|
|
|
+ SendWxCategoryMsgWithActivityAsk(user.CompanyName, user.RealName, sellerItem.RealName, time.Now().Format(utils.FormatDateTimeMinute2), v2.Content, openIdList, v2.AskId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
|
|
|
+ if errFile != nil {
|
|
|
+ msg = "获取失败,Err:" + errFile.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 发送报告提问消息提醒
|
|
|
+func SendWxCategoryMsgWithActivityAsk(companyName, realName, sellerName, askTime, askMsg string, openIdList []*models.OpenIdList, msgId 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("发送报告提问消息提醒类目模版消息失败,用户名", realName, "留言ID:", msgId), 2)
|
|
|
+ utils.FileLog.Info("发送类目模版消息失败,Err:%s", err.Error())
|
|
|
+ }
|
|
|
+ fmt.Println("line 21", err, msg)
|
|
|
+ }()
|
|
|
+ var keyword1 string
|
|
|
+ var keyword2 string
|
|
|
+ var keyword3 string
|
|
|
+ var keyword4 string
|
|
|
+ var keyword5 string
|
|
|
+
|
|
|
+ keyword1 = realName
|
|
|
+ keyword2 = companyName
|
|
|
+ keyword3 = sellerName
|
|
|
+ keyword4 = askTime
|
|
|
+ keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
|
|
|
+
|
|
|
+ keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
|
|
|
+
|
|
|
+ openIdArr := make([]string, 0)
|
|
|
+ for _, v := range openIdList {
|
|
|
+ openIdArr = append(openIdArr, v.OpenId)
|
|
|
+ }
|
|
|
+ redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(msgId)
|
|
|
+
|
|
|
+ sendInfo := new(SendWxCategoryTemplate)
|
|
|
+ sendInfo.Keywords = keywords
|
|
|
+ sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
|
|
|
+ sendInfo.RedirectTarget = 4
|
|
|
+ sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
|
|
|
+ sendInfo.OpenIdArr = openIdArr
|
|
|
+ sendInfo.RedirectUrl = redirectUrl
|
|
|
+ err = SendCategoryTemplateMsg(sendInfo)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 推送会议开始消息提醒60分钟前
|
|
|
+func SendMfyxActivityBeginMsg(cont context.Context) (err error) {
|
|
|
+ //func SendActivityBeginMsg() (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ go utils.SendAlarmMsg("60分钟会议消息提醒失败"+err.Error(), 2)
|
|
|
+ fmt.Println("发送失败,Err:", err.Error())
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
|
|
|
+ listActivity, err := models.GetYxActivitySendMsgListAll(endDate)
|
|
|
+ fmt.Println(len(listActivity))
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(listActivity) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //var remark = "点击查看活动详情"
|
|
|
+ var signupIds string
|
|
|
+ for _, v := range listActivity {
|
|
|
+ signupIds += strconv.Itoa(v.Id) + ","
|
|
|
+ //var reserveResults string
|
|
|
+ //var first string
|
|
|
+ openIdItem := new(models.OpenIdList)
|
|
|
+ openIdItem.OpenId = v.OpenId
|
|
|
+ openIdItem.UserId = v.UserId
|
|
|
+ openIdList := make([]*models.OpenIdList, 0)
|
|
|
+ openIdList = append(openIdList, openIdItem)
|
|
|
+
|
|
|
+ openIdArr := make([]string, 0)
|
|
|
+ for _, v := range openIdList {
|
|
|
+ openIdArr = append(openIdArr, v.OpenId)
|
|
|
+ }
|
|
|
+ keywords := []string{v.ActivityName, v.ActivityTime}
|
|
|
+
|
|
|
+ sendInfo := new(SendWxCategoryTemplate)
|
|
|
+ sendInfo.Keywords = keywords
|
|
|
+ sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
|
|
|
+ sendInfo.RedirectTarget = 4
|
|
|
+ sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
|
|
|
+ sendInfo.OpenIdArr = openIdArr
|
|
|
+ sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
|
|
|
+ err = SendCategoryTemplateMsg(sendInfo)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if len(signupIds) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ signupIds = strings.TrimRight(signupIds, ",")
|
|
|
+ err = models.UPdateSendedMsgStatus(signupIds)
|
|
|
+ if err != nil {
|
|
|
+ var msg string
|
|
|
+ go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 推送会议开始消息提醒15分钟前
|
|
|
+func SendMfyxActivityBeginMsgMeeting(cont context.Context) (err error) {
|
|
|
+ //func SendActivityBeginMsgMeeting() (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ go utils.SendAlarmMsg("15分钟会议消息提醒失败", 2)
|
|
|
+ fmt.Println("发送失败,Err:", err.Error())
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ 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 {
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ openIdArr := make([]string, 0)
|
|
|
+ for _, v := range openIdList {
|
|
|
+ openIdArr = append(openIdArr, v.OpenId)
|
|
|
+ }
|
|
|
+ keywords := []string{v.ActivityName, v.ActivityTime}
|
|
|
+
|
|
|
+ sendInfo := new(SendWxCategoryTemplate)
|
|
|
+ sendInfo.Keywords = keywords
|
|
|
+ sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
|
|
|
+ sendInfo.RedirectTarget = 4
|
|
|
+ sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
|
|
|
+ sendInfo.OpenIdArr = openIdArr
|
|
|
+ //sendInfo.RedirectUrl = redirectUrl
|
|
|
+ err = SendCategoryTemplateMsg(sendInfo)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ err = models.UpdateSendedMsgMeetingSendWxMsg(activityIds)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+
|