activity.go 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109
  1. package services
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/tealeg/xlsx"
  6. "hongze/hongze_cygx/models"
  7. "hongze/hongze_cygx/utils"
  8. "os"
  9. "path/filepath"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. //修改活动状态
  15. func UpdateActivitySattus(cont context.Context) (err error) {
  16. //defer func() {
  17. // if err != nil {
  18. // fmt.Println("同步失败,Err:", err.Error())
  19. // }
  20. //}()
  21. go models.UpdateActivitySattusToHaveInHand()
  22. go models.UpdateActivitySattusToComplete()
  23. return
  24. }
  25. //推送会议开始消息提醒60分钟前
  26. func SendActivityBeginMsg(cont context.Context) (err error) {
  27. defer func() {
  28. if err != nil {
  29. go utils.SendAlarmMsg("60分钟会议消息提醒失败", 2)
  30. fmt.Println("发送失败,Err:", err.Error())
  31. }
  32. }()
  33. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  34. listActivity, err := models.GetActivitySendMsgListAll(endDate)
  35. fmt.Println(len(listActivity))
  36. if err != nil {
  37. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  38. return
  39. }
  40. if len(listActivity) == 0 {
  41. return
  42. }
  43. var remark = "点击查看活动详情"
  44. var signupIds string
  45. for _, v := range listActivity {
  46. signupIds += strconv.Itoa(v.Id) + ","
  47. var reserveResults string
  48. var first string
  49. openIdItem := new(models.OpenIdList)
  50. openIdItem.OpenId = v.OpenId
  51. openIdItem.UserId = v.UserId
  52. openIdList := make([]*models.OpenIdList, 0)
  53. openIdList = append(openIdList, openIdItem)
  54. //if v.FailType == 0 {
  55. // reserveResults = "成功"
  56. //} else if v.FailType == 1 {
  57. // reserveResults = "失败(总人数已满)"
  58. //} else if v.FailType == 2 {
  59. // reserveResults = "失败(单机构超限制)"
  60. //} else if v.FailType == 3 {
  61. // reserveResults = "失败(爽约次数超限)"
  62. //}
  63. reserveResults = "--"
  64. first = "您有一场【" + v.ActivityTypeName + "】将在1小时后开始"
  65. SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTime, v.Address, remark, openIdList, v.ActivityId)
  66. }
  67. if len(signupIds) == 0 {
  68. return
  69. }
  70. signupIds = strings.TrimRight(signupIds, ",")
  71. err = models.UPdateSendedMsgStatus(signupIds)
  72. if err != nil {
  73. var msg string
  74. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  75. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  76. }
  77. return
  78. }
  79. //推送会议开始消息提醒15分钟前
  80. func SendActivityBeginMsgMeeting(cont context.Context) (err error) {
  81. defer func() {
  82. if err != nil {
  83. go utils.SendAlarmMsg("15分钟会议消息提醒失败", 2)
  84. fmt.Println("发送失败,Err:", err.Error())
  85. }
  86. }()
  87. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  88. listActivity, err := models.GetActivitySendMsgListAllMeeting(endDate)
  89. if err != nil {
  90. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  91. return
  92. }
  93. if len(listActivity) == 0 {
  94. return
  95. }
  96. var signupIds string
  97. var remark = "点击查看活动详情"
  98. for _, v := range listActivity {
  99. signupIds += strconv.Itoa(v.Id) + ","
  100. var reserveResults string
  101. var first string
  102. openIdItem := new(models.OpenIdList)
  103. openIdItem.OpenId = v.OpenId
  104. openIdItem.UserId = v.UserId
  105. openIdList := make([]*models.OpenIdList, 0)
  106. openIdList = append(openIdList, openIdItem)
  107. reserveResults = "--"
  108. first = "您有一场【" + v.ActivityTypeName + "】将在15分钟后开始"
  109. SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTime, "--", remark, openIdList, v.ActivityId)
  110. }
  111. if len(signupIds) == 0 {
  112. return
  113. }
  114. signupIds = strings.TrimRight(signupIds, ",")
  115. err = models.UPdateSendedMsgMeetingStatus(signupIds)
  116. if err != nil {
  117. var msg string
  118. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  119. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  120. }
  121. return
  122. }
  123. //预约外呼名单,会前1小时自动发送邮件给专家组
  124. func SendEmailFileToExpert(cont context.Context) (err error) {
  125. var msg string
  126. var touser string
  127. defer func() {
  128. if err != nil {
  129. fmt.Println("err:", err)
  130. go utils.SendAlarmMsg("发送附件模版消息失败", 2)
  131. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  132. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  133. }
  134. if msg != "" {
  135. fmt.Println(msg)
  136. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  137. }
  138. }()
  139. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  140. total, err := models.GetCountActivityIdToSendFile(endDate)
  141. if total == 0 {
  142. fmt.Println("发送附件完成0")
  143. return nil
  144. }
  145. if err != nil {
  146. msg = "发送附件模版消息失败 Err:" + err.Error()
  147. return
  148. }
  149. listActivity, err := models.GetActivityIdToSendFile(endDate)
  150. if err != nil {
  151. msg = "发送附件模版消息失败 Err:" + err.Error()
  152. return
  153. }
  154. for _, v := range listActivity {
  155. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  156. if activityInfo == nil {
  157. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  158. return
  159. }
  160. list, errFile := models.GetSignupExport(v.ActivityId)
  161. if errFile != nil {
  162. msg = "获取失败,Err:" + errFile.Error()
  163. return
  164. }
  165. //创建excel
  166. dir, errFile := os.Executable()
  167. exPath := filepath.Dir(dir)
  168. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  169. xlsxFile := xlsx.NewFile()
  170. if errFile != nil {
  171. msg = "生成文件失败Err:" + errFile.Error()
  172. return
  173. }
  174. style := xlsx.NewStyle()
  175. alignment := xlsx.Alignment{
  176. Horizontal: "center",
  177. Vertical: "center",
  178. WrapText: true,
  179. }
  180. style.Alignment = alignment
  181. style.ApplyAlignment = true
  182. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  183. if errFile != nil {
  184. msg = "新增Sheet失败,Err:" + errFile.Error()
  185. return
  186. }
  187. //设置宽度
  188. _ = sheet.SetColWidth(1, 1, 15)
  189. _ = sheet.SetColWidth(3, 3, 30)
  190. //标头
  191. rowTitle := sheet.AddRow()
  192. cellA := rowTitle.AddCell()
  193. cellA.Value = "姓名"
  194. cellB := rowTitle.AddCell()
  195. cellB.Value = "外呼号码"
  196. cellC := rowTitle.AddCell()
  197. cellC.Value = "国际代码"
  198. cellD := rowTitle.AddCell()
  199. cellD.Value = "公司名称"
  200. cellE := rowTitle.AddCell()
  201. cellE.Value = "所属销售"
  202. for _, item := range list {
  203. row := sheet.AddRow()
  204. cellA := row.AddCell()
  205. cellA.Value = item.RealName
  206. cellB := row.AddCell()
  207. cellB.Value = item.OutboundMobile
  208. cellC := row.AddCell()
  209. if item.CountryCode == "" {
  210. cellC.Value = "86"
  211. } else {
  212. cellC.Value = item.CountryCode
  213. }
  214. cellD := row.AddCell()
  215. cellD.Value = item.CompanyName
  216. cellE := row.AddCell()
  217. cellE.Value = item.SellerName
  218. }
  219. errFile = xlsxFile.Save(downLoadnFilePath)
  220. if errFile != nil {
  221. msg = "保存文件失败Err:" + errFile.Error()
  222. return
  223. }
  224. title := activityInfo.ActivityName + "外呼名单"
  225. content := "外呼名单详情"
  226. fileName := downLoadnFilePath
  227. if activityInfo.ChartPermissionName == "科技" {
  228. touser = utils.EmailTechnology
  229. } else if activityInfo.ChartPermissionName == "医药" {
  230. touser = utils.EmailMedicine
  231. } else if activityInfo.ChartPermissionName == "消费" {
  232. touser = utils.EmailConsumption
  233. } else if activityInfo.ChartPermissionName == "智造" {
  234. touser = utils.EmailZhizao
  235. } else if activityInfo.ChartPermissionName == "策略" {
  236. touser = utils.EmailStrategy
  237. } else if strings.Contains(activityInfo.ChartPermissionName, "研选") {
  238. touser = utils.EmailExpert
  239. }
  240. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  241. if sendResult {
  242. errFile = models.UPdateActivityIdToSendFile(v.ActivityId)
  243. if errFile != nil {
  244. msg = "获取失败,Err:" + errFile.Error()
  245. return
  246. }
  247. os.Remove(downLoadnFilePath)
  248. } else {
  249. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  250. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  251. }
  252. }
  253. return
  254. }
  255. func EditOutboundMobile(cont context.Context) (err error) {
  256. defer func() {
  257. if err != nil {
  258. fmt.Println("发送失败,Err:", err.Error())
  259. }
  260. }()
  261. list, err := models.GetActivitySignupListAll()
  262. if err != nil {
  263. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  264. return
  265. }
  266. for _, v := range list {
  267. err = models.UPdateSignup(v)
  268. fmt.Println("修改:", strconv.Itoa(v.Id))
  269. if err != nil {
  270. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.Id))
  271. }
  272. }
  273. fmt.Println("修改完成")
  274. return
  275. }
  276. //同步用户绑定手机号以及区号
  277. func EditUserOutboundMobile(cont context.Context) (err error) {
  278. defer func() {
  279. if err != nil {
  280. fmt.Println("发送失败,Err:", err.Error())
  281. }
  282. }()
  283. list, err := models.GetUserListAll()
  284. if err != nil {
  285. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  286. return
  287. }
  288. for _, v := range list {
  289. err = models.UPdateUserCountryCode(v)
  290. fmt.Println("修改:", strconv.Itoa(v.UserId))
  291. if err != nil {
  292. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.UserId))
  293. }
  294. }
  295. fmt.Println("修改完成")
  296. return
  297. }
  298. //获取 用户类型 //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  299. func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
  300. var permissionStr, permissionZhegnshiStr string
  301. if companyId <= 1 {
  302. userType = 0
  303. } else {
  304. total, errs := models.GetCountCompanyDetailByIdGroup(companyId)
  305. if errs != nil {
  306. err = errs
  307. return
  308. }
  309. if total == 0 {
  310. userType = 0
  311. } else {
  312. companyDetail, errs := models.GetCompanyDetailByIdGroup(companyId)
  313. if errs != nil {
  314. err = errs
  315. return
  316. }
  317. permissionStr, errs = models.GetCompanyPermissionByUser(companyId)
  318. if errs != nil {
  319. err = errs
  320. return
  321. }
  322. permissionZhegnshiStr, errs = models.GetCompanyPermissionByUserZhengShi(companyId)
  323. if errs != nil {
  324. err = errs
  325. return
  326. }
  327. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  328. if companyDetail.Status == "永续" {
  329. userType = 1
  330. } else if companyDetail.Status == "试用" {
  331. userType = 5
  332. } else if companyDetail.Status == "正式" {
  333. if permissionStr == "专家" {
  334. userType = 4
  335. } else if strings.Count(permissionZhegnshiStr, "医药") == 2 && strings.Count(permissionZhegnshiStr, "消费") == 2 && strings.Count(permissionZhegnshiStr, "科技") == 2 && strings.Count(permissionZhegnshiStr, "智造") == 2 {
  336. userType = 2
  337. } else {
  338. userType = 3
  339. }
  340. if userType == 3 {
  341. if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
  342. userType = 4
  343. }
  344. }
  345. }
  346. }
  347. }
  348. permissionStrnew = permissionStr
  349. return
  350. }
  351. // 校验被分享的用户是否有查看详情的权限
  352. func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, userType int) (noPower bool, err error) {
  353. //var noPower bool
  354. if (userType == 1 || userType == 4 || userType == 5) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  355. noPower = true
  356. }
  357. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  358. if userType == 2 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
  359. noPower = true
  360. }
  361. if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  362. noPower = true
  363. }
  364. if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
  365. noPower = true
  366. }
  367. if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  368. noPower = true
  369. }
  370. return
  371. }
  372. // 校验用户报名的权限
  373. func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDetailStatus string, userType int) (havePower bool, err error) {
  374. if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.LimitPeopleNum == 0 {
  375. havePower = true
  376. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "正式" && strings.Contains(activityInfo.CustomerTypeIds, "4") {
  377. havePower = true
  378. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "试用" && strings.Contains(activityInfo.CustomerTypeIds, "5") {
  379. havePower = true
  380. //} else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  381. // havePower = true
  382. //} else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  383. // havePower = true
  384. } else if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 4 || activityInfo.ActivityTypeId == 5) && strings.Contains(permissionStr, "专家") {
  385. havePower = true
  386. }
  387. if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 {
  388. if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(主观)") {
  389. havePower = true
  390. }
  391. } else {
  392. if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(客观)") {
  393. havePower = true
  394. }
  395. }
  396. if (strings.Contains(activityInfo.ChartPermissionName, "研选") || activityInfo.ChartPermissionName == "策略") && strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  397. havePower = true
  398. }
  399. return
  400. }
  401. //研选系列专家电话会,会前1小时将问题列表发送给邮箱
  402. func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
  403. var msg string
  404. //var touser string
  405. defer func() {
  406. if err != nil {
  407. go utils.SendAlarmMsg("发送附件模版消息失败", 2)
  408. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  409. }
  410. if msg != "" {
  411. go utils.SendAlarmMsg(msg, 2)
  412. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  413. }
  414. }()
  415. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  416. condition := `AND a.activity_type_id = 1 AND a.chart_permission_id = 31 `
  417. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  418. if total == 0 {
  419. fmt.Println("发送附件完成0")
  420. return nil
  421. }
  422. if err != nil {
  423. msg = "发送附件模版消息失败 Err:" + err.Error()
  424. return
  425. }
  426. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  427. if err != nil {
  428. msg = "发送附件模版消息失败 Err:" + err.Error()
  429. return
  430. }
  431. for _, v := range listActivity {
  432. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  433. if activityInfo == nil {
  434. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  435. return
  436. }
  437. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  438. if errFile != nil {
  439. msg = "获取失败,Err:" + errFile.Error()
  440. return
  441. }
  442. for _, v2 := range list {
  443. user, err := models.GetWxUserItemByUserId(v2.UserId)
  444. if err != nil && err.Error() != utils.ErrNoRow() {
  445. return err
  446. }
  447. //获取销售信息
  448. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  449. if err != nil && err.Error() != utils.ErrNoRow() {
  450. return err
  451. }
  452. //给研究员推送消息
  453. if sellerItem != nil {
  454. openIpItem, _ := models.GetUserRecordByMobile(4, utils.ActSendMsgMobile)
  455. if openIpItem != nil && openIpItem.OpenId != "" {
  456. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, activityInfo.ActivityId, openIpItem)
  457. }
  458. }
  459. //给所属销售推送消息
  460. if sellerItem != nil {
  461. openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
  462. if openIpItem != nil && openIpItem.OpenId != "" {
  463. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, activityInfo.ActivityId, openIpItem)
  464. }
  465. }
  466. }
  467. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  468. if errFile != nil {
  469. msg = "获取失败,Err:" + errFile.Error()
  470. return
  471. }
  472. }
  473. return
  474. }
  475. //非研选系列专家电话会,根据主持人姓名,会前15分钟将问题列表发送给至该主持人对应邮箱
  476. func SendEmailFileForAskMsg(cont context.Context) (err error) {
  477. var msg string
  478. //var touser string
  479. defer func() {
  480. if err != nil {
  481. go utils.SendAlarmMsg("发送附件模版消息失败", 2)
  482. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  483. }
  484. if msg != "" {
  485. go utils.SendAlarmMsg(msg, 2)
  486. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  487. }
  488. }()
  489. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  490. condition := `AND a.activity_type_id = 1 AND a.chart_permission_id != 31 `
  491. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  492. if total == 0 {
  493. fmt.Println("发送附件完成0")
  494. return nil
  495. }
  496. if err != nil {
  497. msg = "发送附件模版消息失败 Err:" + err.Error()
  498. return
  499. }
  500. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  501. if err != nil {
  502. msg = "发送附件模版消息失败 Err:" + err.Error()
  503. return
  504. }
  505. listEmail, errEmail := models.GetAskEmail()
  506. if errEmail != nil {
  507. msg = "获取失败,Err:" + errEmail.Error()
  508. return
  509. }
  510. for _, v := range listActivity {
  511. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  512. if activityInfo == nil {
  513. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  514. return
  515. }
  516. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  517. if errFile != nil {
  518. msg = "获取失败,Err:" + errFile.Error()
  519. return
  520. }
  521. for _, v2 := range list {
  522. user, err := models.GetWxUserItemByUserId(v2.UserId)
  523. if err != nil && err.Error() != utils.ErrNoRow() {
  524. return err
  525. }
  526. var sendMobile string
  527. for _, vEmail := range listEmail {
  528. if strings.Index(activityInfo.Host, vEmail.Name) > 0 {
  529. sendMobile = vEmail.Mobile
  530. }
  531. }
  532. //获取销售信息
  533. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  534. if err != nil && err.Error() != utils.ErrNoRow() {
  535. return err
  536. }
  537. //给研究员推送模板消息
  538. if sellerItem != nil {
  539. openIpItem, _ := models.GetUserRecordByMobile(4, sendMobile)
  540. if openIpItem != nil && openIpItem.OpenId != "" {
  541. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, activityInfo.ActivityId, openIpItem)
  542. }
  543. }
  544. //给销售推送模板消息
  545. if sellerItem != nil {
  546. openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
  547. if openIpItem != nil && openIpItem.OpenId != "" {
  548. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, activityInfo.ActivityId, openIpItem)
  549. }
  550. }
  551. }
  552. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  553. if errFile != nil {
  554. msg = "获取失败,Err:" + errFile.Error()
  555. return
  556. }
  557. }
  558. return
  559. }
  560. //活动标签字符串处理
  561. func LabelStr(label string) (labelNew string) {
  562. slicebr := strings.Split(label, "-")
  563. if len(slicebr) < 2 {
  564. labelNew = label
  565. } else {
  566. labelNew = slicebr[1]
  567. }
  568. return labelNew
  569. }
  570. //5.3版本活动标签字符串处理
  571. func LabelStrV5(label string, isShowSubjectName int) (labelNew string) {
  572. slicebr := strings.Split(label, "-")
  573. if len(slicebr) > 1 {
  574. if isShowSubjectName == 1 {
  575. labelNew = slicebr[1]
  576. } else {
  577. labelNew = slicebr[0]
  578. }
  579. } else {
  580. labelNew = label
  581. }
  582. return labelNew
  583. }
  584. func ActivityAttendanceDetail(cont context.Context) (err error) {
  585. defer func() {
  586. if err != nil {
  587. fmt.Println("ActivityAttendanceDetail Err:" + err.Error())
  588. go utils.SendAlarmMsg("同步进门财经数据失败", 2)
  589. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ActivityAttendanceDetail ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  590. }
  591. }()
  592. configCode := "jin_meng_activity_id"
  593. detail, err := models.GetConfigByCode(configCode)
  594. if err != nil {
  595. return err
  596. }
  597. fmt.Println(detail.ConfigValue)
  598. mapActivityId := make(map[string]string)
  599. sliceValue := strings.Split(detail.ConfigValue, ",")
  600. for _, v := range sliceValue {
  601. mapActivityId[v] = v
  602. }
  603. var activityIds string
  604. var activityIdsLongTime string //可回放的会议,到会详情持续更新加入到不做14天限制的活动中
  605. fmt.Println("开始同步")
  606. dateTime := time.Now().AddDate(0, 0, -14).Format(utils.FormatDate)
  607. dateNow := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  608. startDate := dateTime + " 00:00:00"
  609. endDate := dateNow + " 23:59:59"
  610. //获取进门财经需要处理的活动
  611. listActivityRoadshow, err := models.GetRoadshowDataListByDateTime(startDate, endDate)
  612. if err != nil {
  613. fmt.Println("GetRoadshowDataListByDateTime Err:", err.Error())
  614. return err
  615. }
  616. for _, vAct := range listActivityRoadshow {
  617. doTime := utils.TimeRemoveHms2(vAct.RoadshowBeginTime)
  618. findStartDate := doTime + " 00:00:00"
  619. findEndDate := doTime + " 23:59:59"
  620. var roadshowTitle string
  621. roadshowTitle = vAct.RoadshowTitle
  622. vAct.RoadshowTitle = strings.Replace(vAct.RoadshowTitle, "【", "", -1)
  623. vAct.RoadshowTitle = strings.Replace(vAct.RoadshowTitle, "】", "", -1)
  624. vAct.RoadshowTitle = strings.Replace(vAct.RoadshowTitle, " ", "", -1)
  625. vAct.RoadshowTitle = strings.Replace(vAct.RoadshowTitle, "-", "", -1)
  626. vAct.RoadshowTitle = strings.Replace(vAct.RoadshowTitle, ":", "", -1)
  627. nameSlice := strings.Split(vAct.RoadshowTitle, "|")
  628. //fmt.Println(timeSlice[0])
  629. //对于手动匹配到的活动数据也要更新
  630. var activityName string
  631. if len(nameSlice) >= 1 {
  632. //if vAct.JmcjRoadshowTitle != "" {
  633. // activityName = vAct.JmcjRoadshowTitle
  634. //} else {
  635. // activityName = nameSlice[len(nameSlice)-1]
  636. //}
  637. activityName = nameSlice[len(nameSlice)-1]
  638. if activityName != "" {
  639. //通过名称去找匹配的活动
  640. activityDetail, _ := models.GetAddActivityInfoByTitle(activityName, findStartDate, findEndDate)
  641. if activityDetail == nil {
  642. continue
  643. } else {
  644. activityIds += strconv.Itoa(activityDetail.ActivityId) + ","
  645. }
  646. list, err := models.GetRoadshowDataList(roadshowTitle, findStartDate, findEndDate)
  647. if err != nil {
  648. fmt.Println("GetTacticsList Err:", err.Error())
  649. return err
  650. }
  651. var isPlayback bool // 是否包含回放
  652. needAddAttendanc := make([]*models.CygxActivityAttendanceDetail, 0)
  653. var mobileStr string
  654. if len(list) > 0 {
  655. fmt.Println("原来的", vAct.RoadshowTitle)
  656. fmt.Println("处理的", activityName)
  657. for _, v := range list {
  658. if v.UserPhone != "" {
  659. item := new(models.CygxActivityAttendanceDetail)
  660. item.ActivityId = activityDetail.ActivityId
  661. item.RealName = v.UserName
  662. item.Mobile = v.UserPhone
  663. item.CompanyName = v.Company
  664. //item.SellerName = sellerName
  665. item.FirstMeetingTime = v.FirstWatchTime
  666. item.LastMeetingTime = v.LastWatchTime
  667. item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
  668. if v.JoinType == 1 {
  669. item.MeetingTypeStr = "网络"
  670. } else {
  671. item.MeetingTypeStr = "电话"
  672. }
  673. item.MeetingAuthentication = v.AuthInfo
  674. if v.DataType == 1 {
  675. item.MeetingStatusStr = "直播"
  676. } else {
  677. item.MeetingStatusStr = "回放"
  678. isPlayback = true
  679. }
  680. item.Position = v.Occupation
  681. item.UseridEntity = v.UseridEntity
  682. item.ActivityTime = activityDetail.ActivityTime
  683. item.CreateTime = time.Now()
  684. mobileStr += "'" + v.UserPhone + "'" + ","
  685. needAddAttendanc = append(needAddAttendanc, item)
  686. }
  687. }
  688. if isPlayback && mapActivityId[strconv.Itoa(activityDetail.ActivityId)] == "" {
  689. activityIdsLongTime += strconv.Itoa(activityDetail.ActivityId) + ","
  690. }
  691. mobileStr = strings.TrimRight(mobileStr, ",")
  692. if mobileStr == "" {
  693. mobileStr = "1"
  694. }
  695. listUser, err := models.GetWxUserOutboundMobile(mobileStr)
  696. if err != nil {
  697. fmt.Println("GetWxUserOutboundMobile Err:", err.Error())
  698. return err
  699. }
  700. for k, v := range needAddAttendanc {
  701. for _, v2 := range listUser {
  702. if v2.OutboundMobile == v.Mobile || v2.Mobile == v.Mobile {
  703. if needAddAttendanc[k].CompanyId == 0 {
  704. needAddAttendanc[k].CompanyId = v2.CompanyId
  705. needAddAttendanc[k].SellerName = v2.SellerName
  706. needAddAttendanc[k].CompanyName = v2.CompanyName
  707. needAddAttendanc[k].IsMeetingStr = 1
  708. }
  709. }
  710. }
  711. }
  712. //fmt.Println(mobileStr)
  713. //参会记录
  714. err = models.AddAttendancDetail(needAddAttendanc, activityDetail.ActivityId, mobileStr)
  715. if err != nil {
  716. fmt.Println("AddAttendancDetail Err:", err.Error())
  717. return err
  718. }
  719. ////处理是否限制报名
  720. err = AddCygxActivityRestrictSignupByAdmin(activityDetail.ActivityId)
  721. if err != nil {
  722. fmt.Println("AddCygxActivityRestrictSignupByAdmin Err:", err.Error())
  723. return err
  724. }
  725. }
  726. }
  727. }
  728. }
  729. //获取需要处理的活动
  730. listActivity, err := models.GetActivityListByDateTime(startDate, endDate, activityIds, detail.ConfigValue)
  731. if err != nil {
  732. fmt.Println("GetTacticsList Err:", err.Error())
  733. return err
  734. }
  735. //通过本地去找进门财经的数据
  736. for _, vAct := range listActivity {
  737. doTime := utils.TimeRemoveHms2(vAct.ActivityTime)
  738. findStartDate := doTime + " 00:00:00"
  739. findEndDate := doTime + " 23:59:59"
  740. nameSlice := strings.Split(vAct.ActivityName, "】")
  741. //对于手动匹配到的活动数据也要更新
  742. var activityName string
  743. if len(nameSlice) > 1 {
  744. if vAct.JmcjRoadshowTitle != "" {
  745. activityName = vAct.JmcjRoadshowTitle
  746. } else {
  747. activityName = nameSlice[len(nameSlice)-1]
  748. }
  749. //activityName = nameSlice[len(nameSlice)-1]
  750. if activityName != "" {
  751. list, err := models.GetRoadshowDataList(activityName, findStartDate, findEndDate)
  752. if err != nil {
  753. fmt.Println("GetTacticsList Err:", err.Error())
  754. return err
  755. }
  756. var isPlayback bool // 是否包含回放
  757. needAddAttendanc := make([]*models.CygxActivityAttendanceDetail, 0)
  758. var mobileStr string
  759. if len(list) > 0 {
  760. fmt.Println("原来的1", vAct.ActivityName)
  761. fmt.Println("处理的2", activityName)
  762. for _, v := range list {
  763. if v.UserPhone != "" {
  764. item := new(models.CygxActivityAttendanceDetail)
  765. item.ActivityId = vAct.ActivityId
  766. item.RealName = v.UserName
  767. item.Mobile = v.UserPhone
  768. item.CompanyName = v.Company
  769. //item.SellerName = sellerName
  770. item.FirstMeetingTime = v.FirstWatchTime
  771. item.LastMeetingTime = v.LastWatchTime
  772. item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
  773. if v.JoinType == 1 {
  774. item.MeetingTypeStr = "网络"
  775. } else {
  776. item.MeetingTypeStr = "电话"
  777. }
  778. item.MeetingAuthentication = v.AuthInfo
  779. if v.DataType == 1 {
  780. item.MeetingStatusStr = "直播"
  781. } else {
  782. item.MeetingStatusStr = "回放"
  783. isPlayback = true
  784. }
  785. item.Position = v.Occupation
  786. item.UseridEntity = v.UseridEntity
  787. item.ActivityTime = vAct.ActivityTime
  788. item.CreateTime = time.Now()
  789. mobileStr += "'" + v.UserPhone + "'" + ","
  790. needAddAttendanc = append(needAddAttendanc, item)
  791. }
  792. }
  793. if isPlayback && mapActivityId[strconv.Itoa(vAct.ActivityId)] == "" {
  794. activityIdsLongTime += strconv.Itoa(vAct.ActivityId) + ","
  795. }
  796. mobileStr = strings.TrimRight(mobileStr, ",")
  797. if mobileStr == "" {
  798. mobileStr = "1"
  799. }
  800. listUser, err := models.GetWxUserOutboundMobile(mobileStr)
  801. if err != nil {
  802. fmt.Println("GetWxUserOutboundMobile Err:", err.Error())
  803. return err
  804. }
  805. for k, v := range needAddAttendanc {
  806. for _, v2 := range listUser {
  807. if v2.OutboundMobile == v.Mobile || v2.Mobile == v.Mobile {
  808. if needAddAttendanc[k].CompanyId == 0 {
  809. needAddAttendanc[k].CompanyId = v2.CompanyId
  810. needAddAttendanc[k].SellerName = v2.SellerName
  811. needAddAttendanc[k].CompanyName = v2.CompanyName
  812. needAddAttendanc[k].IsMeetingStr = 1
  813. }
  814. }
  815. }
  816. }
  817. ////参会记录
  818. err = models.AddAttendancDetail(needAddAttendanc, vAct.ActivityId, mobileStr)
  819. if err != nil {
  820. fmt.Println("AddAttendancDetail Err:", err.Error())
  821. return err
  822. }
  823. ////处理是否限制报名
  824. err = AddCygxActivityRestrictSignupByAdmin(vAct.ActivityId)
  825. if err != nil {
  826. fmt.Println("AddCygxActivityRestrictSignupByAdmin Err:", err.Error())
  827. return err
  828. }
  829. activityIds += strconv.Itoa(vAct.ActivityId) + ","
  830. }
  831. }
  832. }
  833. }
  834. if activityIdsLongTime != "" {
  835. activityIdsLongTime = strings.TrimRight(activityIdsLongTime, ",")
  836. activityIdsLongTime = detail.ConfigValue + "," + activityIdsLongTime
  837. go models.UpdateConfigByCode(activityIdsLongTime, configCode)
  838. }
  839. activityIds = strings.TrimRight(activityIds, ",")
  840. if activityIds != "" {
  841. detailList, err := models.GetActivityAttendanceDetailList(activityIds)
  842. if err != nil {
  843. fmt.Println("GetActivityAttendanceDetailList Err:", err.Error())
  844. return err
  845. }
  846. //添加报名日志 (下载使用)
  847. err = models.AddCygxActivityMeetDetailLogOnlineByList(detailList, activityIds)
  848. if err != nil {
  849. fmt.Println("AddCygxActivityMeetDetailLogOnline Err:", err.Error())
  850. return err
  851. }
  852. }
  853. fmt.Println("结束路演同步")
  854. return
  855. }
  856. //判断是否加入黑名单
  857. func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
  858. total, err := models.GetActivitySignupNomeetingCount(activityId)
  859. if err != nil {
  860. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  861. fmt.Println(" Err:", err.Error())
  862. return err
  863. }
  864. if total == 0 {
  865. return err
  866. }
  867. mobileList, _ := models.GetUserMeetingMobile(activityId)
  868. if len(mobileList) >= 0 {
  869. for _, v := range mobileList {
  870. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  871. if err != nil {
  872. fmt.Println(" Err:", err.Error())
  873. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  874. return err
  875. }
  876. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  877. if err != nil {
  878. fmt.Println(" Err:", err.Error())
  879. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  880. return err
  881. }
  882. if totalRestrict > 0 && totalNomeet < 3 {
  883. err = models.DeleteCygxActivityRestrictSignup(v.UserId)
  884. if err != nil {
  885. fmt.Println(" Err:", err.Error())
  886. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  887. return err
  888. }
  889. }
  890. }
  891. }
  892. list, err := models.GetActivitySignupNomeetingCountList(activityId)
  893. if err != nil {
  894. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  895. fmt.Println(" 用户限制报名失败 Err:", err.Error())
  896. return err
  897. }
  898. for _, v := range list {
  899. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  900. if err != nil {
  901. fmt.Println(" Err:", err.Error())
  902. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  903. return err
  904. }
  905. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  906. if err != nil {
  907. fmt.Println(" Err:", err.Error())
  908. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  909. return err
  910. }
  911. if totalNomeet >= 3 {
  912. if totalRestrict == 0 {
  913. infoUser, err := models.GetUserAndCompanyNameList(v.UserId)
  914. if err != nil {
  915. fmt.Println(" Err:", err.Error())
  916. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  917. return err
  918. }
  919. if infoUser != nil {
  920. item := new(models.CygxActivityRestrictSignup)
  921. item.UserId = infoUser.UserId
  922. item.CreateTime = time.Now()
  923. item.Mobile = infoUser.Mobile
  924. item.Email = infoUser.Email
  925. item.CompanyId = infoUser.CompanyId
  926. item.CompanyName = infoUser.CompanyName
  927. item.IsRestrict = 1
  928. err = models.AddCygxActivityRestrictSignup(item)
  929. if err != nil {
  930. fmt.Println(" Err:", err.Error())
  931. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  932. return err
  933. }
  934. }
  935. }
  936. }
  937. }
  938. return
  939. }
  940. //判断预约纪要按钮是否显示
  941. func IsShowAppointment(activityTypeId int, chartPermissionName string) (isShowAppointment bool) {
  942. if activityTypeId == 1 || activityTypeId == 2 || activityTypeId == 3 || activityTypeId == 4 {
  943. isShowAppointment = true
  944. }
  945. if activityTypeId == 5 && chartPermissionName == "医药" {
  946. isShowAppointment = true
  947. }
  948. return
  949. }
  950. //用户报告操作行为,模板消息推送 (先放在活动模块下,避免代码冲突)
  951. func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDetail, source int) (err error) {
  952. defer func() {
  953. if err != nil {
  954. go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
  955. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  956. }
  957. }()
  958. countUser, err := models.GetUserRemind(user.UserId)
  959. if err != nil {
  960. return err
  961. }
  962. if countUser == 0 {
  963. return err
  964. }
  965. var sourceMsg string
  966. if source == 1 {
  967. sourceMsg = "阅读报告"
  968. } else {
  969. sourceMsg = "收藏报告"
  970. }
  971. //获取销售手机号
  972. sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  973. if err != nil && err.Error() != utils.ErrNoRow() {
  974. return err
  975. }
  976. if sellerItemQy != nil {
  977. openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
  978. if err != nil {
  979. fmt.Println(err)
  980. return err
  981. }
  982. var keyword1 string
  983. var keyword2 string
  984. keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:", sourceMsg)
  985. keyword2 = articleDetail.Title
  986. SendWxMsgWithArticleUserRemind(keyword1, keyword2, openIdList, articleDetail.ArticleId)
  987. }
  988. return
  989. }
  990. //用户活动操作行为,模板消息推送
  991. func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.ActivityDetail, source int) (err error) {
  992. defer func() {
  993. if err != nil {
  994. go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
  995. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  996. }
  997. }()
  998. countUser, err := models.GetUserRemind(user.UserId)
  999. if err != nil {
  1000. return err
  1001. }
  1002. if countUser == 0 {
  1003. return err
  1004. }
  1005. var sourceMsg string
  1006. if source == 1 {
  1007. sourceMsg = "预约外呼"
  1008. } else if source == 2 {
  1009. sourceMsg = "设置会议提醒"
  1010. } else if source == 3 {
  1011. sourceMsg = "预约纪要"
  1012. } else if source == 4 {
  1013. sourceMsg = "活动报名"
  1014. }
  1015. //获取销售手机号
  1016. sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  1017. if err != nil && err.Error() != utils.ErrNoRow() {
  1018. return err
  1019. }
  1020. if sellerItemQy != nil {
  1021. openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
  1022. if err != nil {
  1023. fmt.Println(err)
  1024. return err
  1025. }
  1026. var keyword1 string
  1027. var keyword2 string
  1028. keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:", sourceMsg)
  1029. keyword2 = activityDetail.ActivityName
  1030. SendWxMsgWithActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
  1031. }
  1032. return
  1033. }
  1034. //用户专项调研操作行为,模板消息推送
  1035. func SpecialActivityUserRemind(user *models.WxUserItem, activityDetail *models.CygxActivitySpecialDetail, source int) (err error) {
  1036. defer func() {
  1037. if err != nil {
  1038. go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
  1039. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  1040. }
  1041. }()
  1042. countUser, err := models.GetUserRemind(user.UserId)
  1043. if err != nil {
  1044. return err
  1045. }
  1046. if countUser == 0 {
  1047. return err
  1048. }
  1049. var sourceMsg string
  1050. if source == 1 {
  1051. sourceMsg = "预报名调研"
  1052. }
  1053. //获取销售手机号
  1054. sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
  1055. if err != nil && err.Error() != utils.ErrNoRow() {
  1056. return err
  1057. }
  1058. if sellerItemQy != nil {
  1059. openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
  1060. if err != nil {
  1061. fmt.Println(err)
  1062. return err
  1063. }
  1064. var keyword1 string
  1065. var keyword2 string
  1066. keyword1 = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:", sourceMsg)
  1067. keyword2 = activityDetail.ResearchTheme
  1068. SendWxMsgWithSpecialActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
  1069. }
  1070. return
  1071. }