activity.go 34 KB

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