activity.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. package activity
  2. import (
  3. "errors"
  4. "gorm.io/gorm"
  5. "hongze/hongze_yb/global"
  6. "hongze/hongze_yb/models/tables/chart_permission"
  7. "hongze/hongze_yb/models/tables/research_report"
  8. "hongze/hongze_yb/models/tables/teleconference"
  9. "hongze/hongze_yb/models/tables/teleconference_video"
  10. "hongze/hongze_yb/models/tables/yb_activity"
  11. "hongze/hongze_yb/models/tables/yb_activity_permission"
  12. "hongze/hongze_yb/models/tables/yb_activity_register"
  13. "hongze/hongze_yb/models/tables/yb_activity_remind"
  14. "hongze/hongze_yb/models/tables/yb_activity_type"
  15. "hongze/hongze_yb/models/tables/yb_activity_voice"
  16. "hongze/hongze_yb/models/tables/yb_speaker"
  17. "hongze/hongze_yb/services/company"
  18. "hongze/hongze_yb/services/user"
  19. "hongze/hongze_yb/utils"
  20. "log"
  21. "strconv"
  22. "strings"
  23. "time"
  24. )
  25. // ActivityList 活动列表
  26. type ActivityList struct {
  27. yb_activity.ActivityItem // 活动信息
  28. VoiceList []*yb_activity_voice.YbActivityVoice // 音频列表
  29. }
  30. // PageList 活动分页列表
  31. func PageList(condition string, pars []interface{}, page, limit int, order string, userInfo user.UserInfo) (list []ActivityList, err error) {
  32. activities, err := yb_activity.GetPageListByWhere(condition, pars, page, limit, order, int(userInfo.UserID))
  33. if err != nil {
  34. log.Print(err.Error())
  35. return
  36. }
  37. if activities != nil {
  38. var activityIds []int
  39. for _, item := range activities {
  40. activityIds = append(activityIds, item.ActivityID)
  41. }
  42. // 录音
  43. voices, queryErr := yb_activity_voice.GetVoicesByActivityIds(activityIds)
  44. if queryErr != nil {
  45. log.Print(queryErr.Error())
  46. return
  47. }
  48. // 提醒
  49. reminds, queryErr := yb_activity_remind.GetRemindsByUserIdAndActivityIds(int(userInfo.UserID), activityIds)
  50. if queryErr != nil {
  51. log.Print(queryErr.Error())
  52. return
  53. }
  54. remindMap := make(map[int]int, 0)
  55. for _, remind := range reminds {
  56. remindMap[remind.ActivityId] = 1
  57. }
  58. // 报名
  59. registers, queryErr := yb_activity_register.GetRegistersByUserIdAndActivityIds(int(userInfo.UserID), activityIds)
  60. if queryErr != nil {
  61. log.Print(queryErr.Error())
  62. return
  63. }
  64. registerMap := make(map[int]int, 0)
  65. for _, register := range registers {
  66. if register.RegisterState == 1 {
  67. registerMap[register.ActivityId] = 1
  68. }
  69. }
  70. var temp ActivityList
  71. for _, activity := range activities {
  72. temp.ActivityItem = activity
  73. temp.WeekString = utils.StrDateTimeToWeek(activity.StartTime.Weekday().String())
  74. temp.ActivityState = getActivityStateByTime(activity.StartTime, activity.EndTime)
  75. // 音频列表
  76. var voiceMap []*yb_activity_voice.YbActivityVoice
  77. for _, voice := range voices {
  78. if temp.ActivityID == int(voice.ActivityID) {
  79. voiceMap = append(voiceMap, voice)
  80. temp.HasPlayBack = 1 // 有回放
  81. }
  82. }
  83. temp.VoiceList = voiceMap
  84. // 是否有提醒
  85. _, ok := remindMap[temp.ActivityID]
  86. if ok {
  87. temp.HasRemind = 1
  88. }
  89. // 是否已报名
  90. _, ok = registerMap[temp.ActivityID]
  91. if ok {
  92. temp.RegisterState = 1
  93. }
  94. list = append(list, temp)
  95. }
  96. }
  97. return
  98. }
  99. // getActivityStateByTime 根据时间生成活动枚举值
  100. func getActivityStateByTime(startTime, endTime time.Time) (state int) {
  101. nowTime := time.Now().Format(utils.FormatDateTime)
  102. timeNow, _ := time.ParseInLocation(utils.FormatDateTime, nowTime, time.Local)
  103. if timeNow.Before(endTime) && timeNow.After(startTime) {
  104. // 进行中
  105. state = 2
  106. } else if timeNow.After(endTime) {
  107. // 已结束
  108. state = 3
  109. } else if timeNow.Before(startTime) {
  110. // 未开始
  111. state = 1
  112. }
  113. return
  114. }
  115. // GetActivityDetail 活动详情
  116. func GetActivityDetail(activityId, userId int) (detail *yb_activity.ActivityDetail, err error) {
  117. detail, err = yb_activity.GetDetailById(activityId)
  118. if err != nil {
  119. if err == gorm.ErrRecordNotFound {
  120. return
  121. }
  122. }
  123. if detail == nil {
  124. return
  125. }
  126. registeredNum, err := yb_activity_register.CountRegistedNumByActivityId(activityId)
  127. if err != nil {
  128. log.Print(err.Error())
  129. return
  130. }
  131. detail.RegisteredNum = int(registeredNum)
  132. detail.WeekString = utils.StrDateTimeToWeek(detail.StartTime.Weekday().String())
  133. detail.ActivityState = getActivityStateByTime(detail.StartTime, detail.EndTime)
  134. _, remindErr := yb_activity_remind.RemindExist(userId, activityId)
  135. if remindErr != gorm.ErrRecordNotFound {
  136. detail.HasRemind = 1
  137. }
  138. _, registerErr := yb_activity_register.RegisterExist(userId, activityId)
  139. if registerErr != gorm.ErrRecordNotFound {
  140. detail.RegisterState = 1
  141. }
  142. return
  143. }
  144. // CheckActivityPermission 验证用户的活动参与权限
  145. func CheckActivityPermission(userInfo user.UserInfo, activityId int) (ok bool, permissionCheckInfo company.PermissionCheckInfo, err error) {
  146. companyId := userInfo.CompanyID
  147. activity, err := yb_activity.GetOneById(activityId)
  148. if err != nil {
  149. if err == gorm.ErrRecordNotFound {
  150. return
  151. }
  152. }
  153. if activity == nil {
  154. return
  155. }
  156. // 查询活动权限集合
  157. permissions, err := yb_activity_permission.GetPermissionsByActivityId(activityId)
  158. if err != nil {
  159. return
  160. }
  161. var permissionIds []int
  162. for _, item := range permissions {
  163. pid := int(item.PermissionID)
  164. permissionIds = append(permissionIds, pid)
  165. }
  166. ok, permissionCheckInfo, err = company.CheckPermissionByPermissionIdList2Ficc(companyId, int(userInfo.UserID), permissionIds)
  167. return
  168. }
  169. // GetUserAuthActivityIds 获取用户有权限参与的活动Ids
  170. func GetUserAuthActivityIds(userInfo user.UserInfo) (acrivityIds []int, err error) {
  171. // 获取用户有效权限
  172. productId := 1
  173. validPermissionIdList, err := company.GetValidPermissionIdListByCompany2ProductId(userInfo.CompanyID, int64(productId))
  174. if err != nil {
  175. return
  176. }
  177. // 获取用户权限可参与的活动ID
  178. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(validPermissionIdList)
  179. if err != nil {
  180. return
  181. }
  182. for _, v := range permissions {
  183. acrivityIds = append(acrivityIds, int(v.ActivityID))
  184. }
  185. return
  186. }
  187. // SyncTeleconferenceOldData 同步旧数据
  188. func SyncTeleconferenceOldData() (countTotal, countSuccess int, err error) {
  189. // 查询所有前三个月的电话会
  190. condition := "enabled = 1"
  191. pars := make([]interface{}, 0)
  192. nowTime := time.Now()
  193. threeMonth := nowTime.AddDate(0, -3, 0).Format(utils.FormatDateTime)
  194. condition += " AND created_time >= ? AND created_time <= ?"
  195. pars = append(pars, threeMonth, nowTime)
  196. teleconferenceList, err := teleconference.GetTeleconferenceList(condition, pars)
  197. if err != nil {
  198. return
  199. }
  200. countTotal = len(teleconferenceList)
  201. // 取出电话会IDs和报告Ids
  202. var teleconferenceIds, reportIds, chartPermissionIds []int
  203. for i := 0; i < len(teleconferenceList); i++ {
  204. teleconferenceIds = append(teleconferenceIds, int(teleconferenceList[i].TeleconferenceID))
  205. reportIds = append(reportIds, int(teleconferenceList[i].ReferResearchReportID))
  206. chartPermissionIds = append(chartPermissionIds, teleconferenceList[i].ReportPermissionID)
  207. }
  208. // 报告名称map
  209. var reportIdNameMap = make(map[int]string, 0)
  210. reportList, err := research_report.GetListByResearchReportIds(reportIds)
  211. if err != nil {
  212. return
  213. }
  214. for i := 0; i < len(reportList); i++ {
  215. reportIdNameMap[int(reportList[i].ResearchReportID)] = reportList[i].ResearchReportName
  216. }
  217. // 活动类型map
  218. var typeNameIdMap = make(map[string]int, 0)
  219. var typeFirstMap = make(map[int]int, 0)
  220. var typeIdNameMap = make(map[int]string, 0)
  221. activityTypeList, err := yb_activity_type.GetTypeList()
  222. if err != nil {
  223. return
  224. }
  225. for _, activityType := range activityTypeList {
  226. typeNameIdMap[activityType.ActivityTypeName] = activityType.ActivityTypeID
  227. typeFirstMap[activityType.ActivityTypeID] = activityType.Pid
  228. typeIdNameMap[activityType.ActivityTypeID] = activityType.ActivityTypeName
  229. }
  230. // 主讲人map
  231. speakerList, err := yb_speaker.GetSpeakerList()
  232. if err != nil {
  233. return
  234. }
  235. var speakerNamePicMap = make(map[string]string, 0)
  236. for i := 0; i < len(speakerList); i++ {
  237. speakerNamePicMap[speakerList[i].SpeakerName] = speakerList[i].SpeakerHeadPic
  238. }
  239. // 音频列表
  240. voicesList, err := teleconference_video.GetListByTeleconferenceIds(teleconferenceIds)
  241. if err != nil {
  242. return
  243. }
  244. // 图片权限map
  245. chartPermissionList, err := chart_permission.GetListByIds(chartPermissionIds)
  246. if err != nil {
  247. return
  248. }
  249. var chartPermissionIdNameMap = make(map[int]string, 0)
  250. for i := 0; i < len(chartPermissionList); i++ {
  251. chartPermissionIdNameMap[int(chartPermissionList[i].ChartPermissionID)] = chartPermissionList[i].PermissionName
  252. }
  253. // 开启事务
  254. tx := global.DEFAULT_MYSQL.Begin()
  255. defer func() {
  256. if err != nil {
  257. tx.Rollback()
  258. } else {
  259. tx.Commit()
  260. }
  261. }()
  262. // 遍历数据
  263. for _, item := range teleconferenceList {
  264. // 匹配报告名称和link
  265. reportId := int(item.ReferResearchReportID)
  266. linkUrl := `https://details.hzinsights.com/ficcReportDetail?research_report_id=`
  267. if global.CONFIG.Serve.RunMode == `debug` {
  268. linkUrl = `http://advisoryadmin.brilliantstart.cn/xcx_h5/ficcReportDetail?research_report_id=`
  269. }
  270. reportLink := linkUrl + strconv.Itoa(reportId)
  271. reportName := reportIdNameMap[reportId]
  272. // 匹配活动类型-中文匹配ID
  273. var firstActivityTypeId, activityTypeId int
  274. var firstActivityTypeName, activityTypeName string
  275. activityTypeId = typeNameIdMap[item.Type]
  276. if activityTypeId > 0 {
  277. // 类型匹配到了
  278. activityTypeName = typeIdNameMap[activityTypeId]
  279. firstActivityTypeId = typeFirstMap[activityTypeId]
  280. firstActivityTypeName = typeIdNameMap[firstActivityTypeId]
  281. }
  282. // 匹配主讲人头像
  283. speakerName := item.Speaker
  284. if speakerName == "" {
  285. continue
  286. } else if speakerName == "全体FICC研究员" || speakerName == "弘则FICC研究员" {
  287. speakerName = "FICC研究员"
  288. }
  289. speakerPic := "https://hzstatic.hzinsights.com/static/images/202112/20211210/wn6c3oYKTfT4NbTZgRGflRuIBZaa.png"
  290. for i := 0; i < len(speakerList); i++ {
  291. if strings.Contains(speakerName, speakerList[i].SpeakerName) {
  292. speakerName = speakerList[i].SpeakerName // 存在多个人的情况,则以新表数据为准
  293. speakerPic = speakerNamePicMap[speakerList[i].SpeakerName]
  294. break
  295. }
  296. }
  297. backgroundPic := ""
  298. if firstActivityTypeId == 1 {
  299. // 电话会议
  300. backgroundPic = `https://hongze.oss-accelerate.aliyuncs.com/static/images/202112/20211214/nNSTxmH6lxlT0PAp7xcfJJTGX9Gu.png`
  301. } else {
  302. // 线下沙龙
  303. backgroundPic = `https://hongze.oss-accelerate.aliyuncs.com/static/images/202112/20211214/k77gDxvFvuAnYUhF6PU1FOVDHI8O.png`
  304. }
  305. // 新增活动数据
  306. activityInfo := &yb_activity.YbActivity{
  307. FirstActivityTypeID: firstActivityTypeId,
  308. FirstActivityTypeName: firstActivityTypeName,
  309. ActivityTypeID: activityTypeId,
  310. ActivityTypeName: activityTypeName,
  311. ActivityName: item.TeleconferenceTitle,
  312. StartTime: item.StartTime,
  313. EndTime: item.EndTime,
  314. Speaker: speakerName,
  315. SpeakerHeadPic: speakerPic,
  316. SpeakerBackgroundPic: backgroundPic,
  317. SingaporeTel: item.SingaporeTelephone,
  318. ParticipationCode: item.Password,
  319. MainlandTel: item.Telephone,
  320. HongKongTel: item.HkTelephone,
  321. ReportID: reportId,
  322. ReportLink: reportLink,
  323. ReportName: reportName,
  324. Remarks: item.Remark,
  325. PublishStatus: 1,
  326. IsSendWxMsg: 1,
  327. IsSendSalonWxMsg: 1,
  328. ModifyTime: nowTime,
  329. CreateTime: nowTime,
  330. }
  331. // 开启事务之后的操作要使用tx
  332. activityCreate := tx.Debug().Create(activityInfo)
  333. if activityCreate.Error != nil {
  334. err = errors.New("新增活动失败")
  335. return
  336. }
  337. activityId := activityInfo.ActivityID
  338. // 5.新增活动音频-音频列表
  339. for _, voice := range voicesList {
  340. if int(item.TeleconferenceID) == voice.TeleconferenceID {
  341. activityVoice := &yb_activity_voice.YbActivityVoice{
  342. ActivityVoiceID: activityId,
  343. VoiceURL: voice.VideoURL,
  344. VoiceName: voice.VideoName,
  345. VoicePlaySeconds: voice.VideoPlaySeconds,
  346. CreateTime: nowTime,
  347. }
  348. activityVoiceCreate := tx.Debug().Create(activityVoice)
  349. if activityVoiceCreate.Error != nil {
  350. err = errors.New("新增活动音频失败")
  351. return
  352. }
  353. }
  354. }
  355. // 6.新增活动关联权限-源数据权限仅一个
  356. activityPermission := &yb_activity_permission.YbActivityPermission{
  357. ActivityID: uint32(activityId),
  358. PermissionID: uint32(item.ReportPermissionID),
  359. PermissionName: chartPermissionIdNameMap[item.ReportPermissionID],
  360. CreateTime: nowTime,
  361. }
  362. activityPermissionCreate := tx.Debug().Create(activityPermission)
  363. if activityPermissionCreate.Error != nil {
  364. err = errors.New("新增活动权限失败")
  365. return
  366. }
  367. countSuccess += 1
  368. }
  369. return
  370. }