wx_template_msg.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_clpt/models"
  8. "hongze/hongze_clpt/utils"
  9. "io/ioutil"
  10. "net/http"
  11. "strconv"
  12. "time"
  13. )
  14. // 发送报告提问消息提醒
  15. func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
  16. var msg string
  17. defer func() {
  18. if err != nil {
  19. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  20. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
  21. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  22. }
  23. fmt.Println("line 21", err, msg)
  24. }()
  25. utils.FileLog.Info("%s", "services SendMsg")
  26. //accessToken, err := models.GetWxAccessToken()
  27. accessToken, err := models.GetWxAccessTokenByXzs()
  28. if err != nil {
  29. msg = "GetWxAccessToken Err:" + err.Error()
  30. return
  31. }
  32. if accessToken == "" {
  33. msg = "accessToken is empty"
  34. return
  35. }
  36. var first string
  37. var keyword1 string
  38. var keyword3 string
  39. var keyword4 string
  40. var remark string
  41. first = "研选报告有新的提问,请及时处理"
  42. keyword1 = name
  43. keyword3 = askTime
  44. keyword4 = askMsg
  45. remark = title
  46. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  47. //templateId := utils.WxMsgTemplateIdAskMsg
  48. templateId := utils.WxMsgTemplateIdAskMsgXzs
  49. sendMap := make(map[string]interface{})
  50. sendData := make(map[string]interface{})
  51. sendMap["template_id"] = templateId
  52. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
  53. //sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "path": "article/detail?ArticleId=1000001"}
  54. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  55. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  56. sendData["keyword2"] = map[string]interface{}{"value": "", "color": "#173177"}
  57. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  58. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  59. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  60. sendMap["data"] = sendData
  61. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  62. return
  63. }
  64. func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
  65. for _, v := range items {
  66. sendMap["touser"] = v.OpenId
  67. data, err := json.Marshal(sendMap)
  68. if err != nil {
  69. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  70. return err
  71. }
  72. utils.FileLog.Info("One SendData:%s", string(data))
  73. fmt.Println(string(data))
  74. err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
  75. if err != nil {
  76. fmt.Println("send err:", err.Error())
  77. return err
  78. }
  79. }
  80. return
  81. }
  82. func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  83. client := http.Client{}
  84. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  85. if err != nil {
  86. return
  87. }
  88. defer resp.Body.Close()
  89. body, _ := ioutil.ReadAll(resp.Body)
  90. utils.FileLog.Info("SendResult:%s", string(body))
  91. var templateResponse SendTemplateResponse
  92. err = json.Unmarshal(body, &templateResponse)
  93. fmt.Println(templateResponse.Errcode)
  94. fmt.Println(templateResponse.Errmsg)
  95. if err != nil {
  96. return err
  97. }
  98. //新增模板消息推送记录
  99. {
  100. tr := new(models.UserTemplateRecord)
  101. tr.UserId = dataItem.UserId
  102. tr.OpenId = dataItem.OpenId
  103. tr.Resource = resource
  104. tr.SendData = string(data)
  105. tr.Result = string(body)
  106. tr.CreateDate = time.Now().Format(utils.FormatDate)
  107. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  108. if templateResponse.Errcode == 0 {
  109. tr.SendStatus = 1
  110. } else {
  111. tr.SendStatus = 0
  112. }
  113. tr.SendType = sendType
  114. go func() {
  115. err = models.AddUserTemplateRecord(tr)
  116. if err != nil {
  117. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  118. }
  119. }()
  120. }
  121. return
  122. }
  123. // 活动带问提醒
  124. func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, remark string, itemOpenid *models.OpenIdList, itemAct *models.ActivityDetail) (err error) {
  125. var msg string
  126. defer func() {
  127. if err != nil {
  128. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  129. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+remark, 2)
  130. }
  131. if msg != "" {
  132. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  133. }
  134. }()
  135. activityId := itemAct.ArticleId
  136. var redirectUrl string
  137. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  138. openIdArr := make([]string, 0)
  139. openIdArr = append(openIdArr, itemOpenid.OpenId)
  140. sendInfo := new(SendWxTemplate)
  141. sendInfo.Keyword1 = keyword1
  142. sendInfo.Keyword2 = keyword2
  143. sendInfo.Keyword3 = keyword3
  144. sendInfo.Keyword4 = keyword4
  145. sendInfo.Remark = remark
  146. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  147. sendInfo.RedirectUrl = redirectUrl
  148. sendInfo.RedirectTarget = 3
  149. sendInfo.Resource = strconv.Itoa(activityId)
  150. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  151. sendInfo.OpenIdArr = openIdArr
  152. err = PublicSendTemplateMsg(sendInfo)
  153. return
  154. }
  155. // 微路演新增留言提问消息提醒
  156. func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.WxUserItem, resourceId int) (err error) {
  157. var msg string
  158. defer func() {
  159. if err != nil || msg != "" {
  160. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  161. go utils.SendAlarmMsg(fmt.Sprint("发送微路演新增留言提问消息提醒失败,用户名", req.Title, "ID:", req.Id), 2)
  162. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  163. }
  164. }()
  165. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  166. if e != nil {
  167. return
  168. }
  169. if companyItem == nil {
  170. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  171. }
  172. var first string
  173. var keyword1 string
  174. var keyword2 string
  175. var keyword3 string
  176. var keyword4 string
  177. var remark string
  178. first = req.Title + "有新的留言,请及时处理"
  179. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  180. keyword3 = time.Now().Format(utils.FormatDateTime)
  181. keyword2 = ""
  182. keyword4 = req.Content
  183. mobile := companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  184. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  185. if e != nil {
  186. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  187. return
  188. }
  189. openIdArr := make([]string, 0)
  190. for _, v := range openIdList {
  191. openIdArr = append(openIdArr, v.OpenId)
  192. }
  193. //SourceType int `description:"视频来源: 1-音频; 2-活动视频; 3-微路演视频 (不传默认为1)"`
  194. redirectUrl := ""
  195. if req.SourceType == 3 {
  196. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT + strconv.Itoa(resourceId)
  197. remark = "点击进入产业资源包详情页"
  198. } else {
  199. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(resourceId)
  200. remark = "点击查看活动详情"
  201. }
  202. sendInfo := new(SendWxTemplate)
  203. sendInfo.First = first
  204. sendInfo.Keyword1 = keyword1
  205. sendInfo.Keyword2 = keyword2
  206. sendInfo.Keyword3 = keyword3
  207. sendInfo.Keyword4 = keyword4
  208. sendInfo.Remark = remark
  209. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  210. sendInfo.RedirectUrl = redirectUrl
  211. sendInfo.RedirectTarget = 3
  212. sendInfo.Resource = strconv.Itoa(req.Id)
  213. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  214. sendInfo.OpenIdArr = openIdArr
  215. err = PublicSendTemplateMsg(sendInfo)
  216. if err != nil {
  217. return
  218. }
  219. return
  220. }
  221. func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail) (err error) {
  222. var msg string
  223. defer func() {
  224. if err != nil {
  225. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  226. go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
  227. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  228. }
  229. }()
  230. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  231. if e != nil {
  232. return
  233. }
  234. if companyItem == nil {
  235. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  236. }
  237. var first string
  238. var keyword1 string
  239. var keyword2 string
  240. var keyword3 string
  241. var keyword4 string
  242. var remark string
  243. var redirectUrl string
  244. var mobile string
  245. first = "【" + articleInfo.Title + "】有新的留言,请及时处理"
  246. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  247. keyword2 = "-"
  248. keyword3 = time.Now().Format(utils.FormatDateTime)
  249. keyword4 = req.Content
  250. remark = "点击查看报告详情"
  251. if articleInfo.ArticleId >= utils.SummaryArticleId {
  252. //研选报告添加汪洋
  253. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  254. } else {
  255. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  256. }
  257. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  258. if e != nil {
  259. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  260. return
  261. }
  262. openIdArr := make([]string, 0)
  263. for _, v := range openIdList {
  264. openIdArr = append(openIdArr, v.OpenId)
  265. }
  266. redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
  267. sendInfo := new(SendWxTemplate)
  268. sendInfo.First = first
  269. sendInfo.Keyword1 = keyword1
  270. sendInfo.Keyword2 = keyword2
  271. sendInfo.Keyword3 = keyword3
  272. sendInfo.Keyword4 = keyword4
  273. sendInfo.Remark = remark
  274. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  275. sendInfo.RedirectUrl = redirectUrl
  276. sendInfo.RedirectTarget = 3
  277. sendInfo.Resource = strconv.Itoa(req.ArticleId)
  278. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  279. sendInfo.OpenIdArr = openIdArr
  280. err = PublicSendTemplateMsg(sendInfo)
  281. if err != nil {
  282. return
  283. }
  284. return
  285. }
  286. // 发送用户操作活动消息提醒
  287. func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  288. var msg string
  289. defer func() {
  290. if err != nil {
  291. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  292. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  293. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  294. }
  295. }()
  296. accessToken, err := models.GetWxAccessTokenByXzs()
  297. if err != nil {
  298. msg = "GetWxAccessToken Err:" + err.Error()
  299. return
  300. }
  301. if accessToken == "" {
  302. msg = "accessToken is empty"
  303. return
  304. }
  305. var first string
  306. first = keyWord1
  307. keyword1 := keyWord2
  308. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  309. templateId := utils.WxMsgTemplateIdArticleUserRemind
  310. sendMap := make(map[string]interface{})
  311. sendData := make(map[string]interface{})
  312. sendMap["template_id"] = templateId
  313. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  314. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  315. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  316. sendMap["data"] = sendData
  317. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  318. return
  319. }
  320. // 发送用户阅读报告消息提醒
  321. func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  322. var msg string
  323. defer func() {
  324. if err != nil {
  325. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  326. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  327. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  328. }
  329. }()
  330. accessToken, err := models.GetWxAccessTokenByXzs()
  331. if err != nil {
  332. msg = "GetWxAccessToken Err:" + err.Error()
  333. return
  334. }
  335. if accessToken == "" {
  336. msg = "accessToken is empty"
  337. return
  338. }
  339. var first string
  340. first = keyWord1
  341. keyword1 := keyWord2
  342. remark := "点击查看报告详情"
  343. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  344. templateId := utils.WxMsgTemplateIdArticleUserRemind
  345. sendMap := make(map[string]interface{})
  346. sendData := make(map[string]interface{})
  347. sendMap["template_id"] = templateId
  348. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
  349. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  350. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  351. sendData["keyword2"] = map[string]interface{}{"value": "--", "color": "#173177"}
  352. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  353. sendMap["data"] = sendData
  354. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  355. return
  356. }