wx_category_template_msg.go 33 KB

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