activity.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  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. first = "您有一场【" + v.ActivityTypeName + "】将在1小时后开始"
  62. SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTime, v.Address, remark, openIdList, v.ActivityId)
  63. }
  64. if len(signupIds) == 0 {
  65. return
  66. }
  67. signupIds = strings.TrimRight(signupIds, ",")
  68. err = models.UPdateSendedMsgStatus(signupIds)
  69. if err != nil {
  70. var msg string
  71. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  72. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  73. }
  74. return
  75. }
  76. //推送会议开始消息提醒15分钟前
  77. func SendActivityBeginMsgMeeting(cont context.Context) (err error) {
  78. defer func() {
  79. if err != nil {
  80. fmt.Println("发送失败,Err:", err.Error())
  81. }
  82. }()
  83. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  84. listActivity, err := models.GetActivitySendMsgListAllMeeting(endDate)
  85. if err != nil {
  86. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  87. return
  88. }
  89. if len(listActivity) == 0 {
  90. return
  91. }
  92. var signupIds string
  93. var remark = "点击查看活动详情"
  94. for _, v := range listActivity {
  95. signupIds += strconv.Itoa(v.Id) + ","
  96. var reserveResults string
  97. var first string
  98. openIdItem := new(models.OpenIdList)
  99. openIdItem.OpenId = v.OpenId
  100. openIdList := make([]*models.OpenIdList, 0)
  101. openIdList = append(openIdList, openIdItem)
  102. reserveResults = "--"
  103. first = "您有一场【" + v.ActivityTypeName + "】将在15分钟后开始"
  104. SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTime, "--", remark, openIdList, v.ActivityId)
  105. }
  106. if len(signupIds) == 0 {
  107. return
  108. }
  109. signupIds = strings.TrimRight(signupIds, ",")
  110. err = models.UPdateSendedMsgMeetingStatus(signupIds)
  111. if err != nil {
  112. var msg string
  113. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  114. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  115. }
  116. return
  117. }
  118. //预约外呼名单,会前1小时自动发送邮件给专家组
  119. func SendEmailFileToExpert(cont context.Context) (err error) {
  120. var msg string
  121. var touser string
  122. defer func() {
  123. if err != nil {
  124. fmt.Println("err:", err)
  125. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  126. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  127. }
  128. if msg != "" {
  129. fmt.Println(msg)
  130. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  131. }
  132. }()
  133. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  134. total, err := models.GetCountActivityIdToSendFile(endDate)
  135. if total == 0 {
  136. fmt.Println("发送附件完成0")
  137. return nil
  138. }
  139. if err != nil {
  140. msg = "发送附件模版消息失败 Err:" + err.Error()
  141. return
  142. }
  143. listActivity, err := models.GetActivityIdToSendFile(endDate)
  144. if err != nil {
  145. msg = "发送附件模版消息失败 Err:" + err.Error()
  146. return
  147. }
  148. for _, v := range listActivity {
  149. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  150. if activityInfo == nil {
  151. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  152. return
  153. }
  154. list, errFile := models.GetSignupExport(v.ActivityId)
  155. if errFile != nil {
  156. msg = "获取失败,Err:" + errFile.Error()
  157. return
  158. }
  159. //创建excel
  160. dir, errFile := os.Executable()
  161. exPath := filepath.Dir(dir)
  162. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  163. xlsxFile := xlsx.NewFile()
  164. if errFile != nil {
  165. msg = "生成文件失败Err:" + errFile.Error()
  166. return
  167. }
  168. style := xlsx.NewStyle()
  169. alignment := xlsx.Alignment{
  170. Horizontal: "center",
  171. Vertical: "center",
  172. WrapText: true,
  173. }
  174. style.Alignment = alignment
  175. style.ApplyAlignment = true
  176. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  177. if errFile != nil {
  178. msg = "新增Sheet失败,Err:" + errFile.Error()
  179. return
  180. }
  181. //设置宽度
  182. _ = sheet.SetColWidth(1, 1, 15)
  183. _ = sheet.SetColWidth(3, 3, 30)
  184. //标头
  185. rowTitle := sheet.AddRow()
  186. cellA := rowTitle.AddCell()
  187. cellA.Value = "姓名"
  188. cellB := rowTitle.AddCell()
  189. cellB.Value = "外呼号码"
  190. cellC := rowTitle.AddCell()
  191. cellC.Value = "国际代码"
  192. cellD := rowTitle.AddCell()
  193. cellD.Value = "公司名称"
  194. cellE := rowTitle.AddCell()
  195. cellE.Value = "所属销售"
  196. for _, item := range list {
  197. row := sheet.AddRow()
  198. cellA := row.AddCell()
  199. cellA.Value = item.RealName
  200. cellB := row.AddCell()
  201. cellB.Value = item.OutboundMobile
  202. cellC := row.AddCell()
  203. if item.CountryCode == "" {
  204. cellC.Value = "86"
  205. } else {
  206. cellC.Value = item.CountryCode
  207. }
  208. cellD := row.AddCell()
  209. cellD.Value = item.CompanyName
  210. cellE := row.AddCell()
  211. cellE.Value = item.SellerName
  212. }
  213. errFile = xlsxFile.Save(downLoadnFilePath)
  214. if errFile != nil {
  215. msg = "保存文件失败Err:" + errFile.Error()
  216. return
  217. }
  218. title := activityInfo.ActivityName + "外呼名单"
  219. content := "外呼名单详情"
  220. fileName := downLoadnFilePath
  221. if activityInfo.ChartPermissionName == "科技" {
  222. touser = utils.EmailTechnology
  223. } else if activityInfo.ChartPermissionName == "医药" {
  224. touser = utils.EmailMedicine
  225. } else if activityInfo.ChartPermissionName == "消费" {
  226. touser = utils.EmailConsumption
  227. } else if activityInfo.ChartPermissionName == "智造" {
  228. touser = utils.EmailZhizao
  229. } else if activityInfo.ChartPermissionName == "策略" {
  230. touser = utils.EmailStrategy
  231. } else if activityInfo.ChartPermissionName == "研选" {
  232. touser = utils.EmailExpert
  233. }
  234. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  235. if sendResult {
  236. errFile = models.UPdateActivityIdToSendFile(v.ActivityId)
  237. if errFile != nil {
  238. msg = "获取失败,Err:" + errFile.Error()
  239. return
  240. }
  241. os.Remove(downLoadnFilePath)
  242. } else {
  243. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  244. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  245. }
  246. }
  247. return
  248. }
  249. func EditOutboundMobile(cont context.Context) (err error) {
  250. defer func() {
  251. if err != nil {
  252. fmt.Println("发送失败,Err:", err.Error())
  253. }
  254. }()
  255. list, err := models.GetActivitySignupListAll()
  256. if err != nil {
  257. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  258. return
  259. }
  260. for _, v := range list {
  261. err = models.UPdateSignup(v)
  262. fmt.Println("修改:", strconv.Itoa(v.Id))
  263. if err != nil {
  264. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.Id))
  265. }
  266. }
  267. fmt.Println("修改完成")
  268. return
  269. }
  270. //同步用户绑定手机号以及区号
  271. func EditUserOutboundMobile(cont context.Context) (err error) {
  272. defer func() {
  273. if err != nil {
  274. fmt.Println("发送失败,Err:", err.Error())
  275. }
  276. }()
  277. list, err := models.GetUserListAll()
  278. if err != nil {
  279. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  280. return
  281. }
  282. for _, v := range list {
  283. err = models.UPdateUserCountryCode(v)
  284. fmt.Println("修改:", strconv.Itoa(v.UserId))
  285. if err != nil {
  286. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.UserId))
  287. }
  288. }
  289. fmt.Println("修改完成")
  290. return
  291. }
  292. //获取 用户类型 //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  293. func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
  294. var permissionStr string
  295. if companyId <= 1 {
  296. userType = 0
  297. } else {
  298. total, errs := models.GetCountCompanyDetailByIdGroup(companyId)
  299. if errs != nil {
  300. err = errs
  301. return
  302. }
  303. if total == 0 {
  304. userType = 0
  305. } else {
  306. companyDetail, errs := models.GetCompanyDetailByIdGroup(companyId)
  307. if errs != nil {
  308. err = errs
  309. return
  310. }
  311. permissionStr, errs = models.GetCompanyPermission(companyId)
  312. if errs != nil {
  313. err = errs
  314. return
  315. }
  316. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  317. if companyDetail.Status == "永续" {
  318. userType = 1
  319. } else if companyDetail.Status == "试用" {
  320. userType = 5
  321. } else if companyDetail.Status == "正式" {
  322. if permissionStr == "专家" {
  323. userType = 4
  324. } else if strings.Contains(permissionStr, "医药") && strings.Contains(permissionStr, "消费") && strings.Contains(permissionStr, "科技") && strings.Contains(permissionStr, "智造") {
  325. userType = 2
  326. } else {
  327. userType = 3
  328. }
  329. if userType == 3 {
  330. if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
  331. userType = 4
  332. }
  333. }
  334. }
  335. }
  336. }
  337. permissionStrnew = permissionStr
  338. return
  339. }
  340. // 校验被分享的用户是否有查看详情的权限
  341. func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, userType int) (noPower bool, err error) {
  342. //var noPower bool
  343. if (userType == 1 || userType == 4 || userType == 5) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  344. noPower = true
  345. }
  346. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  347. 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)) {
  348. noPower = true
  349. }
  350. if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  351. noPower = true
  352. }
  353. if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
  354. noPower = true
  355. }
  356. if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  357. noPower = true
  358. }
  359. return
  360. }
  361. // 校验用户报名的权限
  362. func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDetailStatus string, userType int) (havePower bool, err error) {
  363. if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.LimitPeopleNum == 0 {
  364. havePower = true
  365. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "正式" && strings.Contains(activityInfo.CustomerTypeIds, "4") {
  366. havePower = true
  367. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "试用" && strings.Contains(activityInfo.CustomerTypeIds, "5") {
  368. havePower = true
  369. } else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  370. havePower = true
  371. } else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  372. havePower = true
  373. } else if activityInfo.ActivityTypeId == 5 && strings.Contains(permissionStr, "专家") {
  374. havePower = true
  375. }
  376. return
  377. }
  378. //研选系列专家电话会,会前1小时将问题列表发送给邮箱
  379. func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
  380. var msg string
  381. var touser string
  382. defer func() {
  383. if err != nil {
  384. fmt.Println("err:", err)
  385. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  386. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  387. }
  388. if msg != "" {
  389. fmt.Println(msg)
  390. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  391. }
  392. }()
  393. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  394. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name = '研选' `
  395. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  396. if total == 0 {
  397. fmt.Println("发送附件完成0")
  398. return nil
  399. }
  400. if err != nil {
  401. msg = "发送附件模版消息失败 Err:" + err.Error()
  402. return
  403. }
  404. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  405. if err != nil {
  406. msg = "发送附件模版消息失败 Err:" + err.Error()
  407. return
  408. }
  409. for _, v := range listActivity {
  410. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  411. if activityInfo == nil {
  412. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  413. return
  414. }
  415. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  416. if errFile != nil {
  417. msg = "获取失败,Err:" + errFile.Error()
  418. return
  419. }
  420. //创建excel
  421. dir, errFile := os.Executable()
  422. exPath := filepath.Dir(dir)
  423. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  424. xlsxFile := xlsx.NewFile()
  425. if errFile != nil {
  426. msg = "生成文件失败Err:" + errFile.Error()
  427. return
  428. }
  429. style := xlsx.NewStyle()
  430. alignment := xlsx.Alignment{
  431. Horizontal: "center",
  432. Vertical: "center",
  433. WrapText: true,
  434. }
  435. style.Alignment = alignment
  436. style.ApplyAlignment = true
  437. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  438. if errFile != nil {
  439. msg = "新增Sheet失败,Err:" + errFile.Error()
  440. return
  441. }
  442. //设置宽度
  443. _ = sheet.SetColWidth(1, 1, 30)
  444. _ = sheet.SetColWidth(2, 2, 60)
  445. //标头
  446. rowTitle := sheet.AddRow()
  447. cellA := rowTitle.AddCell()
  448. cellA.Value = "姓名"
  449. cellB := rowTitle.AddCell()
  450. cellB.Value = "公司名称"
  451. cellC := rowTitle.AddCell()
  452. cellC.Value = "问题"
  453. cellD := rowTitle.AddCell()
  454. cellD.Value = "提交时间"
  455. for _, item := range list {
  456. row := sheet.AddRow()
  457. cellA := row.AddCell()
  458. cellA.Value = item.RealName
  459. cellB := row.AddCell()
  460. cellB.Value = item.CompanyName
  461. cellC := row.AddCell()
  462. cellC.Value = item.Content
  463. cellD := row.AddCell()
  464. cellD.Value = item.CreateTime
  465. }
  466. errFile = xlsxFile.Save(downLoadnFilePath)
  467. if errFile != nil {
  468. msg = "保存文件失败Err:" + errFile.Error()
  469. return
  470. }
  471. title := activityInfo.ActivityName + "-活动带问"
  472. content := "活动带问详情"
  473. fileName := downLoadnFilePath
  474. if utils.RunMode == "release" {
  475. touser = "cxzhang@hzinsights.com;ywang@hzinsights.com;tshen@hzinsights.com"
  476. } else {
  477. touser = "cxzhang@hzinsights.com;jhwang@hzinsights.com;tshen@hzinsights.com"
  478. }
  479. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  480. if sendResult {
  481. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  482. if errFile != nil {
  483. msg = "获取失败,Err:" + errFile.Error()
  484. return
  485. }
  486. os.Remove(downLoadnFilePath)
  487. } else {
  488. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.RunMode), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  489. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  490. }
  491. }
  492. return
  493. }
  494. //非研选系列专家电话会,根据主持人姓名,会前15分钟将问题列表发送给至该主持人对应邮箱
  495. func SendEmailFileForAskMsg(cont context.Context) (err error) {
  496. var msg string
  497. var touser string
  498. defer func() {
  499. if err != nil {
  500. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  501. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  502. }
  503. if msg != "" {
  504. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  505. }
  506. }()
  507. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  508. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name != '研选' `
  509. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  510. if total == 0 {
  511. fmt.Println("发送附件完成0")
  512. return nil
  513. }
  514. if err != nil {
  515. msg = "发送附件模版消息失败 Err:" + err.Error()
  516. return
  517. }
  518. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  519. if err != nil {
  520. msg = "发送附件模版消息失败 Err:" + err.Error()
  521. return
  522. }
  523. listEmail, errEmail := models.GetAskEmail()
  524. if errEmail != nil {
  525. msg = "获取失败,Err:" + errEmail.Error()
  526. return
  527. }
  528. for _, v := range listActivity {
  529. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  530. if activityInfo == nil {
  531. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  532. return
  533. }
  534. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  535. if errFile != nil {
  536. msg = "获取失败,Err:" + errFile.Error()
  537. return
  538. }
  539. for _, v := range listEmail {
  540. if strings.Index(activityInfo.Host, v.Name) > 0 {
  541. touser += v.Email + ";"
  542. }
  543. }
  544. if touser == "" {
  545. msg = "没有对应的邮箱"
  546. return
  547. }
  548. if utils.RunMode == "release" {
  549. touser += "tshen@hzinsights.com;cxzhang@hzinsights.com"
  550. } else {
  551. touser = "tshen@hzinsights.com;cxzhang@hzinsights.com"
  552. }
  553. //创建excel
  554. dir, errFile := os.Executable()
  555. exPath := filepath.Dir(dir)
  556. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  557. xlsxFile := xlsx.NewFile()
  558. if errFile != nil {
  559. msg = "生成文件失败Err:" + errFile.Error()
  560. return
  561. }
  562. style := xlsx.NewStyle()
  563. alignment := xlsx.Alignment{
  564. Horizontal: "center",
  565. Vertical: "center",
  566. WrapText: true,
  567. }
  568. style.Alignment = alignment
  569. style.ApplyAlignment = true
  570. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  571. if errFile != nil {
  572. msg = "新增Sheet失败,Err:" + errFile.Error()
  573. return
  574. }
  575. //设置宽度
  576. _ = sheet.SetColWidth(1, 1, 30)
  577. _ = sheet.SetColWidth(2, 2, 60)
  578. //标头
  579. rowTitle := sheet.AddRow()
  580. cellA := rowTitle.AddCell()
  581. cellA.Value = "姓名"
  582. cellB := rowTitle.AddCell()
  583. cellB.Value = "公司名称"
  584. cellC := rowTitle.AddCell()
  585. cellC.Value = "问题"
  586. cellD := rowTitle.AddCell()
  587. cellD.Value = "提交时间"
  588. for _, item := range list {
  589. row := sheet.AddRow()
  590. cellA := row.AddCell()
  591. cellA.Value = item.RealName
  592. cellB := row.AddCell()
  593. cellB.Value = item.CompanyName
  594. cellC := row.AddCell()
  595. cellC.Value = item.Content
  596. cellD := row.AddCell()
  597. cellD.Value = item.CreateTime
  598. }
  599. errFile = xlsxFile.Save(downLoadnFilePath)
  600. if errFile != nil {
  601. msg = "保存文件失败Err:" + errFile.Error()
  602. return
  603. }
  604. title := activityInfo.ActivityName + "-活动带问"
  605. content := "活动带问详情"
  606. fileName := downLoadnFilePath
  607. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  608. if sendResult {
  609. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  610. if errFile != nil {
  611. msg = "获取失败,Err:" + errFile.Error()
  612. return
  613. }
  614. os.Remove(downLoadnFilePath)
  615. } else {
  616. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  617. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  618. }
  619. }
  620. return
  621. }
  622. //活动标签字符串处理
  623. func LabelStr(label string) (labelNew string) {
  624. slicebr := strings.Split(label, "-")
  625. if len(slicebr) < 2 {
  626. labelNew = label
  627. } else {
  628. labelNew = slicebr[1]
  629. }
  630. return labelNew
  631. }
  632. func ActivityAttendanceDetail(cont context.Context) (err error) {
  633. defer func() {
  634. if err != nil {
  635. fmt.Println("RefreshDataFromWind Err:" + err.Error())
  636. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromWind ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  637. }
  638. }()
  639. var mobileStr string
  640. fmt.Println("开始同步")
  641. dateTime := time.Now().AddDate(0, 0, -8).Format(utils.FormatDate)
  642. dateNow := time.Now().AddDate(0, 0, -1).Format(utils.FormatDate)
  643. startDate := dateTime + " 00:00:00"
  644. endDate := dateNow + " 23:59:59"
  645. //获取需要处理的活动
  646. listActivity, err := models.GetActivityListByDateTime(startDate, endDate)
  647. if err != nil {
  648. fmt.Println("GetTacticsList Err:", err.Error())
  649. return err
  650. }
  651. fmt.Println(listActivity)
  652. fmt.Println(mobileStr)
  653. for _, vAct := range listActivity {
  654. doTime := utils.TimeRemoveHms2(vAct.ActivityTime)
  655. findStartDate := doTime + " 00:00:00"
  656. findEndDate := doTime + " 23:59:59"
  657. nameSlice := strings.Split(vAct.ActivityName, "】")
  658. //fmt.Println(timeSlice[0])
  659. var activityName string
  660. if len(nameSlice) > 1 {
  661. activityName = nameSlice[len(nameSlice)-1]
  662. if activityName != "" {
  663. list, err := models.GetRoadshowDataList(activityName, findStartDate, findEndDate)
  664. if err != nil {
  665. fmt.Println("GetTacticsList Err:", err.Error())
  666. return err
  667. }
  668. needAddAttendanc := make([]*models.CygxActivityAttendanceDetail, 0)
  669. fmt.Println("原来的", vAct.ActivityName)
  670. fmt.Println("处理的", activityName)
  671. if len(list) > 0 {
  672. for _, v := range list {
  673. if v.UserPhone != "" {
  674. item := new(models.CygxActivityAttendanceDetail)
  675. item.ActivityId = vAct.ActivityId
  676. item.RealName = v.UserName
  677. item.Mobile = v.UserPhone
  678. item.CompanyName = v.Company
  679. //item.SellerName = sellerName
  680. item.FirstMeetingTime = v.FirstWatchTime
  681. item.LastMeetingTime = v.LastWatchTime
  682. item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
  683. if v.JoinType == 1 {
  684. item.MeetingTypeStr = "网络"
  685. } else {
  686. item.MeetingTypeStr = "电话"
  687. }
  688. item.MeetingAuthentication = v.AuthInfo
  689. if v.DataType == 1 {
  690. item.MeetingStatusStr = "直播"
  691. } else {
  692. item.MeetingStatusStr = "回放"
  693. }
  694. item.Position = v.Occupation
  695. item.CreateTime = time.Now()
  696. mobileStr += "'" + v.UserPhone + "'" + ","
  697. needAddAttendanc = append(needAddAttendanc, item)
  698. }
  699. }
  700. mobileStr = strings.TrimRight(mobileStr, ",")
  701. if mobileStr == "" {
  702. mobileStr = "1"
  703. }
  704. listUser, err := models.GetWxUserOutboundMobile(mobileStr)
  705. if err != nil {
  706. fmt.Println("GetWxUserOutboundMobile Err:", err.Error())
  707. return err
  708. }
  709. for k, v := range needAddAttendanc {
  710. for _, v2 := range listUser {
  711. if v2.OutboundMobile == v.Mobile {
  712. needAddAttendanc[k].CompanyId = v2.CompanyId
  713. needAddAttendanc[k].SellerName = v2.SellerName
  714. needAddAttendanc[k].CompanyName = v2.CompanyName
  715. needAddAttendanc[k].IsMeetingStr = 1
  716. }
  717. }
  718. }
  719. fmt.Println(mobileStr)
  720. err = models.AddAttendancDetail(needAddAttendanc, vAct.ActivityId, mobileStr)
  721. if err != nil {
  722. fmt.Println("AddAttendancDetail Err:", err.Error())
  723. return err
  724. }
  725. err = AddCygxActivityRestrictSignupByAdmin(vAct.ActivityId)
  726. if err != nil {
  727. fmt.Println("AddCygxActivityRestrictSignupByAdmin Err:", err.Error())
  728. return err
  729. }
  730. err = models.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, vAct.ActivityId)
  731. if err != nil {
  732. fmt.Println("AddCygxActivityMeetDetailLogOnline Err:", err.Error())
  733. return err
  734. }
  735. }
  736. }
  737. }
  738. }
  739. fmt.Println("结束路演同步")
  740. return
  741. }
  742. //判断是否加入黑名单
  743. func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
  744. total, err := models.GetActivitySignupNomeetingCount(activityId)
  745. if err != nil {
  746. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  747. fmt.Println(" Err:", err.Error())
  748. return err
  749. }
  750. mobileList, _ := models.GetUserMeetingMobile(activityId)
  751. if len(mobileList) >= 0 {
  752. for _, v := range mobileList {
  753. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  754. if err != nil {
  755. fmt.Println(" Err:", err.Error())
  756. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  757. return err
  758. }
  759. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  760. if err != nil {
  761. fmt.Println(" Err:", err.Error())
  762. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  763. return err
  764. }
  765. if totalRestrict > 0 && totalNomeet < 3 {
  766. err = models.DeleteCygxActivityRestrictSignup(v.UserId)
  767. if err != nil {
  768. fmt.Println(" Err:", err.Error())
  769. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  770. return err
  771. }
  772. }
  773. }
  774. }
  775. if total == 0 {
  776. return err
  777. }
  778. list, err := models.GetActivitySignupNomeetingCountList(activityId)
  779. if err != nil {
  780. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  781. fmt.Println(" 用户限制报名失败 Err:", err.Error())
  782. return err
  783. }
  784. for _, v := range list {
  785. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  786. if err != nil {
  787. fmt.Println(" Err:", err.Error())
  788. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  789. return err
  790. }
  791. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  792. if err != nil {
  793. fmt.Println(" Err:", err.Error())
  794. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  795. return err
  796. }
  797. if totalNomeet >= 3 {
  798. if totalRestrict == 0 {
  799. infoUser, err := models.GetUserAndCompanyNameList(v.UserId)
  800. if err != nil {
  801. fmt.Println(" Err:", err.Error())
  802. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  803. return err
  804. }
  805. if infoUser != nil {
  806. item := new(models.CygxActivityRestrictSignup)
  807. item.UserId = infoUser.UserId
  808. item.CreateTime = time.Now()
  809. item.Mobile = infoUser.Mobile
  810. item.Email = infoUser.Email
  811. item.CompanyId = infoUser.CompanyId
  812. item.CompanyName = infoUser.CompanyName
  813. item.IsRestrict = 1
  814. err = models.AddCygxActivityRestrictSignup(item)
  815. if err != nil {
  816. fmt.Println(" Err:", err.Error())
  817. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  818. return err
  819. }
  820. }
  821. }
  822. }
  823. }
  824. return
  825. }