activity.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  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. fmt.Println("修改状态6661")
  22. go models.UpdateActivitySattusToHaveInHand()
  23. go models.UpdateActivitySattusToComplete()
  24. fmt.Println("修改状态完成")
  25. return
  26. }
  27. //推送会议开始消息提醒60分钟前
  28. func SendActivityBeginMsg(cont context.Context) (err error) {
  29. defer func() {
  30. if err != nil {
  31. fmt.Println("发送失败,Err:", err.Error())
  32. }
  33. }()
  34. endDate := time.Now().Add(+time.Minute * 60).Format("2006-01-02 15:04:05")
  35. listActivity, err := models.GetActivitySendMsgListAll(endDate)
  36. fmt.Println(len(listActivity))
  37. if err != nil {
  38. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  39. return
  40. }
  41. if len(listActivity) == 0 {
  42. return
  43. }
  44. var remark = "点击查看活动详情"
  45. var signupIds string
  46. for _, v := range listActivity {
  47. signupIds += strconv.Itoa(v.Id) + ","
  48. var reserveResults string
  49. var first string
  50. openIdItem := new(models.OpenIdList)
  51. openIdItem.OpenId = v.OpenId
  52. openIdList := make([]*models.OpenIdList, 0)
  53. openIdList = append(openIdList, openIdItem)
  54. if v.FailType == 0 {
  55. reserveResults = "成功"
  56. } else if v.FailType == 1 {
  57. reserveResults = "失败(总人数已满)"
  58. } else if v.FailType == 2 {
  59. reserveResults = "失败(单机构超限制)"
  60. } else if v.FailType == 3 {
  61. reserveResults = "失败(爽约次数超限)"
  62. }
  63. first = "您有一场【" + v.ActivityTypeName + "】将在1小时后开始"
  64. SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTime, v.Address, remark, openIdList, v.ActivityId)
  65. }
  66. if len(signupIds) == 0 {
  67. return
  68. }
  69. signupIds = strings.TrimRight(signupIds, ",")
  70. err = models.UPdateSendedMsgStatus(signupIds)
  71. if err != nil {
  72. var msg string
  73. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  74. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  75. }
  76. return
  77. }
  78. //推送会议开始消息提醒15分钟前
  79. func SendActivityBeginMsgMeeting(cont context.Context) (err error) {
  80. defer func() {
  81. if err != nil {
  82. fmt.Println("发送失败,Err:", err.Error())
  83. }
  84. }()
  85. endDate := time.Now().Add(+time.Minute * 15).Format("2006-01-02 15:04:05")
  86. listActivity, err := models.GetActivitySendMsgListAllMeeting(endDate)
  87. fmt.Println(len(listActivity))
  88. if err != nil {
  89. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  90. return
  91. }
  92. if len(listActivity) == 0 {
  93. return
  94. }
  95. var signupIds string
  96. var remark = "点击查看活动详情"
  97. for _, v := range listActivity {
  98. signupIds += strconv.Itoa(v.Id) + ","
  99. var reserveResults string
  100. var first string
  101. openIdItem := new(models.OpenIdList)
  102. //openIdItem.OpenId = "oN0jD1QwcA2uRD0BC4mH5zJMo0eg"
  103. openIdItem.OpenId = v.OpenId
  104. openIdList := make([]*models.OpenIdList, 0)
  105. openIdList = append(openIdList, openIdItem)
  106. reserveResults = "--"
  107. first = "您有一场【" + v.ActivityTypeName + "】将在15分钟后开始"
  108. SendWxMsgWithFrequency(first, v.ActivityName, reserveResults, v.ActivityTime, "--", remark, openIdList, v.ActivityId)
  109. }
  110. if len(signupIds) == 0 {
  111. return
  112. }
  113. signupIds = strings.TrimRight(signupIds, ",")
  114. err = models.UPdateSendedMsgMeetingStatus(signupIds)
  115. if err != nil {
  116. var msg string
  117. go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  118. utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
  119. }
  120. return
  121. }
  122. //预约外呼名单,会前1小时自动发送邮件给专家组
  123. func SendEmailFileToExpert(cont context.Context) (err error) {
  124. var msg string
  125. var touser string
  126. defer func() {
  127. if err != nil {
  128. fmt.Println("err:", err)
  129. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  130. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  131. }
  132. if msg != "" {
  133. fmt.Println(msg)
  134. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  135. }
  136. }()
  137. fmt.Println("发送附件")
  138. endDate := time.Now().Add(+time.Minute * 60).Format("2006-01-02 15:04:05")
  139. total, err := models.GetCountActivityIdToSendFile(endDate)
  140. if total == 0 {
  141. fmt.Println("发送附件完成0")
  142. return nil
  143. }
  144. if err != nil {
  145. msg = "发送附件模版消息失败 Err:" + err.Error()
  146. return
  147. }
  148. listActivity, err := models.GetActivityIdToSendFile(endDate)
  149. if err != nil {
  150. msg = "发送附件模版消息失败 Err:" + err.Error()
  151. return
  152. }
  153. for _, v := range listActivity {
  154. fmt.Println(v.ActivityId)
  155. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  156. if activityInfo == nil {
  157. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  158. return
  159. }
  160. list, errFile := models.GetSignupExport(v.ActivityId)
  161. if errFile != nil {
  162. msg = "获取失败,Err:" + errFile.Error()
  163. return
  164. }
  165. //创建excel
  166. dir, errFile := os.Executable()
  167. exPath := filepath.Dir(dir)
  168. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  169. xlsxFile := xlsx.NewFile()
  170. if errFile != nil {
  171. msg = "生成文件失败Err:" + errFile.Error()
  172. return
  173. }
  174. style := xlsx.NewStyle()
  175. alignment := xlsx.Alignment{
  176. Horizontal: "center",
  177. Vertical: "center",
  178. WrapText: true,
  179. }
  180. style.Alignment = alignment
  181. style.ApplyAlignment = true
  182. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  183. if errFile != nil {
  184. msg = "新增Sheet失败,Err:" + errFile.Error()
  185. return
  186. }
  187. //标头
  188. rowTitle := sheet.AddRow()
  189. cellA := rowTitle.AddCell()
  190. cellA.Value = "姓名"
  191. cellB := rowTitle.AddCell()
  192. cellB.Value = "外呼号码"
  193. cellC := rowTitle.AddCell()
  194. cellC.Value = "国际代码"
  195. cellD := rowTitle.AddCell()
  196. cellD.Value = "公司名称"
  197. cellE := rowTitle.AddCell()
  198. cellE.Value = "所属销售"
  199. for _, item := range list {
  200. row := sheet.AddRow()
  201. cellA := row.AddCell()
  202. cellA.Value = item.RealName
  203. cellB := row.AddCell()
  204. cellB.Value = item.OutboundMobile
  205. cellC := row.AddCell()
  206. if item.CountryCode == "" {
  207. cellC.Value = "86"
  208. } else {
  209. cellC.Value = item.CountryCode
  210. }
  211. cellD := row.AddCell()
  212. cellD.Value = item.CompanyName
  213. cellE := row.AddCell()
  214. cellE.Value = item.SellerName
  215. }
  216. errFile = xlsxFile.Save(downLoadnFilePath)
  217. if errFile != nil {
  218. msg = "保存文件失败Err:" + errFile.Error()
  219. return
  220. }
  221. title := activityInfo.ActivityName + "外呼名单"
  222. content := "外呼名单详情"
  223. fileName := downLoadnFilePath
  224. if activityInfo.ChartPermissionName == "科技" || activityInfo.ChartPermissionNames == "研选(科技)" {
  225. touser = utils.EmailTechnology
  226. } else if activityInfo.ChartPermissionName == "医药" || activityInfo.ChartPermissionNames == "研选(医药)" {
  227. touser = utils.EmailMedicine
  228. } else if activityInfo.ChartPermissionName == "消费" || activityInfo.ChartPermissionNames == "研选(消费)" {
  229. touser = utils.EmailConsumption
  230. } else if activityInfo.ChartPermissionName == "智造" || activityInfo.ChartPermissionNames == "研选(智造)" {
  231. touser = utils.EmailZhizao
  232. } else if activityInfo.ChartPermissionName == "策略" || activityInfo.ChartPermissionNames == "研选" {
  233. touser = utils.EmailStrategy
  234. }
  235. //haveSuccess := utils.SendEmailHaveFile(title, content, fileName, touser)
  236. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  237. if sendResult {
  238. errFile = models.UPdateActivityIdToSendFile(v.ActivityId)
  239. if errFile != nil {
  240. msg = "获取失败,Err:" + errFile.Error()
  241. return
  242. }
  243. os.Remove(downLoadnFilePath)
  244. } else {
  245. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  246. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  247. }
  248. }
  249. return
  250. }
  251. func EditOutboundMobile(cont context.Context) (err error) {
  252. defer func() {
  253. if err != nil {
  254. fmt.Println("发送失败,Err:", err.Error())
  255. }
  256. }()
  257. list, err := models.GetActivitySignupListAll()
  258. if err != nil {
  259. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  260. return
  261. }
  262. for _, v := range list {
  263. err = models.UPdateSignup(v)
  264. fmt.Println("修改:", strconv.Itoa(v.Id))
  265. if err != nil {
  266. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.Id))
  267. }
  268. }
  269. fmt.Println("修改完成")
  270. return
  271. }
  272. //同步用户绑定手机号以及区号
  273. func EditUserOutboundMobile(cont context.Context) (err error) {
  274. defer func() {
  275. if err != nil {
  276. fmt.Println("发送失败,Err:", err.Error())
  277. }
  278. }()
  279. list, err := models.GetUserListAll()
  280. if err != nil {
  281. fmt.Println("GetActivitySendMsgListAll Err:", err.Error())
  282. return
  283. }
  284. for _, v := range list {
  285. err = models.UPdateUserCountryCode(v)
  286. fmt.Println("修改:", strconv.Itoa(v.UserId))
  287. if err != nil {
  288. fmt.Println("发送失败,Err:", err.Error()+strconv.Itoa(v.UserId))
  289. }
  290. }
  291. fmt.Println("修改完成")
  292. return
  293. }
  294. //获取 用户类型 //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  295. func GetUserType(companyId int) (userType int, permissionStrnew string, err error) {
  296. var permissionStr string
  297. if companyId <= 1 {
  298. userType = 0
  299. } else {
  300. total, errs := models.GetCountCompanyDetailByIdGroup(companyId)
  301. if errs != nil {
  302. err = errs
  303. return
  304. }
  305. if total == 0 {
  306. userType = 0
  307. } else {
  308. companyDetail, errs := models.GetCompanyDetailByIdGroup(companyId)
  309. if errs != nil {
  310. err = errs
  311. return
  312. }
  313. permissionStr, errs = models.GetCompanyPermission(companyId)
  314. if errs != nil {
  315. err = errs
  316. return
  317. }
  318. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  319. if companyDetail.Status == "永续" {
  320. userType = 1
  321. } else if companyDetail.Status == "试用" {
  322. userType = 5
  323. } else if companyDetail.Status == "正式" {
  324. if permissionStr == "专家" {
  325. userType = 4
  326. } else if strings.Contains(permissionStr, "医药") && strings.Contains(permissionStr, "消费") && strings.Contains(permissionStr, "科技") && strings.Contains(permissionStr, "智造") {
  327. userType = 2
  328. } else {
  329. userType = 3
  330. }
  331. if userType == 3 {
  332. if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
  333. userType = 4
  334. }
  335. }
  336. }
  337. }
  338. }
  339. permissionStrnew = permissionStr
  340. return
  341. }
  342. // 校验被分享的用户是否有查看详情的权限
  343. func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, userType int) (noPower bool, err error) {
  344. //var noPower bool
  345. if (userType == 1 || userType == 4 || userType == 5) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  346. noPower = true
  347. }
  348. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  349. 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)) {
  350. noPower = true
  351. }
  352. if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  353. noPower = true
  354. }
  355. if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
  356. noPower = true
  357. }
  358. if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  359. noPower = true
  360. }
  361. return
  362. }
  363. // 校验用户报名的权限
  364. func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDetailStatus string, userType int) (havePower bool, err error) {
  365. if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.LimitPeopleNum == 0 {
  366. havePower = true
  367. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "正式" && strings.Contains(activityInfo.CustomerTypeIds, "4") {
  368. havePower = true
  369. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "试用" && strings.Contains(activityInfo.CustomerTypeIds, "5") {
  370. havePower = true
  371. } else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  372. havePower = true
  373. } else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  374. havePower = true
  375. } else if activityInfo.ActivityTypeId == 5 && strings.Contains(permissionStr, "专家") {
  376. havePower = true
  377. }
  378. return
  379. }
  380. //研选系列专家电话会,会前1小时将问题列表发送给邮箱
  381. func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
  382. var msg string
  383. var touser string
  384. defer func() {
  385. if err != nil {
  386. fmt.Println("err:", err)
  387. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  388. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  389. }
  390. if msg != "" {
  391. fmt.Println(msg)
  392. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  393. }
  394. }()
  395. endDate := time.Now().Add(+time.Minute * 60).Format("2006-01-02 15:04:05")
  396. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name = '研选' `
  397. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  398. if total == 0 {
  399. fmt.Println("发送附件完成0")
  400. return nil
  401. }
  402. if err != nil {
  403. msg = "发送附件模版消息失败 Err:" + err.Error()
  404. return
  405. }
  406. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  407. if err != nil {
  408. msg = "发送附件模版消息失败 Err:" + err.Error()
  409. return
  410. }
  411. for _, v := range listActivity {
  412. fmt.Println(v.ActivityId)
  413. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  414. if activityInfo == nil {
  415. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  416. return
  417. }
  418. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  419. if errFile != nil {
  420. msg = "获取失败,Err:" + errFile.Error()
  421. return
  422. }
  423. //创建excel
  424. dir, errFile := os.Executable()
  425. exPath := filepath.Dir(dir)
  426. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  427. xlsxFile := xlsx.NewFile()
  428. if errFile != nil {
  429. msg = "生成文件失败Err:" + errFile.Error()
  430. return
  431. }
  432. style := xlsx.NewStyle()
  433. alignment := xlsx.Alignment{
  434. Horizontal: "center",
  435. Vertical: "center",
  436. WrapText: true,
  437. }
  438. style.Alignment = alignment
  439. style.ApplyAlignment = true
  440. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  441. if errFile != nil {
  442. msg = "新增Sheet失败,Err:" + errFile.Error()
  443. return
  444. }
  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.WxMsgTemplateIdAskMsgMobile == "" {
  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("2006-01-02 15:04:05"), 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. fmt.Println("err:", err)
  501. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  502. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  503. }
  504. if msg != "" {
  505. fmt.Println(msg)
  506. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  507. }
  508. }()
  509. endDate := time.Now().Add(+time.Minute * 15).Format("2006-01-02 15:04:05")
  510. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name != '研选' `
  511. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  512. if total == 0 {
  513. fmt.Println("发送附件完成0")
  514. return nil
  515. }
  516. if err != nil {
  517. msg = "发送附件模版消息失败 Err:" + err.Error()
  518. return
  519. }
  520. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  521. if err != nil {
  522. msg = "发送附件模版消息失败 Err:" + err.Error()
  523. return
  524. }
  525. listEmail, errEmail := models.GetAskEmail()
  526. if errEmail != nil {
  527. msg = "获取失败,Err:" + errEmail.Error()
  528. return
  529. }
  530. for _, v := range listActivity {
  531. fmt.Println(v.ActivityId)
  532. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  533. if activityInfo == nil {
  534. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  535. return
  536. }
  537. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  538. if errFile != nil {
  539. msg = "获取失败,Err:" + errFile.Error()
  540. return
  541. }
  542. for _, v := range listEmail {
  543. if strings.Index(activityInfo.Host, v.Name) > 0 {
  544. touser += v.Email + ";"
  545. }
  546. }
  547. if touser != "" {
  548. touser += "tshen@hzinsights.com;cxzhang@hzinsights.com"
  549. } else {
  550. fmt.Println("没有对应的邮箱")
  551. return
  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. rowTitle := sheet.AddRow()
  577. cellA := rowTitle.AddCell()
  578. cellA.Value = "姓名"
  579. cellB := rowTitle.AddCell()
  580. cellB.Value = "公司名称"
  581. cellC := rowTitle.AddCell()
  582. cellC.Value = "问题"
  583. cellD := rowTitle.AddCell()
  584. cellD.Value = "提交时间"
  585. for _, item := range list {
  586. row := sheet.AddRow()
  587. cellA := row.AddCell()
  588. cellA.Value = item.RealName
  589. cellB := row.AddCell()
  590. cellB.Value = item.CompanyName
  591. cellC := row.AddCell()
  592. cellC.Value = item.Content
  593. cellD := row.AddCell()
  594. cellD.Value = item.CreateTime
  595. }
  596. errFile = xlsxFile.Save(downLoadnFilePath)
  597. if errFile != nil {
  598. msg = "保存文件失败Err:" + errFile.Error()
  599. return
  600. }
  601. title := activityInfo.ActivityName + "-活动带问"
  602. content := "活动带问详情"
  603. fileName := downLoadnFilePath
  604. //haveSuccess := utils.SendEmailHaveFile(title, content, fileName, touser)
  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("2006-01-02 15:04:05"), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  615. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  616. }
  617. }
  618. return
  619. }