DataCountService.java 15 KB

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