RepalRemindHistoryServiceImpl.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. package com.winhc.repal.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.alibaba.fastjson.JSON;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.metadata.IPage;
  8. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.module.login.usersession.UserBean;
  11. import com.winhc.common.enums.CodeMsg;
  12. import com.winhc.common.exception.CommonException;
  13. import com.winhc.common.model.base.VOPage;
  14. import com.winhc.repal.cloud.dto.QueryV8DynamicDTO;
  15. import com.winhc.repal.cloud.vo.V8DynamicVO;
  16. import com.winhc.repal.entity.*;
  17. import com.winhc.repal.enums.*;
  18. import com.winhc.repal.model.bo.BillRemindBO;
  19. import com.winhc.repal.model.bo.BookDynamicCountBO;
  20. import com.winhc.repal.model.cvt.RepalRemindHistoryConvert;
  21. import com.winhc.repal.model.dto.RepalRemindHistoryDTO;
  22. import com.winhc.repal.model.vo.*;
  23. import com.winhc.repal.repository.RepalRemindHistoryMapper;
  24. import com.winhc.repal.service.*;
  25. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  26. import com.winhc.repal.util.RedisUtil;
  27. import com.winhc.repal.util.UserContextUtil;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import java.math.BigDecimal;
  31. import java.time.DayOfWeek;
  32. import java.time.LocalDate;
  33. import java.time.LocalDateTime;
  34. import java.time.ZoneOffset;
  35. import java.time.format.DateTimeFormatter;
  36. import java.time.temporal.ChronoUnit;
  37. import java.util.*;
  38. import java.util.concurrent.TimeUnit;
  39. import java.util.function.Function;
  40. import java.util.stream.Collectors;
  41. /**
  42. * @description RepalRemindHistory 接口实现类
  43. * @author Generator
  44. * @date 2022-04-08
  45. */
  46. @Service
  47. public class RepalRemindHistoryServiceImpl extends ServiceImpl<RepalRemindHistoryMapper, RepalRemindHistory> implements RepalRemindHistoryService {
  48. private static final String MESSAGE_PRIFIX = "winhc:repal:key_";
  49. @Autowired
  50. private RepalRemindDefinitionService repalRemindDefinitionService;
  51. @Autowired
  52. private MessageNoticeService messageNoticeService;
  53. @Autowired
  54. private RedisUtil redisUtil;
  55. @Autowired
  56. private ThirdPartyAccountService thirdPartyAccountService;
  57. @Autowired
  58. private RepalRemindReadInfoService repalRemindReadInfoService;
  59. @Autowired
  60. private RepalRemindHistoryMapper repalRemindHistoryMapper;
  61. @Autowired
  62. private RepalBillService repalBillService;
  63. @Autowired
  64. private RepalBillDiagnosisService repalBillDiagnosisService;
  65. @Autowired
  66. private CompanyService companyService;
  67. @Autowired
  68. private RepalCustomerService repalCustomerService;
  69. @Autowired
  70. private RepalBookService repalBookService;
  71. @Autowired
  72. private RepalRolePermissionService repalRolePermissionService;
  73. @Autowired
  74. private RepalGroupMemberService repalGroupMemberService;
  75. @Override
  76. public RepalBillRemindUnReadVO getRemindUnReadVO(List<RepalBill> repalBills,Long userId, LocalDateTime startTime ,LocalDateTime endTime) {
  77. RepalBillRemindUnReadVO result = new RepalBillRemindUnReadVO(0,0,0,0,0);
  78. for(RepalBill repalBill:repalBills){
  79. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId());
  80. RepalBillRemindUnReadVO readVO = repalRemindHistoryMapper.getRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(),
  81. repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),
  82. repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(),
  83. startTime, endTime);
  84. result.setUnreadRankCount(result.getUnreadRankCount()+readVO.getUnreadRankCount());
  85. result.setUnreadRiskCount(result.getUnreadRiskCount()+readVO.getUnreadRiskCount());
  86. result.setUnreadOverdueCount(result.getUnreadOverdueCount()+readVO.getUnreadOverdueCount());
  87. result.setUnreadFinanceCount(result.getUnreadFinanceCount()+readVO.getUnreadFinanceCount());
  88. }
  89. result.setUnreadTotalCount(result.getUnreadFinanceCount()+result.getUnreadRankCount()+result.getUnreadRiskCount()+result.getUnreadOverdueCount());
  90. return result;
  91. }
  92. @Override
  93. public boolean insertRankRemind(RepalBill repalBill, RepalBillDiagnosis diagnosis) {
  94. if (repalBill.getRepalBillStage() == null) {
  95. return true;
  96. }
  97. LocalDate endDate = repalBill.getEndDate();
  98. if (endDate == null) {
  99. endDate = LocalDate.now().minusDays(1);
  100. }
  101. OverdueEnum overdueEnum = getDaysBetween(endDate);
  102. LambdaQueryWrapper<RepalRemindDefinition> qw = Wrappers.lambdaQuery(RepalRemindDefinition.class);
  103. qw.eq(RepalRemindDefinition::getRemindType, RemindEnum.账款评级.name());
  104. if (RepalBillStatusEnum.PROGRESSING.getCode().equals(repalBill.getRepalBillStatus())
  105. || !RepalBillStageEnum.NON_PROSECUTE.getCode().equals(repalBill.getRepalBillStage())) {
  106. qw.eq(RepalRemindDefinition::getOpportunity, diagnosis.getDiagnosisGrade());
  107. } else {
  108. qw.eq(RepalRemindDefinition::getOpportunity, diagnosis.getDiagnosisGrade() + "+" + overdueEnum.getCode());
  109. }
  110. qw.eq(RepalRemindDefinition::getRepalBillStatus, repalBill.getRepalBillStatus());
  111. qw.eq(RepalRemindDefinition::getRepalBillStage, repalBill.getRepalBillStage());
  112. RepalRemindDefinition accountRemindDefinition = repalRemindDefinitionService.getOne(qw, false);
  113. if (accountRemindDefinition != null) {
  114. String changeStr = "下降";
  115. String changeStr1 = "下降";
  116. if (repalBill.getDiagnosisScore().compareTo(repalBill.getPreDiagnosisScore() == null ? new BigDecimal(0)
  117. : repalBill.getPreDiagnosisScore()) > 0) {
  118. changeStr = "上升";
  119. changeStr1 = "提高";
  120. }
  121. RepalRemindHistory accountRemindHistory = new RepalRemindHistory();
  122. accountRemindHistory.setCustId(repalBill.getCustomerId())
  123. .setRepalBookId(repalBill.getRepalBookId())
  124. .setRepalBillId(repalBill.getId())
  125. .setTrendId(diagnosis.getId().toString())
  126. .setTrendContent(repalBill.getPreDiagnosisId() != null ? repalBill.getPreDiagnosisId().toString() : null)
  127. .setRemindTime(LocalDateTime.now())
  128. .setCompanyName(repalBill.getCustomerName())
  129. .setRemindTitle(diagnosis.getDiagnosisGrade() + "(" + diagnosis.getDiagnosisScore().stripTrailingZeros().toPlainString() + "分)")
  130. .setRemindContent(StrUtil.format(accountRemindDefinition.getRemindContent(),
  131. changeStr,
  132. changeStr1,
  133. overdueEnum.name()))
  134. .setFunctionList(accountRemindDefinition.getFunctionList())
  135. .setRemindType(RemindEnum.账款评级.getCode());
  136. save(accountRemindHistory);
  137. //推送
  138. //查出组织下所有已经授权的成员
  139. List<ThirdPartyAccount> accounts = thirdPartyAccountService.list(Wrappers.lambdaQuery(ThirdPartyAccount.class)
  140. .eq(ThirdPartyAccount::getGroupId,repalBill.getRepalGroupId())
  141. .eq(ThirdPartyAccount::getDeleted,Dict.DeletedStatusEnunm.否.getCode())
  142. .eq(ThirdPartyAccount::getAppId,0)
  143. .isNotNull(ThirdPartyAccount::getMobileNo));
  144. List<String> mobiles = accounts.stream().map(ThirdPartyAccount::getMobileNo).collect(Collectors.toList());
  145. String redisKey = MESSAGE_PRIFIX + repalBill.getRepalGroupId() + "_" + RemindEnum.账款评级.getCode();
  146. if (CollUtil.isNotEmpty(mobiles) && redisUtil.get(redisKey) == null && repalBill.getPreDiagnosisId() != null) {
  147. for(String mobileNo:mobiles) {
  148. Map<String, String> paraMap = new HashMap<>();
  149. paraMap.put("company", repalBill.getCustomerName());
  150. paraMap.put("pregrade", repalBill.getPreDiagnosisGrade());
  151. paraMap.put("prescore", repalBill.getPreDiagnosisScore().toPlainString());
  152. paraMap.put("change", changeStr);
  153. paraMap.put("grade", repalBill.getDiagnosisGrade());
  154. paraMap.put("score", repalBill.getDiagnosisScore().toPlainString());
  155. paraMap.put("change1", changeStr1);
  156. messageNoticeService.sendSms(mobileNo, MsgNameEnum.评级变动短信提醒, paraMap);
  157. }
  158. redisUtil.setEx(redisKey, "done", calTTL(), TimeUnit.MILLISECONDS);
  159. }
  160. //掐头去尾压进accountbill.remindInfo中
  161. String remindContent = accountRemindHistory.getRemindContent();
  162. if (remindContent.length() > 100) {
  163. remindContent = remindContent.substring(0, 100);
  164. }
  165. accountRemindHistory.setFunctionList(null).setRemindContent(remindContent);
  166. repalBill.setRemindInfo(JSON.toJSONString(accountRemindHistory));
  167. }
  168. return true;
  169. }
  170. @Override
  171. public RepalRemindHistoryVO getDetailById(Long id, UserBean userBean) {
  172. RepalRemindHistory bean = getById(id);
  173. RepalRemindHistoryVO remindHistoryVO = RepalRemindHistoryConvert.EntityToVO(bean);
  174. RepalBill accountBill = repalBillService.getById(remindHistoryVO.getRepalBillId());
  175. //评级提醒返回本次评分 上次评分,以及动态监测
  176. if (RemindEnum.账款评级.getCode().equals(remindHistoryVO.getRemindType())) {
  177. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(remindHistoryVO.getTrendId());
  178. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  179. QueryV8DynamicDTO dynamicDto = new QueryV8DynamicDTO();
  180. remindHistoryVO.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  181. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  182. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime())
  183. .setDiagnosisRecordId(accountBillDiagnosis.getBizId());
  184. dynamicDto.setEndDate(accountBillDiagnosis.getDiagnosisDatetime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
  185. if (StrUtil.isNotEmpty(remindHistoryVO.getTrendContent())) {
  186. RepalBillDiagnosis preAccountDiagnosis = repalBillDiagnosisService.getById(remindHistoryVO.getTrendContent());
  187. if (ObjectUtil.isNotNull(preAccountDiagnosis)) {
  188. remindHistoryVO.setPreDiagnosisGrade(preAccountDiagnosis.getDiagnosisGrade())
  189. .setPreDiagnosisScore(preAccountDiagnosis.getDiagnosisScore())
  190. .setPreDiagnosisDatetime(preAccountDiagnosis.getDiagnosisDatetime());
  191. dynamicDto.setStartDate(preAccountDiagnosis.getDiagnosisDatetime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
  192. }
  193. }
  194. dynamicDto.setEntityNames(Collections.singletonList(accountBill.getCustomerName()));
  195. VOPage<V8DynamicVO> resultPage = companyService.queryDynamic(dynamicDto, 1, 10);
  196. if (ObjectUtil.isNull(resultPage) || ObjectUtil.isNull(resultPage.getDataList()) || CollUtil.isEmpty(resultPage.getDataList())) {
  197. DiagnosisDynamicVO dynamicVO = new DiagnosisDynamicVO();
  198. dynamicVO.setRtaDesc("该账款信息发生变动(欠款企业、金额有所调整)");
  199. dynamicVO.setCreateTime(accountBill.getTimeModified().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  200. remindHistoryVO.setEsDynamics(Collections.singletonList(dynamicVO));
  201. }else {
  202. remindHistoryVO.setEsDynamics(resultPage.getDataList().stream().map(entity -> {
  203. DiagnosisDynamicVO diagnosisDynamicVO = new DiagnosisDynamicVO();
  204. diagnosisDynamicVO.setNewDynamicId(entity.getId());
  205. diagnosisDynamicVO.setRowKey(entity.getRowkey());
  206. diagnosisDynamicVO.setCreateTime(entity.getDynamicTime());
  207. String rtaDesc = DynamicEnum.getDescByTn(entity.getTn());
  208. diagnosisDynamicVO.setRtaDesc(rtaDesc);
  209. diagnosisDynamicVO.setTn(entity.getTn());
  210. diagnosisDynamicVO.setInfoType(entity.getInfoType());
  211. diagnosisDynamicVO.setNewRemindContent(JSON.toJSONString(entity.getDynamicJSON()));
  212. diagnosisDynamicVO.setRouting(DynamicEnum.getRoutingByTn(entity.getTn()));
  213. return diagnosisDynamicVO;
  214. }).collect(Collectors.toList()));
  215. }
  216. }
  217. }
  218. //逾期提醒返回本次评分以及应收账款日期
  219. else if (RemindEnum.逾期提醒.getCode().equals(remindHistoryVO.getRemindType())) {
  220. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(remindHistoryVO.getTrendId());
  221. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  222. remindHistoryVO.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  223. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  224. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime());
  225. }
  226. remindHistoryVO.setEndDate(LocalDateTime.ofEpochSecond(Long.parseLong(remindHistoryVO.getTrendContent()) / 1000, 0, ZoneOffset.ofHours(8)));
  227. }
  228. RepalCustomer repalCustomer = repalCustomerService.getById(accountBill.getCustomerId());
  229. if(ObjectUtil.isNotNull(repalCustomer)) {
  230. remindHistoryVO.setCompanyId(repalCustomer.getCompanyId());
  231. }
  232. //更新已读状态,感觉用不到,还是加上吧
  233. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(),bean.getRemindType(),accountBill.getId(),accountBill.getRepalBookId());
  234. return remindHistoryVO;
  235. }
  236. @Override
  237. public RepalRemindCountVO queryRemidCount(RepalRemindHistoryDTO dto, UserBean userBean) {
  238. //参数校验
  239. if(ObjectUtil.isNull(dto.getQueryType())){
  240. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  241. }
  242. LocalDateTime localDateTime = LocalDateTime.now().withYear(2019);
  243. //添加查询时间的条件
  244. if (StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本月.getCode().equals(dto.getTimeSlot())) {
  245. localDateTime = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0);
  246. }else if(StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本周.getCode().equals(dto.getTimeSlot())){
  247. localDateTime = LocalDateTime.now().with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0);
  248. }
  249. RepalRemindCountVO result = new RepalRemindCountVO(0,0,0,0,0,0,0,0,0,0);
  250. if(Dict.COUNT_QUERY_ENUM.账款.getCode().equals(dto.getQueryType())){
  251. if(ObjectUtil.isNull(dto.getRepalBillId())){
  252. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  253. }
  254. RepalBill repalBill = repalBillService.getById(dto.getRepalBillId());
  255. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  256. result = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  257. result.setUnreadTotalCount(result.getUnreadRankCount()+result.getUnreadRiskCount()+result.getUnreadOverdueCount()+result.getUnreadFinanceCount());
  258. }else if(Dict.COUNT_QUERY_ENUM.客户.getCode().equals(dto.getQueryType())){
  259. if(ObjectUtil.isNull(dto.getCustId())){
  260. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  261. }
  262. //客户维度多账款
  263. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getCustomerId,dto.getCustId()).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  264. for(RepalBill repalBill:repalBills){
  265. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  266. RepalRemindCountVO tmp = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  267. result.setFinanceCount(result.getFinanceCount()+tmp.getFinanceCount());
  268. result.setRankCount(result.getRankCount()+tmp.getRankCount());
  269. result.setOverdueCount(result.getOverdueCount()+tmp.getOverdueCount());
  270. result.setRiskCount(result.getRiskCount()+tmp.getRiskCount());
  271. result.setUnreadRiskCount(result.getUnreadRiskCount()+tmp.getUnreadRiskCount());
  272. result.setUnreadRankCount(result.getUnreadRankCount()+tmp.getUnreadRankCount());
  273. result.setUnreadFinanceCount(result.getUnreadFinanceCount()+tmp.getUnreadFinanceCount());
  274. result.setUnreadOverdueCount(result.getUnreadOverdueCount()+tmp.getUnreadOverdueCount());
  275. result.setTotalCount(result.getTotalCount()+tmp.getTotalCount());
  276. result.setUnreadTotalCount(result.getUnreadTotalCount()+tmp.getUnreadTotalCount());
  277. }
  278. }else if(Dict.COUNT_QUERY_ENUM.用户.getCode().equals(dto.getQueryType())){
  279. //用户->组织->客户s->账款s
  280. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  281. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  282. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  283. if(repalGroupMember!=null){
  284. List<RepalCustomer> repalCustomers = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).eq(RepalCustomer::getRepalGroupId,repalGroupMember.getRepalGroupId()).eq(RepalCustomer::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  285. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).in(RepalBill::getCustomerId,repalCustomers.stream().map(RepalCustomer::getCustId).collect(Collectors.toList())).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  286. for(RepalBill repalBill:repalBills){
  287. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  288. RepalRemindCountVO tmp = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  289. result.setFinanceCount(result.getFinanceCount()+tmp.getFinanceCount());
  290. result.setRankCount(result.getRankCount()+tmp.getRankCount());
  291. result.setOverdueCount(result.getOverdueCount()+tmp.getOverdueCount());
  292. result.setRiskCount(result.getRiskCount()+tmp.getRiskCount());
  293. result.setUnreadRiskCount(result.getUnreadRiskCount()+tmp.getUnreadRiskCount());
  294. result.setUnreadRankCount(result.getUnreadRankCount()+tmp.getUnreadRankCount());
  295. result.setUnreadFinanceCount(result.getUnreadFinanceCount()+tmp.getUnreadFinanceCount());
  296. result.setUnreadOverdueCount(result.getUnreadOverdueCount()+tmp.getUnreadOverdueCount());
  297. result.setTotalCount(result.getTotalCount()+tmp.getTotalCount());
  298. result.setUnreadTotalCount(result.getUnreadTotalCount()+tmp.getUnreadTotalCount());
  299. }
  300. }
  301. }else if(Dict.COUNT_QUERY_ENUM.账本.getCode().equals(dto.getQueryType())){
  302. if(ObjectUtil.isNull(dto.getRepalBookId())){
  303. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  304. }
  305. //客户维度多账款
  306. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getRepalBookId,dto.getRepalBookId()).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  307. for(RepalBill repalBill:repalBills){
  308. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  309. RepalRemindCountVO tmp = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  310. result.setFinanceCount(result.getFinanceCount()+tmp.getFinanceCount());
  311. result.setRankCount(result.getRankCount()+tmp.getRankCount());
  312. result.setOverdueCount(result.getOverdueCount()+tmp.getOverdueCount());
  313. result.setRiskCount(result.getRiskCount()+tmp.getRiskCount());
  314. result.setUnreadRiskCount(result.getUnreadRiskCount()+tmp.getUnreadRiskCount());
  315. result.setUnreadRankCount(result.getUnreadRankCount()+tmp.getUnreadRankCount());
  316. result.setUnreadFinanceCount(result.getUnreadFinanceCount()+tmp.getUnreadFinanceCount());
  317. result.setUnreadOverdueCount(result.getUnreadOverdueCount()+tmp.getUnreadOverdueCount());
  318. result.setTotalCount(result.getTotalCount()+tmp.getTotalCount());
  319. result.setUnreadTotalCount(result.getUnreadTotalCount()+tmp.getUnreadTotalCount());
  320. }
  321. }
  322. return result;
  323. }
  324. @Override
  325. public VOPage<RepalRemindHistoryVO> find(RepalRemindHistoryDTO dto, Integer pageNum, Integer pageSize, UserBean userBean) {
  326. //权限
  327. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),PermissionEnum.QUERY_ALL_URGE.getCode());
  328. //参数校验
  329. if(ObjectUtil.isNull(dto.getQueryType())){
  330. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  331. }
  332. LocalDateTime localDateTime = LocalDateTime.now().withYear(2019);
  333. //添加查询时间的条件
  334. if (StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本月.getCode().equals(dto.getTimeSlot())) {
  335. localDateTime = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0);
  336. }else if(StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本周.getCode().equals(dto.getTimeSlot())){
  337. localDateTime = LocalDateTime.now().with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0);
  338. }
  339. VOPage<RepalRemindHistoryVO> result = new VOPage<>(pageNum,pageSize,0L,new ArrayList<>());
  340. LambdaQueryWrapper<RepalRemindHistory> qw = Wrappers.lambdaQuery(RepalRemindHistory.class);
  341. if (StrUtil.isNotBlank(dto.getRemindType())) {
  342. if (RemindEnum.财产线索.getCode().equals(dto.getRemindType())
  343. || RemindEnum.逾期提醒.getCode().equals(dto.getRemindType())
  344. || RemindEnum.账款评级.getCode().equals(dto.getRemindType())
  345. || RemindEnum.风险预警.getCode().equals(dto.getRemindType())) {
  346. qw.eq(RepalRemindHistory::getRemindType, dto.getRemindType());
  347. }
  348. }
  349. qw.ge(RepalRemindHistory::getRemindTime,localDateTime).orderByDesc(RepalRemindHistory::getId);
  350. if(Dict.COUNT_QUERY_ENUM.账款.getCode().equals(dto.getQueryType())){
  351. if(ObjectUtil.isNull(dto.getRepalBillId())){
  352. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  353. }
  354. qw.eq(RepalRemindHistory::getRepalBillId,dto.getRepalBillId());
  355. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  356. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  357. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  358. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  359. //更新已读未读状态
  360. RepalBill repalBill = repalBillService.getById(dto.getRepalBillId());
  361. RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId());
  362. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  363. for(RepalRemindHistoryVO vo:result.getDataList()){
  364. vo.setCompanyId(repalCustomer.getCompanyId());
  365. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  366. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  367. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  368. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  369. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  370. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  371. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  372. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  373. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  374. }
  375. }
  376. //查询详细分类时更新已读id
  377. if(StrUtil.isNotBlank(dto.getRemindType())){
  378. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),dto.getRepalBillId(), repalBill.getRepalBookId());
  379. }
  380. }
  381. }else if(Dict.COUNT_QUERY_ENUM.客户.getCode().equals(dto.getQueryType())){
  382. if(ObjectUtil.isNull(dto.getCustId())){
  383. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  384. }
  385. //客户维度多账款
  386. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getCustomerId,dto.getCustId()).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  387. if(CollUtil.isEmpty(repalBills)){
  388. return new VOPage<>();
  389. }
  390. qw.in(RepalRemindHistory::getRepalBillId,repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()));
  391. Map<String,RepalCustomer> repalCustomerMap = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId,repalBills.stream().map(RepalBill::getCustomerId).collect(Collectors.toList()))).stream().collect(Collectors.toMap(RepalCustomer::getCustName, Function.identity(),(a,b)->a));
  392. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  393. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  394. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  395. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  396. Map<Long,RepalRemindReadInfo> readInfoMap = new HashMap<>();
  397. for(RepalRemindHistoryVO vo:result.getDataList()){
  398. if(repalCustomerMap.containsKey(vo.getCompanyName())){
  399. vo.setCompanyId(repalCustomerMap.get(vo.getCompanyName()).getCompanyId());
  400. }
  401. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  402. RepalRemindReadInfo repalRemindReadInfo;
  403. if(readInfoMap.containsKey(vo.getRepalBillId())){
  404. repalRemindReadInfo = readInfoMap.get(vo.getRepalBillId());
  405. }else {
  406. repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), vo.getRepalBillId(), vo.getRepalBookId());
  407. readInfoMap.put(vo.getRepalBillId(),repalRemindReadInfo);
  408. }
  409. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  410. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  411. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  412. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  413. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  414. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  415. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  416. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  417. }
  418. }
  419. //查询详细分类时更新已读id
  420. if(StrUtil.isNotBlank(dto.getRemindType()) && CollUtil.isNotEmpty(readInfoMap)){
  421. for(RepalRemindReadInfo repalRemindReadInfo:readInfoMap.values()){
  422. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),repalRemindReadInfo.getRepalBillId(), repalRemindReadInfo.getRepalBookId());
  423. }
  424. }
  425. }
  426. }else if(Dict.COUNT_QUERY_ENUM.用户.getCode().equals(dto.getQueryType())){
  427. //用户->组织->客户s->账款s
  428. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  429. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  430. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  431. if(repalGroupMember!=null){
  432. List<RepalCustomer> repalCustomers = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).eq(RepalCustomer::getRepalGroupId,repalGroupMember.getRepalGroupId()).eq(RepalCustomer::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  433. if(CollUtil.isEmpty(repalCustomers)){
  434. return new VOPage<>();
  435. }
  436. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).in(RepalBill::getCustomerId,repalCustomers.stream().map(RepalCustomer::getCustId).collect(Collectors.toList())).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  437. if(CollUtil.isEmpty(repalBills)){
  438. return new VOPage<>();
  439. }
  440. Map<String,RepalCustomer> repalCustomerMap = repalCustomers.stream().collect(Collectors.toMap(RepalCustomer::getCustName, Function.identity(),(a,b)->a));
  441. qw.in(RepalRemindHistory::getRepalBillId,repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()));
  442. qw.exists(!allFlag,"select 1 from REPAL_CUST_CHARGE_REL C WHERE C.CUST_ID = REPAL_REMIND_HISTORY.CUST_ID AND C.MEMBER_USER_ID = "+userBean.getUserId());
  443. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  444. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  445. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  446. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  447. Map<Long,RepalRemindReadInfo> readInfoMap = new HashMap<>();
  448. for(RepalRemindHistoryVO vo:result.getDataList()){
  449. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  450. if(repalCustomerMap.containsKey(vo.getCompanyName())){
  451. vo.setCompanyId(repalCustomerMap.get(vo.getCompanyName()).getCompanyId());
  452. }
  453. RepalRemindReadInfo repalRemindReadInfo;
  454. if(readInfoMap.containsKey(vo.getRepalBillId())){
  455. repalRemindReadInfo = readInfoMap.get(vo.getRepalBillId());
  456. }else {
  457. repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), vo.getRepalBillId(), vo.getRepalBookId());
  458. readInfoMap.put(vo.getRepalBillId(),repalRemindReadInfo);
  459. }
  460. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  461. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  462. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  463. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  464. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  465. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  466. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  467. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  468. }
  469. }
  470. //查询详细分类时更新已读id
  471. if(StrUtil.isNotBlank(dto.getRemindType()) && CollUtil.isNotEmpty(readInfoMap)){
  472. for(RepalRemindReadInfo repalRemindReadInfo:readInfoMap.values()){
  473. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),repalRemindReadInfo.getRepalBillId(), repalRemindReadInfo.getRepalBookId());
  474. }
  475. }
  476. }
  477. }
  478. }else if(Dict.COUNT_QUERY_ENUM.账本.getCode().equals(dto.getQueryType())){
  479. if(ObjectUtil.isNull(dto.getRepalBookId())){
  480. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  481. }
  482. //客户维度多账款
  483. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getRepalBookId,dto.getRepalBookId()).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  484. if(CollUtil.isEmpty(repalBills)){
  485. return new VOPage<>();
  486. }
  487. qw.in(RepalRemindHistory::getRepalBillId,repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()));
  488. Map<String,RepalCustomer> repalCustomerMap = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId,repalBills.stream().map(RepalBill::getCustomerId).collect(Collectors.toList()))).stream().collect(Collectors.toMap(RepalCustomer::getCustName, Function.identity(),(a,b)->a));
  489. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  490. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  491. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  492. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  493. Map<Long,RepalRemindReadInfo> readInfoMap = new HashMap<>();
  494. for(RepalRemindHistoryVO vo:result.getDataList()){
  495. if(repalCustomerMap.containsKey(vo.getCompanyName())){
  496. vo.setCompanyId(repalCustomerMap.get(vo.getCompanyName()).getCompanyId());
  497. }
  498. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  499. RepalRemindReadInfo repalRemindReadInfo;
  500. if(readInfoMap.containsKey(vo.getRepalBillId())){
  501. repalRemindReadInfo = readInfoMap.get(vo.getRepalBillId());
  502. }else {
  503. repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), vo.getRepalBillId(), vo.getRepalBookId());
  504. readInfoMap.put(vo.getRepalBillId(),repalRemindReadInfo);
  505. }
  506. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  507. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  508. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  509. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  510. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  511. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  512. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  513. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  514. }
  515. }
  516. //查询详细分类时更新已读id
  517. if(StrUtil.isNotBlank(dto.getRemindType()) && CollUtil.isNotEmpty(readInfoMap)){
  518. for(RepalRemindReadInfo repalRemindReadInfo:readInfoMap.values()){
  519. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),repalRemindReadInfo.getRepalBillId(), repalRemindReadInfo.getRepalBookId());
  520. }
  521. }
  522. }
  523. }
  524. if (CollUtil.isNotEmpty(result.getDataList())) {
  525. result.getDataList().forEach(e -> {
  526. //逾期提醒返回本次评分以及应收账款日期
  527. if (RemindEnum.逾期提醒.getCode().equals(e.getRemindType())) {
  528. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(e.getTrendId());
  529. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  530. e.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  531. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  532. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime());
  533. }
  534. e.setEndDate(LocalDateTime.ofEpochSecond(Long.parseLong(e.getTrendContent()) / 1000, 0, ZoneOffset.ofHours(8)));
  535. }
  536. if (RemindEnum.账款评级.getCode().equals(e.getRemindType())) {
  537. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(e.getTrendId());
  538. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  539. e.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  540. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  541. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime())
  542. .setDiagnosisRecordId(accountBillDiagnosis.getBizId());
  543. if (StrUtil.isNotEmpty(e.getTrendContent())) {
  544. RepalBillDiagnosis preAccountDiagnosis = repalBillDiagnosisService.getById(e.getTrendContent());
  545. if (ObjectUtil.isNotNull(preAccountDiagnosis)) {
  546. e.setPreDiagnosisGrade(preAccountDiagnosis.getDiagnosisGrade())
  547. .setPreDiagnosisScore(preAccountDiagnosis.getDiagnosisScore())
  548. .setPreDiagnosisDatetime(preAccountDiagnosis.getDiagnosisDatetime());
  549. }
  550. }
  551. }
  552. }
  553. });
  554. }
  555. return result;
  556. }
  557. private OverdueEnum getDaysBetween(LocalDate endDate) {
  558. long delta = LocalDate.now().toEpochDay() - endDate.toEpochDay();
  559. OverdueEnum overdueEnum = OverdueEnum.其他;
  560. if (delta <= 0 && delta >= -7) {
  561. overdueEnum = OverdueEnum.即将逾期;
  562. } else if (delta > 0 && delta < 90) {
  563. overdueEnum = OverdueEnum.已逾期;
  564. } else if (delta >= 90 && delta < 180) {
  565. overdueEnum = OverdueEnum.已逾期三个月;
  566. } else if (delta >= 180 && delta < 365) {
  567. overdueEnum = OverdueEnum.已逾期半年;
  568. } else if (delta >= 365 && delta < 365 * 3) {
  569. overdueEnum = OverdueEnum.已逾期一年;
  570. } else if (delta >= 365 * 3) {
  571. overdueEnum = OverdueEnum.已逾期三年;
  572. }
  573. return overdueEnum;
  574. }
  575. /**
  576. * 计算当天剩余的毫秒时间
  577. * @return
  578. */
  579. private Long calTTL(){
  580. LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
  581. return ChronoUnit.MILLIS.between(LocalDateTime.now(),midnight);
  582. }
  583. @Override
  584. public List<BookDynamicCountBO> getBookDynamicCount(Long repalBookId, Long userId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
  585. return repalRemindHistoryMapper.getBookDynamicCount(repalBookId, userId, startDateTime, endDateTime);
  586. }
  587. @Override
  588. public RepalBillRemindUnReadVO getBillRemindUnReadVO(Long riskId, Long rankId, Long overdueId, Long financeId, Long repalBookId, Long repalBillId, LocalDateTime startTime, LocalDateTime endTime) {
  589. return repalRemindHistoryMapper.getRemindUnReadVO(riskId, rankId, overdueId, financeId, repalBookId, repalBillId, startTime, endTime);
  590. }
  591. }