wx_template_msg.go 30 KB

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