wx_category_template_msg.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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. postData, err := json.Marshal(sendInfo)
  28. if err != nil {
  29. go utils.SendAlarmMsg("SendCategoryTemplateMsg json.Marshal Err:"+err.Error(), 1)
  30. return err
  31. }
  32. body := ioutil.NopCloser(strings.NewReader(string(postData)))
  33. client := &http.Client{}
  34. req, err := http.NewRequest("POST", utils.SendWxCategoryTemplateMsgUrl, body)
  35. if err != nil {
  36. go utils.SendAlarmMsg("SendCategoryTemplateMsg http.NewRequest Err:"+err.Error(), 1)
  37. return err
  38. }
  39. contentType := "application/json;charset=utf-8"
  40. req.Header.Set("Content-Type", contentType)
  41. req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
  42. resp, err := client.Do(req)
  43. if err != nil {
  44. fmt.Println("http client.Do Err:" + err.Error())
  45. return err
  46. }
  47. defer resp.Body.Close()
  48. b, err := ioutil.ReadAll(resp.Body)
  49. if err != nil {
  50. return err
  51. }
  52. result := new(models.BaseResponse)
  53. err = json.Unmarshal(b, &result)
  54. if err != nil {
  55. return err
  56. }
  57. if result.Ret != 200 {
  58. err = errors.New(string(b))
  59. return err
  60. }
  61. return
  62. }
  63. // 帮我带问的问题,会前1小时发送
  64. func SendMfyxEmailFileForAskMsgResearch(cont context.Context) (err error) {
  65. var msg string
  66. //var touser string
  67. defer func() {
  68. if err != nil {
  69. go utils.SendAlarmMsg("发送附件模版消息失败", 2)
  70. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  71. }
  72. if msg != "" {
  73. go utils.SendAlarmMsg(msg, 2)
  74. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  75. }
  76. }()
  77. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  78. condition := `AND a.activity_type_id = 1 AND a.chart_permission_id = 31 `
  79. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  80. if total == 0 {
  81. fmt.Println("发送附件完成0")
  82. return nil
  83. }
  84. if err != nil {
  85. msg = "发送附件模版消息失败 Err:" + err.Error()
  86. return
  87. }
  88. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  89. if err != nil {
  90. msg = "发送附件模版消息失败 Err:" + err.Error()
  91. return
  92. }
  93. for _, v := range listActivity {
  94. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  95. if activityInfo == nil {
  96. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  97. return
  98. }
  99. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  100. if errFile != nil {
  101. msg = "获取失败,Err:" + errFile.Error()
  102. return
  103. }
  104. for _, v2 := range list {
  105. user, e := models.GetWxUserItemByUserId(v2.UserId)
  106. if e != nil && e.Error() != utils.ErrNoRow() {
  107. err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
  108. return err
  109. }
  110. //获取销售信息
  111. sellerItem, e := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  112. if e != nil && e.Error() != utils.ErrNoRow() {
  113. err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
  114. return
  115. }
  116. //给所属销售推送消息
  117. if sellerItem != nil && user != nil {
  118. openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
  119. openIdList := make([]*models.OpenIdList,0)
  120. openIdList = append(openIdList, openIpItem)
  121. SendWxCategoryMsgWithActivityAsk(user.CompanyName, user.RealName, sellerItem.RealName, time.Now().Format(utils.FormatDateTimeMinute2), v2.Content, openIdList, v.ActivityId)
  122. }
  123. }
  124. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  125. if errFile != nil {
  126. msg = "获取失败,Err:" + errFile.Error()
  127. return
  128. }
  129. }
  130. return
  131. }
  132. // 发送报告提问消息提醒
  133. func SendWxCategoryMsgWithActivityAsk(companyName, realName, sellerName, askTime, askMsg string, openIdList []*models.OpenIdList, msgId int) (err error) {
  134. if len(openIdList) == 0 {
  135. return
  136. }
  137. var msg string
  138. defer func() {
  139. if err != nil {
  140. go utils.SendEmail("发送类目模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  141. go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒类目模版消息失败,用户名", realName, "留言ID:", msgId), 2)
  142. utils.FileLog.Info("发送类目模版消息失败,Err:%s", err.Error())
  143. }
  144. fmt.Println("line 21", err, msg)
  145. }()
  146. var keyword1 string
  147. var keyword2 string
  148. var keyword3 string
  149. var keyword4 string
  150. var keyword5 string
  151. keyword1 = realName
  152. keyword2 = companyName
  153. keyword3 = sellerName
  154. keyword4 = askTime
  155. keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
  156. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  157. openIdArr := make([]string, 0)
  158. for _, v := range openIdList {
  159. openIdArr = append(openIdArr, v.OpenId)
  160. }
  161. redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(msgId)
  162. sendInfo := new(SendWxCategoryTemplate)
  163. sendInfo.Keywords = keywords
  164. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
  165. sendInfo.RedirectTarget = 4
  166. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  167. sendInfo.OpenIdArr = openIdArr
  168. sendInfo.RedirectUrl = redirectUrl
  169. err = SendCategoryTemplateMsg(sendInfo)
  170. if err != nil {
  171. return
  172. }
  173. return
  174. }
  175. // 推送会议开始消息提醒60分钟前
  176. func SendMfyxActivityBeginMsg(cont context.Context) (err error) {
  177. //func SendActivityBeginMsg() (err error) {
  178. defer func() {
  179. if err != nil {
  180. go utils.SendAlarmMsg("60分钟会议消息提醒失败"+err.Error(), 2)
  181. fmt.Println("发送失败,Err:", err.Error())
  182. }
  183. }()
  184. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  185. listActivity, err := models.GetYxActivitySendMsgListAll(endDate)
  186. fmt.Println(len(listActivity))
  187. if err != nil {
  188. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  189. return
  190. }
  191. if len(listActivity) == 0 {
  192. return
  193. }
  194. //var remark = "点击查看活动详情"
  195. var signupIds string
  196. for _, v := range listActivity {
  197. signupIds += strconv.Itoa(v.Id) + ","
  198. //var reserveResults string
  199. //var first string
  200. openIdItem := new(models.OpenIdList)
  201. openIdItem.OpenId = v.OpenId
  202. openIdItem.UserId = v.UserId
  203. openIdList := make([]*models.OpenIdList, 0)
  204. openIdList = append(openIdList, openIdItem)
  205. openIdArr := make([]string, 0)
  206. for _, v := range openIdList {
  207. openIdArr = append(openIdArr, v.OpenId)
  208. }
  209. keywords := []string{utils.TruncateActivityNameString(v.ActivityName), v.ActivityTime}
  210. sendInfo := new(SendWxCategoryTemplate)
  211. sendInfo.Keywords = keywords
  212. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
  213. sendInfo.RedirectTarget = 4
  214. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  215. sendInfo.OpenIdArr = openIdArr
  216. sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
  217. err = SendCategoryTemplateMsg(sendInfo)
  218. if err != nil {
  219. return
  220. }
  221. }
  222. if len(signupIds) == 0 {
  223. return
  224. }
  225. signupIds = strings.TrimRight(signupIds, ",")
  226. err = models.UPdateSendedMsgStatus(signupIds)
  227. if err != nil {
  228. var msg string
  229. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  230. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  231. }
  232. return
  233. }
  234. // 推送会议开始消息提醒15分钟前
  235. func SendMfyxActivityBeginMsgMeeting(cont context.Context) (err error) {
  236. //func SendActivityBeginMsgMeeting() (err error) {
  237. defer func() {
  238. if err != nil {
  239. go utils.SendAlarmMsg("15分钟会议消息提醒失败", 2)
  240. fmt.Println("发送失败,Err:", err.Error())
  241. }
  242. }()
  243. var condition string
  244. var pars []interface{}
  245. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  246. condition = ` AND activity_time <= ? AND activity_time >= NOW() AND publish_status = 1 `
  247. pars = append(pars, endDate)
  248. listActivity, e := models.GetCygxActivityList(condition, pars, 0, 100000)
  249. if e != nil && e.Error() != utils.ErrNoRow() {
  250. err = errors.New("GetCygxActivityList, Err: " + e.Error())
  251. return
  252. }
  253. if len(listActivity) == 0 {
  254. return
  255. }
  256. //var signupIds string
  257. //var remark = "点击查看活动详情"
  258. var activityIds []int
  259. //同一时间举办的活动不多所以这里循环查询
  260. for _, v := range listActivity {
  261. activityIds = append(activityIds, v.ActivityId)
  262. var mobiles []string
  263. pars = make([]interface{}, 0)
  264. condition = ` AND activity_id = ? AND is_send_wx_msg = 0 `
  265. pars = append(pars, v.ActivityId)
  266. //获取设置消息提醒的用户列表
  267. listxReminder, e := models.GetCygxReminderListByUser(condition, pars)
  268. if e != nil {
  269. err = errors.New("GetCygxReminderListByUser, Err: " + e.Error())
  270. return
  271. }
  272. for _, vReminder := range listxReminder {
  273. mobiles = append(mobiles, vReminder.Mobile)
  274. }
  275. pars = make([]interface{}, 0)
  276. condition = ` AND do_fail_type = 0 AND activity_id = ? AND signup_type = 1 AND is_send_wx_msg = 0 `
  277. pars = append(pars, v.ActivityId)
  278. //获取设置预约外呼的用户列表
  279. listSignup, e := models.GetActivitySignupList(condition, pars)
  280. if e != nil && e.Error() != utils.ErrNoRow() {
  281. err = errors.New("GetActivitySignupList, Err: " + e.Error())
  282. return
  283. }
  284. for _, vSignup := range listSignup {
  285. mobiles = append(mobiles, vSignup.Mobile)
  286. }
  287. //获取这些手机号对应的Openid
  288. listOpenid, e := models.GetUserRecordListByMobileArr(mobiles)
  289. if e != nil && e.Error() != utils.ErrNoRow() {
  290. err = errors.New("GetUserRecordListByMobileArr, Err: " + e.Error())
  291. return
  292. }
  293. openIdList := make([]*models.OpenIdList, 0)
  294. for _, vOpenid := range listOpenid {
  295. openIdItem := new(models.OpenIdList)
  296. openIdItem.OpenId = vOpenid.OpenId
  297. openIdItem.UserId = vOpenid.UserId
  298. openIdList = append(openIdList, openIdItem)
  299. }
  300. openIdArr := make([]string, 0)
  301. for _, v := range openIdList {
  302. openIdArr = append(openIdArr, v.OpenId)
  303. }
  304. keywords := []string{utils.TruncateActivityNameString(v.ActivityName), v.ActivityTime}
  305. sendInfo := new(SendWxCategoryTemplate)
  306. sendInfo.Keywords = keywords
  307. sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdArticleUserRemind
  308. sendInfo.RedirectTarget = 4
  309. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  310. sendInfo.OpenIdArr = openIdArr
  311. sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(v.ActivityId)
  312. err = SendCategoryTemplateMsg(sendInfo)
  313. if err != nil {
  314. return
  315. }
  316. }
  317. err = models.UpdateSendedMsgMeetingSendWxMsg(activityIds)
  318. return
  319. }
  320. // 线下调研活动扫码签到给对应销售发类目模班消息
  321. func SendActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
  322. defer func() {
  323. if err != nil {
  324. go utils.SendAlarmMsg(fmt.Sprint("线下调研活动扫码签到给对应销售发模班消息推送失败Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
  325. }
  326. }()
  327. var mobiles []string
  328. //获取销售信息
  329. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  330. if err != nil && err.Error() != utils.ErrNoRow() {
  331. return
  332. }
  333. if sellerItem != nil {
  334. mobiles = append(mobiles, sellerItem.Mobile, utils.MobileWuAngDi, utils.MobileDongHeng, utils.MobileShenTao)
  335. }
  336. var keyword1 string
  337. var keyword2 string
  338. var keyword3 string
  339. var keyword4 string
  340. var keyword5 string
  341. var redirectUrl string
  342. keyword1 = user.RealName
  343. keyword2 = user.CompanyName
  344. keyword3 = sellerItem.RealName
  345. keyword4 = utils.TruncateActivityNameString(activityDetail.ActivityName)
  346. keyword5 = time.Now().Format(utils.FormatDateTimeMinute2)
  347. openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
  348. if e != nil {
  349. err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
  350. return
  351. }
  352. openIdArr := make([]string, 0)
  353. for _, v := range openIdList {
  354. openIdArr = append(openIdArr, v.OpenId)
  355. }
  356. redirectUrl = utils.WX_MSG_PATH_YX_SIGNUP_DETAIL + strconv.Itoa(activityDetail.ActivityId)
  357. keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
  358. sendInfo := new(SendWxCategoryTemplate)
  359. sendInfo.Keywords = keywords
  360. sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdActivitySign
  361. sendInfo.RedirectTarget = 4
  362. sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
  363. sendInfo.OpenIdArr = openIdArr
  364. sendInfo.RedirectUrl = redirectUrl
  365. err = SendCategoryTemplateMsg(sendInfo)
  366. if err != nil {
  367. return
  368. }
  369. return
  370. }