DataCountService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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.google.common.collect.Lists;
  12. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  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. LambdaQueryWrapper<RoomVisitLog> wrapper2 = new LambdaQueryWrapper<>();
  45. if(roomIds.size() >0){
  46. wrapper2.in(RoomVisitLog::getRoomId,roomIds);
  47. }
  48. Long visitCount = roomVisitLogService.count(wrapper2);
  49. LambdaQueryWrapper<RoomShareLog> wrapper3 = new LambdaQueryWrapper<>();
  50. if(roomIds.size() >0){
  51. wrapper3.in(RoomShareLog::getRoomId,roomIds);
  52. }
  53. Long shareCount = roomShareLogService.count(wrapper3);
  54. RoomData roomData = new RoomData();
  55. roomData.setRoomCount(roomCount);
  56. roomData.setVisitManCount(visitManCount);
  57. roomData.setVisitCount(visitCount);
  58. roomData.setShareCount(shareCount);
  59. return roomData;
  60. }
  61. public Object takeLookTop5(String token) {
  62. List<Room> roomList = roomService.getRoomByToken(token);
  63. List<String> roomIds = roomList.stream().map(Room::getRoomId).collect(Collectors.toList());
  64. TakeLookTop5 takeLookTop5 = new TakeLookTop5();
  65. if(roomIds.size() <=0){
  66. return takeLookTop5;
  67. }
  68. List<DataCount> takeLookList = new ArrayList<>();
  69. for (Room room : roomList) {
  70. if(takeLookList.size() >= 5){
  71. continue;
  72. }
  73. DataCount dataCount = new DataCount();
  74. dataCount.setDataKey(room.getRoomTitle());
  75. dataCount.setDataCount(Long.valueOf(room.getRoomViewCount()));
  76. takeLookList.add(dataCount);
  77. }
  78. List<DataCount> danmakuList = roomDanmakuService.getDataCountTop5(roomIds);
  79. takeLookTop5.setTakeLookList(takeLookList);
  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 Object 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::getRoomId,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. List<DataCount> roomShareList = roomShareLogService.getGroupByRoomId();
  192. HashMap<String,Long> roomShareMap = new HashMap<>();
  193. roomShareList.forEach(entity -> roomShareMap.put(entity.getDataKey(),entity.getDataCount()));
  194. for (Room record : page.getRecords()) {
  195. List<RoomNum> roomNums = numRoomMap.get(record.getRoomId());
  196. List<String> sceneTileList = new ArrayList<>();
  197. if(roomNums !=null){
  198. roomNums.forEach(entity -> {
  199. SceneVo sceneVo = sceneMap.get(entity.getNum());
  200. if(sceneVo != null){
  201. sceneTileList.add(sceneVo.getTitle());
  202. }
  203. });
  204. }
  205. List<RoomUser> roomUserList = roomUserService.getByRoomId(record.getRoomId());
  206. Long minute = Dateutils.getLongTime(record.getUseStartTime(), record.getUseEndTime(),DateUnit.MINUTE);
  207. for (RoomUser roomUser : roomUserList) {
  208. minute += Dateutils.getLongTime(roomUser.getUseStartTime(), roomUser.getUseEndTime(),DateUnit.MINUTE);
  209. }
  210. RoomListDataVo roomListDataVo = new RoomListDataVo();
  211. roomListDataVo.setRoomTitle(record.getRoomTitle());
  212. roomListDataVo.setSceneNameList(sceneTileList);
  213. roomListDataVo.setCreateTime(record.getCreateTime());
  214. roomListDataVo.setRoomStatus(record.getRoomStatus());
  215. roomListDataVo.setLookTime(minute);
  216. roomListDataVo.setLookManCount(roomManMap.get(record.getRoomId()) == null ? 0L:roomManMap.get(record.getRoomId()) );
  217. roomListDataVo.setShareCount(roomShareMap.get(record.getRoomId()) == null ? 0L:roomShareMap.get(record.getRoomId()) );
  218. voList.add(roomListDataVo);
  219. }
  220. Page<RoomListDataVo> pageVo = new Page<>(pageNum,pageSize);
  221. pageVo.setRecords(voList);
  222. pageVo.setTotal(page.getTotal());
  223. return PageInfo.PageInfo(pageVo);
  224. }
  225. public Object roomMsgList(String token ,String roomTitle, String startTime, String endTime, Integer pageNum, Integer pageSize) {
  226. List<Room> roomList = roomService.getRoomByToken(token);
  227. List<String> roomIdsDb = roomList.stream().map(Room::getRoomId).collect(Collectors.toList());
  228. List<String> roomIds = roomIdsDb;
  229. if(StringUtils.isNotBlank(roomTitle)){
  230. List<Room> roomListLike = roomService.getLikeTitle(roomTitle);
  231. if(roomList.size() >0){
  232. List<String> roomIds2 = roomListLike.stream().map(Room::getRoomId).collect(Collectors.toList());
  233. roomIds = roomIdsDb.stream().filter(roomIds2::contains).collect(Collectors.toList());
  234. }
  235. }
  236. if(roomIds.isEmpty()){
  237. return PageInfo.PageInfo(new Page<>(pageNum,pageSize));
  238. }
  239. startTime = Dateutils.formatStartTime(startTime);
  240. endTime = Dateutils.formatEndTime(endTime);
  241. Page<UserMsgVo> page = roomDanmakuService.pageList(new Page<>(pageNum,pageSize) ,roomIds,startTime,endTime);
  242. HashMap<String,List<RoomVisitLog>> roomVisitLogsMap = new HashMap<>();
  243. HashMap<String,List<RoomDanmaku>> danmakusMap = new HashMap<>();
  244. for (UserMsgVo record : page.getRecords()) {
  245. List<RoomVisitLog> roomVisitLogs = roomVisitLogsMap.get(record.getRoomId());
  246. if(roomVisitLogs == null){
  247. roomVisitLogs = roomVisitLogService.getByRoomId(record.getRoomId());
  248. roomVisitLogsMap.put(record.getRoomId(),roomVisitLogs);
  249. }
  250. Long time = 0L;
  251. Date firstOutTime = null;
  252. Date endOutTime = null;
  253. for (RoomVisitLog roomVisitLog : roomVisitLogs) {
  254. if(roomVisitLog.getOutRoomTime() == null || roomVisitLog.getInRoomTime() == null){
  255. continue;
  256. }
  257. if(firstOutTime == null){
  258. firstOutTime = roomVisitLog.getInRoomTime();
  259. }else {
  260. firstOutTime = firstOutTime.getTime() <= roomVisitLog.getInRoomTime().getTime() ? firstOutTime : roomVisitLog.getInRoomTime();
  261. }
  262. if(endOutTime == null){
  263. endOutTime = roomVisitLog.getOutRoomTime();
  264. }else {
  265. endOutTime = endOutTime.getTime() >= roomVisitLog.getOutRoomTime().getTime() ? endOutTime : roomVisitLog.getOutRoomTime();
  266. }
  267. time += (roomVisitLog.getOutRoomTime().getTime() - roomVisitLog.getInRoomTime().getTime());
  268. }
  269. List<RoomDanmaku> danmakus = danmakusMap.get(record.getRoomId()+record.getWxUserId());
  270. if(danmakus == null){
  271. danmakus = roomDanmakuService.getByRoomId(record.getRoomId(),record.getWxUserId());
  272. danmakusMap.put(record.getRoomId()+record.getWxUserId(),danmakus);
  273. }
  274. List<String> collect = danmakus.stream().map(RoomDanmaku::getText).collect(Collectors.toList());
  275. record.setOnlineTime(time/1000/60);
  276. record.setFirstInRoomTime(firstOutTime);
  277. record.setLastOutRoomTime(endOutTime);
  278. record.setTextCount(Long.valueOf(danmakus.size()));
  279. record.setTexts(collect);
  280. }
  281. return PageInfo.PageInfo(page);
  282. }
  283. }