wx_template_msg.go 32 KB

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