wx_category_template_msg.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  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. // 帮我带问的问题,会前1小时发送
  67. func SendMfyxEmailFileForAskMsgResearch(cont context.Context) (err error) {
  68. var msg string
  69. //var touser string
  70. defer func() {
  71. if err != nil {
  72. go utils.SendAlarmMsg("发送附件模版消息失败:"+err.Error(), 2)
  73. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  74. }
  75. if msg != "" {
  76. go utils.SendAlarmMsg(msg, 2)
  77. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  78. }
  79. }()
  80. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  81. condition := `AND a.activity_type_id = 1 AND a.chart_permission_id = 31 `
  82. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  83. if total == 0 {
  84. fmt.Println("发送附件完成0")
  85. return nil
  86. }
  87. if err != nil {
  88. msg = "发送附件模版消息失败 Err:" + err.Error()
  89. return
  90. }
  91. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  92. if err != nil {
  93. msg = "发送附件模版消息失败 Err:" + err.Error()
  94. return
  95. }
  96. for _, v := range listActivity {
  97. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  98. if activityInfo == nil {
  99. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  100. return
  101. }
  102. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  103. if errFile != nil {
  104. msg = "获取失败,Err:" + errFile.Error()
  105. return
  106. }
  107. for _, v2 := range list {
  108. user, e := models.GetWxUserItemByUserId(v2.UserId)
  109. if e != nil && e.Error() != utils.ErrNoRow() {
  110. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  111. return err
  112. }
  113. //获取销售信息
  114. sellerItem, e := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  115. if e != nil && e.Error() != utils.ErrNoRow() {
  116. err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
  117. return
  118. }
  119. //给所属销售推送消息
  120. if sellerItem != nil && user != nil {
  121. openIpItem, _ := models.GetMfyxUserRecordByMobile(12, sellerItem.Mobile)
  122. openIdList := make([]*models.OpenIdList, 0)
  123. openIdList = append(openIdList, openIpItem)
  124. SendWxCategoryMsgWithActivityAsk(user.CompanyName, user.RealName, sellerItem.RealName, time.Now().Format(utils.FormatDateTimeMinute2), v2.Content, openIdList, v.ActivityId)
  125. }
  126. }
  127. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  128. if errFile != nil {
  129. msg = "获取失败,Err:" + errFile.Error()
  130. return
  131. }
  132. }
  133. return
  134. }
  135. // 发送报告提问消息提醒
  136. func SendWxCategoryMsgWithActivityAsk(companyName, realName, sellerName, askTime, askMsg string, openIdList []*models.OpenIdList, msgId int) (err error) {
  137. if len(openIdList) == 0 {
  138. return
  139. }
  140. var msg string
  141. defer func() {
  142. if err != nil {
  143. go utils.SendEmail("发送类目模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  144. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒类目模版消息失败,用户名", realName, "留言ID:", msgId), 2)
  145. utils.FileLog.Info("发送类目模版消息失败,Err:%s", err.Error())
  146. }
  147. fmt.Println("line 21", err, msg)
  148. }()
  149. var keyword1 string
  150. var keyword2 string
  151. var keyword3 string
  152. var keyword4 string
  153. var keyword5 string
  154. keyword1 = realName
  155. keyword2 = companyName
  156. keyword3 = sellerName
  157. keyword4 = askTime
  158. keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
  159. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  160. openIdArr := make([]string, 0)
  161. for _, v := range openIdList {
  162. openIdArr = append(openIdArr, v.OpenId)
  163. }
  164. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(msgId)
  165. sendInfo := new(SendWxCategoryTemplate)
  166. sendInfo.Keywords = keywords
  167. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  168. sendInfo.RedirectTarget = 4
  169. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  170. sendInfo.OpenIdArr = openIdArr
  171. sendInfo.RedirectUrl = redirectUrl
  172. err = SendCategoryTemplateMsg(sendInfo)
  173. if err != nil {
  174. return
  175. }
  176. return
  177. }
  178. // 推送会议开始消息提醒60分钟前
  179. func SendMfyxActivityBeginMsg(cont context.Context) (err error) {
  180. //func SendActivityBeginMsg() (err error) {
  181. defer func() {
  182. if err != nil {
  183. go utils.SendAlarmMsg("60分钟会议消息提醒失败"+err.Error(), 2)
  184. fmt.Println("发送失败,Err:", err.Error())
  185. }
  186. }()
  187. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  188. listActivity, err := models.GetMfyxActivitySendMsgListAll(endDate)
  189. fmt.Println(len(listActivity))
  190. if err != nil {
  191. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  192. return
  193. }
  194. if len(listActivity) == 0 {
  195. return
  196. }
  197. //var remark = "点击查看活动详情"
  198. var signupIds string
  199. for _, v := range listActivity {
  200. signupIds += strconv.Itoa(v.Id) + ","
  201. //var reserveResults string
  202. //var first string
  203. openIdItem := new(models.OpenIdList)
  204. openIdItem.OpenId = v.OpenId
  205. openIdItem.UserId = v.UserId
  206. openIdList := make([]*models.OpenIdList, 0)
  207. openIdList = append(openIdList, openIdItem)
  208. openIdArr := make([]string, 0)
  209. for _, v := range openIdList {
  210. openIdArr = append(openIdArr, v.OpenId)
  211. }
  212. keywords := []string{utils.TruncateActivityNameString(v.ActivityName), v.ActivityTime}
  213. sendInfo := new(SendWxCategoryTemplate)
  214. sendInfo.Keywords = keywords
  215. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
  216. sendInfo.RedirectTarget = 4
  217. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  218. sendInfo.OpenIdArr = openIdArr
  219. sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
  220. err = SendCategoryTemplateMsg(sendInfo)
  221. if err != nil {
  222. return
  223. }
  224. }
  225. if len(signupIds) == 0 {
  226. return
  227. }
  228. signupIds = strings.TrimRight(signupIds, ",")
  229. err = models.UPdateSendedMsgStatus(signupIds)
  230. if err != nil {
  231. var msg string
  232. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  233. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  234. }
  235. return
  236. }
  237. // 推送会议开始消息提醒15分钟前
  238. func SendMfyxActivityBeginMsgMeeting(cont context.Context) (err error) {
  239. //func SendActivityBeginMsgMeeting() (err error) {
  240. defer func() {
  241. if err != nil {
  242. go utils.SendAlarmMsg("15分钟会议消息提醒失败:"+err.Error(), 2)
  243. fmt.Println("发送失败,Err:", err.Error())
  244. }
  245. }()
  246. var condition string
  247. var pars []interface{}
  248. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  249. condition = ` AND activity_time <= ? AND activity_time >= NOW() AND publish_status = 1 `
  250. pars = append(pars, endDate)
  251. listActivity, e := models.GetCygxActivityList(condition, pars, 0, 100000)
  252. if e != nil && e.Error() != utils.ErrNoRow() {
  253. err = errors.New("GetCygxActivityList, Err: " + e.Error())
  254. return
  255. }
  256. if len(listActivity) == 0 {
  257. return
  258. }
  259. //var signupIds string
  260. //var remark = "点击查看活动详情"
  261. var activityIds []int
  262. //同一时间举办的活动不多所以这里循环查询
  263. for _, v := range listActivity {
  264. activityIds = append(activityIds, v.ActivityId)
  265. var mobiles []string
  266. pars = make([]interface{}, 0)
  267. condition = ` AND activity_id = ? AND is_send_wx_msg = 0 `
  268. pars = append(pars, v.ActivityId)
  269. //获取设置消息提醒的用户列表
  270. listxReminder, e := models.GetCygxReminderListByUser(condition, pars)
  271. if e != nil {
  272. err = errors.New("GetCygxReminderListByUser, Err: " + e.Error())
  273. return
  274. }
  275. for _, vReminder := range listxReminder {
  276. mobiles = append(mobiles, vReminder.Mobile)
  277. }
  278. pars = make([]interface{}, 0)
  279. condition = ` AND do_fail_type = 0 AND activity_id = ? AND signup_type = 1 AND is_send_wx_msg = 0 `
  280. pars = append(pars, v.ActivityId)
  281. //获取设置预约外呼的用户列表
  282. listSignup, e := models.GetActivitySignupList(condition, pars)
  283. if e != nil && e.Error() != utils.ErrNoRow() {
  284. err = errors.New("GetActivitySignupList, Err: " + e.Error())
  285. return
  286. }
  287. for _, vSignup := range listSignup {
  288. mobiles = append(mobiles, vSignup.Mobile)
  289. }
  290. //获取这些手机号对应的Openid
  291. listOpenid, e := models.GetMfyxUserRecordListByMobileArr(mobiles)
  292. if e != nil && e.Error() != utils.ErrNoRow() {
  293. err = errors.New("GetUserRecordListByMobileArr, Err: " + e.Error())
  294. return
  295. }
  296. openIdList := make([]*models.OpenIdList, 0)
  297. for _, vOpenid := range listOpenid {
  298. openIdItem := new(models.OpenIdList)
  299. openIdItem.OpenId = vOpenid.OpenId
  300. openIdItem.UserId = vOpenid.UserId
  301. openIdList = append(openIdList, openIdItem)
  302. }
  303. openIdArr := make([]string, 0)
  304. for _, v := range openIdList {
  305. openIdArr = append(openIdArr, v.OpenId)
  306. }
  307. keywords := []string{utils.TruncateActivityNameString(v.ActivityName), v.ActivityTime}
  308. sendInfo := new(SendWxCategoryTemplate)
  309. sendInfo.Keywords = keywords
  310. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
  311. sendInfo.RedirectTarget = 4
  312. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  313. sendInfo.OpenIdArr = openIdArr
  314. sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
  315. err = SendCategoryTemplateMsg(sendInfo)
  316. if err != nil {
  317. return
  318. }
  319. }
  320. err = models.UpdateSendedMsgMeetingSendWxMsg(activityIds)
  321. return
  322. }
  323. // 线下调研活动扫码签到给对应销售发类目模班消息
  324. func SendActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  325. defer func() {
  326. if err != nil {
  327. go utils.SendAlarmMsg(fmt.Sprint("线下调研活动扫码签到给对应销售发模班消息推送失败 SendActivitieSignCategoryTemplateMsg Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
  328. }
  329. }()
  330. var mobiles []string
  331. //获取销售信息
  332. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  333. if err != nil && err.Error() != utils.ErrNoRow() {
  334. return
  335. }
  336. if sellerItem != nil {
  337. mobiles = append(mobiles, sellerItem.Mobile, utils.MobileWuAngDi, utils.MobileDongHeng, utils.MobileShenTao, utils.MobileZhangChuanXin)
  338. }
  339. var keyword1 string
  340. var keyword2 string
  341. var keyword3 string
  342. var keyword4 string
  343. var keyword5 string
  344. var redirectUrl string
  345. keyword1 = user.RealName
  346. keyword2 = user.CompanyName
  347. keyword3 = sellerItem.RealName
  348. keyword4 = utils.TruncateActivityNameString(activityDetail.ActivityName)
  349. keyword5 = time.Now().Format(utils.FormatDateTimeMinute2)
  350. openIdList, e := models.GetMfyxWxOpenIdByMobileSliceList(mobiles)
  351. if e != nil {
  352. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  353. return
  354. }
  355. openIdArr := make([]string, 0)
  356. for _, v := range openIdList {
  357. openIdArr = append(openIdArr, v.OpenId)
  358. }
  359. redirectUrl = utils.WX_MSG_PATH_YX_SIGNUP_DETAIL + strconv.Itoa(activityDetail.ActivityId)
  360. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  361. sendInfo := new(SendWxCategoryTemplate)
  362. sendInfo.Keywords = keywords
  363. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdActivitySign
  364. sendInfo.RedirectTarget = 4
  365. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  366. sendInfo.OpenIdArr = openIdArr
  367. sendInfo.RedirectUrl = redirectUrl
  368. err = SendCategoryTemplateMsg(sendInfo)
  369. if err != nil {
  370. return
  371. }
  372. return
  373. }
  374. // 研选专栏审核完成时,给提交人发送类目模板消息
  375. func SendWxCategoryMsgSpecialAuthor(specialId, status int) (err error) {
  376. defer func() {
  377. if err != nil {
  378. go utils.SendAlarmMsg(fmt.Sprint("研选专栏审核完成时,给提交人发送模板消息 SendWxCategoryMsgSpecialAuthor ", specialId, ", specialId", err.Error()), 2)
  379. }
  380. }()
  381. var keyword1 string
  382. var keyword2 string
  383. var keyword3 string
  384. var keyword4 string
  385. var redirectUrl string
  386. specialItem, e := models.GetYanxuanSpecialItemById(specialId)
  387. if e != nil {
  388. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  389. return
  390. }
  391. user, e := models.GetWxUserItemByUserId(specialItem.UserId)
  392. if e != nil {
  393. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  394. return err
  395. }
  396. openIdList, err := models.GetMfyxWxOpenIdByMobileList(user.Mobile)
  397. if err != nil && err.Error() != utils.ErrNoRow() {
  398. return err
  399. }
  400. if len(openIdList) == 0 {
  401. return
  402. }
  403. keyword1 = utils.TruncateActivityNameString(specialItem.Title)
  404. keyword2 = specialItem.NickName
  405. if status == 1 {
  406. keyword3 = "文章已通过审核,点击查看详情"
  407. redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
  408. } else {
  409. keyword3 = "文章未通过审核,点击查看驳回原因"
  410. redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_CENTER
  411. }
  412. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  413. openIdArr := make([]string, 0)
  414. for _, v := range openIdList {
  415. openIdArr = append(openIdArr, v.OpenId)
  416. }
  417. keywords := []string{keyword1, keyword2, keyword3, keyword4}
  418. sendInfo := new(SendWxCategoryTemplate)
  419. sendInfo.Keywords = keywords
  420. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdCompanyApprovalMessageRai
  421. sendInfo.RedirectTarget = 4
  422. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  423. sendInfo.OpenIdArr = openIdArr
  424. sendInfo.RedirectUrl = redirectUrl
  425. err = SendCategoryTemplateMsg(sendInfo)
  426. if err != nil {
  427. return
  428. }
  429. return
  430. }
  431. // 研选专栏有新内容审核通过时,给关注此专栏的客户发送模板消息
  432. func SendWxCategoryMsgSpecialFollow(specialId int) (err error) {
  433. defer func() {
  434. if err != nil {
  435. go utils.SendAlarmMsg(fmt.Sprint("研选专栏有新内容审核通过时,给关注此专栏的客户发送类目模板消息失败", specialId, ", specialId", err.Error()), 2)
  436. }
  437. }()
  438. var keyword1 string
  439. var keyword2 string
  440. var keyword3 string
  441. var keyword4 string
  442. followers, e := models.GetYanxuanSpecialFollowUserById(specialId)
  443. if e != nil {
  444. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  445. return
  446. }
  447. if len(followers) == 0 {
  448. return
  449. }
  450. specialItem, e := models.GetYanxuanSpecialItemById(specialId)
  451. if e != nil {
  452. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  453. return
  454. }
  455. var allInUserId string
  456. for _, v := range followers {
  457. allInUserId += strconv.Itoa(v) + ","
  458. }
  459. allInUserId = strings.TrimRight(allInUserId, ",")
  460. userList, err := models.GetWxUserListByUserIds(allInUserId)
  461. if err != nil && err.Error() != utils.ErrNoRow() {
  462. return err
  463. }
  464. var mobiles []string
  465. for _, v := range userList {
  466. if v.Mobile != "" {
  467. mobiles = append(mobiles, v.Mobile)
  468. }
  469. }
  470. openIdList, e := models.GetMfyxUserRecordListByMobileArr(mobiles)
  471. if e != nil {
  472. err = errors.New("GetSellerByAdminId, Err: " + e.Error())
  473. return
  474. }
  475. if len(openIdList) == 0 {
  476. return
  477. }
  478. keyword1 = specialItem.SpecialName
  479. keyword2 = "发布了新报告"
  480. keyword3 = specialItem.Title
  481. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  482. openIdArr := make([]string, 0)
  483. for _, v := range openIdList {
  484. openIdArr = append(openIdArr, v.OpenId)
  485. }
  486. redirectUrl := ""
  487. redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
  488. keywords := []string{keyword1, keyword2, keyword3, keyword4}
  489. sendInfo := new(SendWxCategoryTemplate)
  490. sendInfo.Keywords = keywords
  491. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
  492. sendInfo.RedirectTarget = 4
  493. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  494. sendInfo.OpenIdArr = openIdArr
  495. sendInfo.RedirectUrl = redirectUrl
  496. err = SendCategoryTemplateMsg(sendInfo)
  497. if err != nil {
  498. return
  499. }
  500. return
  501. }
  502. // SendReviewCategoryTemplateMsgAdmin 提交审核时给王芳、葛琳和沈涛发研选类目模板消息
  503. func SendReviewCategoryTemplateMsgAdmin(specialId int) (err error) {
  504. defer func() {
  505. if err != nil {
  506. go utils.SendAlarmMsg(fmt.Sprint("处理试用申请给王芳,汪洋发消息失败, specialId:", specialId, "ErrMsg", err.Error()), 2)
  507. }
  508. }()
  509. //王芳、葛琳和沈涛
  510. mobile := utils.WxMsgTemplateIdAskMsgMobilePublic + utils.RAI_MOBILE_GE_LIN
  511. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  512. if e != nil && e.Error() != utils.ErrNoRow() {
  513. err = errors.New("GetUserRecordListByMobile, Err: " + e.Error())
  514. return err
  515. }
  516. if len(openIdList) == 0 {
  517. return
  518. }
  519. specialItem, e := models.GetYanxuanSpecialItemById(specialId)
  520. if e != nil {
  521. err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
  522. return
  523. }
  524. user, e := models.GetWxUserItemByUserId(specialItem.UserId)
  525. if e != nil {
  526. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  527. return err
  528. }
  529. var keyword1 string
  530. var keyword2 string
  531. var keyword3 string
  532. var keyword4 string
  533. var keyword5 string
  534. keyword1 = specialItem.NickName
  535. keyword2 = specialItem.RealName + "-" + user.CompanyName
  536. keyword2 = utils.TruncateActivityNameString(keyword2)
  537. keyword3 = specialItem.SpecialName
  538. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  539. keyword5 = "研选专栏提交了内容待审核"
  540. openIdArr := make([]string, 0)
  541. for _, v := range openIdList {
  542. openIdArr = append(openIdArr, v.OpenId)
  543. }
  544. redirectUrl := utils.WX_MSG_PATH_YX_SPECIAL_ENABLE_DETAIL + strconv.Itoa(specialId)
  545. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  546. sendInfo := new(SendWxCategoryTemplate)
  547. sendInfo.Keywords = keywords
  548. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  549. sendInfo.RedirectTarget = 4
  550. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  551. sendInfo.OpenIdArr = openIdArr
  552. sendInfo.RedirectUrl = redirectUrl
  553. err = SendCategoryTemplateMsg(sendInfo)
  554. if err != nil {
  555. return
  556. }
  557. return
  558. }
  559. // 发送活动提问消息提醒(研选公众号类目模版消息)
  560. func SendWxCategoryMsgWithAsk(user *models.WxUserItem, activityInfo *models.ActivityDetail, askMsg string, askId int) (err error) {
  561. if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
  562. return
  563. }
  564. defer func() {
  565. if err != nil {
  566. fmt.Println(err)
  567. go utils.SendAlarmMsg(fmt.Sprint("发送活动提问消息提醒类目模版消息失败,用户名", user.RealName, "提问ID:", askId), 2)
  568. }
  569. }()
  570. companyId := user.CompanyId
  571. var sellerName string
  572. //潜在客户、未开权益,已开FICC的客户推给王芳,开通权益的客户推给对应销售
  573. mobile := utils.WxMsgTemplateIdAskMsgMobilePublic
  574. if companyId > 1 {
  575. raiCount, e := models.GetCompanyProductCount(companyId, utils.COMPANY_PRODUCT_RAI_ID)
  576. if e != nil {
  577. err = errors.New("GetCompanyProductCount, Err: " + e.Error())
  578. return
  579. }
  580. if raiCount > 0 {
  581. sealldetail, e := models.GetRaiSellerByCompanyId(companyId)
  582. if e != nil {
  583. err = errors.New("GetRaiSellerByCompanyId, Err: " + e.Error())
  584. return
  585. }
  586. sellerName = sealldetail.RealName
  587. mobile += "," + sealldetail.Mobile
  588. }
  589. }
  590. var mobiles []string
  591. 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) //葛琳、高亦文、董衡、吴昂迪手机号
  592. mobile += "," + strings.Join(mobiles, ",")
  593. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  594. if e != nil {
  595. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  596. return err
  597. }
  598. if len(openIdList) == 0 {
  599. return
  600. }
  601. var keyword1 string
  602. var keyword2 string
  603. var keyword3 string
  604. var keyword4 string
  605. var keyword5 string
  606. keyword1 = user.RealName
  607. keyword2 = utils.TruncateActivityNameString(user.CompanyName)
  608. keyword3 = sellerName
  609. keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
  610. keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
  611. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  612. openIdArr := make([]string, 0)
  613. for _, v := range openIdList {
  614. openIdArr = append(openIdArr, v.OpenId)
  615. }
  616. redirectUrl := utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(askId) + "&SourceType=2"
  617. //redirectUrl = ""
  618. sendInfo := new(SendWxCategoryTemplate)
  619. sendInfo.Keywords = keywords
  620. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  621. sendInfo.RedirectTarget = 4
  622. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  623. sendInfo.OpenIdArr = openIdArr
  624. sendInfo.RedirectUrl = redirectUrl
  625. err = SendCategoryTemplateMsg(sendInfo)
  626. return
  627. }
  628. // 用户报名模板消息推送(研选公众号类目模版消息)
  629. func SendNeiRongZuActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  630. defer func() {
  631. if err != nil {
  632. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityDetail.ActivityId), 2)
  633. fmt.Println(err)
  634. }
  635. }()
  636. sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  637. if e != nil && e.Error() != utils.ErrNoRow() {
  638. return
  639. }
  640. var mobile string
  641. var sellerRealName string
  642. var mobiles []string
  643. mobiles = append(mobiles, utils.RAI_MOBILE_GAO_YI_WEN, utils.RAI_MOBILE_DONG_HENG, utils.RAI_MOBILE_WU_ANG_DI, utils.MobileShenTao, utils.MobileZhangChuanXin) //高亦文、董衡、吴昂迪手机号
  644. if sellerItemQy != nil {
  645. mobiles = append(mobiles, sellerItemQy.Mobile)
  646. sellerRealName = sellerItemQy.RealName
  647. } else {
  648. sellerRealName = "__"
  649. }
  650. mobile = strings.Join(mobiles, ",")
  651. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  652. if e != nil {
  653. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  654. return err
  655. }
  656. if len(openIdList) == 0 {
  657. err = nil
  658. return
  659. }
  660. openIdArr := make([]string, 0)
  661. for _, v := range openIdList {
  662. openIdArr = append(openIdArr, v.OpenId)
  663. }
  664. var keywords []string
  665. keywords = append(keywords, user.RealName, user.CompanyName, sellerRealName, time.Now().Format(utils.FormatDateTimeMinute2), utils.TruncateActivityNameString("报名:"+activityDetail.ActivityName))
  666. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId) //活动详情地址
  667. sendInfo := new(SendWxCategoryTemplate)
  668. sendInfo.Keywords = keywords
  669. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  670. sendInfo.RedirectTarget = 4
  671. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  672. sendInfo.OpenIdArr = openIdArr
  673. sendInfo.RedirectUrl = redirectUrl
  674. err = SendCategoryTemplateMsg(sendInfo)
  675. return
  676. }
  677. // 用户取消报名模板消息推送(研选公众号类目模版消息)
  678. func SendActivitieCancelSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  679. defer func() {
  680. if err != nil {
  681. fmt.Println(err)
  682. go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,活动ID:", activityDetail.ActivityId), 2)
  683. }
  684. }()
  685. sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  686. if e != nil && e.Error() != utils.ErrNoRow() {
  687. return
  688. }
  689. var mobile string
  690. var sellerRealName string
  691. var mobiles []string
  692. mobiles = append(mobiles, utils.RAI_MOBILE_GAO_YI_WEN, utils.RAI_MOBILE_DONG_HENG, utils.RAI_MOBILE_WU_ANG_DI, utils.MobileShenTao, utils.MobileZhangChuanXin) //高亦文、董衡、吴昂迪手机号
  693. if sellerItemQy != nil {
  694. mobiles = append(mobiles, sellerItemQy.Mobile)
  695. sellerRealName = sellerItemQy.RealName
  696. } else {
  697. sellerRealName = "__"
  698. }
  699. mobile = strings.Join(mobiles, ",")
  700. openIdList, e := models.GetMfyxWxOpenIdByMobileList(mobile)
  701. if e != nil {
  702. err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
  703. return err
  704. }
  705. if len(openIdList) == 0 {
  706. err = nil
  707. return
  708. }
  709. openIdArr := make([]string, 0)
  710. for _, v := range openIdList {
  711. openIdArr = append(openIdArr, v.OpenId)
  712. }
  713. var keywords []string
  714. keywords = append(keywords, user.RealName, user.CompanyName, sellerRealName, time.Now().Format(utils.FormatDateTimeMinute2), utils.TruncateActivityNameString("取消报名:"+activityDetail.ActivityName))
  715. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId) //活动详情地址
  716. sendInfo := new(SendWxCategoryTemplate)
  717. sendInfo.Keywords = keywords
  718. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  719. sendInfo.RedirectTarget = 4
  720. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
  721. sendInfo.OpenIdArr = openIdArr
  722. sendInfo.RedirectUrl = redirectUrl
  723. err = SendCategoryTemplateMsg(sendInfo)
  724. return
  725. }