RepalRemindReadInfoServiceImpl.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package com.winhc.repal.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.map.MapUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.winhc.repal.entity.RepalRemindHistory;
  7. import com.winhc.repal.entity.RepalRemindReadInfo;
  8. import com.winhc.repal.enums.Dict;
  9. import com.winhc.repal.enums.RemindEnum;
  10. import com.winhc.repal.model.bo.BillRemindBO;
  11. import com.winhc.repal.model.bo.BookDynamicCountBO;
  12. import com.winhc.repal.model.bo.UserBillUnreadInfoBO;
  13. import com.winhc.repal.repository.RepalRemindReadInfoMapper;
  14. import com.winhc.repal.service.RepalRemindHistoryService;
  15. import com.winhc.repal.service.RepalRemindReadInfoService;
  16. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  17. import com.winhc.repal.util.RedisUtil;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import java.time.LocalDateTime;
  22. import java.time.temporal.ChronoUnit;
  23. import java.util.*;
  24. import java.util.concurrent.TimeUnit;
  25. /**
  26. * @description RepalRemindReadInfo 接口实现类
  27. * @author Generator
  28. * @date 2022-04-27
  29. */
  30. @Service
  31. @Slf4j
  32. public class RepalRemindReadInfoServiceImpl extends ServiceImpl<RepalRemindReadInfoMapper, RepalRemindReadInfo> implements RepalRemindReadInfoService {
  33. @Autowired
  34. private RepalRemindHistoryService repalRemindHistoryService;
  35. @Autowired
  36. private RedisUtil redisUtil;
  37. private static final String MESSAGE_PRIFIX = "winhc:repal:read_";
  38. /**
  39. * 查询账款已读情况,没数据则插入一条全部已读
  40. * @param userId
  41. * @param repalBillId
  42. * @param repalBookId
  43. * @return
  44. */
  45. @Override
  46. public RepalRemindReadInfo getReadInfoByUserId(Long userId,Long repalBillId,Long repalBookId) {
  47. RepalRemindReadInfo repalRemindReadInfo = getOne(Wrappers.lambdaQuery(RepalRemindReadInfo.class)
  48. .eq(RepalRemindReadInfo::getUserId,userId)
  49. .eq(RepalRemindReadInfo::getRepalBillId,repalBillId)
  50. .eq(RepalRemindReadInfo::getRepalBookId,repalBookId),false);
  51. if(ObjectUtil.isNotNull(repalRemindReadInfo)){
  52. return repalRemindReadInfo;
  53. }
  54. repalRemindReadInfo = new RepalRemindReadInfo().setUserId(userId).setRepalBillId(repalBillId).setRepalBookId(repalBookId)
  55. .setRankRemindId(0L).setRiskRemindId(0L).setFinanceRemindId(0L).setOverdueRemindId(0L);
  56. RepalRemindHistory overDue = repalRemindHistoryService.getOne(Wrappers.lambdaQuery(RepalRemindHistory.class)
  57. .eq(RepalRemindHistory::getRepalBillId,repalBillId)
  58. .eq(RepalRemindHistory::getTrentType, RemindEnum.逾期提醒.getCode())
  59. .orderByDesc(RepalRemindHistory::getId)
  60. .last(" LIMIT 1 "),false);
  61. if(ObjectUtil.isNotNull(overDue)){
  62. repalRemindReadInfo.setOverdueRemindId(overDue.getId());
  63. }
  64. RepalRemindHistory rank = repalRemindHistoryService.getOne(Wrappers.lambdaQuery(RepalRemindHistory.class)
  65. .eq(RepalRemindHistory::getRepalBillId,repalBillId)
  66. .eq(RepalRemindHistory::getTrentType, RemindEnum.账款评级.getCode())
  67. .orderByDesc(RepalRemindHistory::getId)
  68. .last(" LIMIT 1 "),false);
  69. if(ObjectUtil.isNotNull(rank)){
  70. repalRemindReadInfo.setRankRemindId(rank.getId());
  71. }
  72. RepalRemindHistory finance = repalRemindHistoryService.getOne(Wrappers.lambdaQuery(RepalRemindHistory.class)
  73. .eq(RepalRemindHistory::getRepalBillId,repalBillId)
  74. .eq(RepalRemindHistory::getTrentType, RemindEnum.财产线索.getCode())
  75. .orderByDesc(RepalRemindHistory::getId)
  76. .last(" LIMIT 1 "),false);
  77. if(ObjectUtil.isNotNull(finance)){
  78. repalRemindReadInfo.setFinanceRemindId(finance.getId());
  79. }
  80. RepalRemindHistory risk = repalRemindHistoryService.getOne(Wrappers.lambdaQuery(RepalRemindHistory.class)
  81. .eq(RepalRemindHistory::getRepalBillId,repalBillId)
  82. .eq(RepalRemindHistory::getTrentType, RemindEnum.风险预警.getCode())
  83. .orderByDesc(RepalRemindHistory::getId)
  84. .last(" LIMIT 1 "),false);
  85. if(ObjectUtil.isNotNull(risk)){
  86. repalRemindReadInfo.setRiskRemindId(risk.getId());
  87. }
  88. save(repalRemindReadInfo);
  89. return repalRemindReadInfo;
  90. }
  91. /**
  92. * 根据类型更新已读状态
  93. * 风险预警 逾期动态 财产提醒 由于是每天跑调度,一天更新一次即可
  94. * 评级变更 10s更新一次
  95. * @param userId
  96. * @param remindType
  97. */
  98. @Override
  99. public void updateReadInfoByUserId(Long userId, String remindType,Long repalBillId,Long repalBookId) {
  100. String redisKey = MESSAGE_PRIFIX+userId+"_"+remindType+"_"+repalBookId+"_"+repalBillId;
  101. if(redisUtil.get(redisKey) != null){
  102. return;
  103. }
  104. RepalRemindReadInfo repalRemindReadInfo = getReadInfoByUserId(userId,repalBillId,repalBookId);
  105. RepalRemindHistory repalRemindHistory = repalRemindHistoryService.getOne(Wrappers.lambdaQuery(RepalRemindHistory.class)
  106. .eq(RepalRemindHistory::getRepalBillId,repalBillId)
  107. .eq(RepalRemindHistory::getRemindType, remindType)
  108. .orderByDesc(RepalRemindHistory::getId)
  109. .last(" LIMIT 1 "),false);
  110. if(ObjectUtil.isNotNull(repalRemindHistory)){
  111. if(RemindEnum.账款评级.getCode().equals(remindType)){
  112. repalRemindReadInfo.setRankRemindId(repalRemindHistory.getId());
  113. updateById(repalRemindReadInfo);
  114. redisUtil.setEx(redisKey,"1",10, TimeUnit.SECONDS);
  115. }else if(RemindEnum.风险预警.getCode().equals(remindType)){
  116. repalRemindReadInfo.setRiskRemindId(repalRemindHistory.getId());
  117. updateById(repalRemindReadInfo);
  118. redisUtil.setEx(redisKey,"1",calTTL(), TimeUnit.MILLISECONDS);
  119. }else if(RemindEnum.财产线索.getCode().equals(remindType)){
  120. repalRemindReadInfo.setFinanceRemindId(repalRemindHistory.getId());
  121. updateById(repalRemindReadInfo);
  122. redisUtil.setEx(redisKey,"1",calTTL(), TimeUnit.MILLISECONDS);
  123. }else if(RemindEnum.逾期提醒.getCode().equals(remindType)){
  124. repalRemindReadInfo.setOverdueRemindId(repalRemindHistory.getId());
  125. updateById(repalRemindReadInfo);
  126. redisUtil.setEx(redisKey,"1",calTTL(), TimeUnit.MILLISECONDS);
  127. }
  128. }
  129. }
  130. /**
  131. * 计算当天剩余的毫秒时间
  132. * @return
  133. */
  134. private Long calTTL(){
  135. LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
  136. return ChronoUnit.MILLIS.between(LocalDateTime.now(),midnight);
  137. }
  138. @Override
  139. public List<UserBillUnreadInfoBO> getUserBillUnreadInfo(Long userId, List<Long> repalBillIdList) {
  140. if (CollUtil.isEmpty(repalBillIdList)) {
  141. return new ArrayList<>();
  142. }
  143. List<RepalRemindReadInfo> readInfoList = this.list(Wrappers.lambdaQuery(RepalRemindReadInfo.class).eq(RepalRemindReadInfo::getUserId, userId)
  144. .in(RepalRemindReadInfo::getRepalBillId, repalBillIdList));
  145. if (CollUtil.isEmpty(readInfoList)) {
  146. return new ArrayList<>();
  147. }
  148. Map<Long, List<BillRemindBO>> remindMap = repalRemindHistoryService.getRepalBillLastRemind(repalBillIdList);
  149. if (MapUtil.isEmpty(remindMap)) {
  150. return new ArrayList<>();
  151. }
  152. List<UserBillUnreadInfoBO> unreadInfoList = new ArrayList<>();
  153. readInfoList.forEach(readInfo -> {
  154. List<BillRemindBO> remindBOList = remindMap.get(readInfo.getRepalBillId());
  155. if (CollUtil.isNotEmpty(remindBOList)) {
  156. UserBillUnreadInfoBO unreadInfo = new UserBillUnreadInfoBO();
  157. unreadInfo.setRepalBillId(readInfo.getRepalBillId());
  158. unreadInfo.setUnreadFinanceCount(getRemindTypeUnread(readInfo.getId(), remindBOList, RemindEnum.财产线索.getCode()));
  159. unreadInfo.setUnreadRankCount(getRemindTypeUnread(readInfo.getId(), remindBOList, RemindEnum.账款评级.getCode()));
  160. unreadInfo.setUnreadOverdueCount(getRemindTypeUnread(readInfo.getId(), remindBOList, RemindEnum.逾期提醒.getCode()));
  161. unreadInfo.setUnreadRiskCount(getRemindTypeUnread(readInfo.getId(), remindBOList, RemindEnum.风险预警.getCode()));
  162. unreadInfoList.add(unreadInfo);
  163. }
  164. });
  165. return unreadInfoList;
  166. }
  167. /**
  168. * 计算未读数量
  169. * @param currentId currentId
  170. * @param billRemindBOList billRemindBOList
  171. * @param remindType remindType
  172. * @return java.lang.Integer
  173. * @author xda
  174. * @date 2022/4/30 14:31
  175. */
  176. public Integer getRemindTypeUnread(Long currentId, List<BillRemindBO> billRemindBOList, String remindType) {
  177. if (Objects.isNull(currentId)) {
  178. return 0;
  179. }
  180. Optional<BillRemindBO> first = billRemindBOList.stream().filter(t -> remindType.equals(t.getRemindType())).findFirst();
  181. return first.map(billRemindBO -> (int) (billRemindBO.getRepalRemindHistoryId() - currentId)).orElse(0);
  182. }
  183. }