activity.go 11 KB

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