wx_category_template_msg.go 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995
  1. package services
  2. import (
  3. "context"
  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. type SendWxCategoryTemplate struct {
  16. WxAppId string `description:"公众号appId"`
  17. Keywords []string `description:"模板消息keyword字段"`
  18. TemplateId string `description:"模板id"`
  19. RedirectUrl string `description:"跳转地址"`
  20. RedirectTarget int `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序,3:查研观向,4:买方研选"`
  21. Resource string `description:"资源唯一标识"`
  22. SendType int `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
  23. OpenIdArr []string `description:"消息接收者openid"`
  24. }
  25. // 推送类目模板消息
  26. func SendCategoryTemplateMsg(sendInfo *SendWxCategoryTemplate) (err error) {
  27. if len(sendInfo.OpenIdArr) == 0 {
  28. return
  29. }
  30. postData, err := json.Marshal(sendInfo)
  31. if err != nil {
  32. go utils.SendAlarmMsg("SendCategoryTemplateMsg json.Marshal Err:"+err.Error(), 1)
  33. return err
  34. }
  35. body := ioutil.NopCloser(strings.NewReader(string(postData)))
  36. client := &http.Client{}
  37. req, err := http.NewRequest("POST", utils.SendWxCategoryTemplateMsgUrl, body)
  38. if err != nil {
  39. go utils.SendAlarmMsg("SendCategoryTemplateMsg http.NewRequest Err:"+err.Error(), 1)
  40. return err
  41. }
  42. contentType := "application/json;charset=utf-8"
  43. req.Header.Set("Content-Type", contentType)
  44. req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
  45. resp, err := client.Do(req)
  46. if err != nil {
  47. fmt.Println("http client.Do Err:" + err.Error())
  48. return err
  49. }
  50. defer resp.Body.Close()
  51. b, err := ioutil.ReadAll(resp.Body)
  52. if err != nil {
  53. return err
  54. }
  55. result := new(models.BaseResponse)
  56. err = json.Unmarshal(b, &result)
  57. if err != nil {
  58. return err
  59. }
  60. if result.Ret != 200 {
  61. err = errors.New(string(b))
  62. return err
  63. }
  64. return
  65. }
  66. // 用户模块
  67. // 研选类目模板消息
  68. func SendPermissionApplyTemplateMsgAdminByYxCategory(req models.ApplyTryReq, companyId int, usermobile, applyMethod, redirectUrl string) (err error) {
  69. defer func() {
  70. if err != nil {
  71. go utils.SendAlarmMsg("研选类目模板消息消息失败, SendPermissionApplyTemplateMsgAdminByYxCategoryErrMsg: "+err.Error(), 3)
  72. }
  73. }()
  74. //潜在客户、未开权益,已开FICC的客户推给王芳,开通权益的客户推给对应销售
  75. mobileOpneid := utils.WxMsgTemplateIdAskMsgMobilePublic
  76. if companyId > 1 {
  77. raiCount, e := models.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
  78. if e != nil {
  79. err = errors.New("GetCompanyProductCount, Err: " + e.Error())
  80. return
  81. }
  82. if raiCount > 0 {
  83. sealldetail, e := models.GetRaiSellerByCompanyId(companyId)
  84. if e != nil {
  85. err = errors.New("GetRaiSellerByCompanyId, Err: " + e.Error())
  86. return
  87. }
  88. mobileOpneid = sealldetail.Mobile
  89. }
  90. }
  91. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobileOpneid)
  92. if e != nil {
  93. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  94. return err
  95. }
  96. if len(openIdList) == 0 {
  97. return
  98. }
  99. var keyword1 string
  100. var keyword2 string
  101. var keyword3 string
  102. var keyword4 string
  103. var keyword5 string
  104. keyword1 = req.RealName
  105. keyword2 = utils.TruncateActivityNameString(req.CompanyName)
  106. keyword3 = "权限申请"
  107. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  108. keyword5 = applyMethod
  109. openIdArr := make([]string, 0)
  110. for _, v := range openIdList {
  111. openIdArr = append(openIdArr, v.OpenId)
  112. }
  113. detail, e := models.GetCygxApplyRecordByMobile(usermobile)
  114. if e != nil {
  115. err = errors.New("GetCygxApplyRecordByMobile" + e.Error())
  116. return
  117. }
  118. //redirectUrl := ""
  119. //如果是潜在客户就推送可查看详情的模版消息
  120. if detail.ApplyMethod == 2 {
  121. redirectUrl = utils.WX_MSG_PATH_APPLY_DETAIL + strconv.Itoa(detail.ApplyRecordId)
  122. }
  123. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  124. sendInfo := new(SendWxCategoryTemplate)
  125. sendInfo.Keywords = keywords
  126. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  127. sendInfo.RedirectTarget = 4
  128. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  129. sendInfo.OpenIdArr = openIdArr
  130. sendInfo.RedirectUrl = redirectUrl
  131. err = SendCategoryTemplateMsg(sendInfo)
  132. return
  133. }
  134. // 用户模块End
  135. // 报告模块
  136. // 发送用户留言提醒(研选公众号类目模版消息)
  137. func SendCommentWxTemplateMsgByYxCategory(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
  138. if articleInfo.ArticleTypeId == 0 {
  139. return // 非研选的文章不做推送
  140. }
  141. defer func() {
  142. if err != nil {
  143. go utils.SendAlarmMsg(fmt.Sprint("发送用户用户留言提醒失败,文章ID:", req.ArticleId, "err", err.Error()), 2)
  144. }
  145. }()
  146. companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
  147. if e != nil {
  148. return
  149. }
  150. if companyItem == nil {
  151. err = errors.New("获取客户所属销售信息失败")
  152. return
  153. }
  154. var keyword1 string
  155. var keyword2 string
  156. var keyword3 string
  157. var keyword4 string
  158. var keyword5 string
  159. var redirectUrl string
  160. var mobile string
  161. var keywords []string
  162. keyword1 = user.RealName
  163. keyword2 = utils.TruncateActivityNameString(companyItem.CompanyName)
  164. keyword3 = companyItem.SellerName
  165. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  166. keyword5 = "报告留言:" + req.Content
  167. keyword5 = utils.TruncateActivityNameString(keyword5)
  168. keywords = append(keywords, keyword1, keyword2, keyword3, keyword4, keyword5)
  169. var mobiles []string
  170. 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) //葛琳、高亦文、董衡、吴昂迪手机号
  171. mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + strings.Join(mobiles, ",")
  172. //mobile =
  173. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  174. if e != nil {
  175. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  176. return
  177. }
  178. if len(openIdList) == 0 {
  179. return
  180. }
  181. openIdArr := make([]string, 0)
  182. for _, v := range openIdList {
  183. openIdArr = append(openIdArr, v.OpenId)
  184. }
  185. redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=1"
  186. sendInfo := new(SendWxCategoryTemplate)
  187. sendInfo.Keywords = keywords
  188. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  189. sendInfo.RedirectTarget = 4
  190. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  191. sendInfo.OpenIdArr = openIdArr
  192. sendInfo.RedirectUrl = redirectUrl
  193. err = SendCategoryTemplateMsg(sendInfo)
  194. return
  195. }
  196. // 发送报告提问消息提醒
  197. func SendWxCategoryMsgWithActivityAsk(companyName, realName, sellerName, askTime, askMsg string, openIdList []*models.OpenIdList, msgId int) (err error) {
  198. if len(openIdList) == 0 {
  199. return
  200. }
  201. defer func() {
  202. if err != nil {
  203. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒类目模版消息失败,用户名", realName, "留言ID:", msgId), 2)
  204. }
  205. }()
  206. var keyword1 string
  207. var keyword2 string
  208. var keyword3 string
  209. var keyword4 string
  210. var keyword5 string
  211. keyword1 = realName
  212. keyword2 = companyName
  213. keyword3 = sellerName
  214. keyword4 = askTime
  215. keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
  216. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  217. openIdArr := make([]string, 0)
  218. for _, v := range openIdList {
  219. openIdArr = append(openIdArr, v.OpenId)
  220. }
  221. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(msgId)
  222. sendInfo := new(SendWxCategoryTemplate)
  223. sendInfo.Keywords = keywords
  224. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  225. sendInfo.RedirectTarget = 4
  226. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  227. sendInfo.OpenIdArr = openIdArr
  228. sendInfo.RedirectUrl = redirectUrl
  229. err = SendCategoryTemplateMsg(sendInfo)
  230. if err != nil {
  231. return
  232. }
  233. return
  234. }
  235. //报告模块END
  236. // 活动模块
  237. // 帮我带问的问题,会前1小时发送
  238. func SendMfyxEmailFileForAskMsgResearch(cont context.Context) (err error) {
  239. var msg string
  240. //var touser string
  241. defer func() {
  242. if err != nil {
  243. go utils.SendAlarmMsg("发送附件模版消息失败:"+err.Error(), 2)
  244. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  245. }
  246. if msg != "" {
  247. go utils.SendAlarmMsg(msg, 2)
  248. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  249. }
  250. }()
  251. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  252. condition := `AND a.activity_type_id = 1 AND a.chart_permission_id = 31 `
  253. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  254. if total == 0 {
  255. fmt.Println("发送附件完成0")
  256. return nil
  257. }
  258. if err != nil {
  259. msg = "发送附件模版消息失败 Err:" + err.Error()
  260. return
  261. }
  262. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  263. if err != nil {
  264. msg = "发送附件模版消息失败 Err:" + err.Error()
  265. return
  266. }
  267. for _, v := range listActivity {
  268. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  269. if activityInfo == nil {
  270. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  271. return
  272. }
  273. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  274. if errFile != nil {
  275. msg = "获取失败,Err:" + errFile.Error()
  276. return
  277. }
  278. for _, v2 := range list {
  279. user, e := models.GetWxUserItemByUserId(v2.UserId)
  280. if e != nil && e.Error() != utils.ErrNoRow() {
  281. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  282. return err
  283. }
  284. //获取销售信息
  285. sellerItem, e := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  286. if e != nil && e.Error() != utils.ErrNoRow() {
  287. err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
  288. return
  289. }
  290. //给所属销售推送消息
  291. if sellerItem != nil && user != nil {
  292. openIpItem, _ := models.GetMfyxUserRecordByMobile(12, sellerItem.Mobile)
  293. openIdList := make([]*models.OpenIdList, 0)
  294. openIdList = append(openIdList, openIpItem)
  295. SendWxCategoryMsgWithActivityAsk(user.CompanyName, user.RealName, sellerItem.RealName, time.Now().Format(utils.FormatDateTimeMinute2), v2.Content, openIdList, v.ActivityId)
  296. }
  297. }
  298. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  299. if errFile != nil {
  300. msg = "获取失败,Err:" + errFile.Error()
  301. return
  302. }
  303. }
  304. return
  305. }
  306. // 推送会议开始消息提醒60分钟前
  307. func SendMfyxActivityBeginMsg(cont context.Context) (err error) {
  308. //func SendActivityBeginMsg() (err error) {
  309. defer func() {
  310. if err != nil {
  311. go utils.SendAlarmMsg("60分钟会议消息提醒失败"+err.Error(), 2)
  312. fmt.Println("发送失败,Err:", err.Error())
  313. }
  314. }()
  315. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  316. listActivity, err := models.GetMfyxActivitySendMsgListAll(endDate)
  317. fmt.Println(len(listActivity))
  318. if err != nil {
  319. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  320. return
  321. }
  322. if len(listActivity) == 0 {
  323. return
  324. }
  325. //var remark = "点击查看活动详情"
  326. var signupIds string
  327. for _, v := range listActivity {
  328. signupIds += strconv.Itoa(v.Id) + ","
  329. //var reserveResults string
  330. //var first string
  331. openIdItem := new(models.OpenIdList)
  332. openIdItem.OpenId = v.OpenId
  333. openIdItem.UserId = v.UserId
  334. openIdList := make([]*models.OpenIdList, 0)
  335. openIdList = append(openIdList, openIdItem)
  336. openIdArr := make([]string, 0)
  337. for _, v := range openIdList {
  338. openIdArr = append(openIdArr, v.OpenId)
  339. }
  340. keywords := []string{utils.TruncateActivityNameString(v.ActivityName), v.ActivityTime}
  341. sendInfo := new(SendWxCategoryTemplate)
  342. sendInfo.Keywords = keywords
  343. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
  344. sendInfo.RedirectTarget = 4
  345. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  346. sendInfo.OpenIdArr = openIdArr
  347. sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
  348. err = SendCategoryTemplateMsg(sendInfo)
  349. if err != nil {
  350. return
  351. }
  352. }
  353. if len(signupIds) == 0 {
  354. return
  355. }
  356. signupIds = strings.TrimRight(signupIds, ",")
  357. err = models.UPdateSendedMsgStatus(signupIds)
  358. if err != nil {
  359. var msg string
  360. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  361. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  362. }
  363. return
  364. }
  365. // 推送会议开始消息提醒15分钟前
  366. func SendMfyxActivityBeginMsgMeeting(cont context.Context) (err error) {
  367. //func SendActivityBeginMsgMeeting() (err error) {
  368. defer func() {
  369. if err != nil {
  370. go utils.SendAlarmMsg("15分钟会议消息提醒失败:"+err.Error(), 2)
  371. fmt.Println("发送失败,Err:", err.Error())
  372. }
  373. }()
  374. var condition string
  375. var pars []interface{}
  376. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  377. condition = ` AND activity_time <= ? AND activity_time >= NOW() AND publish_status = 1 `
  378. pars = append(pars, endDate)
  379. listActivity, e := models.GetCygxActivityList(condition, pars, 0, 100000)
  380. if e != nil && e.Error() != utils.ErrNoRow() {
  381. err = errors.New("GetCygxActivityList, Err: " + e.Error())
  382. return
  383. }
  384. if len(listActivity) == 0 {
  385. return
  386. }
  387. //var signupIds string
  388. //var remark = "点击查看活动详情"
  389. var activityIds []int
  390. //同一时间举办的活动不多所以这里循环查询
  391. for _, v := range listActivity {
  392. activityIds = append(activityIds, v.ActivityId)
  393. var mobiles []string
  394. pars = make([]interface{}, 0)
  395. condition = ` AND activity_id = ? AND is_send_wx_msg = 0 `
  396. pars = append(pars, v.ActivityId)
  397. //获取设置消息提醒的用户列表
  398. listxReminder, e := models.GetCygxReminderListByUser(condition, pars)
  399. if e != nil {
  400. err = errors.New("GetCygxReminderListByUser, Err: " + e.Error())
  401. return
  402. }
  403. for _, vReminder := range listxReminder {
  404. mobiles = append(mobiles, vReminder.Mobile)
  405. }
  406. pars = make([]interface{}, 0)
  407. condition = ` AND do_fail_type = 0 AND activity_id = ? AND signup_type = 1 AND is_send_wx_msg = 0 `
  408. pars = append(pars, v.ActivityId)
  409. //获取设置预约外呼的用户列表
  410. listSignup, e := models.GetActivitySignupList(condition, pars)
  411. if e != nil && e.Error() != utils.ErrNoRow() {
  412. err = errors.New("GetActivitySignupList, Err: " + e.Error())
  413. return
  414. }
  415. for _, vSignup := range listSignup {
  416. mobiles = append(mobiles, vSignup.Mobile)
  417. }
  418. //获取这些手机号对应的Openid
  419. listOpenid, e := models.GetMfyxUserRecordListByMobileArr(mobiles)
  420. if e != nil && e.Error() != utils.ErrNoRow() {
  421. err = errors.New("GetUserRecordListByMobileArr, Err: " + e.Error())
  422. return
  423. }
  424. openIdList := make([]*models.OpenIdList, 0)
  425. for _, vOpenid := range listOpenid {
  426. openIdItem := new(models.OpenIdList)
  427. openIdItem.OpenId = vOpenid.OpenId
  428. openIdItem.UserId = vOpenid.UserId
  429. openIdList = append(openIdList, openIdItem)
  430. }
  431. openIdArr := make([]string, 0)
  432. for _, v := range openIdList {
  433. openIdArr = append(openIdArr, v.OpenId)
  434. }
  435. keywords := []string{utils.TruncateActivityNameString(v.ActivityName), v.ActivityTime}
  436. sendInfo := new(SendWxCategoryTemplate)
  437. sendInfo.Keywords = keywords
  438. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
  439. sendInfo.RedirectTarget = 4
  440. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  441. sendInfo.OpenIdArr = openIdArr
  442. sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
  443. err = SendCategoryTemplateMsg(sendInfo)
  444. if err != nil {
  445. return
  446. }
  447. }
  448. err = models.UpdateSendedMsgMeetingSendWxMsg(activityIds)
  449. return
  450. }
  451. // 线下调研活动扫码签到给对应销售发类目模班消息
  452. func SendActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  453. if activityDetail.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
  454. return
  455. }
  456. defer func() {
  457. if err != nil {
  458. go utils.SendAlarmMsg(fmt.Sprint("线下调研活动扫码签到给对应销售发模班消息推送失败 SendActivitieSignCategoryTemplateMsg Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
  459. }
  460. }()
  461. var mobiles []string
  462. //获取销售信息
  463. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  464. if err != nil && err.Error() != utils.ErrNoRow() {
  465. return
  466. }
  467. if sellerItem != nil {
  468. mobiles = append(mobiles, sellerItem.Mobile, utils.MobileWuAngDi, utils.MobileDongHeng, utils.MobileShenTao, utils.MobileZhangChuanXin)
  469. }
  470. var keyword1 string
  471. var keyword2 string
  472. var keyword3 string
  473. var keyword4 string
  474. var keyword5 string
  475. var redirectUrl string
  476. keyword1 = user.RealName
  477. keyword2 = user.CompanyName
  478. keyword3 = sellerItem.RealName
  479. keyword4 = utils.TruncateActivityNameString(activityDetail.ActivityName)
  480. keyword5 = time.Now().Format(utils.FormatDateTimeMinute2)
  481. openIdList, e := models.GetMfyxWxOpenIdByMobileSliceList(mobiles)
  482. if e != nil {
  483. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  484. return
  485. }
  486. openIdArr := make([]string, 0)
  487. for _, v := range openIdList {
  488. openIdArr = append(openIdArr, v.OpenId)
  489. }
  490. redirectUrl = utils.WX_MSG_PATH_YX_SIGNUP_DETAIL + strconv.Itoa(activityDetail.ActivityId)
  491. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  492. sendInfo := new(SendWxCategoryTemplate)
  493. sendInfo.Keywords = keywords
  494. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdActivitySign
  495. sendInfo.RedirectTarget = 4
  496. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  497. sendInfo.OpenIdArr = openIdArr
  498. sendInfo.RedirectUrl = redirectUrl
  499. err = SendCategoryTemplateMsg(sendInfo)
  500. if err != nil {
  501. return
  502. }
  503. return
  504. }
  505. // 发送活动提问消息提醒(研选公众号类目模版消息)
  506. func SendWxCategoryMsgWithAsk(user *models.WxUserItem, activityInfo *models.ActivityDetail, askMsg string, askId int) (err error) {
  507. if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
  508. return
  509. }
  510. defer func() {
  511. if err != nil {
  512. fmt.Println(err)
  513. go utils.SendAlarmMsg(fmt.Sprint("发送活动提问消息提醒类目模版消息失败,用户名", user.RealName, "提问ID:", askId), 2)
  514. }
  515. }()
  516. companyId := user.CompanyId
  517. var sellerName string
  518. //潜在客户、未开权益,已开FICC的客户推给王芳,开通权益的客户推给对应销售
  519. mobile := utils.WxMsgTemplateIdAskMsgMobilePublic
  520. if companyId > 1 {
  521. raiCount, e := models.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
  522. if e != nil {
  523. err = errors.New("GetCompanyProductCount, Err: " + e.Error())
  524. return
  525. }
  526. if raiCount > 0 {
  527. sealldetail, e := models.GetRaiSellerByCompanyId(companyId)
  528. if e != nil {
  529. err = errors.New("GetRaiSellerByCompanyId, Err: " + e.Error())
  530. return
  531. }
  532. sellerName = sealldetail.RealName
  533. mobile += "," + sealldetail.Mobile
  534. }
  535. }
  536. var mobiles []string
  537. 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) //葛琳、高亦文、董衡、吴昂迪手机号
  538. mobile += "," + strings.Join(mobiles, ",")
  539. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  540. if e != nil {
  541. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  542. return err
  543. }
  544. if len(openIdList) == 0 {
  545. return
  546. }
  547. var keyword1 string
  548. var keyword2 string
  549. var keyword3 string
  550. var keyword4 string
  551. var keyword5 string
  552. keyword1 = user.RealName
  553. keyword2 = utils.TruncateActivityNameString(user.CompanyName)
  554. keyword3 = sellerName
  555. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  556. keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
  557. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  558. openIdArr := make([]string, 0)
  559. for _, v := range openIdList {
  560. openIdArr = append(openIdArr, v.OpenId)
  561. }
  562. redirectUrl := utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(askId) + "&SourceType=2"
  563. //redirectUrl = ""
  564. sendInfo := new(SendWxCategoryTemplate)
  565. sendInfo.Keywords = keywords
  566. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  567. sendInfo.RedirectTarget = 4
  568. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  569. sendInfo.OpenIdArr = openIdArr
  570. sendInfo.RedirectUrl = redirectUrl
  571. err = SendCategoryTemplateMsg(sendInfo)
  572. return
  573. }
  574. // 用户报名模板消息推送(研选公众号类目模版消息)
  575. func SendNeiRongZuActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  576. if activityDetail.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
  577. return
  578. }
  579. defer func() {
  580. if err != nil {
  581. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityDetail.ActivityId), 2)
  582. fmt.Println(err)
  583. }
  584. }()
  585. sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  586. if e != nil && e.Error() != utils.ErrNoRow() {
  587. return
  588. }
  589. var mobile string
  590. var sellerRealName string
  591. var mobiles []string
  592. mobiles = append(mobiles, utils.RAI_MOBILE_GAO_YI_WEN, utils.RAI_MOBILE_DONG_HENG, utils.RAI_MOBILE_WU_ANG_DI, utils.MobileShenTao, utils.MobileZhangChuanXin) //高亦文、董衡、吴昂迪手机号
  593. if sellerItemQy != nil {
  594. mobiles = append(mobiles, sellerItemQy.Mobile)
  595. sellerRealName = sellerItemQy.RealName
  596. } else {
  597. sellerRealName = "__"
  598. }
  599. mobile = strings.Join(mobiles, ",")
  600. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  601. if e != nil {
  602. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  603. return err
  604. }
  605. if len(openIdList) == 0 {
  606. err = nil
  607. return
  608. }
  609. openIdArr := make([]string, 0)
  610. for _, v := range openIdList {
  611. openIdArr = append(openIdArr, v.OpenId)
  612. }
  613. var keywords []string
  614. keywords = append(keywords, user.RealName, user.CompanyName, sellerRealName, time.Now().Format(utils.FormatDateTimeMinute2), utils.TruncateActivityNameString("报名:"+activityDetail.ActivityName))
  615. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId) //活动详情地址
  616. sendInfo := new(SendWxCategoryTemplate)
  617. sendInfo.Keywords = keywords
  618. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  619. sendInfo.RedirectTarget = 4
  620. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  621. sendInfo.OpenIdArr = openIdArr
  622. sendInfo.RedirectUrl = redirectUrl
  623. err = SendCategoryTemplateMsg(sendInfo)
  624. return
  625. }
  626. // 用户取消报名模板消息推送(研选公众号类目模版消息)
  627. func SendActivitieCancelSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  628. if activityDetail.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
  629. return
  630. }
  631. defer func() {
  632. if err != nil {
  633. fmt.Println(err)
  634. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,活动ID:", activityDetail.ActivityId), 2)
  635. }
  636. }()
  637. sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  638. if e != nil && e.Error() != utils.ErrNoRow() {
  639. return
  640. }
  641. var mobile string
  642. var sellerRealName string
  643. var mobiles []string
  644. mobiles = append(mobiles, utils.RAI_MOBILE_GAO_YI_WEN, utils.RAI_MOBILE_DONG_HENG, utils.RAI_MOBILE_WU_ANG_DI, utils.MobileShenTao, utils.MobileZhangChuanXin) //高亦文、董衡、吴昂迪手机号
  645. if sellerItemQy != nil {
  646. mobiles = append(mobiles, sellerItemQy.Mobile)
  647. sellerRealName = sellerItemQy.RealName
  648. } else {
  649. sellerRealName = "__"
  650. }
  651. mobile = strings.Join(mobiles, ",")
  652. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  653. if e != nil {
  654. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  655. return err
  656. }
  657. if len(openIdList) == 0 {
  658. err = nil
  659. return
  660. }
  661. openIdArr := make([]string, 0)
  662. for _, v := range openIdList {
  663. openIdArr = append(openIdArr, v.OpenId)
  664. }
  665. var keywords []string
  666. keywords = append(keywords, user.RealName, user.CompanyName, sellerRealName, time.Now().Format(utils.FormatDateTimeMinute2), utils.TruncateActivityNameString("取消报名:"+activityDetail.ActivityName))
  667. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId) //活动详情地址
  668. sendInfo := new(SendWxCategoryTemplate)
  669. sendInfo.Keywords = keywords
  670. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  671. sendInfo.RedirectTarget = 4
  672. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  673. sendInfo.OpenIdArr = openIdArr
  674. sendInfo.RedirectUrl = redirectUrl
  675. err = SendCategoryTemplateMsg(sendInfo)
  676. return
  677. }
  678. // 发送用户操作活动消息提醒
  679. func SendWxCategoryMsgWithActivityUserRemind(keyWord1, keyWord2, keyWord3, keyWord4, redirectUrl string, openIdList []*models.OpenIdList, activityId int) (err error) {
  680. if len(openIdList) == 0 {
  681. return
  682. }
  683. defer func() {
  684. if err != nil {
  685. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,SendWxCategoryMsgWithActivityUserRemind 文章ID:", activityId), 2)
  686. }
  687. }()
  688. keyWord1 = utils.TruncateActivityNameString(keyWord1)
  689. openIdArr := make([]string, 0)
  690. for _, v := range openIdList {
  691. openIdArr = append(openIdArr, v.OpenId)
  692. }
  693. var keywords []string
  694. keywords = append(keywords, keyWord1, keyWord2, keyWord3, keyWord4)
  695. sendInfo := new(SendWxCategoryTemplate)
  696. sendInfo.Keywords = keywords
  697. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
  698. sendInfo.RedirectTarget = 4
  699. sendInfo.RedirectUrl = redirectUrl
  700. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  701. sendInfo.OpenIdArr = openIdArr
  702. err = SendCategoryTemplateMsg(sendInfo)
  703. return
  704. }
  705. // 买方研选推送会议开始消息提醒60/15分钟前
  706. func SendWxMsgWithFrequencyBycategoryMfyx(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
  707. if len(openIdList) == 0 {
  708. return
  709. }
  710. defer func() {
  711. if err != nil {
  712. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,SendWxCategoryMsgWithActivityUserRemind 文章ID:", activityId), 2)
  713. }
  714. }()
  715. keyWord1 = utils.TruncateActivityNameString(keyWord1)
  716. openIdArr := make([]string, 0)
  717. for _, v := range openIdList {
  718. openIdArr = append(openIdArr, v.OpenId)
  719. }
  720. var keywords []string
  721. keyWord2 = utils.StrTimeToTime(keyWord2).Format(utils.FormatDateTimeMinute2) //去掉时间格式后面的秒
  722. keywords = append(keywords, keyWord1, keyWord2)
  723. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
  724. sendInfo := new(SendWxCategoryTemplate)
  725. sendInfo.Keywords = keywords
  726. sendInfo.TemplateId = utils.WxMsgTemplateIdActivityChangeApplyXzs
  727. sendInfo.RedirectTarget = 4
  728. sendInfo.RedirectUrl = redirectUrl
  729. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  730. sendInfo.OpenIdArr = openIdArr
  731. err = SendCategoryTemplateMsg(sendInfo)
  732. return
  733. }
  734. // 活动模块END
  735. // 专栏模块
  736. // 研选专栏审核完成时,给提交人发送类目模板消息
  737. func SendWxCategoryMsgSpecialAuthor(specialId, status int) (err error) {
  738. defer func() {
  739. if err != nil {
  740. go utils.SendAlarmMsg(fmt.Sprint("研选专栏审核完成时,给提交人发送模板消息 SendWxCategoryMsgSpecialAuthor ", specialId, ", specialId", err.Error()), 2)
  741. }
  742. }()
  743. var keyword1 string
  744. var keyword2 string
  745. var keyword3 string
  746. var keyword4 string
  747. var redirectUrl string
  748. specialItem, e := models.GetYanxuanSpecialItemById(specialId)
  749. if e != nil {
  750. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  751. return
  752. }
  753. user, e := models.GetWxUserItemByUserId(specialItem.UserId)
  754. if e != nil {
  755. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  756. return err
  757. }
  758. openIdList, err := models.GetMfyxWxOpenIdByMobileList(user.Mobile)
  759. if err != nil && err.Error() != utils.ErrNoRow() {
  760. return err
  761. }
  762. if len(openIdList) == 0 {
  763. return
  764. }
  765. keyword1 = utils.TruncateActivityNameString(specialItem.Title)
  766. keyword2 = specialItem.NickName
  767. if status == 1 {
  768. keyword3 = "文章已通过审核,点击查看详情"
  769. redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
  770. } else {
  771. keyword3 = "文章未通过审核,点击查看驳回原因"
  772. redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_CENTER
  773. }
  774. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  775. openIdArr := make([]string, 0)
  776. for _, v := range openIdList {
  777. openIdArr = append(openIdArr, v.OpenId)
  778. }
  779. keywords := []string{keyword1, keyword2, keyword3, keyword4}
  780. sendInfo := new(SendWxCategoryTemplate)
  781. sendInfo.Keywords = keywords
  782. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdCompanyApprovalMessageRai
  783. sendInfo.RedirectTarget = 4
  784. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  785. sendInfo.OpenIdArr = openIdArr
  786. sendInfo.RedirectUrl = redirectUrl
  787. err = SendCategoryTemplateMsg(sendInfo)
  788. if err != nil {
  789. return
  790. }
  791. return
  792. }
  793. // 研选专栏有新内容审核通过时,给关注此专栏的客户发送模板消息
  794. func SendWxCategoryMsgSpecialFollow(specialId int) (err error) {
  795. defer func() {
  796. if err != nil {
  797. go utils.SendAlarmMsg(fmt.Sprint("研选专栏有新内容审核通过时,给关注此专栏的客户发送类目模板消息失败", specialId, ", specialId", err.Error()), 2)
  798. }
  799. }()
  800. var keyword1 string
  801. var keyword2 string
  802. var keyword3 string
  803. var keyword4 string
  804. followers, e := models.GetYanxuanSpecialFollowUserById(specialId)
  805. if e != nil {
  806. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  807. return
  808. }
  809. if len(followers) == 0 {
  810. return
  811. }
  812. specialItem, e := models.GetYanxuanSpecialItemById(specialId)
  813. if e != nil {
  814. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  815. return
  816. }
  817. var allInUserId string
  818. for _, v := range followers {
  819. allInUserId += strconv.Itoa(v) + ","
  820. }
  821. allInUserId = strings.TrimRight(allInUserId, ",")
  822. userList, err := models.GetWxUserListByUserIds(allInUserId)
  823. if err != nil && err.Error() != utils.ErrNoRow() {
  824. return err
  825. }
  826. var mobiles []string
  827. for _, v := range userList {
  828. if v.Mobile != "" {
  829. mobiles = append(mobiles, v.Mobile)
  830. }
  831. }
  832. openIdList, e := models.GetMfyxUserRecordListByMobileArr(mobiles)
  833. if e != nil {
  834. err = errors.New("GetSellerByAdminId, Err: " + e.Error())
  835. return
  836. }
  837. if len(openIdList) == 0 {
  838. return
  839. }
  840. keyword1 = specialItem.SpecialName
  841. keyword2 = "发布了新报告"
  842. keyword3 = specialItem.Title
  843. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  844. openIdArr := make([]string, 0)
  845. for _, v := range openIdList {
  846. openIdArr = append(openIdArr, v.OpenId)
  847. }
  848. redirectUrl := ""
  849. redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
  850. keywords := []string{keyword1, keyword2, keyword3, keyword4}
  851. sendInfo := new(SendWxCategoryTemplate)
  852. sendInfo.Keywords = keywords
  853. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
  854. sendInfo.RedirectTarget = 4
  855. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  856. sendInfo.OpenIdArr = openIdArr
  857. sendInfo.RedirectUrl = redirectUrl
  858. err = SendCategoryTemplateMsg(sendInfo)
  859. if err != nil {
  860. return
  861. }
  862. return
  863. }
  864. // SendReviewCategoryTemplateMsgAdmin 专栏提交审核时给王芳、葛琳和沈涛发研选类目模板消息
  865. func SendReviewCategoryTemplateMsgAdmin(specialId int) (err error) {
  866. defer func() {
  867. if err != nil {
  868. go utils.SendAlarmMsg(fmt.Sprint("处理试用申请给王芳,汪洋发消息失败, specialId:", specialId, "ErrMsg", err.Error()), 2)
  869. }
  870. }()
  871. //王芳、葛琳和沈涛
  872. mobile := utils.WxMsgTemplateIdAskMsgMobilePublic + utils.RAI_MOBILE_GE_LIN
  873. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  874. if e != nil && e.Error() != utils.ErrNoRow() {
  875. err = errors.New("GetUserRecordListByMobile, Err: " + e.Error())
  876. return err
  877. }
  878. if len(openIdList) == 0 {
  879. return
  880. }
  881. specialItem, e := models.GetYanxuanSpecialItemById(specialId)
  882. if e != nil {
  883. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  884. return
  885. }
  886. user, e := models.GetWxUserItemByUserId(specialItem.UserId)
  887. if e != nil {
  888. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  889. return err
  890. }
  891. var keyword1 string
  892. var keyword2 string
  893. var keyword3 string
  894. var keyword4 string
  895. var keyword5 string
  896. keyword1 = specialItem.NickName
  897. keyword2 = specialItem.RealName + "-" + user.CompanyName
  898. keyword2 = utils.TruncateActivityNameString(keyword2)
  899. keyword3 = specialItem.SpecialName
  900. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  901. keyword5 = "研选专栏提交了内容待审核"
  902. openIdArr := make([]string, 0)
  903. for _, v := range openIdList {
  904. openIdArr = append(openIdArr, v.OpenId)
  905. }
  906. redirectUrl := utils.WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL + strconv.Itoa(specialId)
  907. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  908. sendInfo := new(SendWxCategoryTemplate)
  909. sendInfo.Keywords = keywords
  910. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  911. sendInfo.RedirectTarget = 4
  912. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  913. sendInfo.OpenIdArr = openIdArr
  914. sendInfo.RedirectUrl = redirectUrl
  915. err = SendCategoryTemplateMsg(sendInfo)
  916. if err != nil {
  917. return
  918. }
  919. return
  920. }
  921. //专栏模块END