wx_template_msg.go 32 KB

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