wx_template_msg.go 34 KB

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