wx_template_msg.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. package services
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "hongze/hongze_cygx/models"
  8. "hongze/hongze_cygx/utils"
  9. "io/ioutil"
  10. "net/http"
  11. "strconv"
  12. "time"
  13. )
  14. // 活动预开始模版消息通知
  15. func SendWxMsgWithFrequency(keyword2, activityName, reserveResults, activityTime, activityAddress, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
  16. if len(openIdList) == 0 {
  17. return
  18. }
  19. var msg string
  20. defer func() {
  21. if err != nil {
  22. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  23. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  24. }
  25. fmt.Println("line 21", err, msg)
  26. }()
  27. redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  28. sendInfo := new(SendWxTemplate)
  29. sendInfo.Keyword1 = activityName
  30. sendInfo.Keyword2 = keyword2
  31. openIdArr := make([]string, 0)
  32. for _, v := range openIdList {
  33. openIdArr = append(openIdArr, v.OpenId)
  34. }
  35. sendInfo.Remark = remark
  36. sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
  37. sendInfo.RedirectUrl = redirectUrl
  38. sendInfo.RedirectTarget = 3
  39. sendInfo.Resource = strconv.Itoa(activityId)
  40. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  41. sendInfo.OpenIdArr = openIdArr
  42. err = PublicSendTemplateMsg(sendInfo)
  43. return
  44. }
  45. // 专项调研活动预开始消息通知
  46. // func SendWxMsgWithFrequencySpecial(first, activityName, reserveResults, activityTime, activityAddress, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
  47. func SendWxMsgWithFrequencySpecial(first, keyword1, keyword2, keyword3, keyword4, remark string, openIdList []*models.OpenIdList, activityId int) (err error) {
  48. if len(openIdList) == 0 {
  49. return
  50. }
  51. var msg string
  52. defer func() {
  53. if err != nil {
  54. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  55. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  56. }
  57. }()
  58. openIdArr := make([]string, 0)
  59. for _, v := range openIdList {
  60. openIdArr = append(openIdArr, v.OpenId)
  61. }
  62. redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
  63. sendInfo := new(SendWxTemplate)
  64. sendInfo.First = first
  65. sendInfo.Keyword1 = keyword1
  66. sendInfo.Keyword2 = keyword2
  67. sendInfo.Keyword3 = keyword3
  68. sendInfo.Keyword4 = keyword4
  69. sendInfo.Remark = remark
  70. sendInfo.TemplateId = utils.WxMsgTemplateIdActivityApplyXzs
  71. sendInfo.RedirectUrl = redirectUrl
  72. sendInfo.RedirectTarget = 3
  73. sendInfo.Resource = strconv.Itoa(activityId)
  74. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  75. sendInfo.OpenIdArr = openIdArr
  76. err = PublicSendTemplateMsg(sendInfo)
  77. return
  78. }
  79. // 发送报告提问消息提醒
  80. func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
  81. if len(openIdList) == 0 {
  82. return
  83. }
  84. var msg string
  85. defer func() {
  86. if err != nil {
  87. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  88. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
  89. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  90. }
  91. fmt.Println("line 21", err, msg)
  92. }()
  93. var first string
  94. var keyword1 string
  95. var keyword2 string
  96. var keyword3 string
  97. var keyword4 string
  98. var remark string
  99. first = "研选报告有新的提问,请及时处理"
  100. keyword1 = name
  101. keyword3 = askTime
  102. keyword2 = ""
  103. keyword4 = askMsg
  104. remark = title
  105. openIdArr := make([]string, 0)
  106. for _, v := range openIdList {
  107. openIdArr = append(openIdArr, v.OpenId)
  108. }
  109. redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
  110. sendInfo := new(SendWxTemplate)
  111. sendInfo.First = first
  112. sendInfo.Keyword1 = keyword1
  113. sendInfo.Keyword2 = keyword2
  114. sendInfo.Keyword3 = keyword3
  115. sendInfo.Keyword4 = keyword4
  116. sendInfo.Remark = remark
  117. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  118. sendInfo.RedirectUrl = redirectUrl
  119. sendInfo.RedirectTarget = 3
  120. sendInfo.Resource = strconv.Itoa(articleId)
  121. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  122. sendInfo.OpenIdArr = openIdArr
  123. err = PublicSendTemplateMsg(sendInfo)
  124. if err != nil {
  125. return
  126. }
  127. return
  128. }
  129. // 到期提醒模板消息
  130. func SendWxMsgWithCompanyRemind(first, keyword1, keyword2, remark string, openIdList []*models.OpenIdList) (err error) {
  131. var msg string
  132. defer func() {
  133. if err != nil {
  134. fmt.Println(err)
  135. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  136. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  137. }
  138. }()
  139. accessToken, err := models.GetWxAccessToken()
  140. if err != nil {
  141. msg = "GetWxAccessToken Err:" + err.Error()
  142. return
  143. }
  144. if accessToken == "" {
  145. msg = "accessToken is empty"
  146. return
  147. }
  148. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  149. sendMap := make(map[string]interface{})
  150. sendData := make(map[string]interface{})
  151. sendMap["template_id"] = utils.WxMsgTemplateIdActivityChange
  152. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  153. sendData["productname"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  154. sendData["date"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  155. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  156. sendMap["data"] = sendData
  157. fmt.Println(accessToken)
  158. fmt.Println(sendUrl)
  159. //WxSendTemplateMsg(sendUrl, sendMap, openIdList)
  160. return
  161. }
  162. // 发送报告提问消息提醒
  163. func SendWxMsgWithArticleClassToAdmin(keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  164. if len(openIdList) == 0 {
  165. return
  166. }
  167. var msg string
  168. defer func() {
  169. if err != nil {
  170. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  171. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  172. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  173. }
  174. }()
  175. accessToken, err := models.GetWxAccessTokenByXzs()
  176. if err != nil {
  177. msg = "GetWxAccessToken Err:" + err.Error()
  178. return
  179. }
  180. if accessToken == "" {
  181. msg = "accessToken is empty"
  182. return
  183. }
  184. var first string
  185. first = keyWord1
  186. keyword1 := keyWord2
  187. keyword2 := keyWord3
  188. keyword3 := keyWord4
  189. keyword4 := ""
  190. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  191. templateId := utils.TemplateIdByProductXzs
  192. sendMap := make(map[string]interface{})
  193. sendData := make(map[string]interface{})
  194. sendMap["template_id"] = templateId
  195. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
  196. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  197. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  198. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
  199. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
  200. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
  201. sendMap["data"] = sendData
  202. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  203. return
  204. }
  205. // 发送用户阅读报告消息提醒
  206. func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
  207. if len(openIdList) == 0 {
  208. return
  209. }
  210. var msg string
  211. defer func() {
  212. if err != nil {
  213. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  214. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  215. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  216. }
  217. }()
  218. accessToken, err := models.GetWxAccessTokenByXzs()
  219. if err != nil {
  220. msg = "GetWxAccessToken Err:" + err.Error()
  221. return
  222. }
  223. if accessToken == "" {
  224. msg = "accessToken is empty"
  225. return
  226. }
  227. var first string
  228. first = keyWord1
  229. //keyword1 := keyWord2
  230. //keyword1 := keyWord2
  231. remark := "点击查看报告详情"
  232. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  233. templateId := utils.WxMsgTemplateIdArticleUserRemind
  234. sendMap := make(map[string]interface{})
  235. sendData := make(map[string]interface{})
  236. sendMap["template_id"] = templateId
  237. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
  238. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  239. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  240. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  241. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  242. sendMap["data"] = sendData
  243. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  244. return
  245. }
  246. // 发送用户操作活动消息提醒
  247. func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  248. if len(openIdList) == 0 {
  249. return
  250. }
  251. var msg string
  252. defer func() {
  253. if err != nil {
  254. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  255. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  256. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  257. }
  258. }()
  259. accessToken, err := models.GetWxAccessTokenByXzs()
  260. if err != nil {
  261. msg = "GetWxAccessToken Err:" + err.Error()
  262. return
  263. }
  264. if accessToken == "" {
  265. msg = "accessToken is empty"
  266. return
  267. }
  268. var first string
  269. //first = keyWord1
  270. //keyword1 := keyWord2
  271. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  272. templateId := utils.WxMsgTemplateIdArticleUserRemind
  273. sendMap := make(map[string]interface{})
  274. sendData := make(map[string]interface{})
  275. sendMap["template_id"] = templateId
  276. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  277. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  278. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  279. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  280. sendMap["data"] = sendData
  281. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  282. return
  283. }
  284. // 发送用户操作专项调研活动消息提醒
  285. func SendWxMsgWithSpecialActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  286. if len(openIdList) == 0 {
  287. return
  288. }
  289. var msg string
  290. defer func() {
  291. if err != nil {
  292. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  293. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  294. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  295. }
  296. }()
  297. accessToken, err := models.GetWxAccessTokenByXzs()
  298. if err != nil {
  299. msg = "GetWxAccessToken Err:" + err.Error()
  300. return
  301. }
  302. if accessToken == "" {
  303. msg = "accessToken is empty"
  304. return
  305. }
  306. var first string
  307. first = keyWord1
  308. keyword1 := keyWord2
  309. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  310. templateId := utils.WxMsgTemplateIdArticleUserRemind
  311. sendMap := make(map[string]interface{})
  312. sendData := make(map[string]interface{})
  313. sendMap["template_id"] = templateId
  314. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/specialDetail/specialDetail?id=" + strconv.Itoa(activityId)}
  315. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  316. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  317. sendMap["data"] = sendData
  318. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  319. return
  320. }
  321. // 活动带问提醒
  322. func SendActivityAskApplyTemplateMsg(applyName, applyTime, askContent, activityName string, activityId int, itemOpenid *models.OpenIdList) (err error) {
  323. var msg string
  324. defer func() {
  325. if err != nil {
  326. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  327. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+activityName, 2)
  328. }
  329. if msg != "" {
  330. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  331. }
  332. }()
  333. var accessToken string
  334. if utils.RunMode == "release" {
  335. accessToken, err = models.GetWxAccessTokenByXzs()
  336. if err != nil {
  337. msg = "GetWxAccessToken Err:" + err.Error()
  338. return
  339. }
  340. if accessToken == "" {
  341. msg = "accessToken is empty"
  342. return
  343. }
  344. } else {
  345. accessToken, err = models.GetWxAccessToken()
  346. if err != nil {
  347. msg = "GetWxAccessToken Err:" + err.Error()
  348. return
  349. }
  350. if accessToken == "" {
  351. msg = "accessToken is empty"
  352. return
  353. }
  354. }
  355. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  356. sendMap := make(map[string]interface{})
  357. sendData := make(map[string]interface{})
  358. first := "有新的客户提问"
  359. keyword1 := applyName
  360. keyword2 := "-"
  361. keyword3 := applyTime
  362. keyword4 := askContent
  363. remark := activityName
  364. fontColor := "#D9001B"
  365. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  366. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  367. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  368. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  369. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  370. sendData["remark"] = map[string]interface{}{"value": remark, "color": fontColor}
  371. if utils.RunMode == "release" {
  372. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  373. } else {
  374. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  375. }
  376. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  377. sendMap["data"] = sendData
  378. sendTemplateMsg(sendUrl, sendMap, itemOpenid, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
  379. fmt.Println("send end")
  380. return
  381. }
  382. // 活动带问提醒
  383. func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, remark string, itemOpenid *models.OpenIdList, itemAct *models.ActivityDetail, msgId int) (err error) {
  384. var msg string
  385. defer func() {
  386. if err != nil {
  387. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  388. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+remark, 2)
  389. }
  390. if msg != "" {
  391. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  392. }
  393. }()
  394. activityId := itemAct.ActivityId
  395. var redirectUrl string
  396. //redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  397. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  398. //if utils.RunMode != "release" {
  399. //
  400. //} else {
  401. //
  402. //}
  403. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=2"
  404. openIdArr := make([]string, 0)
  405. openIdArr = append(openIdArr, itemOpenid.OpenId)
  406. sendInfo := new(SendWxTemplate)
  407. sendInfo.Keyword1 = keyword1
  408. sendInfo.Keyword2 = keyword2
  409. sendInfo.Keyword3 = keyword3
  410. sendInfo.Keyword4 = keyword4
  411. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  412. sendInfo.Remark = remark
  413. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  414. sendInfo.RedirectUrl = redirectUrl
  415. sendInfo.RedirectTarget = 3
  416. sendInfo.Resource = strconv.Itoa(activityId)
  417. sendInfo.OpenIdArr = openIdArr
  418. err = PublicSendTemplateMsg(sendInfo)
  419. return
  420. }
  421. // 专项产业调研模板消息推送
  422. func SendSpecialTemplateMsg(applyName, applyTime, mobile, activityName, resource string, itemOpenid *models.OpenIdList) (err error) {
  423. var msg string
  424. defer func() {
  425. if err != nil {
  426. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  427. go utils.SendAlarmMsg("专项产业调研模板消息推送消息失败"+activityName, 2)
  428. }
  429. if msg != "" {
  430. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  431. }
  432. }()
  433. var accessToken string
  434. if utils.RunMode == "release" {
  435. accessToken, err = models.GetWxAccessTokenByXzs()
  436. if err != nil {
  437. msg = "GetWxAccessToken Err:" + err.Error()
  438. return
  439. }
  440. if accessToken == "" {
  441. msg = "accessToken is empty"
  442. return
  443. }
  444. } else {
  445. accessToken, err = models.GetWxAccessToken()
  446. if err != nil {
  447. msg = "GetWxAccessToken Err:" + err.Error()
  448. return
  449. }
  450. if accessToken == "" {
  451. msg = "accessToken is empty"
  452. return
  453. }
  454. }
  455. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  456. sendMap := make(map[string]interface{})
  457. sendData := make(map[string]interface{})
  458. var first string
  459. if resource == "sale" {
  460. first = "有客户对专项调研感兴趣"
  461. } else {
  462. first = "有5家公司预报名专项调研"
  463. }
  464. keyword1 := applyName
  465. keyword2 := mobile
  466. keyword3 := applyTime
  467. keyword4 := activityName
  468. fontColor := "#D9001B"
  469. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  470. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  471. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  472. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  473. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  474. if utils.RunMode == "release" {
  475. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  476. } else {
  477. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  478. }
  479. sendMap["data"] = sendData
  480. sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
  481. return
  482. }
  483. //弘则投资:
  484. //Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY 活动预约通知
  485. //CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM 项目状态变更通知
  486. //
  487. //
  488. //弘则研究:
  489. //MwZ5wxfd0O1Yt0Pkf6OkfWP4USQzZbiEo5SkZ26735s 活动预约通知
  490. //dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0 项目状态变更通知
  491. func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
  492. for _, v := range items {
  493. sendMap["touser"] = v.OpenId
  494. data, err := json.Marshal(sendMap)
  495. if err != nil {
  496. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  497. return err
  498. }
  499. utils.FileLog.Info("One SendData:%s", string(data))
  500. fmt.Println(string(data))
  501. err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
  502. if err != nil {
  503. fmt.Println("send err:", err.Error())
  504. return err
  505. }
  506. }
  507. return
  508. }
  509. func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  510. client := http.Client{}
  511. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  512. if err != nil {
  513. return
  514. }
  515. defer resp.Body.Close()
  516. body, _ := ioutil.ReadAll(resp.Body)
  517. utils.FileLog.Info("SendResult:%s", string(body))
  518. var templateResponse models.SendTemplateResponse
  519. err = json.Unmarshal(body, &templateResponse)
  520. fmt.Println(templateResponse.Errcode)
  521. fmt.Println(templateResponse.Errmsg)
  522. if err != nil {
  523. return err
  524. }
  525. //新增模板消息推送记录
  526. {
  527. tr := new(models.UserTemplateRecord)
  528. tr.UserId = dataItem.UserId
  529. tr.OpenId = dataItem.OpenId
  530. tr.Resource = resource
  531. tr.SendData = string(data)
  532. tr.Result = string(body)
  533. tr.CreateDate = time.Now().Format(utils.FormatDate)
  534. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  535. if templateResponse.Errcode == 0 {
  536. tr.SendStatus = 1
  537. } else {
  538. tr.SendStatus = 0
  539. }
  540. tr.SendType = sendType
  541. go func() {
  542. err = models.AddUserTemplateRecord(tr)
  543. if err != nil {
  544. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  545. }
  546. }()
  547. }
  548. return
  549. }
  550. // 发送报告更新的消息给预约的用户
  551. func SendWxMsgWithArticleUpdate(first, keyWord1, keyWord2, keyWord3, keyWord4 string, item *models.OpenIdList, articleId int) (err error) {
  552. var msg string
  553. defer func() {
  554. if err != nil {
  555. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  556. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  557. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  558. }
  559. }()
  560. accessToken, err := models.GetWxAccessTokenByXzs()
  561. if err != nil {
  562. msg = "GetWxAccessToken Err:" + err.Error()
  563. return
  564. }
  565. if accessToken == "" {
  566. msg = "accessToken is empty"
  567. return
  568. }
  569. var openIdList []*models.OpenIdList
  570. openIdList = append(openIdList, item)
  571. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  572. templateId := utils.TemplateIdByProductXzs
  573. sendMap := make(map[string]interface{})
  574. sendData := make(map[string]interface{})
  575. sendMap["template_id"] = templateId
  576. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId) + "&IsSendWx=1"}
  577. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  578. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  579. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  580. sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
  581. sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
  582. sendData["remark"] = map[string]interface{}{"value": "点击查看报告详情", "color": "#173177"}
  583. sendMap["data"] = sendData
  584. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  585. return
  586. }
  587. // 周日下午4点半,推送全部活动
  588. func SendActivityOnenIdWxTemplateMsg(first, keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList) (err error) {
  589. var msg string
  590. defer func() {
  591. if err != nil {
  592. go utils.SendEmail("周日下午4点半,推送全部活"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  593. go utils.SendAlarmMsg(fmt.Sprint("发送周日下午4点半,推送全部活模版消息失败,"), 2)
  594. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  595. }
  596. }()
  597. accessToken, err := models.GetWxAccessTokenByXzs()
  598. if err != nil {
  599. msg = "GetWxAccessToken Err:" + err.Error()
  600. return
  601. }
  602. if accessToken == "" {
  603. msg = "accessToken is empty"
  604. return
  605. }
  606. //var openIdList []*models.OpenIdList
  607. //openIdList = append(openIdList, item)
  608. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  609. templateId := utils.WxMsgTemplateIdArticleUserRemind
  610. sendMap := make(map[string]interface{})
  611. sendData := make(map[string]interface{})
  612. sendMap["template_id"] = templateId
  613. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
  614. //sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
  615. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  616. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  617. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  618. sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
  619. sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
  620. sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
  621. sendMap["data"] = sendData
  622. WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  623. return
  624. }
  625. // 发送用户留言提醒
  626. // func SendCommentWxTemplateMsg(title, companyName, userName, sellerName, createTime, content string, openIdList []*models.OpenIdList, articleId int) (err error) {
  627. func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
  628. var msg string
  629. defer func() {
  630. if err != nil {
  631. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  632. go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
  633. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  634. }
  635. }()
  636. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  637. if e != nil {
  638. return
  639. }
  640. if companyItem == nil {
  641. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  642. }
  643. var first string
  644. var keyword1 string
  645. var keyword2 string
  646. var keyword3 string
  647. var keyword4 string
  648. var remark string
  649. var redirectUrl string
  650. var mobile string
  651. first = "【" + articleInfo.Title + "】有新的留言,请及时处理"
  652. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  653. keyword2 = "留言:" + articleInfo.Title
  654. keyword3 = time.Now().Format(utils.FormatDateTime)
  655. keyword4 = req.Content
  656. remark = "点击查看报告详情"
  657. if articleInfo.ArticleTypeId > 0 {
  658. //研选报告添加汪洋
  659. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  660. } else {
  661. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  662. }
  663. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  664. if e != nil {
  665. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  666. return
  667. }
  668. openIdArr := make([]string, 0)
  669. for _, v := range openIdList {
  670. openIdArr = append(openIdArr, v.OpenId)
  671. }
  672. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  673. if utils.RunMode != "release" {
  674. redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
  675. } else {
  676. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=1"
  677. }
  678. sendInfo := new(SendWxTemplate)
  679. sendInfo.First = first
  680. sendInfo.Keyword1 = keyword1
  681. sendInfo.Keyword2 = keyword2
  682. sendInfo.Keyword3 = keyword3
  683. sendInfo.Keyword4 = keyword4
  684. sendInfo.Remark = remark
  685. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  686. sendInfo.RedirectUrl = redirectUrl
  687. sendInfo.RedirectTarget = 3
  688. sendInfo.Resource = strconv.Itoa(req.ArticleId)
  689. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  690. sendInfo.OpenIdArr = openIdArr
  691. err = PublicSendTemplateMsg(sendInfo)
  692. if err != nil {
  693. return
  694. }
  695. return
  696. }
  697. // 微路演新增留言提问消息提醒
  698. func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.WxUserItem, resourceId, msgId int, title string, isResearch bool) (err error) {
  699. var msg string
  700. defer func() {
  701. if err != nil || msg != "" {
  702. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  703. go utils.SendAlarmMsg(fmt.Sprint("发送微路演新增留言提问消息提醒失败,用户名", req.Title, "ID:", req.Id), 2)
  704. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  705. }
  706. }()
  707. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  708. if e != nil {
  709. return
  710. }
  711. if companyItem == nil {
  712. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  713. }
  714. var first string
  715. var keyword1 string
  716. var keyword2 string
  717. var keyword3 string
  718. var keyword4 string
  719. var remark string
  720. var mobile string
  721. first = req.Title + "有新的留言,请及时处理"
  722. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  723. keyword3 = time.Now().Format(utils.FormatDateTime)
  724. keyword2 = "留言:" + title
  725. keyword4 = req.Content
  726. if isResearch {
  727. //研选报告添加汪洋
  728. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  729. } else {
  730. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  731. }
  732. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  733. if e != nil {
  734. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  735. return
  736. }
  737. openIdArr := make([]string, 0)
  738. for _, v := range openIdList {
  739. openIdArr = append(openIdArr, v.OpenId)
  740. }
  741. mapSource := make(map[int]string)
  742. mapSource[1] = "5"
  743. mapSource[2] = "4"
  744. mapSource[3] = "3"
  745. if mapSource[resourceId] == "" {
  746. err = errors.New("留言消息类型错误, resourceId: " + strconv.Itoa(resourceId))
  747. return
  748. }
  749. //SourceType int `description:"视频来源: 1-音频; 2-活动视频; 3-微路演视频 (不传默认为1)"`
  750. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  751. redirectUrl := ""
  752. if utils.RunMode != "release" {
  753. if req.SourceType == 3 {
  754. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT + strconv.Itoa(resourceId)
  755. remark = "点击进入产业资源包详情页"
  756. } else {
  757. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(resourceId)
  758. remark = "点击查看活动详情"
  759. }
  760. } else {
  761. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=" + mapSource[resourceId]
  762. }
  763. sendInfo := new(SendWxTemplate)
  764. sendInfo.First = first
  765. sendInfo.Keyword1 = keyword1
  766. sendInfo.Keyword2 = keyword2
  767. sendInfo.Keyword3 = keyword3
  768. sendInfo.Keyword4 = keyword4
  769. sendInfo.Remark = remark
  770. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  771. sendInfo.RedirectUrl = redirectUrl
  772. sendInfo.RedirectTarget = 3
  773. sendInfo.Resource = strconv.Itoa(req.Id)
  774. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  775. sendInfo.OpenIdArr = openIdArr
  776. err = PublicSendTemplateMsg(sendInfo)
  777. if err != nil {
  778. return
  779. }
  780. return
  781. }