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