activity.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871
  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, permissionZhegnshiStr 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. permissionZhegnshiStr, errs = models.GetCompanyPermissionByUserZhengShi(companyId)
  317. if errs != nil {
  318. err = errs
  319. return
  320. }
  321. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  322. if companyDetail.Status == "永续" {
  323. userType = 1
  324. } else if companyDetail.Status == "试用" {
  325. userType = 5
  326. } else if companyDetail.Status == "正式" {
  327. if permissionStr == "专家" {
  328. userType = 4
  329. } else if strings.Contains(permissionZhegnshiStr, "医药") && strings.Contains(permissionZhegnshiStr, "消费") && strings.Contains(permissionZhegnshiStr, "科技") && strings.Contains(permissionZhegnshiStr, "智造") {
  330. userType = 2
  331. } else {
  332. userType = 3
  333. }
  334. if userType == 3 {
  335. if !strings.Contains(permissionStr, "医药") && !strings.Contains(permissionStr, "消费") && !strings.Contains(permissionStr, "科技") && !strings.Contains(permissionStr, "智造") {
  336. userType = 4
  337. }
  338. }
  339. }
  340. }
  341. }
  342. permissionStrnew = permissionStr
  343. return
  344. }
  345. // 校验被分享的用户是否有查看详情的权限
  346. func GetShareNoPowe(activityInfo *models.ActivityDetail, permissionStr string, userType int) (noPower bool, err error) {
  347. //var noPower bool
  348. if (userType == 1 || userType == 4 || userType == 5) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  349. noPower = true
  350. }
  351. //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户
  352. 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)) {
  353. noPower = true
  354. }
  355. if userType == 2 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(2)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  356. noPower = true
  357. }
  358. if userType == 3 && strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(4)) {
  359. noPower = true
  360. }
  361. if userType == 3 && !strings.Contains(permissionStr, "专家") && !strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(3)) {
  362. noPower = true
  363. }
  364. return
  365. }
  366. // 校验用户报名的权限
  367. func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDetailStatus string, userType int) (havePower bool, err error) {
  368. if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3) && strings.Contains(permissionStr, "专家") && activityInfo.LimitPeopleNum == 0 {
  369. havePower = true
  370. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "正式" && strings.Contains(activityInfo.CustomerTypeIds, "4") {
  371. havePower = true
  372. } else if activityInfo.ActivityTypeId == 3 && strings.Contains(permissionStr, "专家") && companyDetailStatus == "试用" && strings.Contains(activityInfo.CustomerTypeIds, "5") {
  373. havePower = true
  374. //} else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, strconv.Itoa(userType)) {
  375. // havePower = true
  376. //} else if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  377. // havePower = true
  378. } else if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 4 || activityInfo.ActivityTypeId == 5) && strings.Contains(permissionStr, "专家") {
  379. havePower = true
  380. }
  381. if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 {
  382. if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(主观)") {
  383. havePower = true
  384. }
  385. } else {
  386. if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(客观)") {
  387. havePower = true
  388. }
  389. }
  390. if (activityInfo.ChartPermissionName == "研选" || activityInfo.ChartPermissionName == "策略") && strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
  391. havePower = true
  392. }
  393. return
  394. }
  395. //研选系列专家电话会,会前1小时将问题列表发送给邮箱
  396. func SendEmailFileForAskMsgResearch(cont context.Context) (err error) {
  397. var msg string
  398. //var touser string
  399. defer func() {
  400. if err != nil {
  401. fmt.Println("err:", err)
  402. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  403. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  404. }
  405. if msg != "" {
  406. fmt.Println(msg)
  407. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  408. }
  409. }()
  410. endDate := time.Now().Add(+time.Minute * 60).Format(utils.FormatDateTime)
  411. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name = '研选' `
  412. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  413. if total == 0 {
  414. fmt.Println("发送附件完成0")
  415. return nil
  416. }
  417. if err != nil {
  418. msg = "发送附件模版消息失败 Err:" + err.Error()
  419. return
  420. }
  421. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  422. if err != nil {
  423. msg = "发送附件模版消息失败 Err:" + err.Error()
  424. return
  425. }
  426. for _, v := range listActivity {
  427. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  428. if activityInfo == nil {
  429. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  430. return
  431. }
  432. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  433. if errFile != nil {
  434. msg = "获取失败,Err:" + errFile.Error()
  435. return
  436. }
  437. for _, v2 := range list {
  438. user, err := models.GetWxUserItemByUserId(v2.UserId)
  439. if err != nil && err.Error() != utils.ErrNoRow() {
  440. return err
  441. }
  442. //获取销售信息
  443. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  444. if err != nil && err.Error() != utils.ErrNoRow() {
  445. return err
  446. }
  447. //给研究员推送消息
  448. if sellerItem != nil {
  449. openIpItem, _ := models.GetUserRecordByMobile(4, utils.ActSendMsgMobile)
  450. if openIpItem != nil && openIpItem.OpenId != "" {
  451. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, openIpItem.OpenId, activityInfo.ActivityId)
  452. }
  453. }
  454. //给所属销售推送消息
  455. if sellerItem != nil {
  456. openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
  457. if openIpItem != nil && openIpItem.OpenId != "" {
  458. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, openIpItem.OpenId, activityInfo.ActivityId)
  459. }
  460. }
  461. }
  462. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  463. if errFile != nil {
  464. msg = "获取失败,Err:" + errFile.Error()
  465. return
  466. }
  467. }
  468. return
  469. }
  470. //非研选系列专家电话会,根据主持人姓名,会前15分钟将问题列表发送给至该主持人对应邮箱
  471. func SendEmailFileForAskMsg(cont context.Context) (err error) {
  472. var msg string
  473. //var touser string
  474. defer func() {
  475. if err != nil {
  476. go utils.SendEmail("发送附件模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format(utils.FormatDateTime), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  477. utils.FileLog.Info("发送附件模版消息失败,Err:%s", err.Error())
  478. }
  479. if msg != "" {
  480. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  481. }
  482. }()
  483. endDate := time.Now().Add(+time.Minute * 15).Format(utils.FormatDateTime)
  484. condition := `AND a.activity_type_id = 1 AND a.chart_permission_name != '研选' `
  485. total, err := models.GetCountActivityResearchToSendFile(condition, endDate)
  486. if total == 0 {
  487. fmt.Println("发送附件完成0")
  488. return nil
  489. }
  490. if err != nil {
  491. msg = "发送附件模版消息失败 Err:" + err.Error()
  492. return
  493. }
  494. listActivity, err := models.GetActivityResearchToSendFile(condition, endDate)
  495. if err != nil {
  496. msg = "发送附件模版消息失败 Err:" + err.Error()
  497. return
  498. }
  499. listEmail, errEmail := models.GetAskEmail()
  500. if errEmail != nil {
  501. msg = "获取失败,Err:" + errEmail.Error()
  502. return
  503. }
  504. for _, v := range listActivity {
  505. activityInfo, _ := models.GetAddActivityInfoById(v.ActivityId)
  506. if activityInfo == nil {
  507. msg = "活动不存在,Err:activityId:" + strconv.Itoa(v.ActivityId)
  508. return
  509. }
  510. list, errFile := models.GetActivityMsgExport(v.ActivityId)
  511. if errFile != nil {
  512. msg = "获取失败,Err:" + errFile.Error()
  513. return
  514. }
  515. for _, v2 := range list {
  516. user, err := models.GetWxUserItemByUserId(v2.UserId)
  517. if err != nil && err.Error() != utils.ErrNoRow() {
  518. return err
  519. }
  520. var sendMobile string
  521. for _, vEmail := range listEmail {
  522. if strings.Index(activityInfo.Host, vEmail.Name) > 0 {
  523. sendMobile = vEmail.Mobile
  524. }
  525. }
  526. //获取销售信息
  527. sellerItem, err := models.GetSellerByCompanyIdCheckFicc(v2.CompanyId, 2)
  528. if err != nil && err.Error() != utils.ErrNoRow() {
  529. return err
  530. }
  531. //给研究员推送模板消息
  532. if sellerItem != nil {
  533. openIpItem, _ := models.GetUserRecordByMobile(4, sendMobile)
  534. if openIpItem != nil && openIpItem.OpenId != "" {
  535. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, openIpItem.OpenId, activityInfo.ActivityId)
  536. }
  537. }
  538. //给销售推送模板消息
  539. if sellerItem != nil {
  540. openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
  541. if openIpItem != nil && openIpItem.OpenId != "" {
  542. SendActivityAskApplyTemplateMsg(user.RealName+"——"+user.CompanyName+"(所属销售:"+sellerItem.RealName+")", v2.CreateTime, v2.Content, activityInfo.ActivityName, openIpItem.OpenId, activityInfo.ActivityId)
  543. }
  544. }
  545. }
  546. errFile = models.UPdateActivityMsgToSendFile(v.ActivityId)
  547. if errFile != nil {
  548. msg = "获取失败,Err:" + errFile.Error()
  549. return
  550. }
  551. }
  552. return
  553. }
  554. //活动标签字符串处理
  555. func LabelStr(label string) (labelNew string) {
  556. slicebr := strings.Split(label, "-")
  557. if len(slicebr) < 2 {
  558. labelNew = label
  559. } else {
  560. labelNew = slicebr[1]
  561. }
  562. return labelNew
  563. }
  564. func ActivityAttendanceDetail(cont context.Context) (err error) {
  565. defer func() {
  566. if err != nil {
  567. fmt.Println("RefreshDataFromWind Err:" + err.Error())
  568. go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromWind ErrMsg:"+err.Error(), utils.EmailSendToUsers)
  569. }
  570. }()
  571. fmt.Println("开始同步")
  572. dateTime := time.Now().AddDate(0, 0, -14).Format(utils.FormatDate)
  573. dateNow := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
  574. startDate := dateTime + " 00:00:00"
  575. endDate := dateNow + " 23:59:59"
  576. //获取需要处理的活动
  577. listActivity, err := models.GetActivityListByDateTime(startDate, endDate)
  578. if err != nil {
  579. fmt.Println("GetTacticsList Err:", err.Error())
  580. return err
  581. }
  582. fmt.Println(listActivity)
  583. for _, vAct := range listActivity {
  584. doTime := utils.TimeRemoveHms2(vAct.ActivityTime)
  585. findStartDate := doTime + " 00:00:00"
  586. findEndDate := doTime + " 23:59:59"
  587. nameSlice := strings.Split(vAct.ActivityName, "】")
  588. //fmt.Println(timeSlice[0])
  589. var activityName string
  590. if len(nameSlice) > 1 {
  591. activityName = nameSlice[len(nameSlice)-1]
  592. if activityName != "" {
  593. list, err := models.GetRoadshowDataList(activityName, findStartDate, findEndDate)
  594. if err != nil {
  595. fmt.Println("GetTacticsList Err:", err.Error())
  596. return err
  597. }
  598. needAddAttendanc := make([]*models.CygxActivityAttendanceDetail, 0)
  599. fmt.Println("原来的", vAct.ActivityName)
  600. fmt.Println("处理的", activityName)
  601. var mobileStr string
  602. if len(list) > 0 {
  603. for _, v := range list {
  604. if v.UserPhone != "" {
  605. item := new(models.CygxActivityAttendanceDetail)
  606. item.ActivityId = vAct.ActivityId
  607. item.RealName = v.UserName
  608. item.Mobile = v.UserPhone
  609. item.CompanyName = v.Company
  610. //item.SellerName = sellerName
  611. item.FirstMeetingTime = v.FirstWatchTime
  612. item.LastMeetingTime = v.LastWatchTime
  613. item.Duration = utils.GetAttendanceDetailSeconds(v.JoinTime)
  614. if v.JoinType == 1 {
  615. item.MeetingTypeStr = "网络"
  616. } else {
  617. item.MeetingTypeStr = "电话"
  618. }
  619. item.MeetingAuthentication = v.AuthInfo
  620. if v.DataType == 1 {
  621. item.MeetingStatusStr = "直播"
  622. } else {
  623. item.MeetingStatusStr = "回放"
  624. }
  625. item.Position = v.Occupation
  626. item.CreateTime = time.Now()
  627. mobileStr += "'" + v.UserPhone + "'" + ","
  628. needAddAttendanc = append(needAddAttendanc, item)
  629. }
  630. }
  631. mobileStr = strings.TrimRight(mobileStr, ",")
  632. if mobileStr == "" {
  633. mobileStr = "1"
  634. }
  635. listUser, err := models.GetWxUserOutboundMobile(mobileStr)
  636. if err != nil {
  637. fmt.Println("GetWxUserOutboundMobile Err:", err.Error())
  638. return err
  639. }
  640. for k, v := range needAddAttendanc {
  641. for _, v2 := range listUser {
  642. if v2.OutboundMobile == v.Mobile {
  643. needAddAttendanc[k].CompanyId = v2.CompanyId
  644. needAddAttendanc[k].SellerName = v2.SellerName
  645. needAddAttendanc[k].CompanyName = v2.CompanyName
  646. needAddAttendanc[k].IsMeetingStr = 1
  647. }
  648. }
  649. }
  650. //fmt.Println(mobileStr)
  651. //参会记录
  652. err = models.AddAttendancDetail(needAddAttendanc, vAct.ActivityId, mobileStr)
  653. if err != nil {
  654. fmt.Println("AddAttendancDetail Err:", err.Error())
  655. return err
  656. }
  657. ////处理是否限制报名
  658. err = AddCygxActivityRestrictSignupByAdmin(vAct.ActivityId)
  659. if err != nil {
  660. fmt.Println("AddCygxActivityRestrictSignupByAdmin Err:", err.Error())
  661. return err
  662. }
  663. ////添加报名日志
  664. //err = models.AddCygxActivityMeetDetailLogOnline(needAddAttendanc, vAct.ActivityId)
  665. //if err != nil {
  666. // fmt.Println("AddCygxActivityMeetDetailLogOnline Err:", err.Error())
  667. // return err
  668. //}
  669. }
  670. }
  671. }
  672. }
  673. var activityIds string
  674. for _, v := range listActivity {
  675. activityIds += strconv.Itoa(v.ActivityId) + ","
  676. }
  677. activityIds = strings.TrimRight(activityIds, ",")
  678. detailList, err := models.GetActivityAttendanceDetailList(activityIds)
  679. if err != nil {
  680. fmt.Println("GetActivityAttendanceDetailList Err:", err.Error())
  681. return err
  682. }
  683. //添加报名日志 (下载使用)
  684. err = models.AddCygxActivityMeetDetailLogOnlineByList(detailList, activityIds)
  685. if err != nil {
  686. fmt.Println("AddCygxActivityMeetDetailLogOnline Err:", err.Error())
  687. return err
  688. }
  689. fmt.Println("结束路演同步")
  690. return
  691. }
  692. //判断是否加入黑名单
  693. func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
  694. total, err := models.GetActivitySignupNomeetingCount(activityId)
  695. if err != nil {
  696. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  697. fmt.Println(" Err:", err.Error())
  698. return err
  699. }
  700. if total == 0 {
  701. return err
  702. }
  703. mobileList, _ := models.GetUserMeetingMobile(activityId)
  704. if len(mobileList) >= 0 {
  705. for _, v := range mobileList {
  706. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  707. if err != nil {
  708. fmt.Println(" Err:", err.Error())
  709. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  710. return err
  711. }
  712. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  713. if err != nil {
  714. fmt.Println(" Err:", err.Error())
  715. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  716. return err
  717. }
  718. if totalRestrict > 0 && totalNomeet < 3 {
  719. err = models.DeleteCygxActivityRestrictSignup(v.UserId)
  720. if err != nil {
  721. fmt.Println(" Err:", err.Error())
  722. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  723. return err
  724. }
  725. }
  726. }
  727. }
  728. list, err := models.GetActivitySignupNomeetingCountList(activityId)
  729. if err != nil {
  730. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  731. fmt.Println(" 用户限制报名失败 Err:", err.Error())
  732. return err
  733. }
  734. for _, v := range list {
  735. totalRestrict, err := models.GetRestrictSignupCountByUid(v.UserId)
  736. if err != nil {
  737. fmt.Println(" Err:", err.Error())
  738. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  739. return err
  740. }
  741. totalNomeet, err := models.GetActivitySignupNomeetingCountByUid(v.UserId)
  742. if err != nil {
  743. fmt.Println(" Err:", err.Error())
  744. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  745. return err
  746. }
  747. if totalNomeet >= 3 {
  748. if totalRestrict == 0 {
  749. infoUser, err := models.GetUserAndCompanyNameList(v.UserId)
  750. if err != nil {
  751. fmt.Println(" Err:", err.Error())
  752. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  753. return err
  754. }
  755. if infoUser != nil {
  756. item := new(models.CygxActivityRestrictSignup)
  757. item.UserId = infoUser.UserId
  758. item.CreateTime = time.Now()
  759. item.Mobile = infoUser.Mobile
  760. item.Email = infoUser.Email
  761. item.CompanyId = infoUser.CompanyId
  762. item.CompanyName = infoUser.CompanyName
  763. item.IsRestrict = 1
  764. err = models.AddCygxActivityRestrictSignup(item)
  765. if err != nil {
  766. fmt.Println(" Err:", err.Error())
  767. utils.FileLog.Info("用户限制报名失败,Err:%s,%s", err.Error())
  768. return err
  769. }
  770. }
  771. }
  772. }
  773. }
  774. return
  775. }
  776. //活动带问提醒
  777. func SendActivityAskApplyTemplateMsg(applyName, applyTime, askContent, activityName, openId string, activityId int) (err error) {
  778. var msg string
  779. defer func() {
  780. if err != nil {
  781. go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
  782. }
  783. if msg != "" {
  784. utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
  785. }
  786. }()
  787. var accessToken string
  788. if utils.RunMode == "release" {
  789. accessToken, err = models.GetWxAccessTokenByXzs()
  790. if err != nil {
  791. msg = "GetWxAccessToken Err:" + err.Error()
  792. return
  793. }
  794. if accessToken == "" {
  795. msg = "accessToken is empty"
  796. return
  797. }
  798. } else {
  799. accessToken, err = models.GetWxAccessToken()
  800. if err != nil {
  801. msg = "GetWxAccessToken Err:" + err.Error()
  802. return
  803. }
  804. if accessToken == "" {
  805. msg = "accessToken is empty"
  806. return
  807. }
  808. }
  809. sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
  810. sendMap := make(map[string]interface{})
  811. sendData := make(map[string]interface{})
  812. first := "有新的客户提问"
  813. keyword1 := applyName
  814. keyword2 := "-"
  815. keyword3 := applyTime
  816. keyword4 := askContent
  817. remark := activityName
  818. fontColor := "#D9001B"
  819. sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
  820. sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
  821. sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
  822. sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
  823. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  824. sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
  825. sendData["remark"] = map[string]interface{}{"value": remark, "color": fontColor}
  826. if utils.RunMode == "release" {
  827. sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
  828. } else {
  829. sendMap["template_id"] = utils.WxMsgTemplateIdApply
  830. }
  831. sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
  832. sendMap["data"] = sendData
  833. sendTemplateMsg(sendUrl, openId, sendMap)
  834. fmt.Println("send end")
  835. return
  836. }