activity.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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/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_voice"
  15. "hongze/hongze_yb/services/company"
  16. "hongze/hongze_yb/services/user"
  17. "hongze/hongze_yb/utils"
  18. "log"
  19. "strings"
  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. productId := 1
  169. // 查询用户产品状态是否正常
  170. companyProduct, err := company_product.GetByCompany2ProductId(userInfo.CompanyID, int64(productId))
  171. if err != nil {
  172. return
  173. }
  174. statusMatch := "正式,试用,永续"
  175. if !strings.Contains(statusMatch, companyProduct.Status) || companyProduct.IsSuspend == 1 {
  176. acrivityIds = append(acrivityIds, 0)
  177. return
  178. }
  179. // 获取用户有效权限
  180. validPermissionIdList, err := company.GetValidPermissionIdListByCompany2ProductId(userInfo.CompanyID, int64(productId))
  181. if err != nil {
  182. return
  183. }
  184. // 获取用户权限可参与的活动ID
  185. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(validPermissionIdList)
  186. if err != nil {
  187. return
  188. }
  189. for _, v := range permissions {
  190. acrivityIds = append(acrivityIds, int(v.ActivityID))
  191. }
  192. return
  193. }
  194. // GetLatestActivity 从用户有权限参与的活动中,筛选出最新的活动
  195. func GetLatestActivity(permissionIds []int, userId uint64) (purchaseItem *purchase.PurchaseListItem, err error) {
  196. var errMsg string
  197. defer func() {
  198. if sysErr := recover(); sysErr != nil {
  199. err = errors.New("系统错误")
  200. global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s,sysErr:%s", userId, err.Error(), sysErr))
  201. }
  202. if err != nil {
  203. global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
  204. }
  205. }()
  206. // 获取用户权限可参与的活动ID
  207. var activityIds []int
  208. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(permissionIds)
  209. if err != nil {
  210. return
  211. }
  212. for _, v := range permissions {
  213. activityIds = append(activityIds, int(v.ActivityID))
  214. }
  215. activityItem, err := yb_activity.GetLatestByIds(activityIds)
  216. if err != nil {
  217. errMsg = err.Error()
  218. err = errors.New("查询活动错误")
  219. return
  220. }
  221. //统计未读数
  222. unRead, err := GetUnRead(activityIds, userId)
  223. if err != nil{
  224. errMsg = err.Error()
  225. err = errors.New("查询活动未读数错误")
  226. return
  227. }
  228. purchaseItem = new(purchase.PurchaseListItem)
  229. if activityItem.ActivityID > 0 {
  230. purchaseItem.ActivityId = activityItem.ActivityID
  231. purchaseItem.Title = activityItem.ActivityName
  232. purchaseItem.Content = fmt.Sprintf("主讲:%s", activityItem.Speaker)
  233. purchaseItem.Time = activityItem.ModifyTime
  234. purchaseItem.Unread = unRead
  235. // 添加活动icon
  236. purchaseItem.ImgUrl = utils.ALIYUN_YBIMG_HOST + "purchase_icon_xj_two_week.png"
  237. }
  238. return
  239. }
  240. // GetList 从用户有权限参与的活动中,筛选出最新的活动
  241. func GetPurchaseDetail(permissionIds []int, userId uint64, pageIndex, pageSize int) (ret *purchase.DetailResp, err error) {
  242. // 获取用户权限可参与的活动ID
  243. var activityIds []int
  244. permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(permissionIds)
  245. if err != nil {
  246. return
  247. }
  248. for _, v := range permissions {
  249. activityIds = append(activityIds, int(v.ActivityID))
  250. }
  251. offset := (pageIndex - 1) * pageSize
  252. activityList, err := yb_activity.GetListByIds(activityIds, offset, pageSize)
  253. if err != nil {
  254. return
  255. }
  256. total, err := yb_activity.GetListCountByIds(activityIds)
  257. if err != nil {
  258. return
  259. }
  260. var WeekDayMap = map[string]string{
  261. "Monday": "周一",
  262. "Tuesday": "周二",
  263. "Wednesday": "周三",
  264. "Thursday": "周四",
  265. "Friday": "周五",
  266. "Saturday": "周六",
  267. "Sunday": "周日",
  268. }
  269. ret = new(purchase.DetailResp)
  270. var list []*purchase.Detail
  271. for _, item := range activityList {
  272. temp := new(purchase.Detail)
  273. temp.ActivityId = item.ActivityID
  274. temp.Title = fmt.Sprintf("主讲:%s", item.Speaker)
  275. // 时间处理
  276. activityDate := item.StartTime.Format("2006-01-02")
  277. activityStart := item.StartTime.Format("15:04")
  278. activityEnd := item.EndTime.Format("15:04")
  279. activityWeek := item.StartTime.Weekday().String()
  280. weekStr := WeekDayMap[activityWeek]
  281. timeStr := activityDate + " " + activityStart + "-" + activityEnd + " " + weekStr
  282. temp.Content = fmt.Sprintf("活动时间:%s", timeStr)
  283. temp.Time = item.ModifyTime
  284. temp.TopName = item.ActivityName
  285. temp.ImgUrl = utils.ALIYUN_YBIMG_HOST + "purchase_bg_activity.png"
  286. list = append(list, temp)
  287. }
  288. ret.List = list
  289. ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
  290. num, tErr := BatchInsertActivityView(activityIds, userId)
  291. log.Printf("新增活动浏览记录:%d", num)
  292. if tErr != nil {
  293. err = tErr
  294. return
  295. }
  296. return
  297. }