activity.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. package activity
  2. import (
  3. "errors"
  4. "fmt"
  5. "gorm.io/gorm"
  6. "hongze/hongze_yb/global"
  7. "hongze/hongze_yb/models/response"
  8. "hongze/hongze_yb/models/response/purchase"
  9. "hongze/hongze_yb/models/tables/company_product"
  10. "hongze/hongze_yb/models/tables/rddp/report"
  11. "hongze/hongze_yb/models/tables/research_report"
  12. "hongze/hongze_yb/models/tables/yb_activity"
  13. "hongze/hongze_yb/models/tables/yb_activity_permission"
  14. "hongze/hongze_yb/models/tables/yb_activity_register"
  15. "hongze/hongze_yb/models/tables/yb_activity_remind"
  16. "hongze/hongze_yb/models/tables/yb_activity_voice"
  17. "hongze/hongze_yb/services/company"
  18. "hongze/hongze_yb/services/user"
  19. "hongze/hongze_yb/utils"
  20. "log"
  21. "strings"
  22. "time"
  23. )
  24. // ActivityList 活动列表
  25. type ActivityList struct {
  26. yb_activity.ActivityItem // 活动信息
  27. VoiceList []*yb_activity_voice.YbActivityVoice // 音频列表
  28. }
  29. // PageList 活动分页列表
  30. func PageList(condition string, pars []interface{}, page, limit int, order string, userInfo user.UserInfo) (list []ActivityList, err error) {
  31. activities, err := yb_activity.GetPageListByWhere(condition, pars, page, limit, order, int(userInfo.UserID))
  32. if err != nil {
  33. log.Print(err.Error())
  34. return
  35. }
  36. if activities != nil {
  37. var activityIds []int
  38. for _, item := range activities {
  39. activityIds = append(activityIds, item.ActivityID)
  40. }
  41. // 录音
  42. voices, queryErr := yb_activity_voice.GetVoicesByActivityIds(activityIds)
  43. if queryErr != nil {
  44. log.Print(queryErr.Error())
  45. return
  46. }
  47. // 提醒
  48. reminds, queryErr := yb_activity_remind.GetRemindsByUserIdAndActivityIds(int(userInfo.UserID), activityIds)
  49. if queryErr != nil {
  50. log.Print(queryErr.Error())
  51. return
  52. }
  53. remindMap := make(map[int]int, 0)
  54. for _, remind := range reminds {
  55. remindMap[remind.ActivityId] = 1
  56. }
  57. // 报名
  58. registers, queryErr := yb_activity_register.GetRegistersByUserIdAndActivityIds(int(userInfo.UserID), activityIds)
  59. if queryErr != nil {
  60. log.Print(queryErr.Error())
  61. return
  62. }
  63. registerMap := make(map[int]int, 0)
  64. for _, register := range registers {
  65. if register.RegisterState == 1 {
  66. registerMap[register.ActivityId] = 1
  67. }
  68. }
  69. var temp ActivityList
  70. for _, activity := range activities {
  71. temp.ActivityItem = activity
  72. temp.WeekString = utils.StrDateTimeToWeek(activity.StartTime.Weekday().String())
  73. temp.ActivityState = getActivityStateByTime(activity.StartTime, activity.EndTime)
  74. // 音频列表
  75. var voiceMap []*yb_activity_voice.YbActivityVoice
  76. for _, voice := range voices {
  77. if temp.ActivityID == int(voice.ActivityID) {
  78. voiceMap = append(voiceMap, voice)
  79. temp.HasPlayBack = 1 // 有回放
  80. }
  81. }
  82. temp.VoiceList = voiceMap
  83. // 是否有提醒
  84. _, ok := remindMap[temp.ActivityID]
  85. if ok {
  86. temp.HasRemind = 1
  87. }
  88. // 是否已报名
  89. _, ok = registerMap[temp.ActivityID]
  90. if ok {
  91. temp.RegisterState = 1
  92. }
  93. list = append(list, temp)
  94. }
  95. }
  96. return
  97. }
  98. // getActivityStateByTime 根据时间生成活动枚举值
  99. func getActivityStateByTime(startTime, endTime time.Time) (state int) {
  100. nowTime := time.Now().Format(utils.FormatDateTime)
  101. timeNow, _ := time.ParseInLocation(utils.FormatDateTime, nowTime, time.Local)
  102. if timeNow.Before(endTime) && timeNow.After(startTime) {
  103. // 进行中
  104. state = 2
  105. } else if timeNow.After(endTime) {
  106. // 已结束
  107. state = 3
  108. } else if timeNow.Before(startTime) {
  109. // 未开始
  110. state = 1
  111. }
  112. return
  113. }
  114. // GetActivityDetail 活动详情
  115. func GetActivityDetail(activityId, userId int) (detail *yb_activity.ActivityDetail, err error) {
  116. detail, err = yb_activity.GetDetailById(activityId)
  117. if err != nil {
  118. if err == gorm.ErrRecordNotFound {
  119. return
  120. }
  121. }
  122. if detail == nil {
  123. return
  124. }
  125. registeredNum, err := yb_activity_register.CountRegistedNumByActivityId(activityId)
  126. if err != nil {
  127. log.Print(err.Error())
  128. return
  129. }
  130. detail.RegisteredNum = int(registeredNum)
  131. detail.WeekString = utils.StrDateTimeToWeek(detail.StartTime.Weekday().String())
  132. detail.ActivityState = getActivityStateByTime(detail.StartTime, detail.EndTime)
  133. _, remindErr := yb_activity_remind.RemindExist(userId, activityId)
  134. if remindErr != gorm.ErrRecordNotFound {
  135. detail.HasRemind = 1
  136. }
  137. _, registerErr := yb_activity_register.RegisterExist(userId, activityId)
  138. if registerErr != gorm.ErrRecordNotFound {
  139. detail.RegisterState = 1
  140. }
  141. // 判断报告链接对应的报告发布状态,若为未发布则报告链接置空
  142. if detail.ReportId > 0 && detail.ReportLink != "" {
  143. if detail.IsNewReport == 1 {
  144. // 去新报告表中查询
  145. newReport, e := report.GetByReportId(detail.ReportId)
  146. if e != nil {
  147. err = errors.New("获取新报告详情失败, Err: " + e.Error())
  148. return
  149. }
  150. if newReport.State != 2 {
  151. detail.ReportLink = ""
  152. }
  153. } else {
  154. // 查询老报告表
  155. oldReport, e := research_report.GetByResearchReportId(uint64(detail.ReportId))
  156. if e != nil {
  157. err = errors.New("获取老报告详情失败, Err: " + e.Error())
  158. return
  159. }
  160. if oldReport.Status != "report" {
  161. detail.ReportLink = ""
  162. }
  163. }
  164. }
  165. return
  166. }
  167. // CheckActivityPermission 验证用户的活动参与权限
  168. func CheckActivityPermission(userInfo user.UserInfo, activityId int) (ok bool, permissionCheckInfo company.PermissionCheckInfo, err error) {
  169. companyId := userInfo.CompanyID
  170. activity, err := yb_activity.GetOneById(activityId)
  171. if err != nil {
  172. if err == gorm.ErrRecordNotFound {
  173. return
  174. }
  175. }
  176. if activity == nil {
  177. return
  178. }
  179. // 查询活动权限集合
  180. permissions, err := yb_activity_permission.GetPermissionsByActivityId(activityId)
  181. if err != nil {
  182. return
  183. }
  184. var permissionIds []int
  185. for _, item := range permissions {
  186. pid := int(item.PermissionID)
  187. permissionIds = append(permissionIds, pid)
  188. }
  189. ok, permissionCheckInfo, err = company.CheckPermissionByPermissionIdList2Ficc(companyId, int(userInfo.UserID), permissionIds)
  190. return
  191. }
  192. // GetUserAuthActivityIds 获取用户有权限参与的活动Ids
  193. func GetUserAuthActivityIds(userInfo user.UserInfo) (acrivityIds []int, err error) {
  194. productId := 1
  195. // 查询用户产品状态是否正常
  196. companyProduct, err := company_product.GetByCompany2ProductId(userInfo.CompanyID, int64(productId))
  197. if err != nil {
  198. return
  199. }
  200. statusMatch := "正式,试用,永续"
  201. if !strings.Contains(statusMatch, companyProduct.Status) || companyProduct.IsSuspend == 1 {
  202. acrivityIds = append(acrivityIds, 0)
  203. return
  204. }
  205. // 获取用户有效权限
  206. validPermissionIdList, err := company.GetValidPermissionIdListByCompany2ProductId(userInfo.CompanyID, int64(productId))
  207. if err != nil {
  208. return
  209. }
  210. // 获取用户权限可参与的活动ID
  211. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(validPermissionIdList)
  212. if err != nil {
  213. return
  214. }
  215. for _, v := range permissions {
  216. acrivityIds = append(acrivityIds, int(v.ActivityID))
  217. }
  218. return
  219. }
  220. // GetLatestActivity 从用户有权限参与的活动中,筛选出最新的活动
  221. func GetLatestActivity(permissionIds []int, userId uint64) (purchaseItem *purchase.PurchaseListItem, err error) {
  222. var errMsg string
  223. defer func() {
  224. if sysErr := recover(); sysErr != nil {
  225. err = errors.New("系统错误")
  226. global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s,sysErr:%s", userId, err.Error(), sysErr))
  227. }
  228. if err != nil {
  229. global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
  230. }
  231. }()
  232. // 获取用户权限可参与的活动ID
  233. var activityIds []int
  234. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(permissionIds)
  235. if err != nil {
  236. return
  237. }
  238. for _, v := range permissions {
  239. activityIds = append(activityIds, int(v.ActivityID))
  240. }
  241. activityItem, err := yb_activity.GetLatestByIds(activityIds)
  242. if err != nil {
  243. errMsg = err.Error()
  244. err = errors.New("查询活动错误")
  245. return
  246. }
  247. //统计未读数
  248. unRead, err := GetUnRead(activityIds, userId)
  249. if err != nil {
  250. errMsg = err.Error()
  251. err = errors.New("查询活动未读数错误")
  252. return
  253. }
  254. purchaseItem = new(purchase.PurchaseListItem)
  255. if activityItem.ActivityID > 0 {
  256. purchaseItem.ActivityId = activityItem.ActivityID
  257. purchaseItem.Title = activityItem.ActivityName
  258. purchaseItem.Content = fmt.Sprintf("主讲:%s", activityItem.Speaker)
  259. purchaseItem.Time = activityItem.ModifyTime
  260. purchaseItem.Unread = unRead
  261. // 添加活动icon
  262. purchaseItem.ImgUrl = utils.ALIYUN_YBIMG_HOST + "purchase_icon_xj_two_week.png"
  263. }
  264. return
  265. }
  266. // GetList 从用户有权限参与的活动中,筛选出最新的活动
  267. func GetPurchaseDetail(permissionIds []int, userId uint64, pageIndex, pageSize int) (ret *purchase.DetailResp, err error) {
  268. // 获取用户权限可参与的活动ID
  269. var activityIds []int
  270. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(permissionIds)
  271. if err != nil {
  272. return
  273. }
  274. for _, v := range permissions {
  275. activityIds = append(activityIds, int(v.ActivityID))
  276. }
  277. offset := (pageIndex - 1) * pageSize
  278. activityList, err := yb_activity.GetListByIds(activityIds, offset, pageSize)
  279. if err != nil {
  280. return
  281. }
  282. total, err := yb_activity.GetListCountByIds(activityIds)
  283. if err != nil {
  284. return
  285. }
  286. var WeekDayMap = map[string]string{
  287. "Monday": "周一",
  288. "Tuesday": "周二",
  289. "Wednesday": "周三",
  290. "Thursday": "周四",
  291. "Friday": "周五",
  292. "Saturday": "周六",
  293. "Sunday": "周日",
  294. }
  295. ret = new(purchase.DetailResp)
  296. var list []*purchase.Detail
  297. for _, item := range activityList {
  298. temp := new(purchase.Detail)
  299. temp.ActivityId = item.ActivityID
  300. temp.Title = fmt.Sprintf("主讲:%s", item.Speaker)
  301. // 时间处理
  302. activityDate := item.StartTime.Format("2006-01-02")
  303. activityStart := item.StartTime.Format("15:04")
  304. activityEnd := item.EndTime.Format("15:04")
  305. activityWeek := item.StartTime.Weekday().String()
  306. weekStr := WeekDayMap[activityWeek]
  307. timeStr := activityDate + " " + activityStart + "-" + activityEnd + " " + weekStr
  308. temp.Content = fmt.Sprintf("活动时间:%s", timeStr)
  309. temp.Time = item.ModifyTime
  310. temp.TopName = item.ActivityName
  311. temp.ImgUrl = utils.ALIYUN_YBIMG_HOST + "purchase_bg_activity.png"
  312. list = append(list, temp)
  313. }
  314. ret.List = list
  315. ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
  316. num, tErr := BatchInsertActivityView(activityIds, userId)
  317. log.Printf("新增活动浏览记录:%d", num)
  318. if tErr != nil {
  319. err = tErr
  320. return
  321. }
  322. return
  323. }