wx_template_msg.go 32 KB

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