activity.go 32 KB

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