DataCountService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. package com.fdkankan.tk.service;
  2. import cn.hutool.core.date.DateUnit;
  3. import cn.hutool.core.date.DateUtil;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.fdkankan.tk.common.PageInfo;
  6. import com.fdkankan.tk.common.util.JwtUtil;
  7. import com.fdkankan.tk.entity.*;
  8. import com.fdkankan.tk.response.*;
  9. import com.fdkankan.tk.util.DataCountUtil;
  10. import com.fdkankan.tk.util.Dateutils;
  11. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import java.net.URLEncoder;
  16. import java.util.*;
  17. import java.util.stream.Collectors;
  18. @Service
  19. public class DataCountService {
  20. @Autowired
  21. IRoomService roomService;
  22. @Autowired
  23. IRoomVisitLogService roomVisitLogService;
  24. @Autowired
  25. IRoomShareLogService roomShareLogService;
  26. @Autowired
  27. IRoomDanmakuService roomDanmakuService;
  28. @Autowired
  29. IRoomNumService roomNumService;
  30. @Autowired
  31. ISceneService sceneService;
  32. @Autowired
  33. IRoomUserService roomUserService;
  34. @Autowired
  35. IWxUserService wxUserService;
  36. public Object roomData(String token) {
  37. List<Room> roomList = roomService.getRoomByToken(token);
  38. List<String> roomIds = roomList.stream().map(Room::getRoomId).collect(Collectors.toList());
  39. if(roomIds.size() <=0){
  40. return new RoomData();
  41. }
  42. Long roomCount = Long.valueOf(roomList.size());
  43. Long visitManCount = roomVisitLogService.manCount(roomIds);
  44. Integer shareCount = 0 ;
  45. for (Room room : roomList) {
  46. shareCount += room.getShareCount();
  47. }
  48. Integer visitCount = 0 ;
  49. for (Room room : roomList) {
  50. visitCount += room.getRoomViewCount();
  51. }
  52. RoomData roomData = new RoomData();
  53. roomData.setRoomCount(roomCount);
  54. roomData.setVisitManCount(visitManCount);
  55. roomData.setVisitCount(visitCount);
  56. roomData.setShareCount(shareCount);
  57. return roomData;
  58. }
  59. public Object takeLookTop5(String token) {
  60. List<Room> roomList = roomService.getRoomByToken(token);
  61. List<String> roomIds = roomList.stream().map(Room::getRoomId).collect(Collectors.toList());
  62. TakeLookTop5 takeLookTop5 = new TakeLookTop5();
  63. if(roomIds.size() <=0){
  64. return takeLookTop5;
  65. }
  66. List<DataCount> lookList = roomVisitLogService.getDataCountTop5(roomIds);
  67. HashMap<String,Room> roomHashMap = new HashMap<>();
  68. List<String> roomIdList = lookList.stream().map(DataCount::getDataKey).collect(Collectors.toList());
  69. if(roomIdList.size() >0){
  70. List<Room> roomListDb = roomService.listByIds(roomIdList);
  71. roomListDb.forEach(entity-> roomHashMap.put(entity.getRoomId(),entity));
  72. }
  73. for (DataCount dataCount : lookList) {
  74. if(dataCount != null && roomHashMap.get(dataCount.getDataKey()) != null){
  75. dataCount.setDataKey(roomHashMap.get(dataCount.getDataKey()).getRoomTitle());
  76. }
  77. }
  78. List<DataCount> danmakuList = roomDanmakuService.getDataCountTop5(roomIds);
  79. takeLookTop5.setTakeLookList(lookList);
  80. takeLookTop5.setDanmakuList(danmakuList);
  81. return takeLookTop5;
  82. }
  83. public Object onlineTimeCount(String token) {
  84. List<Room> roomList = roomService.getRoomByToken(token);
  85. List<String> roomIds = roomList.stream().map(Room::getRoomId).collect(Collectors.toList());
  86. List<Integer> keys = DataCountUtil.timeShardingRes;
  87. List<DataCount> dataCounts = new ArrayList<>();
  88. for (Integer key : keys) {
  89. Long count = null;
  90. if(roomIds.isEmpty()){
  91. count = 0L;
  92. }else {
  93. count = roomVisitLogService.getCountByTime(key,roomIds);
  94. }
  95. DataCount dataCount = new DataCount();
  96. dataCount.setDataKey(key.toString());
  97. dataCount.setDataCount(count);
  98. dataCounts.add(dataCount);
  99. }
  100. return dataCounts;
  101. }
  102. public Object roomVisitData(String token,String roomTitle, String startTime, String endTime) {
  103. List<Room> roomList = roomService.getRoomByToken(token);
  104. List<String> roomIdsDb = roomList.stream().map(Room::getRoomId).collect(Collectors.toList());
  105. List<String> roomIds = roomIdsDb;
  106. if(StringUtils.isNotBlank(roomTitle)){
  107. List<Room> roomListLike = roomService.getLikeTitle(roomTitle);
  108. if(roomList.size() >0){
  109. List<String> roomIds2 = roomListLike.stream().map(Room::getRoomId).collect(Collectors.toList());
  110. roomIds = roomIdsDb.stream().filter(roomIds2::contains).collect(Collectors.toList());
  111. }
  112. }
  113. RoomVisitData roomVisitData = new RoomVisitData();
  114. if(roomIds.isEmpty()){
  115. return roomVisitData;
  116. }
  117. startTime = Dateutils.formatStartTime(startTime);
  118. endTime = Dateutils.formatEndTime(endTime);
  119. List<DataCount> dbVisitList = roomVisitLogService.getByGroupRoomId("t_room_visit_log",roomIds,startTime,endTime);
  120. List<DataCount> dbVisitListFmt = getDataCountListByList(dbVisitList, startTime, endTime);
  121. List<DataCount> dbSharList = roomVisitLogService.getByGroupRoomId("t_room_share_log",roomIds,startTime,endTime);
  122. List<DataCount> dbSharListFmt = getDataCountListByList(dbSharList, startTime, endTime);
  123. List<DataCount> dbDanmakuList = roomVisitLogService.getByGroupRoomId("t_room_danmaku",roomIds,startTime,endTime);
  124. List<DataCount> dbDanmakuListFmt = getDataCountListByList(dbDanmakuList, startTime, endTime);
  125. List<DataCount> dbDanmakuListD = roomVisitLogService.getByDGroupRoomId("t_room_danmaku",roomIds,startTime,endTime);
  126. List<DataCount> dbDanmakuListFmtD = getDataCountListByList(dbDanmakuListD, startTime, endTime);
  127. roomVisitData.setUserVisitList(dbVisitListFmt);
  128. roomVisitData.setUserShareList(dbSharListFmt);
  129. roomVisitData.setUserMsgManList(dbDanmakuListFmtD);
  130. roomVisitData.setUserMsgCountList(dbDanmakuListFmt);
  131. return roomVisitData;
  132. }
  133. public List<DataCount> getDataCountListByList( List<DataCount> visitList,String startTime,String endTime){
  134. HashMap<String ,DataCount> map = new HashMap<>();
  135. visitList.forEach(entity -> map.put(entity.getDataKey(),entity));
  136. List<String> dates = Dateutils.findDatesStr(Dateutils.getDate(startTime), Dateutils.getDate(endTime),Dateutils.DAY );
  137. List<DataCount> dataCounts = new ArrayList<>();
  138. for (String date : dates) {
  139. DataCount dataCount = map.get(date);
  140. if(dataCount == null){
  141. dataCount = new DataCount();
  142. dataCount.setDataKey(date);
  143. dataCount.setDataCount(0L);
  144. }
  145. dataCounts.add(dataCount);
  146. }
  147. return dataCounts;
  148. }
  149. public Page<RoomListDataVo> roomDataList(String token, String roomTitle, String startTime, String endTime, Integer pageNum, Integer pageSize) {
  150. startTime = Dateutils.formatStartTime(startTime);
  151. endTime = Dateutils.formatEndTime(endTime);
  152. LambdaQueryWrapper<Room> wrapper = new LambdaQueryWrapper<>();
  153. if(StringUtils.isNotBlank(token)){
  154. String userName = JwtUtil.getUserName(token);
  155. wrapper.eq(Room::getRoomUserName,userName);
  156. }
  157. if(StringUtils.isNotBlank(roomTitle)){
  158. wrapper.like(Room::getRoomTitle,roomTitle);
  159. }
  160. if(StringUtils.isNotBlank(startTime)){
  161. wrapper.ge(Room::getCreateTime,startTime);
  162. }
  163. if(StringUtils.isNotBlank(endTime)){
  164. wrapper.le(Room::getCreateTime,endTime);
  165. }
  166. wrapper.orderByDesc(Room::getCreateTime);
  167. List<RoomListDataVo> voList = new ArrayList<>();
  168. Page<Room> page = roomService.page(new Page<>(pageNum, pageSize), wrapper);
  169. List<String> roomIds = page.getRecords().stream().map(Room::getRoomId).collect(Collectors.toList());
  170. List<RoomNum> roomNumList = roomNumService.getListByRoomIds(roomIds);
  171. Set<String> numList = roomNumList.stream().map(RoomNum::getNum).collect(Collectors.toSet());
  172. HashMap<String,List<RoomNum>> numRoomMap = new HashMap<>();
  173. for (RoomNum roomNum : roomNumList) {
  174. if(numRoomMap.get(roomNum.getRoomId()) == null){
  175. List<RoomNum> numList1 = new ArrayList<>();
  176. numList1.add(roomNum);
  177. numRoomMap.put(roomNum.getRoomId(),numList1);
  178. }else {
  179. numRoomMap.get(roomNum.getRoomId()).add(roomNum);
  180. }
  181. }
  182. List<SceneVo> list = new ArrayList<>();
  183. HashMap<String,SceneVo> sceneMap = new HashMap<>();
  184. if(numList.size() >0){
  185. list = sceneService.getListByNumList(new ArrayList<>(numList));
  186. list.forEach(entity -> sceneMap.put(entity.getNum(),entity));
  187. }
  188. // List<DataCount> roomList = roomVisitLogService.getGroupByRoomId();
  189. // HashMap<String,Long> roomManMap = new HashMap<>();
  190. // roomList.forEach(entity -> roomManMap.put(entity.getDataKey(),entity.getDataCount()));
  191. for (Room record : page.getRecords()) {
  192. List<RoomNum> roomNums = numRoomMap.get(record.getRoomId());
  193. List<String> sceneTileList = new ArrayList<>();
  194. if(roomNums !=null){
  195. roomNums.forEach(entity -> {
  196. SceneVo sceneVo = sceneMap.get(entity.getNum());
  197. if(sceneVo != null){
  198. sceneTileList.add(sceneVo.getTitle());
  199. }
  200. });
  201. }
  202. List<RoomVisitLog> roomLives = roomVisitLogService.getByRoomId(record.getRoomId());
  203. Long minute = 0L;
  204. HashMap<Long,Long> dateMap = new HashMap<>();
  205. for (RoomVisitLog roomLive : roomLives) {
  206. Date overTime = roomLive.getOutRoomTime();
  207. if(overTime == null){
  208. continue;
  209. }
  210. if(dateMap.get(overTime.getTime()) == null){
  211. dateMap.put(overTime.getTime(),roomLive.getInRoomTime().getTime());
  212. }else {
  213. if(roomLive.getInRoomTime().getTime() < dateMap.get(overTime.getTime())){
  214. dateMap.put(overTime.getTime(),roomLive.getInRoomTime().getTime());
  215. }
  216. }
  217. }
  218. for (Long key : dateMap.keySet()) {
  219. minute += (key - dateMap.get(key)) /1000/60;
  220. }
  221. RoomListDataVo roomListDataVo = new RoomListDataVo();
  222. roomListDataVo.setRoomTitle(record.getRoomTitle());
  223. roomListDataVo.setSceneNameList(sceneTileList);
  224. roomListDataVo.setCreateTime(record.getCreateTime());
  225. roomListDataVo.setRoomStatus(record.getRoomStatus());
  226. roomListDataVo.setLookTime(minute);
  227. roomListDataVo.setLookManCount(record.getRoomViewCount());
  228. roomListDataVo.setShareCount(record.getShareCount());
  229. voList.add(roomListDataVo);
  230. }
  231. Page<RoomListDataVo> pageVo = new Page<>(pageNum,pageSize);
  232. pageVo.setRecords(voList);
  233. pageVo.setTotal(page.getTotal());
  234. return pageVo;
  235. }
  236. public Page<UserMsgVo> roomMsgList(String token ,String roomTitle, String startTime, String endTime, Integer pageNum, Integer pageSize) {
  237. String userName = JwtUtil.getUserName(token);
  238. startTime = Dateutils.formatStartTime(startTime);
  239. endTime = Dateutils.formatEndTime(endTime);
  240. Page<UserMsgVo> page = roomDanmakuService.pageList(new Page<>(pageNum,pageSize) ,userName,roomTitle,startTime,endTime);
  241. HashMap<String,List<RoomDanmaku>> danmakusMap = new HashMap<>();
  242. for (UserMsgVo record : page.getRecords()) {
  243. List<RoomDanmaku> danmakus = danmakusMap.get(record.getRoomId()+record.getWxUserId());
  244. if(danmakus == null){
  245. danmakus = roomDanmakuService.getByRoomId(record.getRoomId(),record.getWxUserId());
  246. danmakusMap.put(record.getRoomId()+record.getWxUserId(),danmakus);
  247. }
  248. List<String> collect = danmakus.stream().map(RoomDanmaku::getText).collect(Collectors.toList());
  249. if(record.getFirstInRoomTime() != null && record.getLastOutRoomTime()!=null){
  250. Long time = DateUtil.between(record.getFirstInRoomTime(),record.getLastOutRoomTime(),DateUnit.MINUTE);
  251. record.setOnlineTime(time);
  252. }
  253. record.setTextCount(Long.valueOf(danmakus.size()));
  254. record.setTexts(collect);
  255. }
  256. return page;
  257. }
  258. }