wx_template_msg.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  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. //keyword1 := keyWord2
  268. remark := "点击查看报告详情"
  269. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  270. templateId := utils.WxMsgTemplateIdArticleUserRemind
  271. sendMap := make(map[string]interface{})
  272. sendData := make(map[string]interface{})
  273. sendMap["template_id"] = templateId
  274. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
  275. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  276. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  277. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  278. sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
  279. sendMap["data"] = sendData
  280. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  281. return
  282. }
  283. // 发送用户操作活动消息提醒
  284. func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  285. var msg string
  286. defer func() {
  287. if err != nil {
  288. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  289. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  290. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  291. }
  292. }()
  293. accessToken, err := models.GetWxAccessTokenByXzs()
  294. if err != nil {
  295. msg = "GetWxAccessToken Err:" + err.Error()
  296. return
  297. }
  298. if accessToken == "" {
  299. msg = "accessToken is empty"
  300. return
  301. }
  302. var first string
  303. //first = keyWord1
  304. //keyword1 := keyWord2
  305. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  306. templateId := utils.WxMsgTemplateIdArticleUserRemind
  307. sendMap := make(map[string]interface{})
  308. sendData := make(map[string]interface{})
  309. sendMap["template_id"] = templateId
  310. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  311. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  312. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  313. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  314. sendMap["data"] = sendData
  315. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  316. return
  317. }
  318. // 发送用户操作专项调研活动消息提醒
  319. func SendWxMsgWithSpecialActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  320. var msg string
  321. defer func() {
  322. if err != nil {
  323. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  324. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
  325. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  326. }
  327. }()
  328. accessToken, err := models.GetWxAccessTokenByXzs()
  329. if err != nil {
  330. msg = "GetWxAccessToken Err:" + err.Error()
  331. return
  332. }
  333. if accessToken == "" {
  334. msg = "accessToken is empty"
  335. return
  336. }
  337. var first string
  338. first = keyWord1
  339. keyword1 := keyWord2
  340. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  341. templateId := utils.WxMsgTemplateIdArticleUserRemind
  342. sendMap := make(map[string]interface{})
  343. sendData := make(map[string]interface{})
  344. sendMap["template_id"] = templateId
  345. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/specialDetail/specialDetail?id=" + strconv.Itoa(activityId)}
  346. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  347. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
  348. sendMap["data"] = sendData
  349. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  350. return
  351. }
  352. // 活动带问提醒
  353. func SendActivityAskApplyTemplateMsg(applyName, applyTime, askContent, activityName string, activityId int, itemOpenid *models.OpenIdList) (err error) {
  354. var msg string
  355. defer func() {
  356. if err != nil {
  357. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  358. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+activityName, 2)
  359. }
  360. if msg != "" {
  361. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  362. }
  363. }()
  364. var accessToken string
  365. if utils.RunMode == "release" {
  366. accessToken, err = models.GetWxAccessTokenByXzs()
  367. if err != nil {
  368. msg = "GetWxAccessToken Err:" + err.Error()
  369. return
  370. }
  371. if accessToken == "" {
  372. msg = "accessToken is empty"
  373. return
  374. }
  375. } else {
  376. accessToken, err = models.GetWxAccessToken()
  377. if err != nil {
  378. msg = "GetWxAccessToken Err:" + err.Error()
  379. return
  380. }
  381. if accessToken == "" {
  382. msg = "accessToken is empty"
  383. return
  384. }
  385. }
  386. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  387. sendMap := make(map[string]interface{})
  388. sendData := make(map[string]interface{})
  389. first := "有新的客户提问"
  390. keyword1 := applyName
  391. keyword2 := "-"
  392. keyword3 := applyTime
  393. keyword4 := askContent
  394. remark := activityName
  395. fontColor := "#D9001B"
  396. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  397. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  398. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  399. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  400. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  401. sendData["remark"] = map[string]interface{}{"value": remark, "color": fontColor}
  402. if utils.RunMode == "release" {
  403. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  404. } else {
  405. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  406. }
  407. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  408. sendMap["data"] = sendData
  409. sendTemplateMsg(sendUrl, sendMap, itemOpenid, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
  410. fmt.Println("send end")
  411. return
  412. }
  413. // 活动带问提醒
  414. func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, remark string, itemOpenid *models.OpenIdList, itemAct *models.ActivityDetail, msgId int) (err error) {
  415. var msg string
  416. defer func() {
  417. if err != nil {
  418. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  419. go utils.SendAlarmMsg("活动带问提醒发送模版消息失败"+remark, 2)
  420. }
  421. if msg != "" {
  422. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  423. }
  424. }()
  425. activityId := itemAct.ActivityId
  426. var redirectUrl string
  427. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  428. openIdArr := make([]string, 0)
  429. openIdArr = append(openIdArr, itemOpenid.OpenId)
  430. sendInfo := new(SendWxTemplate)
  431. sendInfo.Keyword1 = keyword1
  432. sendInfo.Keyword2 = keyword2
  433. sendInfo.Keyword3 = keyword3
  434. sendInfo.Keyword4 = keyword4
  435. sendInfo.Remark = remark
  436. sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
  437. sendInfo.RedirectUrl = redirectUrl
  438. sendInfo.RedirectTarget = 3
  439. sendInfo.Resource = strconv.Itoa(activityId)
  440. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  441. if utils.RunMode != "release" {
  442. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
  443. } else {
  444. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=2"
  445. }
  446. sendInfo.OpenIdArr = openIdArr
  447. err = PublicSendTemplateMsg(sendInfo)
  448. return
  449. }
  450. // 专项产业调研模板消息推送
  451. func SendSpecialTemplateMsg(applyName, applyTime, mobile, activityName, resource string, itemOpenid *models.OpenIdList) (err error) {
  452. var msg string
  453. defer func() {
  454. if err != nil {
  455. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  456. go utils.SendAlarmMsg("专项产业调研模板消息推送消息失败"+activityName, 2)
  457. }
  458. if msg != "" {
  459. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  460. }
  461. }()
  462. var accessToken string
  463. if utils.RunMode == "release" {
  464. accessToken, err = models.GetWxAccessTokenByXzs()
  465. if err != nil {
  466. msg = "GetWxAccessToken Err:" + err.Error()
  467. return
  468. }
  469. if accessToken == "" {
  470. msg = "accessToken is empty"
  471. return
  472. }
  473. } else {
  474. accessToken, err = models.GetWxAccessToken()
  475. if err != nil {
  476. msg = "GetWxAccessToken Err:" + err.Error()
  477. return
  478. }
  479. if accessToken == "" {
  480. msg = "accessToken is empty"
  481. return
  482. }
  483. }
  484. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  485. sendMap := make(map[string]interface{})
  486. sendData := make(map[string]interface{})
  487. var first string
  488. if resource == "sale" {
  489. first = "有客户对专项调研感兴趣"
  490. } else {
  491. first = "有5家公司预报名专项调研"
  492. }
  493. keyword1 := applyName
  494. keyword2 := mobile
  495. keyword3 := applyTime
  496. keyword4 := activityName
  497. fontColor := "#D9001B"
  498. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  499. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  500. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  501. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  502. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  503. if utils.RunMode == "release" {
  504. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  505. } else {
  506. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  507. }
  508. sendMap["data"] = sendData
  509. sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
  510. return
  511. }
  512. //弘则投资:
  513. //Y59n_AHg-RLCKaz293geW76KDHpGL1qOnE7eF_lxelY 活动预约通知
  514. //CB7bOl7f3viMG4s1uhRo7WM0Jbx3WvodKuIZ8A_z8fM 项目状态变更通知
  515. //
  516. //
  517. //弘则研究:
  518. //MwZ5wxfd0O1Yt0Pkf6OkfWP4USQzZbiEo5SkZ26735s 活动预约通知
  519. //dYg6iHooRq74PyCXmw_Ns7qdJZmbtLoKS2p2FKeaXl0 项目状态变更通知
  520. func WxSendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*models.OpenIdList, resource string, sendType int) (err error) {
  521. for _, v := range items {
  522. sendMap["touser"] = v.OpenId
  523. data, err := json.Marshal(sendMap)
  524. if err != nil {
  525. fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
  526. return err
  527. }
  528. utils.FileLog.Info("One SendData:%s", string(data))
  529. fmt.Println(string(data))
  530. err = SendTemplateMsg(sendUrl, data, resource, sendType, v)
  531. if err != nil {
  532. fmt.Println("send err:", err.Error())
  533. return err
  534. }
  535. }
  536. return
  537. }
  538. func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, dataItem *models.OpenIdList) (err error) {
  539. client := http.Client{}
  540. resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
  541. if err != nil {
  542. return
  543. }
  544. defer resp.Body.Close()
  545. body, _ := ioutil.ReadAll(resp.Body)
  546. utils.FileLog.Info("SendResult:%s", string(body))
  547. var templateResponse models.SendTemplateResponse
  548. err = json.Unmarshal(body, &templateResponse)
  549. fmt.Println(templateResponse.Errcode)
  550. fmt.Println(templateResponse.Errmsg)
  551. if err != nil {
  552. return err
  553. }
  554. //新增模板消息推送记录
  555. {
  556. tr := new(models.UserTemplateRecord)
  557. tr.UserId = dataItem.UserId
  558. tr.OpenId = dataItem.OpenId
  559. tr.Resource = resource
  560. tr.SendData = string(data)
  561. tr.Result = string(body)
  562. tr.CreateDate = time.Now().Format(utils.FormatDate)
  563. tr.CreateTime = time.Now().Format(utils.FormatDateTime)
  564. if templateResponse.Errcode == 0 {
  565. tr.SendStatus = 1
  566. } else {
  567. tr.SendStatus = 0
  568. }
  569. tr.SendType = sendType
  570. go func() {
  571. err = models.AddUserTemplateRecord(tr)
  572. if err != nil {
  573. utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
  574. }
  575. }()
  576. }
  577. return
  578. }
  579. // 发送报告更新的消息给预约的用户
  580. func SendWxMsgWithArticleUpdate(first, keyWord1, keyWord2, keyWord3, keyWord4 string, item *models.OpenIdList, articleId int) (err error) {
  581. var msg string
  582. defer func() {
  583. if err != nil {
  584. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  585. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
  586. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  587. }
  588. }()
  589. accessToken, err := models.GetWxAccessTokenByXzs()
  590. if err != nil {
  591. msg = "GetWxAccessToken Err:" + err.Error()
  592. return
  593. }
  594. if accessToken == "" {
  595. msg = "accessToken is empty"
  596. return
  597. }
  598. var openIdList []*models.OpenIdList
  599. openIdList = append(openIdList, item)
  600. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  601. templateId := utils.TemplateIdByProductXzs
  602. sendMap := make(map[string]interface{})
  603. sendData := make(map[string]interface{})
  604. sendMap["template_id"] = templateId
  605. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pageMy/reportDetail/reportDetail?id=" + strconv.Itoa(articleId) + "&IsSendWx=1"}
  606. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  607. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  608. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  609. sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
  610. sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
  611. sendData["remark"] = map[string]interface{}{"value": "点击查看报告详情", "color": "#173177"}
  612. sendMap["data"] = sendData
  613. WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  614. return
  615. }
  616. // 周日下午4点半,推送全部活动
  617. func SendActivityOnenIdWxTemplateMsg(first, keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList) (err error) {
  618. var msg string
  619. defer func() {
  620. if err != nil {
  621. go utils.SendEmail("周日下午4点半,推送全部活"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  622. go utils.SendAlarmMsg(fmt.Sprint("发送周日下午4点半,推送全部活模版消息失败,"), 2)
  623. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  624. }
  625. }()
  626. accessToken, err := models.GetWxAccessTokenByXzs()
  627. if err != nil {
  628. msg = "GetWxAccessToken Err:" + err.Error()
  629. return
  630. }
  631. if accessToken == "" {
  632. msg = "accessToken is empty"
  633. return
  634. }
  635. //var openIdList []*models.OpenIdList
  636. //openIdList = append(openIdList, item)
  637. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  638. templateId := utils.WxMsgTemplateIdArticleUserRemind
  639. sendMap := make(map[string]interface{})
  640. sendData := make(map[string]interface{})
  641. sendMap["template_id"] = templateId
  642. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/activity/activity"}
  643. //sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
  644. sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
  645. sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
  646. sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
  647. sendData["keyword3"] = map[string]interface{}{"value": keyWord3, "color": "#173177"}
  648. sendData["keyword4"] = map[string]interface{}{"value": keyWord4, "color": "#173177"}
  649. sendData["remark"] = map[string]interface{}{"value": "点击查看下周活动列表", "color": "#173177"}
  650. sendMap["data"] = sendData
  651. WxSendTemplateMsg(sendUrl, sendMap, openIdList, "", utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
  652. return
  653. }
  654. // 发送用户留言提醒
  655. // func SendCommentWxTemplateMsg(title, companyName, userName, sellerName, createTime, content string, openIdList []*models.OpenIdList, articleId int) (err error) {
  656. func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
  657. var msg string
  658. defer func() {
  659. if err != nil {
  660. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  661. go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
  662. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  663. }
  664. }()
  665. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  666. if e != nil {
  667. return
  668. }
  669. if companyItem == nil {
  670. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  671. }
  672. var first string
  673. var keyword1 string
  674. var keyword2 string
  675. var keyword3 string
  676. var keyword4 string
  677. var remark string
  678. var redirectUrl string
  679. var mobile string
  680. first = "【" + articleInfo.Title + "】有新的留言,请及时处理"
  681. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  682. keyword2 = "留言:" + articleInfo.Title
  683. keyword3 = time.Now().Format(utils.FormatDateTime)
  684. keyword4 = req.Content
  685. remark = "点击查看报告详情"
  686. if articleInfo.ArticleId >= utils.SummaryArticleId {
  687. //研选报告添加汪洋
  688. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
  689. } else {
  690. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  691. }
  692. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  693. if e != nil {
  694. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  695. return
  696. }
  697. openIdArr := make([]string, 0)
  698. for _, v := range openIdList {
  699. openIdArr = append(openIdArr, v.OpenId)
  700. }
  701. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  702. if utils.RunMode != "release" {
  703. redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
  704. } else {
  705. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=1"
  706. }
  707. sendInfo := new(SendWxTemplate)
  708. sendInfo.First = first
  709. sendInfo.Keyword1 = keyword1
  710. sendInfo.Keyword2 = keyword2
  711. sendInfo.Keyword3 = keyword3
  712. sendInfo.Keyword4 = keyword4
  713. sendInfo.Remark = remark
  714. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  715. sendInfo.RedirectUrl = redirectUrl
  716. sendInfo.RedirectTarget = 3
  717. sendInfo.Resource = strconv.Itoa(req.ArticleId)
  718. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  719. sendInfo.OpenIdArr = openIdArr
  720. err = PublicSendTemplateMsg(sendInfo)
  721. if err != nil {
  722. return
  723. }
  724. return
  725. }
  726. // 微路演新增留言提问消息提醒
  727. func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.WxUserItem, resourceId, msgId int) (err error) {
  728. var msg string
  729. defer func() {
  730. if err != nil || msg != "" {
  731. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  732. go utils.SendAlarmMsg(fmt.Sprint("发送微路演新增留言提问消息提醒失败,用户名", req.Title, "ID:", req.Id), 2)
  733. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  734. }
  735. }()
  736. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  737. if e != nil {
  738. return
  739. }
  740. if companyItem == nil {
  741. msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
  742. }
  743. var first string
  744. var keyword1 string
  745. var keyword2 string
  746. var keyword3 string
  747. var keyword4 string
  748. var remark string
  749. first = req.Title + "有新的留言,请及时处理"
  750. keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
  751. keyword3 = time.Now().Format(utils.FormatDateTime)
  752. keyword2 = ""
  753. keyword4 = req.Content
  754. mobile := companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
  755. openIdList, e := models.GetWxOpenIdByMobileList(mobile)
  756. if e != nil {
  757. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  758. return
  759. }
  760. openIdArr := make([]string, 0)
  761. for _, v := range openIdList {
  762. openIdArr = append(openIdArr, v.OpenId)
  763. }
  764. mapSource := make(map[int]string)
  765. mapSource[1] = "5"
  766. mapSource[2] = "4"
  767. mapSource[3] = "3"
  768. if mapSource[resourceId] == "" {
  769. err = errors.New("留言消息类型错误, resourceId: " + strconv.Itoa(resourceId))
  770. return
  771. }
  772. //SourceType int `description:"视频来源: 1-音频; 2-活动视频; 3-微路演视频 (不传默认为1)"`
  773. //mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
  774. redirectUrl := ""
  775. if utils.RunMode != "release" {
  776. if req.SourceType == 3 {
  777. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT + strconv.Itoa(resourceId)
  778. remark = "点击进入产业资源包详情页"
  779. } else {
  780. redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(resourceId)
  781. remark = "点击查看活动详情"
  782. }
  783. } else {
  784. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=" + mapSource[resourceId]
  785. }
  786. sendInfo := new(SendWxTemplate)
  787. sendInfo.First = first
  788. sendInfo.Keyword1 = keyword1
  789. sendInfo.Keyword2 = keyword2
  790. sendInfo.Keyword3 = keyword3
  791. sendInfo.Keyword4 = keyword4
  792. sendInfo.Remark = remark
  793. sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
  794. sendInfo.RedirectUrl = redirectUrl
  795. sendInfo.RedirectTarget = 3
  796. sendInfo.Resource = strconv.Itoa(req.Id)
  797. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
  798. sendInfo.OpenIdArr = openIdArr
  799. err = PublicSendTemplateMsg(sendInfo)
  800. if err != nil {
  801. return
  802. }
  803. return
  804. }