wx_template_msg.go 32 KB

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