activity.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  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 == "科技" || activityInfo.ChartPermissionNames == "研选(科技)" {
  222. touser = utils.EmailTechnology
  223. } else if activityInfo.ChartPermissionName == "医药" || activityInfo.ChartPermissionNames == "研选(医药)" {
  224. touser = utils.EmailMedicine
  225. } else if activityInfo.ChartPermissionName == "消费" || activityInfo.ChartPermissionNames == "研选(消费)" {
  226. touser = utils.EmailConsumption
  227. } else if activityInfo.ChartPermissionName == "智造" || activityInfo.ChartPermissionNames == "研选(智造)" {
  228. touser = utils.EmailZhizao
  229. } else if activityInfo.ChartPermissionName == "策略" || activityInfo.ChartPermissionNames == "研选" {
  230. touser = utils.EmailStrategy
  231. }
  232. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  233. if sendResult {
  234. errFile = models.UPdateActivityIdToSendFile(v.ActivityId)
  235. if errFile != nil {
  236. msg = "获取失败,Err:" + errFile.Error()
  237. return
  238. }
  239. os.Remove(downLoadnFilePath)
  240. } else {
  241. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  242. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  243. }
  244. }
  245. return
  246. }
  247. func EditOutboundMobile(cont context.Context) (err error) {
  248. defer func() {
  249. if err != nil {
  250. fmt.Println("发送失败,Err:", err.Error())
  251. }
  252. }()
  253. list, err := models.GetActivitySignupListAll()
  254. if err != nil {
  255. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  256. return
  257. }
  258. for _, v := range list {
  259. err = models.UPdateSignup(v)
  260. fmt.Println("修改:", strconv.Itoa(v.Id))
  261. if err != nil {
  262. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.Id))
  263. }
  264. }
  265. fmt.Println("修改完成")
  266. return
  267. }
  268. //同步用户绑定手机号以及区号
  269. func EditUserOutboundMobile(cont context.Context) (err error) {
  270. defer func() {
  271. if err != nil {
  272. fmt.Println("发送失败,Err:", err.Error())
  273. }
  274. }()
  275. list, err := models.GetUserListAll()
  276. if err != nil {
  277. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  278. return
  279. }
  280. for _, v := range list {
  281. err = models.UPdateUserCountryCode(v)
  282. fmt.Println("修改:", strconv.Itoa(v.UserId))
  283. if err != nil {
  284. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.UserId))
  285. }
  286. }
  287. fmt.Println("修改完成")
  288. return
  289. }
  290. //获取 用户类型 //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  291. func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
  292. var permissionStr string
  293. if companyId <= 1 {
  294. userType = 0
  295. } else {
  296. total, errs := models.GetCountCompanyDetailByIdGroup(companyId)
  297. if errs != nil {
  298. err = errs
  299. return
  300. }
  301. if total == 0 {
  302. userType = 0
  303. } else {
  304. companyDetail, errs := models.GetCompanyDetailByIdGroup(companyId)
  305. if errs != nil {
  306. err = errs
  307. return
  308. }
  309. permissionStr, errs = models.GetCompanyPermission(companyId)
  310. if errs != nil {
  311. err = errs
  312. return
  313. }
  314. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  315. if companyDetail.Status == "永续" {
  316. userType = 1
  317. } else if companyDetail.Status == "试用" {
  318. userType = 5
  319. } else if companyDetail.Status == "正式" {
  320. if permissionStr == "专家" {
  321. userType = 4
  322. } else if strings.Contains(permissionStr, "医药") && strings.Contains(permissionStr, "消费") && strings.Contains(permissionStr, "科技") && strings.Contains(permissionStr, "智造") {
  323. userType = 2
  324. } else {
  325. userType = 3
  326. }
  327. if userType == 3 {
  328. if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
  329. userType = 4
  330. }
  331. }
  332. }
  333. }
  334. }
  335. permissionStrnew = permissionStr
  336. return
  337. }
  338. // 校验被分享的用户是否有查看详情的权限
  339. func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, userType int) (noPower bool, err error) {
  340. //var noPower bool
  341. if (userType == 1 || userType == 4 || userType == 5) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  342. noPower = true
  343. }
  344. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  345. 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)) {
  346. noPower = true
  347. }
  348. if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  349. noPower = true
  350. }
  351. if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
  352. noPower = true
  353. }
  354. if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  355. noPower = true
  356. }
  357. return
  358. }
  359. // 校验用户报名的权限
  360. func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDetailStatus string, userType int) (havePower bool, err error) {
  361. if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.LimitPeopleNum == 0 {
  362. havePower = true
  363. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "正式" && strings.Contains(activityInfo.CustomerTypeIds, "4") {
  364. havePower = true
  365. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "试用" && strings.Contains(activityInfo.CustomerTypeIds, "5") {
  366. havePower = true
  367. } else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  368. havePower = true
  369. } else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  370. havePower = true
  371. } else if activityInfo.ActivityTypeId == 5 && strings.Contains(permissionStr, "专家") {
  372. havePower = true
  373. }
  374. return
  375. }
  376. //研选系列专家电话会,会前1小时将问题列表发送给邮箱
  377. func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
  378. var msg string
  379. var touser string
  380. defer func() {
  381. if err != nil {
  382. fmt.Println("err:", err)
  383. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  384. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  385. }
  386. if msg != "" {
  387. fmt.Println(msg)
  388. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  389. }
  390. }()
  391. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  392. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name = '研选' `
  393. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  394. if total == 0 {
  395. fmt.Println("发送附件完成0")
  396. return nil
  397. }
  398. if err != nil {
  399. msg = "发送附件模版消息失败 Err:" + err.Error()
  400. return
  401. }
  402. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  403. if err != nil {
  404. msg = "发送附件模版消息失败 Err:" + err.Error()
  405. return
  406. }
  407. for _, v := range listActivity {
  408. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  409. if activityInfo == nil {
  410. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  411. return
  412. }
  413. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  414. if errFile != nil {
  415. msg = "获取失败,Err:" + errFile.Error()
  416. return
  417. }
  418. //创建excel
  419. dir, errFile := os.Executable()
  420. exPath := filepath.Dir(dir)
  421. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  422. xlsxFile := xlsx.NewFile()
  423. if errFile != nil {
  424. msg = "生成文件失败Err:" + errFile.Error()
  425. return
  426. }
  427. style := xlsx.NewStyle()
  428. alignment := xlsx.Alignment{
  429. Horizontal: "center",
  430. Vertical: "center",
  431. WrapText: true,
  432. }
  433. style.Alignment = alignment
  434. style.ApplyAlignment = true
  435. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  436. if errFile != nil {
  437. msg = "新增Sheet失败,Err:" + errFile.Error()
  438. return
  439. }
  440. //设置宽度
  441. _ = sheet.SetColWidth(1, 1, 30)
  442. _ = sheet.SetColWidth(2, 2, 60)
  443. //标头
  444. rowTitle := sheet.AddRow()
  445. cellA := rowTitle.AddCell()
  446. cellA.Value = "姓名"
  447. cellB := rowTitle.AddCell()
  448. cellB.Value = "公司名称"
  449. cellC := rowTitle.AddCell()
  450. cellC.Value = "问题"
  451. cellD := rowTitle.AddCell()
  452. cellD.Value = "提交时间"
  453. for _, item := range list {
  454. row := sheet.AddRow()
  455. cellA := row.AddCell()
  456. cellA.Value = item.RealName
  457. cellB := row.AddCell()
  458. cellB.Value = item.CompanyName
  459. cellC := row.AddCell()
  460. cellC.Value = item.Content
  461. cellD := row.AddCell()
  462. cellD.Value = item.CreateTime
  463. }
  464. errFile = xlsxFile.Save(downLoadnFilePath)
  465. if errFile != nil {
  466. msg = "保存文件失败Err:" + errFile.Error()
  467. return
  468. }
  469. title := activityInfo.ActivityName + "-活动带问"
  470. content := "活动带问详情"
  471. fileName := downLoadnFilePath
  472. if utils.RunMode == "release" {
  473. touser = "cxzhang@hzinsights.com;ywang@hzinsights.com;tshen@hzinsights.com"
  474. } else {
  475. touser = "cxzhang@hzinsights.com;jhwang@hzinsights.com;tshen@hzinsights.com"
  476. }
  477. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  478. if sendResult {
  479. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  480. if errFile != nil {
  481. msg = "获取失败,Err:" + errFile.Error()
  482. return
  483. }
  484. os.Remove(downLoadnFilePath)
  485. } else {
  486. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.RunMode), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  487. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  488. }
  489. }
  490. return
  491. }
  492. //非研选系列专家电话会,根据主持人姓名,会前15分钟将问题列表发送给至该主持人对应邮箱
  493. func SendEmailFileForAskMsg(cont context.Context) (err error) {
  494. var msg string
  495. var touser string
  496. defer func() {
  497. if err != nil {
  498. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  499. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  500. }
  501. if msg != "" {
  502. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  503. }
  504. }()
  505. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  506. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name != '研选' `
  507. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  508. if total == 0 {
  509. fmt.Println("发送附件完成0")
  510. return nil
  511. }
  512. if err != nil {
  513. msg = "发送附件模版消息失败 Err:" + err.Error()
  514. return
  515. }
  516. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  517. if err != nil {
  518. msg = "发送附件模版消息失败 Err:" + err.Error()
  519. return
  520. }
  521. listEmail, errEmail := models.GetAskEmail()
  522. if errEmail != nil {
  523. msg = "获取失败,Err:" + errEmail.Error()
  524. return
  525. }
  526. for _, v := range listActivity {
  527. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  528. if activityInfo == nil {
  529. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  530. return
  531. }
  532. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  533. if errFile != nil {
  534. msg = "获取失败,Err:" + errFile.Error()
  535. return
  536. }
  537. for _, v := range listEmail {
  538. if strings.Index(activityInfo.Host, v.Name) > 0 {
  539. touser += v.Email + ";"
  540. }
  541. }
  542. if touser == "" {
  543. msg = "没有对应的邮箱"
  544. return
  545. }
  546. if utils.RunMode == "release" {
  547. touser += "tshen@hzinsights.com;cxzhang@hzinsights.com"
  548. } else {
  549. touser = "tshen@hzinsights.com;cxzhang@hzinsights.com"
  550. }
  551. //创建excel
  552. dir, errFile := os.Executable()
  553. exPath := filepath.Dir(dir)
  554. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  555. xlsxFile := xlsx.NewFile()
  556. if errFile != nil {
  557. msg = "生成文件失败Err:" + errFile.Error()
  558. return
  559. }
  560. style := xlsx.NewStyle()
  561. alignment := xlsx.Alignment{
  562. Horizontal: "center",
  563. Vertical: "center",
  564. WrapText: true,
  565. }
  566. style.Alignment = alignment
  567. style.ApplyAlignment = true
  568. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  569. if errFile != nil {
  570. msg = "新增Sheet失败,Err:" + errFile.Error()
  571. return
  572. }
  573. //设置宽度
  574. _ = sheet.SetColWidth(1, 1, 30)
  575. _ = sheet.SetColWidth(2, 2, 60)
  576. //标头
  577. rowTitle := sheet.AddRow()
  578. cellA := rowTitle.AddCell()
  579. cellA.Value = "姓名"
  580. cellB := rowTitle.AddCell()
  581. cellB.Value = "公司名称"
  582. cellC := rowTitle.AddCell()
  583. cellC.Value = "问题"
  584. cellD := rowTitle.AddCell()
  585. cellD.Value = "提交时间"
  586. for _, item := range list {
  587. row := sheet.AddRow()
  588. cellA := row.AddCell()
  589. cellA.Value = item.RealName
  590. cellB := row.AddCell()
  591. cellB.Value = item.CompanyName
  592. cellC := row.AddCell()
  593. cellC.Value = item.Content
  594. cellD := row.AddCell()
  595. cellD.Value = item.CreateTime
  596. }
  597. errFile = xlsxFile.Save(downLoadnFilePath)
  598. if errFile != nil {
  599. msg = "保存文件失败Err:" + errFile.Error()
  600. return
  601. }
  602. title := activityInfo.ActivityName + "-活动带问"
  603. content := "活动带问详情"
  604. fileName := downLoadnFilePath
  605. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  606. if sendResult {
  607. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  608. if errFile != nil {
  609. msg = "获取失败,Err:" + errFile.Error()
  610. return
  611. }
  612. os.Remove(downLoadnFilePath)
  613. } else {
  614. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  615. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  616. }
  617. }
  618. return
  619. }