RepalRemindHistoryServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  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. }
  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. else if (RemindEnum.逾期提醒.getCode().equals(remindHistoryVO.getRemindType())) {
  219. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(remindHistoryVO.getTrendId());
  220. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  221. remindHistoryVO.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  222. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  223. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime());
  224. }
  225. remindHistoryVO.setEndDate(LocalDateTime.ofEpochSecond(Long.parseLong(remindHistoryVO.getTrendContent()) / 1000, 0, ZoneOffset.ofHours(8)));
  226. }
  227. RepalCustomer repalCustomer = repalCustomerService.getById(accountBill.getCustomerId());
  228. if(ObjectUtil.isNotNull(repalCustomer)) {
  229. remindHistoryVO.setCompanyId(repalCustomer.getCompanyId());
  230. }
  231. //更新已读状态,感觉用不到,还是加上吧
  232. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(),bean.getRemindType(),accountBill.getId(),accountBill.getRepalBookId());
  233. return remindHistoryVO;
  234. }
  235. @Override
  236. public RepalRemindCountVO queryRemidCount(RepalRemindHistoryDTO dto, UserBean userBean) {
  237. //参数校验
  238. if(ObjectUtil.isNull(dto.getQueryType())){
  239. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  240. }
  241. LocalDateTime localDateTime = LocalDateTime.now().withYear(2019);
  242. //添加查询时间的条件
  243. if (StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本月.getCode().equals(dto.getTimeSlot())) {
  244. localDateTime = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0);
  245. }else if(StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本周.getCode().equals(dto.getTimeSlot())){
  246. localDateTime = LocalDateTime.now().with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0);
  247. }
  248. RepalRemindCountVO result = new RepalRemindCountVO(0,0,0,0,0,0,0,0,0,0);
  249. if(Dict.COUNT_QUERY_ENUM.账款.getCode().equals(dto.getQueryType())){
  250. if(ObjectUtil.isNull(dto.getRepalBillId())){
  251. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  252. }
  253. RepalBill repalBill = repalBillService.getById(dto.getRepalBillId());
  254. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  255. result = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  256. result.setUnreadTotalCount(result.getUnreadRankCount()+result.getUnreadRiskCount()+result.getUnreadOverdueCount()+result.getUnreadFinanceCount());
  257. }else if(Dict.COUNT_QUERY_ENUM.客户.getCode().equals(dto.getQueryType())){
  258. if(ObjectUtil.isNull(dto.getCustId())){
  259. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  260. }
  261. //客户维度多账款
  262. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getCustomerId,dto.getCustId()).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  263. for(RepalBill repalBill:repalBills){
  264. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  265. RepalRemindCountVO tmp = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  266. result.setFinanceCount(result.getFinanceCount()+tmp.getFinanceCount());
  267. result.setRankCount(result.getRankCount()+tmp.getRankCount());
  268. result.setOverdueCount(result.getOverdueCount()+tmp.getOverdueCount());
  269. result.setRiskCount(result.getRiskCount()+tmp.getRiskCount());
  270. result.setUnreadRiskCount(result.getUnreadRiskCount()+tmp.getUnreadRiskCount());
  271. result.setUnreadRankCount(result.getUnreadRankCount()+tmp.getUnreadRankCount());
  272. result.setUnreadFinanceCount(result.getUnreadFinanceCount()+tmp.getUnreadFinanceCount());
  273. result.setUnreadOverdueCount(result.getUnreadOverdueCount()+tmp.getUnreadOverdueCount());
  274. result.setTotalCount(result.getTotalCount()+tmp.getTotalCount());
  275. result.setUnreadTotalCount(result.getUnreadTotalCount()+tmp.getUnreadTotalCount());
  276. }
  277. }else if(Dict.COUNT_QUERY_ENUM.用户.getCode().equals(dto.getQueryType())){
  278. //用户->组织->客户s->账款s
  279. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  280. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  281. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  282. if(repalGroupMember!=null){
  283. List<RepalCustomer> repalCustomers = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).eq(RepalCustomer::getRepalGroupId,repalGroupMember.getRepalGroupId()).eq(RepalCustomer::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  284. 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()));
  285. for(RepalBill repalBill:repalBills){
  286. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  287. RepalRemindCountVO tmp = repalRemindHistoryMapper.remindCount(repalBill.getId(),localDateTime,repalRemindReadInfo.getRiskRemindId(),repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),repalRemindReadInfo.getFinanceRemindId());
  288. result.setFinanceCount(result.getFinanceCount()+tmp.getFinanceCount());
  289. result.setRankCount(result.getRankCount()+tmp.getRankCount());
  290. result.setOverdueCount(result.getOverdueCount()+tmp.getOverdueCount());
  291. result.setRiskCount(result.getRiskCount()+tmp.getRiskCount());
  292. result.setUnreadRiskCount(result.getUnreadRiskCount()+tmp.getUnreadRiskCount());
  293. result.setUnreadRankCount(result.getUnreadRankCount()+tmp.getUnreadRankCount());
  294. result.setUnreadFinanceCount(result.getUnreadFinanceCount()+tmp.getUnreadFinanceCount());
  295. result.setUnreadOverdueCount(result.getUnreadOverdueCount()+tmp.getUnreadOverdueCount());
  296. result.setTotalCount(result.getTotalCount()+tmp.getTotalCount());
  297. result.setUnreadTotalCount(result.getUnreadTotalCount()+tmp.getUnreadTotalCount());
  298. }
  299. }
  300. }
  301. return result;
  302. }
  303. @Override
  304. public VOPage<RepalRemindHistoryVO> find(RepalRemindHistoryDTO dto, Integer pageNum, Integer pageSize, UserBean userBean) {
  305. //权限
  306. boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),PermissionEnum.QUERY_ALL_URGE.getCode());
  307. //参数校验
  308. if(ObjectUtil.isNull(dto.getQueryType())){
  309. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  310. }
  311. LocalDateTime localDateTime = LocalDateTime.now().withYear(2019);
  312. //添加查询时间的条件
  313. if (StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本月.getCode().equals(dto.getTimeSlot())) {
  314. localDateTime = LocalDateTime.now().withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0);
  315. }else if(StrUtil.isBlank(dto.getTimeSlot()) || Dict.TIME_SLOT_ENUM.本周.getCode().equals(dto.getTimeSlot())){
  316. localDateTime = LocalDateTime.now().with(DayOfWeek.MONDAY).withHour(0).withMinute(0).withSecond(0);
  317. }
  318. VOPage<RepalRemindHistoryVO> result = new VOPage<>(pageNum,pageSize,0L,new ArrayList<>());
  319. LambdaQueryWrapper<RepalRemindHistory> qw = Wrappers.lambdaQuery(RepalRemindHistory.class);
  320. if (StrUtil.isNotBlank(dto.getRemindType())) {
  321. if (RemindEnum.财产线索.getCode().equals(dto.getRemindType())
  322. || RemindEnum.逾期提醒.getCode().equals(dto.getRemindType())
  323. || RemindEnum.账款评级.getCode().equals(dto.getRemindType())
  324. || RemindEnum.风险预警.getCode().equals(dto.getRemindType())) {
  325. qw.eq(RepalRemindHistory::getRemindType, dto.getRemindType());
  326. }
  327. }
  328. qw.ge(RepalRemindHistory::getRemindTime,localDateTime).orderByDesc(RepalRemindHistory::getId);
  329. if(Dict.COUNT_QUERY_ENUM.账款.getCode().equals(dto.getQueryType())){
  330. if(ObjectUtil.isNull(dto.getRepalBillId())){
  331. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  332. }
  333. qw.eq(RepalRemindHistory::getRepalBillId,dto.getRepalBillId());
  334. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  335. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  336. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  337. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  338. //更新已读未读状态
  339. RepalBill repalBill = repalBillService.getById(dto.getRepalBillId());
  340. RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId());
  341. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), dto.getRepalBillId(), repalBill.getRepalBookId());
  342. for(RepalRemindHistoryVO vo:result.getDataList()){
  343. vo.setCompanyId(repalCustomer.getCompanyId());
  344. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  345. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  346. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  347. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  348. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  349. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  350. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  351. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  352. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  353. }
  354. }
  355. //查询详细分类时更新已读id
  356. if(StrUtil.isNotBlank(dto.getRemindType())){
  357. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),dto.getRepalBillId(), repalBill.getRepalBookId());
  358. }
  359. }
  360. }else if(Dict.COUNT_QUERY_ENUM.客户.getCode().equals(dto.getQueryType())){
  361. if(ObjectUtil.isNull(dto.getCustId())){
  362. throw new CommonException(CodeMsg.VALIDATE_PARAMETER);
  363. }
  364. //客户维度多账款
  365. List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class).eq(RepalBill::getCustomerId,dto.getCustId()).eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
  366. if(CollUtil.isEmpty(repalBills)){
  367. return new VOPage<>();
  368. }
  369. qw.in(RepalRemindHistory::getRepalBillId,repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()));
  370. 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()));
  371. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  372. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  373. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  374. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  375. Map<Long,RepalRemindReadInfo> readInfoMap = new HashMap<>();
  376. for(RepalRemindHistoryVO vo:result.getDataList()){
  377. if(repalCustomerMap.containsKey(vo.getCompanyName())){
  378. vo.setCompanyId(repalCustomerMap.get(vo.getCompanyName()).getCompanyId());
  379. }
  380. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  381. RepalRemindReadInfo repalRemindReadInfo;
  382. if(readInfoMap.containsKey(vo.getRepalBillId())){
  383. repalRemindReadInfo = readInfoMap.get(vo.getRepalBillId());
  384. }else {
  385. repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), vo.getRepalBillId(), vo.getRepalBookId());
  386. readInfoMap.put(vo.getRepalBillId(),repalRemindReadInfo);
  387. }
  388. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  389. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  390. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  391. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  392. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  393. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  394. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  395. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  396. }
  397. }
  398. //查询详细分类时更新已读id
  399. if(StrUtil.isNotBlank(dto.getRemindType()) && CollUtil.isNotEmpty(readInfoMap)){
  400. for(RepalRemindReadInfo repalRemindReadInfo:readInfoMap.values()){
  401. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),repalRemindReadInfo.getRepalBillId(), repalRemindReadInfo.getRepalBookId());
  402. }
  403. }
  404. }
  405. }else if(Dict.COUNT_QUERY_ENUM.用户.getCode().equals(dto.getQueryType())){
  406. //用户->组织->客户s->账款s
  407. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  408. .eq(RepalGroupMember::getUserId,userBean.getUserId())
  409. .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  410. if(repalGroupMember!=null){
  411. List<RepalCustomer> repalCustomers = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).eq(RepalCustomer::getRepalGroupId,repalGroupMember.getRepalGroupId()).eq(RepalCustomer::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
  412. if(CollUtil.isEmpty(repalCustomers)){
  413. return new VOPage<>();
  414. }
  415. 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()));
  416. if(CollUtil.isEmpty(repalBills)){
  417. return new VOPage<>();
  418. }
  419. Map<String,RepalCustomer> repalCustomerMap = repalCustomers.stream().collect(Collectors.toMap(RepalCustomer::getCustName, Function.identity(),(a,b)->a));
  420. qw.in(RepalRemindHistory::getRepalBillId,repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()));
  421. 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());
  422. IPage<RepalRemindHistory> pageAccountRemindHistory = page(new Page<>(pageNum, pageSize), qw);
  423. if(CollUtil.isNotEmpty(pageAccountRemindHistory.getRecords())){
  424. result = new VOPage<>(pageNum, pageSize, pageAccountRemindHistory.getTotal(), pageAccountRemindHistory.getRecords().stream()
  425. .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
  426. Map<Long,RepalRemindReadInfo> readInfoMap = new HashMap<>();
  427. for(RepalRemindHistoryVO vo:result.getDataList()){
  428. vo.setReadStatus(Dict.ReadStatusEnum.已读.getCode());
  429. if(repalCustomerMap.containsKey(vo.getCompanyName())){
  430. vo.setCompanyId(repalCustomerMap.get(vo.getCompanyName()).getCompanyId());
  431. }
  432. RepalRemindReadInfo repalRemindReadInfo;
  433. if(readInfoMap.containsKey(vo.getRepalBillId())){
  434. repalRemindReadInfo = readInfoMap.get(vo.getRepalBillId());
  435. }else {
  436. repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userBean.getUserId(), vo.getRepalBillId(), vo.getRepalBookId());
  437. readInfoMap.put(vo.getRepalBillId(),repalRemindReadInfo);
  438. }
  439. if(RemindEnum.逾期提醒.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getOverdueRemindId()){
  440. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  441. }else if(RemindEnum.财产线索.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getFinanceRemindId()){
  442. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  443. }else if(RemindEnum.风险预警.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRiskRemindId()){
  444. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  445. }else if(RemindEnum.账款评级.getCode().equals(vo.getRemindType()) && vo.getId() > repalRemindReadInfo.getRankRemindId()){
  446. vo.setReadStatus(Dict.ReadStatusEnum.未读.getCode());
  447. }
  448. }
  449. //查询详细分类时更新已读id
  450. if(StrUtil.isNotBlank(dto.getRemindType()) && CollUtil.isNotEmpty(readInfoMap)){
  451. for(RepalRemindReadInfo repalRemindReadInfo:readInfoMap.values()){
  452. repalRemindReadInfoService.updateReadInfoByUserId(userBean.getUserId(), dto.getRemindType(),repalRemindReadInfo.getRepalBillId(), repalRemindReadInfo.getRepalBookId());
  453. }
  454. }
  455. }
  456. }
  457. }
  458. if (CollUtil.isNotEmpty(result.getDataList())) {
  459. result.getDataList().forEach(e -> {
  460. //逾期提醒返回本次评分以及应收账款日期
  461. if (RemindEnum.逾期提醒.getCode().equals(e.getRemindType())) {
  462. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(e.getTrendId());
  463. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  464. e.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  465. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  466. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime());
  467. }
  468. e.setEndDate(LocalDateTime.ofEpochSecond(Long.parseLong(e.getTrendContent()) / 1000, 0, ZoneOffset.ofHours(8)));
  469. }
  470. if (RemindEnum.账款评级.getCode().equals(e.getRemindType())) {
  471. RepalBillDiagnosis accountBillDiagnosis = repalBillDiagnosisService.getById(e.getTrendId());
  472. if (ObjectUtil.isNotNull(accountBillDiagnosis)) {
  473. e.setDiagnosisGrade(accountBillDiagnosis.getDiagnosisGrade())
  474. .setDiagnosisScore(accountBillDiagnosis.getDiagnosisScore())
  475. .setDiagnosisDatetime(accountBillDiagnosis.getDiagnosisDatetime())
  476. .setDiagnosisRecordId(accountBillDiagnosis.getBizId());
  477. if (StrUtil.isNotEmpty(e.getTrendContent())) {
  478. RepalBillDiagnosis preAccountDiagnosis = repalBillDiagnosisService.getById(e.getTrendContent());
  479. if (ObjectUtil.isNotNull(preAccountDiagnosis)) {
  480. e.setPreDiagnosisGrade(preAccountDiagnosis.getDiagnosisGrade())
  481. .setPreDiagnosisScore(preAccountDiagnosis.getDiagnosisScore())
  482. .setPreDiagnosisDatetime(preAccountDiagnosis.getDiagnosisDatetime());
  483. }
  484. }
  485. }
  486. }
  487. });
  488. }
  489. return result;
  490. }
  491. private OverdueEnum getDaysBetween(LocalDate endDate) {
  492. long delta = LocalDate.now().toEpochDay() - endDate.toEpochDay();
  493. OverdueEnum overdueEnum = OverdueEnum.其他;
  494. if (delta <= 0 && delta >= -7) {
  495. overdueEnum = OverdueEnum.即将逾期;
  496. } else if (delta > 0 && delta < 90) {
  497. overdueEnum = OverdueEnum.已逾期;
  498. } else if (delta >= 90 && delta < 180) {
  499. overdueEnum = OverdueEnum.已逾期三个月;
  500. } else if (delta >= 180 && delta < 365) {
  501. overdueEnum = OverdueEnum.已逾期半年;
  502. } else if (delta >= 365 && delta < 365 * 3) {
  503. overdueEnum = OverdueEnum.已逾期一年;
  504. } else if (delta >= 365 * 3) {
  505. overdueEnum = OverdueEnum.已逾期三年;
  506. }
  507. return overdueEnum;
  508. }
  509. /**
  510. * 计算当天剩余的毫秒时间
  511. * @return
  512. */
  513. private Long calTTL(){
  514. LocalDateTime midnight = LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
  515. return ChronoUnit.MILLIS.between(LocalDateTime.now(),midnight);
  516. }
  517. @Override
  518. public List<BookDynamicCountBO> getBookDynamicCount(Long repalBookId, Long userId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
  519. return repalRemindHistoryMapper.getBookDynamicCount(repalBookId, userId, startDateTime, endDateTime);
  520. }
  521. @Override
  522. public RepalBillRemindUnReadVO getBillRemindUnReadVO(Long riskId, Long rankId, Long overdueId, Long financeId, Long repalBookId, Long repalBillId, LocalDateTime startTime, LocalDateTime endTime) {
  523. return repalRemindHistoryMapper.getRemindUnReadVO(riskId, rankId, overdueId, financeId, repalBookId, repalBillId, startTime, endTime);
  524. }
  525. }