wx_template_msg.go 31 KB

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