activity.go 36 KB

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