activity.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  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.GetCompanyPermissionByUser(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 == 1 || activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 4 || activityInfo.ActivityTypeId == 5) && strings.Contains(permissionStr, "专家") {
  374. havePower = true
  375. }
  376. if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 {
  377. if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(主观)") {
  378. havePower = true
  379. }
  380. } else {
  381. if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(客观)") {
  382. havePower = true
  383. }
  384. }
  385. if (activityInfo.ChartPermissionName == "研选" || activityInfo.ChartPermissionName == "策略") && strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  386. havePower = true
  387. }
  388. return
  389. }
  390. //研选系列专家电话会,会前1小时将问题列表发送给邮箱
  391. func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
  392. var msg string
  393. var touser string
  394. defer func() {
  395. if err != nil {
  396. fmt.Println("err:", err)
  397. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  398. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  399. }
  400. if msg != "" {
  401. fmt.Println(msg)
  402. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  403. }
  404. }()
  405. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  406. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name = '研选' `
  407. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  408. if total == 0 {
  409. fmt.Println("发送附件完成0")
  410. return nil
  411. }
  412. if err != nil {
  413. msg = "发送附件模版消息失败 Err:" + err.Error()
  414. return
  415. }
  416. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  417. if err != nil {
  418. msg = "发送附件模版消息失败 Err:" + err.Error()
  419. return
  420. }
  421. for _, v := range listActivity {
  422. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  423. if activityInfo == nil {
  424. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  425. return
  426. }
  427. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  428. if errFile != nil {
  429. msg = "获取失败,Err:" + errFile.Error()
  430. return
  431. }
  432. //创建excel
  433. dir, errFile := os.Executable()
  434. exPath := filepath.Dir(dir)
  435. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  436. xlsxFile := xlsx.NewFile()
  437. if errFile != nil {
  438. msg = "生成文件失败Err:" + errFile.Error()
  439. return
  440. }
  441. style := xlsx.NewStyle()
  442. alignment := xlsx.Alignment{
  443. Horizontal: "center",
  444. Vertical: "center",
  445. WrapText: true,
  446. }
  447. style.Alignment = alignment
  448. style.ApplyAlignment = true
  449. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  450. if errFile != nil {
  451. msg = "新增Sheet失败,Err:" + errFile.Error()
  452. return
  453. }
  454. //设置宽度
  455. _ = sheet.SetColWidth(1, 1, 30)
  456. _ = sheet.SetColWidth(2, 2, 60)
  457. //标头
  458. rowTitle := sheet.AddRow()
  459. cellA := rowTitle.AddCell()
  460. cellA.Value = "姓名"
  461. cellB := rowTitle.AddCell()
  462. cellB.Value = "公司名称"
  463. cellC := rowTitle.AddCell()
  464. cellC.Value = "问题"
  465. cellD := rowTitle.AddCell()
  466. cellD.Value = "提交时间"
  467. for _, item := range list {
  468. row := sheet.AddRow()
  469. cellA := row.AddCell()
  470. cellA.Value = item.RealName
  471. cellB := row.AddCell()
  472. cellB.Value = item.CompanyName
  473. cellC := row.AddCell()
  474. cellC.Value = item.Content
  475. cellD := row.AddCell()
  476. cellD.Value = item.CreateTime
  477. }
  478. errFile = xlsxFile.Save(downLoadnFilePath)
  479. if errFile != nil {
  480. msg = "保存文件失败Err:" + errFile.Error()
  481. return
  482. }
  483. title := activityInfo.ActivityName + "-活动带问"
  484. content := "活动带问详情"
  485. fileName := downLoadnFilePath
  486. if utils.RunMode == "release" {
  487. touser = "cxzhang@hzinsights.com;ywang@hzinsights.com;tshen@hzinsights.com"
  488. } else {
  489. touser = "cxzhang@hzinsights.com;jhwang@hzinsights.com;tshen@hzinsights.com"
  490. }
  491. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  492. if sendResult {
  493. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  494. if errFile != nil {
  495. msg = "获取失败,Err:" + errFile.Error()
  496. return
  497. }
  498. os.Remove(downLoadnFilePath)
  499. } else {
  500. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.RunMode), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  501. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  502. }
  503. }
  504. return
  505. }
  506. //非研选系列专家电话会,根据主持人姓名,会前15分钟将问题列表发送给至该主持人对应邮箱
  507. func SendEmailFileForAskMsg(cont context.Context) (err error) {
  508. var msg string
  509. var touser string
  510. defer func() {
  511. if err != nil {
  512. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  513. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  514. }
  515. if msg != "" {
  516. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  517. }
  518. }()
  519. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  520. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name != '研选' `
  521. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  522. if total == 0 {
  523. fmt.Println("发送附件完成0")
  524. return nil
  525. }
  526. if err != nil {
  527. msg = "发送附件模版消息失败 Err:" + err.Error()
  528. return
  529. }
  530. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  531. if err != nil {
  532. msg = "发送附件模版消息失败 Err:" + err.Error()
  533. return
  534. }
  535. listEmail, errEmail := models.GetAskEmail()
  536. if errEmail != nil {
  537. msg = "获取失败,Err:" + errEmail.Error()
  538. return
  539. }
  540. for _, v := range listActivity {
  541. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  542. if activityInfo == nil {
  543. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  544. return
  545. }
  546. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  547. if errFile != nil {
  548. msg = "获取失败,Err:" + errFile.Error()
  549. return
  550. }
  551. for _, v := range listEmail {
  552. if strings.Index(activityInfo.Host, v.Name) > 0 {
  553. touser += v.Email + ";"
  554. }
  555. }
  556. if touser == "" {
  557. msg = "没有对应的邮箱"
  558. return
  559. }
  560. if utils.RunMode == "release" {
  561. touser += "tshen@hzinsights.com;cxzhang@hzinsights.com"
  562. } else {
  563. touser = "tshen@hzinsights.com;cxzhang@hzinsights.com"
  564. }
  565. //创建excel
  566. dir, errFile := os.Executable()
  567. exPath := filepath.Dir(dir)
  568. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + utils.GetRandDigit(5) + ".xlsx"
  569. xlsxFile := xlsx.NewFile()
  570. if errFile != nil {
  571. msg = "生成文件失败Err:" + errFile.Error()
  572. return
  573. }
  574. style := xlsx.NewStyle()
  575. alignment := xlsx.Alignment{
  576. Horizontal: "center",
  577. Vertical: "center",
  578. WrapText: true,
  579. }
  580. style.Alignment = alignment
  581. style.ApplyAlignment = true
  582. sheet, errFile := xlsxFile.AddSheet("外呼名单")
  583. if errFile != nil {
  584. msg = "新增Sheet失败,Err:" + errFile.Error()
  585. return
  586. }
  587. //设置宽度
  588. _ = sheet.SetColWidth(1, 1, 30)
  589. _ = sheet.SetColWidth(2, 2, 60)
  590. //标头
  591. rowTitle := sheet.AddRow()
  592. cellA := rowTitle.AddCell()
  593. cellA.Value = "姓名"
  594. cellB := rowTitle.AddCell()
  595. cellB.Value = "公司名称"
  596. cellC := rowTitle.AddCell()
  597. cellC.Value = "问题"
  598. cellD := rowTitle.AddCell()
  599. cellD.Value = "提交时间"
  600. for _, item := range list {
  601. row := sheet.AddRow()
  602. cellA := row.AddCell()
  603. cellA.Value = item.RealName
  604. cellB := row.AddCell()
  605. cellB.Value = item.CompanyName
  606. cellC := row.AddCell()
  607. cellC.Value = item.Content
  608. cellD := row.AddCell()
  609. cellD.Value = item.CreateTime
  610. }
  611. errFile = xlsxFile.Save(downLoadnFilePath)
  612. if errFile != nil {
  613. msg = "保存文件失败Err:" + errFile.Error()
  614. return
  615. }
  616. title := activityInfo.ActivityName + "-活动带问"
  617. content := "活动带问详情"
  618. fileName := downLoadnFilePath
  619. sendResult := utils.SendEmailByHongze(title, content, touser, fileName, title+".xlsx")
  620. if sendResult {
  621. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  622. if errFile != nil {
  623. msg = "获取失败,Err:" + errFile.Error()
  624. return
  625. }
  626. os.Remove(downLoadnFilePath)
  627. } else {
  628. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+activityInfo.ActivityName, utils.EmailSendToUsers)
  629. utils.FileLog.Info("发送附件模版消息失败,Err:%s", activityInfo.ActivityName)
  630. }
  631. }
  632. return
  633. }
  634. //活动标签字符串处理
  635. func LabelStr(label string) (labelNew string) {
  636. slicebr := strings.Split(label, "-")
  637. if len(slicebr) < 2 {
  638. labelNew = label
  639. } else {
  640. labelNew = slicebr[1]
  641. }
  642. return labelNew
  643. }
  644. func ActivityAttendanceDetail(cont context.Context) (err error) {
  645. defer func() {
  646. if err != nil {
  647. fmt.Println("RefreshDataFromWind Err:" + err.Error())
  648. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromWind ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  649. }
  650. }()
  651. fmt.Println("开始同步")
  652. dateTime := time.Now().AddDate(0, 0, -14).Format(utils.FormatDate)
  653. dateNow := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  654. startDate := dateTime + " 00:00:00"
  655. endDate := dateNow + " 23:59:59"
  656. //获取需要处理的活动
  657. listActivity, err := models.GetActivityListByDateTime(startDate, endDate)
  658. if err != nil {
  659. fmt.Println("GetTacticsList Err:", err.Error())
  660. return err
  661. }
  662. fmt.Println(listActivity)
  663. for _, vAct := range listActivity {
  664. doTime := utils.TimeRemoveHms2(vAct.ActivityTime)
  665. findStartDate := doTime + " 00:00:00"
  666. findEndDate := doTime + " 23:59:59"
  667. nameSlice := strings.Split(vAct.ActivityName, "】")
  668. //fmt.Println(timeSlice[0])
  669. var activityName string
  670. if len(nameSlice) > 1 {
  671. activityName = nameSlice[len(nameSlice)-1]
  672. if activityName != "" {
  673. list, err := models.GetRoadshowDataList(activityName, findStartDate, findEndDate)
  674. if err != nil {
  675. fmt.Println("GetTacticsList Err:", err.Error())
  676. return err
  677. }
  678. needAddAttendanc := make([]*models.CygxActivityAttendanceDetail, 0)
  679. fmt.Println("原来的", vAct.ActivityName)
  680. fmt.Println("处理的", activityName)
  681. var mobileStr string
  682. if len(list) > 0 {
  683. for _, v := range list {
  684. if v.UserPhone != "" {
  685. item := new(models.CygxActivityAttendanceDetail)
  686. item.ActivityId = vAct.ActivityId
  687. item.RealName = v.UserName
  688. item.Mobile = v.UserPhone
  689. item.CompanyName = v.Company
  690. //item.SellerName = sellerName
  691. item.FirstMeetingTime = v.FirstWatchTime
  692. item.LastMeetingTime = v.LastWatchTime
  693. item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
  694. if v.JoinType == 1 {
  695. item.MeetingTypeStr = "网络"
  696. } else {
  697. item.MeetingTypeStr = "电话"
  698. }
  699. item.MeetingAuthentication = v.AuthInfo
  700. if v.DataType == 1 {
  701. item.MeetingStatusStr = "直播"
  702. } else {
  703. item.MeetingStatusStr = "回放"
  704. }
  705. item.Position = v.Occupation
  706. item.CreateTime = time.Now()
  707. mobileStr += "'" + v.UserPhone + "'" + ","
  708. needAddAttendanc = append(needAddAttendanc, item)
  709. }
  710. }
  711. mobileStr = strings.TrimRight(mobileStr, ",")
  712. if mobileStr == "" {
  713. mobileStr = "1"
  714. }
  715. listUser, err := models.GetWxUserOutboundMobile(mobileStr)
  716. if err != nil {
  717. fmt.Println("GetWxUserOutboundMobile Err:", err.Error())
  718. return err
  719. }
  720. for k, v := range needAddAttendanc {
  721. for _, v2 := range listUser {
  722. if v2.OutboundMobile == v.Mobile {
  723. needAddAttendanc[k].CompanyId = v2.CompanyId
  724. needAddAttendanc[k].SellerName = v2.SellerName
  725. needAddAttendanc[k].CompanyName = v2.CompanyName
  726. needAddAttendanc[k].IsMeetingStr = 1
  727. }
  728. }
  729. }
  730. //fmt.Println(mobileStr)
  731. //参会记录
  732. err = models.AddAttendancDetail(needAddAttendanc, vAct.ActivityId, mobileStr)
  733. if err != nil {
  734. fmt.Println("AddAttendancDetail Err:", err.Error())
  735. return err
  736. }
  737. ////处理是否限制报名
  738. err = AddCygxActivityRestrictSignupByAdmin(vAct.ActivityId)
  739. if err != nil {
  740. fmt.Println("AddCygxActivityRestrictSignupByAdmin Err:", err.Error())
  741. return err
  742. }
  743. ////添加报名日志
  744. //err = models.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, vAct.ActivityId)
  745. //if err != nil {
  746. // fmt.Println("AddCygxActivityMeetDetailLogOnline Err:", err.Error())
  747. // return err
  748. //}
  749. }
  750. }
  751. }
  752. }
  753. var activityIds string
  754. for _, v := range listActivity {
  755. activityIds += strconv.Itoa(v.ActivityId) + ","
  756. }
  757. activityIds = strings.TrimRight(activityIds, ",")
  758. detailList, err := models.GetActivityAttendanceDetailList(activityIds)
  759. if err != nil {
  760. fmt.Println("GetActivityAttendanceDetailList Err:", err.Error())
  761. return err
  762. }
  763. //添加报名日志 (下载使用)
  764. err = models.AddCygxActivityMeetDetailLogOnlineByList(detailList, activityIds)
  765. if err != nil {
  766. fmt.Println("AddCygxActivityMeetDetailLogOnline Err:", err.Error())
  767. return err
  768. }
  769. fmt.Println("结束路演同步")
  770. return
  771. }
  772. //判断是否加入黑名单
  773. func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
  774. total, err := models.GetActivitySignupNomeetingCount(activityId)
  775. if err != nil {
  776. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  777. fmt.Println(" Err:", err.Error())
  778. return err
  779. }
  780. if total == 0 {
  781. return err
  782. }
  783. mobileList, _ := models.GetUserMeetingMobile(activityId)
  784. if len(mobileList) >= 0 {
  785. for _, v := range mobileList {
  786. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  787. if err != nil {
  788. fmt.Println(" Err:", err.Error())
  789. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  790. return err
  791. }
  792. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  793. if err != nil {
  794. fmt.Println(" Err:", err.Error())
  795. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  796. return err
  797. }
  798. if totalRestrict > 0 && totalNomeet < 3 {
  799. err = models.DeleteCygxActivityRestrictSignup(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. }
  806. }
  807. }
  808. list, err := models.GetActivitySignupNomeetingCountList(activityId)
  809. if err != nil {
  810. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  811. fmt.Println(" 用户限制报名失败 Err:", err.Error())
  812. return err
  813. }
  814. for _, v := range list {
  815. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  816. if err != nil {
  817. fmt.Println(" Err:", err.Error())
  818. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  819. return err
  820. }
  821. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  822. if err != nil {
  823. fmt.Println(" Err:", err.Error())
  824. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  825. return err
  826. }
  827. if totalNomeet >= 3 {
  828. if totalRestrict == 0 {
  829. infoUser, err := models.GetUserAndCompanyNameList(v.UserId)
  830. if err != nil {
  831. fmt.Println(" Err:", err.Error())
  832. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  833. return err
  834. }
  835. if infoUser != nil {
  836. item := new(models.CygxActivityRestrictSignup)
  837. item.UserId = infoUser.UserId
  838. item.CreateTime = time.Now()
  839. item.Mobile = infoUser.Mobile
  840. item.Email = infoUser.Email
  841. item.CompanyId = infoUser.CompanyId
  842. item.CompanyName = infoUser.CompanyName
  843. item.IsRestrict = 1
  844. err = models.AddCygxActivityRestrictSignup(item)
  845. if err != nil {
  846. fmt.Println(" Err:", err.Error())
  847. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  848. return err
  849. }
  850. }
  851. }
  852. }
  853. }
  854. return
  855. }