RepalBillServiceImpl.java 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851
  1. package com.winhc.repal.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.NumberUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.winhc.common.base.ApiDataResult;
  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.DataMiddlewareService;
  15. import com.winhc.repal.cloud.InCaseService;
  16. import com.winhc.repal.cloud.dto.GetCompanyRiskNumDTO;
  17. import com.winhc.repal.cloud.dto.GetCreditPunishmentLabelDTO;
  18. import com.winhc.repal.cloud.dto.GetFinanceDynamicNumDTO;
  19. import com.winhc.repal.cloud.vo.CompanyRiskNumVO;
  20. import com.winhc.repal.cloud.vo.CreditPunishmentLabelListVO;
  21. import com.winhc.repal.cloud.vo.DiagnosisRecordVO;
  22. import com.winhc.repal.cloud.vo.FinanceDynamicNumVO;
  23. import com.winhc.repal.entity.*;
  24. import com.winhc.repal.enums.*;
  25. import com.winhc.repal.model.bo.*;
  26. import com.winhc.repal.model.dto.*;
  27. import com.winhc.repal.model.vo.*;
  28. import com.winhc.repal.repository.RepalBillMapper;
  29. import com.winhc.repal.repository.RepalResponsiblePersonMapper;
  30. import com.winhc.repal.service.*;
  31. import com.winhc.repal.util.DiagnosisUtil;
  32. import com.winhc.repal.util.RepalBillStatusUtil;
  33. import com.winhc.repal.util.UserContextUtil;
  34. import org.slf4j.Logger;
  35. import org.slf4j.LoggerFactory;
  36. import org.springframework.beans.BeanUtils;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.stereotype.Service;
  39. import org.springframework.transaction.annotation.Transactional;
  40. import java.math.BigDecimal;
  41. import java.math.RoundingMode;
  42. import java.time.DayOfWeek;
  43. import java.time.LocalDate;
  44. import java.time.LocalDateTime;
  45. import java.time.LocalTime;
  46. import java.time.temporal.TemporalAdjusters;
  47. import java.util.*;
  48. import java.util.function.Function;
  49. import java.util.stream.Collectors;
  50. /**
  51. * @description RepalBill 接口实现类
  52. * @author Generator
  53. * @date 2022-04-08
  54. */
  55. @Service
  56. public class RepalBillServiceImpl extends ServiceImpl<RepalBillMapper, RepalBill> implements RepalBillService {
  57. public static final Logger LOGGER = LoggerFactory.getLogger(RepalBillServiceImpl.class);
  58. @Autowired
  59. private RepalBillMapper repalBillMapper;
  60. @Autowired
  61. private RepalResponsiblePersonService repalResponsiblePersonService;
  62. @Autowired
  63. private RepalGroupMemberService repalGroupMemberService;
  64. @Autowired
  65. private RepalCustomerService repalCustomerService;
  66. @Autowired
  67. private DataMiddlewareService dataMiddlewareService;
  68. @Autowired
  69. private InCaseService inCaseService;
  70. @Autowired
  71. private RepalBillDiagnosisService repalBillDiagnosisService;
  72. @Autowired
  73. private RepalChangeRecordService repalChangeRecordService;
  74. @Autowired
  75. private RepalBookService repalBookService;
  76. @Autowired
  77. private RepalRolePermissionService repalRolePermissionService;
  78. @Autowired
  79. private RepalRemindHistoryService repalRemindHistoryService;
  80. @Autowired
  81. private RepalRemindReadInfoService repalRemindReadInfoService;
  82. @Autowired
  83. private RepalBillOperLogService repalBillOperLogService;
  84. @Autowired
  85. private UserExtService userExtService;
  86. @Autowired
  87. private RepalResponsiblePersonMapper repalResponsiblePersonMapper;
  88. @Autowired
  89. private RepalDynamicService repalDynamicService;
  90. @Autowired
  91. private RepalVipService repalVipService;
  92. @Autowired
  93. private RepalCustChargeRelService repalCustChargeRelService;
  94. @Override
  95. public RepalBillInfoVO getRepalBillPage(GetRepalBillPageDTO dto) {
  96. long userId = UserContextUtil.getUser().getUserId();
  97. Long groupId = repalGroupMemberService.getUserGroupId(userId);
  98. VOPage<RepalBillPageVO> voPage = new VOPage<>();
  99. voPage.setPageSize(dto.getPageSize());
  100. voPage.setPageNum(dto.getPageNum());
  101. RepalBillInfoVO infoVO = new RepalBillInfoVO();
  102. boolean allFlag = repalRolePermissionService.checkUserPermission(userId,
  103. RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()) ? PermissionEnum.QUERY_ALL_RECEIVABLE.getCode() : PermissionEnum.QUERY_ALL_RECEIPT.getCode());
  104. LOGGER.info("allFlag:[{}]", allFlag);
  105. TotalMoneyBO totalMoneyBO;
  106. TotalMoneyBO overdueBO;
  107. TotalMoneyBO totalBO;
  108. if (allFlag) {
  109. totalMoneyBO = repalBillMapper.getTotalMoneyByGroup(groupId, dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId());
  110. overdueBO = repalBillMapper.getTotalMoneyByGroup(groupId, dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId());
  111. totalBO = repalBillMapper.getTotalMoneyByGroup(groupId, dto.getRepalBillType(), null, dto.getRepalBookId());
  112. } else {
  113. // 只查询自己负责的
  114. totalMoneyBO = repalBillMapper.getTotalMoneyByUser(userId, groupId, dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId());
  115. overdueBO = repalBillMapper.getTotalMoneyByUser(userId, groupId, dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId());
  116. totalBO = repalBillMapper.getTotalMoneyByUser(userId, groupId, dto.getRepalBillType(), null, dto.getRepalBookId());
  117. }
  118. infoVO.setTotalBillMoneyStr(totalMoneyBO.getTotalMoney().stripTrailingZeros().toPlainString());
  119. infoVO.setTotalBillCount(totalMoneyBO.getTotalCount());
  120. infoVO.setTotalOverdueCount(overdueBO.getTotalCount());
  121. infoVO.setTotalOverdueStr(overdueBO.getTotalMoney().stripTrailingZeros().toPlainString());
  122. infoVO.setTotalCount(totalBO.getTotalCount());
  123. infoVO.setTotalStr(totalBO.getTotalMoney().stripTrailingZeros().toPlainString());
  124. // 分页数据
  125. Page<RepalBill> repalBillPage = new Page<>(dto.getPageNum(),dto.getPageSize());
  126. BillPageBO billPageBO = new BillPageBO();
  127. BeanUtils.copyProperties(dto, billPageBO);
  128. billPageBO.setUserId(userId);
  129. billPageBO.setAllFlag(allFlag);
  130. billPageBO.setRepalGroupId(groupId);
  131. // 对应1-4到期时间
  132. if (Objects.nonNull(dto.getOverdueType())) {
  133. switch (dto.getOverdueType()) {
  134. case 1:
  135. billPageBO.setStartDate(LocalDate.now());
  136. billPageBO.setEndDate(billPageBO.getStartDate());
  137. break;
  138. case 2:
  139. billPageBO.setStartDate(LocalDate.now().with(DayOfWeek.MONDAY));
  140. billPageBO.setEndDate(LocalDate.now().with(DayOfWeek.SUNDAY));
  141. break;
  142. case 3:
  143. billPageBO.setStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()));
  144. billPageBO.setEndDate(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()));
  145. case 4:
  146. billPageBO.setStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfYear()));
  147. billPageBO.setEndDate(LocalDate.now().with(TemporalAdjusters.lastDayOfYear()));
  148. break;
  149. default:
  150. break;
  151. }
  152. }
  153. repalBillPage = repalBillMapper.getRepalBillPage(repalBillPage, billPageBO);
  154. voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages()));
  155. voPage.setTotalNum(repalBillPage.getTotal());
  156. voPage.setDataList(new ArrayList<>());
  157. infoVO.setPage(voPage);
  158. if (CollUtil.isEmpty(repalBillPage.getRecords())) {
  159. return infoVO;
  160. }
  161. // 未读消息
  162. List<Long> billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList());
  163. Map<Long, RepalBillRemindUnReadVO> unreadMap = new HashMap<>();
  164. repalBillPage.getRecords().parallelStream().forEach(repalBill -> {
  165. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId());
  166. RepalBillRemindUnReadVO readVO = repalRemindHistoryService.getBillRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(),
  167. repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),
  168. repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(),
  169. Objects.isNull(billPageBO.getStartDate()) ? null : LocalDateTime.of(billPageBO.getStartDate(), LocalTime.MIN),
  170. Objects.isNull(billPageBO.getEndDate()) ? null : LocalDateTime.of(billPageBO.getEndDate(), LocalTime.MAX));
  171. unreadMap.put(repalBill.getId(), readVO);
  172. });
  173. Map<Long, List<String>> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList);
  174. List<RepalCustomer> customerList = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId,
  175. repalBillPage.getRecords().stream().map(RepalBill::getCustomerId).distinct().collect(Collectors.toList())));
  176. Map<Long, Integer> custMap = customerList.stream().collect(Collectors.toMap(RepalCustomer::getCustId, RepalCustomer::getCustProperty));
  177. voPage.setDataList(repalBillPage.getRecords().stream().map(repalBill -> {
  178. RepalBillPageVO vo = new RepalBillPageVO();
  179. BeanUtils.copyProperties(repalBill, vo);
  180. vo.setRepalBillId(repalBill.getId());
  181. if (nameMap.containsKey(repalBill.getId())) {
  182. vo.setResponsiblePersonNames(String.join("、", nameMap.get(repalBill.getId())));
  183. }
  184. vo.setRepalOverdueStatus(repalBill.getRepalBillStatus() > 1 ? repalBill.getRepalBillStatus() + 1 : repalBill.getRepalBillStatus());
  185. if (RepalBillStatusEnum.PROGRESSING.getCode().equals(vo.getRepalOverdueStatus()) && LocalDate.now().plusDays(3).equals(vo.getEndDate())) {
  186. vo.setRepalOverdueStatus(2);
  187. }
  188. vo.setCustName(repalBill.getCustomerName());
  189. vo.setCustProperty(custMap.get(repalBill.getCustomerId()));
  190. vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString());
  191. vo.setReceivableMoneyStr(repalBill.getReceivable().stripTrailingZeros().toPlainString());
  192. // 评分趋势
  193. vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade()));
  194. if (Objects.nonNull(repalBill.getDiagnosisScore())) {
  195. vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString());
  196. }
  197. RepalBillRemindUnReadVO unReadVO = unreadMap.get(vo.getRepalBillId());
  198. if (Objects.nonNull(unReadVO)) {
  199. vo.setDynamicCountList(new ArrayList<Integer>(){{
  200. add(unReadVO.getUnreadRiskCount());
  201. add(unReadVO.getUnreadFinanceCount());
  202. add(unReadVO.getUnreadRankCount());
  203. add(unReadVO.getUnreadOverdueCount());
  204. }});
  205. }
  206. return vo;
  207. }).collect(Collectors.toList()));
  208. return infoVO;
  209. }
  210. @Override
  211. public VOPage<RepalBillPageVO> searchBill(SearchBillDTO dto) {
  212. long userId = UserContextUtil.getUser().getUserId();
  213. Long groupId = repalGroupMemberService.getUserGroupId(userId);
  214. VOPage<RepalBillPageVO> voPage = new VOPage<>();
  215. voPage.setPageSize(dto.getPageSize());
  216. voPage.setPageNum(dto.getPageNum());
  217. // 分页数据
  218. Page<RepalBill> repalBillPage = new Page<>(dto.getPageNum(),dto.getPageSize());
  219. SearchBillPageBO searchBillPageBO = new SearchBillPageBO();
  220. if (Objects.isNull(dto.getRepalBillType())) {
  221. searchBillPageBO.setReceivableFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIVABLE.getCode()));
  222. searchBillPageBO.setReceiptFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIPT.getCode()));
  223. } else {
  224. if (RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType())) {
  225. searchBillPageBO.setReceivableFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIVABLE.getCode()));
  226. searchBillPageBO.setReceiptFlag(false);
  227. } else {
  228. searchBillPageBO.setReceivableFlag(false);
  229. searchBillPageBO.setReceiptFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIPT.getCode()));
  230. }
  231. }
  232. searchBillPageBO.setUserId(userId);
  233. searchBillPageBO.setRepalGroupId(groupId);
  234. searchBillPageBO.setRepalBookId(dto.getRepalBookId());
  235. repalBillPage = repalBillMapper.searchPage(repalBillPage, searchBillPageBO);
  236. voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages()));
  237. voPage.setTotalNum(repalBillPage.getTotal());
  238. voPage.setDataList(new ArrayList<>());
  239. if (CollUtil.isEmpty(repalBillPage.getRecords())) {
  240. return voPage;
  241. }
  242. // 未读消息
  243. List<Long> billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList());
  244. Map<Long, RepalBillRemindUnReadVO> unreadMap = new HashMap<>();
  245. repalBillPage.getRecords().parallelStream().forEach(repalBill -> {
  246. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId());
  247. RepalBillRemindUnReadVO readVO = repalRemindHistoryService.getBillRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(),
  248. repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(),
  249. repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(),
  250. null, null);
  251. unreadMap.put(repalBill.getId(), readVO);
  252. });
  253. Map<Long, List<String>> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList);
  254. List<RepalCustomer> customerList = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId,
  255. repalBillPage.getRecords().stream().map(RepalBill::getCustomerId).distinct().collect(Collectors.toList())));
  256. Map<Long, Integer> custMap = customerList.stream().collect(Collectors.toMap(RepalCustomer::getCustId, RepalCustomer::getCustProperty));
  257. voPage.setDataList(repalBillPage.getRecords().stream().map(repalBill -> {
  258. RepalBillPageVO vo = new RepalBillPageVO();
  259. BeanUtils.copyProperties(repalBill, vo);
  260. vo.setRepalBillId(repalBill.getId());
  261. if (nameMap.containsKey(repalBill.getId())) {
  262. vo.setResponsiblePersonNames(String.join("、", nameMap.get(repalBill.getId())));
  263. }
  264. vo.setRepalOverdueStatus(repalBill.getRepalBillStatus() > 1 ? repalBill.getRepalBillStatus() + 1 : repalBill.getRepalBillStatus());
  265. vo.setCustName(repalBill.getCustomerName());
  266. vo.setCustProperty(custMap.get(repalBill.getCustomerId()));
  267. vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString());
  268. vo.setReceivableMoneyStr(repalBill.getReceivable().stripTrailingZeros().toPlainString());
  269. // 评分趋势
  270. vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade()));
  271. if (Objects.nonNull(repalBill.getDiagnosisScore())) {
  272. vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString());
  273. }
  274. RepalBillRemindUnReadVO unReadVO = unreadMap.get(vo.getRepalBillId());
  275. if (Objects.nonNull(unReadVO)) {
  276. vo.setDynamicCountList(new ArrayList<Integer>(){{
  277. add(unReadVO.getUnreadRiskCount());
  278. add(unReadVO.getUnreadFinanceCount());
  279. add(unReadVO.getUnreadRankCount());
  280. add(unReadVO.getUnreadOverdueCount());
  281. }});
  282. }
  283. return vo;
  284. }).collect(Collectors.toList()));
  285. return voPage;
  286. }
  287. @Override
  288. public RepalBillDetailVO getRepalBillDetail(Long repalBillId) {
  289. RepalBill repalBill = this.getById(repalBillId);
  290. // 负责人或高级权限才能查看
  291. boolean queryAllFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  292. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.QUERY_ALL_RECEIVABLE.getCode() : PermissionEnum.QUERY_ALL_RECEIPT.getCode());
  293. if (!queryAllFlag &&!repalResponsiblePersonService.getResponsiblePersonId(repalBillId).contains(UserContextUtil.getUser().getUserId())) {
  294. throw new CommonException(CodeMsg.FAILED, "没有查看权限");
  295. }
  296. RepalBillDetailVO vo = new RepalBillDetailVO();
  297. BeanUtils.copyProperties(repalBill, vo);
  298. vo.setRepalBillId(repalBill.getId());
  299. RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId());
  300. vo.setCompanyId(repalCustomer.getCompanyId());
  301. vo.setCustProperty(repalCustomer.getCustProperty());
  302. List<String> nameList = repalResponsiblePersonService.getResponsiblePersonName(vo.getRepalBillId());
  303. if (CollUtil.isNotEmpty(nameList)) {
  304. vo.setResponsiblePersonNames(CollUtil.isEmpty(nameList) ? "" : String.join("、", nameList));
  305. }
  306. vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString());
  307. vo.setReceiptStr(repalBill.getReceipt().stripTrailingZeros().toPlainString());
  308. vo.setReceivableStr(repalBill.getReceivable().stripTrailingZeros().toPlainString());
  309. // 评分趋势
  310. vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade()));
  311. if (Objects.nonNull(repalBill.getDiagnosisScore())) {
  312. vo.setDiagnosisGradeDesc(DiagnosisUtil.getGradeConclusion(repalBill.getDiagnosisScore()));
  313. vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString());
  314. }
  315. // companyId
  316. if (StrUtil.isNotBlank(vo.getCompanyId())) {
  317. // 财产数量
  318. ApiDataResult<List<FinanceDynamicNumVO>> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(vo.getCompanyId())));
  319. if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) {
  320. vo.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum());
  321. }
  322. // 风险数量
  323. ApiDataResult<List<CompanyRiskNumVO>> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(vo.getCompanyId())));
  324. if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) {
  325. vo.setRiskNum(riskResult.getData().get(0).getRiskNum());
  326. }
  327. // 失信限高标签
  328. ApiDataResult<List<CreditPunishmentLabelListVO>> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(vo.getCompanyId())));
  329. if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) {
  330. vo.setLabelList(labelResult.getData().get(0).getLabelList());
  331. }
  332. }
  333. if (Objects.nonNull(repalBill.getDiagnosisId())) {
  334. RepalBillDiagnosis repalBillDiagnosis = repalBillDiagnosisService.getById(repalBill.getDiagnosisId());
  335. if (Objects.nonNull(repalBillDiagnosis)) {
  336. ApiDataResult<DiagnosisRecordVO> apiDataResult = inCaseService.getRecordVO(repalBillDiagnosis.getBizId());
  337. if (Objects.nonNull(apiDataResult)) {
  338. vo.setAnalysisList(DiagnosisUtil.convertItemToList(apiDataResult.getData().getResultItem()));
  339. }
  340. }
  341. }
  342. // 合同
  343. if (StrUtil.isNotBlank(repalBill.getContractUrl())) {
  344. List<String> urlList = Arrays.stream(repalBill.getContractUrl().split(";")).collect(Collectors.toList());
  345. vo.setContractList(urlList.stream().map(s -> {
  346. RepalBillDetailVO.BillContract billContract = new RepalBillDetailVO.BillContract();
  347. billContract.setContractUrl(s);
  348. billContract.setContractName(s.substring(s.lastIndexOf("/") + 1));
  349. return billContract;
  350. }).collect(Collectors.toList()));
  351. }
  352. if (RepalBillStatusEnum.OVERDUE.getCode().equals(repalBill.getRepalBillStatus())) {
  353. if (Objects.nonNull(repalBill.getEndDate())) {
  354. if (LocalDate.now().isAfter(repalBill.getEndDate()) || LocalDate.now().compareTo(repalBill.getEndDate()) == 0) {
  355. // 避免天数出现负数
  356. vo.setOverdueDay(Math.toIntExact(LocalDate.now().toEpochDay() - repalBill.getEndDate().toEpochDay()) + 1);
  357. }
  358. }
  359. }
  360. List<RepalChangeRecord> repalChangeRecordList = repalChangeRecordService.list(Wrappers.lambdaQuery(RepalChangeRecord.class)
  361. .eq(RepalChangeRecord::getRepalBillId, vo.getRepalBillId())
  362. .eq(RepalChangeRecord::getDeleted, DeletedStatusEnum.NORMAL.getCode()));
  363. if (CollUtil.isNotEmpty(repalChangeRecordList)) {
  364. vo.setChangeList(repalChangeRecordList.stream().map(t -> {
  365. RepalBillDetailVO.BillMoneyChange billMoneyChange = new RepalBillDetailVO.BillMoneyChange();
  366. billMoneyChange.setChangeTime(t.getTimeCreated());
  367. billMoneyChange.setChangeDesc(t.getOperUserName() + " 增加回款 " + t.getTransMoney().stripTrailingZeros().toPlainString());
  368. return billMoneyChange;
  369. }).collect(Collectors.toList()));
  370. }
  371. return vo;
  372. }
  373. @Override
  374. @Transactional(rollbackFor = Exception.class)
  375. public Boolean deleteRepalBillById(DeleteRepalBillDTO dto) {
  376. RepalBill repalBill = this.getById(dto.getRepalBillId());
  377. if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  378. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  379. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  380. }
  381. this.update(Wrappers.lambdaUpdate(RepalBill.class).eq(RepalBill::getId, dto.getRepalBillId())
  382. .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode()));
  383. // 删除关联人
  384. repalResponsiblePersonService.deletePersonByBillId(dto.getRepalBillId());
  385. return true;
  386. }
  387. @Override
  388. @Transactional(rollbackFor = Exception.class)
  389. public Boolean settleRepalBillById(SettleRepalBillDTO dto) {
  390. long userId = UserContextUtil.getUser().getUserId();
  391. RepalBill repalBill = this.getById(dto.getRepalBillId());
  392. if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  393. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  394. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  395. }
  396. // 结清tag
  397. boolean success = false;
  398. // 金额溢出
  399. if (dto.getMoney().compareTo(repalBill.getReceivable()) >= 0) {
  400. dto.setMoney(repalBill.getReceivable());
  401. success = true;
  402. }
  403. RepalGroupMember member = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
  404. .eq(RepalGroupMember::getRepalGroupId, repalGroupMemberService.getUserGroupId(userId))
  405. .eq(RepalGroupMember::getUserId, userId)
  406. .eq(RepalGroupMember::getDeleted, DeletedStatusEnum.NORMAL.getCode()));
  407. if (Objects.isNull(member)) {
  408. throw new CommonException(CodeMsg.FAILED, "成员信息错误");
  409. }
  410. RepalChangeRecord changeRecord = new RepalChangeRecord();
  411. changeRecord.setRepalBookId(repalBill.getRepalBookId());
  412. changeRecord.setRepalBillId(repalBill.getId());
  413. changeRecord.setAfterMoney(repalBill.getReceivable().subtract(dto.getMoney()));
  414. changeRecord.setPreMoney(repalBill.getReceivable());
  415. changeRecord.setTransMoney(dto.getMoney());
  416. changeRecord.setOperUserId(userId);
  417. changeRecord.setRecordDate(dto.getRecordDate());
  418. changeRecord.setOperUserName(member.getMemberUserName());
  419. repalChangeRecordService.save(changeRecord);
  420. // 重新计算金额
  421. repalBill.setReceivable(success ? BigDecimal.ZERO : repalBill.getReceivable().subtract(dto.getMoney()));
  422. repalBill.setReceipt(success ? repalBill.getTotalMoney() : repalBill.getReceipt().add(dto.getMoney()));
  423. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  424. .eq(RepalBill::getId, repalBill.getId())
  425. .set(success, RepalBill::getRepalBillStatus, RepalBillStatusEnum.SUCCESS.getCode())
  426. .set(RepalBill::getReceivable, repalBill.getReceivable())
  427. .set(RepalBill::getReceipt, repalBill.getReceipt())
  428. .set(success, RepalBill::getSettleTime, LocalDateTime.now()));
  429. return true;
  430. }
  431. @Override
  432. @Transactional(rollbackFor = Exception.class)
  433. public Boolean addRepalBill(AddRepalBillDTO dto) {
  434. RepalCustomer customer = repalCustomerService.getById(dto.getCustomerId());
  435. if (Objects.isNull(customer)) {
  436. throw new CommonException(CodeMsg.FAILED, "客户信息错误");
  437. }
  438. long groupId = repalGroupMemberService.getUserGroupId(UserContextUtil.getUser().getUserId());
  439. // 评级flag
  440. boolean diagnosisFlag = (CustPropertyEnum.COMPANY.getCode().equals(customer.getCustProperty()) || CustPropertyEnum.GOV.getCode().equals(customer.getCustProperty()))
  441. && RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType());
  442. if (diagnosisFlag && StrUtil.isBlank(customer.getCompanyId())) {
  443. throw new CommonException(CodeMsg.FAILED, "公司信息错误");
  444. }
  445. if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  446. RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()) ? PermissionEnum.ADD_RECEIVABLE.getCode() : PermissionEnum.ADD_RECEIPT.getCode())) {
  447. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  448. }
  449. if (Objects.isNull(dto.getRepalBookId())) {
  450. // 新建账本
  451. RepalBook repalBook = new RepalBook();
  452. repalBook.setRepalGroupId(groupId);
  453. repalBook.setRepalBookName("默认账本");
  454. repalBook.setUserId(UserContextUtil.getUser().getUserId());
  455. repalBookService.save(repalBook);
  456. dto.setRepalBookId(repalBook.getId());
  457. }
  458. RepalBill repalBill = new RepalBill();
  459. BeanUtils.copyProperties(dto, repalBill);
  460. repalBill.setCustomerName(customer.getCustName());
  461. repalBill.setUserId(UserContextUtil.getUser().getUserId());
  462. repalBill.setRepalBillStatus(RepalBillStatusUtil.getRepalBillStatus(dto.getEndDate()));
  463. repalBill.setRepalGroupId(groupId);
  464. if (CollUtil.isNotEmpty(dto.getContractUrlList())) {
  465. repalBill.setContractUrl(String.join(";", dto.getContractUrlList()));
  466. }
  467. this.save(repalBill);
  468. if (diagnosisFlag) {
  469. // 非个人 & 应收,才会评级
  470. repalBillDiagnosisService.addRepalBillDiagnosis(repalBill.getUserId(), repalBill.getId(), dto.getTotalMoney(), Collections.singletonList(customer.getCustName()));
  471. }
  472. // 负责人
  473. if (CollUtil.isNotEmpty(dto.getResponsiblePersonIdList())) {
  474. repalResponsiblePersonService.saveBatch(dto.getResponsiblePersonIdList().stream().map(t -> {
  475. RepalResponsiblePerson person = new RepalResponsiblePerson();
  476. person.setRepalGroupId(groupId);
  477. person.setRepalBookId(dto.getRepalBookId());
  478. person.setRepalBillId(repalBill.getId());
  479. person.setUserId(t);
  480. return person;
  481. }).collect(Collectors.toList()));
  482. }
  483. return true;
  484. }
  485. @Override
  486. @Transactional(rollbackFor = Exception.class)
  487. public Boolean breakRepalBill(BreakRepalBillDTO dto) {
  488. RepalBill repalBill = this.getById(dto.getRepalBillId());
  489. if (Objects.isNull(repalBill)) {
  490. throw new CommonException(CodeMsg.FAILED, "账款错误");
  491. }
  492. if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  493. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  494. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  495. }
  496. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  497. .eq(RepalBill::getId, dto.getRepalBillId())
  498. .set(RepalBill::getRepalBillStatus, RepalBillStatusEnum.END.getCode())
  499. .set(StrUtil.isNotBlank(dto.getBreakReason()), RepalBill::getBreakReason, dto.getBreakReason()));
  500. return true;
  501. }
  502. @Override
  503. @Transactional(rollbackFor = Exception.class)
  504. public Boolean updateRepalBill(UpdateRepalBillDTO dto) {
  505. RepalBill repalBill = this.getById(dto.getRepalBillId());
  506. if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(),
  507. RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) {
  508. throw new CommonException(CodeMsg.FAILED, "无对应权限");
  509. }
  510. // 责任人
  511. List<Long> currentIdList = repalResponsiblePersonService.getResponsiblePersonId(repalBill.getId());
  512. List<Long> difference = new ArrayList<>(CollUtil.disjunction(dto.getResponsiblePersonIdList(), currentIdList));
  513. if (CollUtil.isNotEmpty(difference)) {
  514. for (Long aLong : difference) {
  515. if (currentIdList.contains(aLong)) {
  516. // 移除
  517. repalResponsiblePersonService.update(Wrappers.lambdaUpdate(RepalResponsiblePerson.class)
  518. .eq(RepalResponsiblePerson::getRepalBillId, repalBill.getId())
  519. .eq(RepalResponsiblePerson::getUserId, aLong)
  520. .set(RepalResponsiblePerson::getDeleted, DeletedStatusEnum.DELETE.getCode()));
  521. }
  522. if (dto.getResponsiblePersonIdList().contains(aLong)) {
  523. // 新增
  524. RepalResponsiblePerson person = new RepalResponsiblePerson();
  525. person.setRepalBillId(repalBill.getId());
  526. person.setRepalBookId(repalBill.getRepalBookId());
  527. person.setRepalGroupId(repalBill.getRepalGroupId());
  528. person.setUserId(aLong);
  529. repalResponsiblePersonService.save(person);
  530. }
  531. }
  532. }
  533. if (LocalDate.now().isBefore(dto.getEndDate())) {
  534. // 逾期
  535. repalBill.setRepalBillStatus(RepalBillStatusEnum.OVERDUE.getCode());
  536. }
  537. repalBill.setTotalMoney(new BigDecimal(dto.getTotalMoneyStr()));
  538. if (repalBill.getReceipt().compareTo(repalBill.getTotalMoney()) >= 0) {
  539. // 收回了
  540. repalBill.setRefreshStatus(RepalBillStatusEnum.SUCCESS.getCode());
  541. repalBill.setReceivable(BigDecimal.ZERO);
  542. }
  543. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  544. .eq(RepalBill::getId, repalBill.getId())
  545. .set(RepalBill::getEndDate, dto.getEndDate())
  546. .set(RepalBill::getRepalBillStatus, repalBill.getRepalBillStatus())
  547. .set(RepalBill::getRepalBillStage, dto.getRepalBillStage())
  548. .set(RepalBill::getBillRemark, dto.getBillRemark())
  549. .set(RepalBill::getTotalMoney, repalBill.getTotalMoney())
  550. .set(RepalBill::getReceivable, repalBill.getReceivable()));
  551. return true;
  552. }
  553. @Override
  554. @Transactional(rollbackFor = Exception.class)
  555. public Boolean deleteRepalBillByBookId(Long repalBookId) {
  556. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  557. .eq(RepalBill::getRepalBookId, repalBookId)
  558. .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode()));
  559. // 责任人也删除
  560. repalResponsiblePersonService.deletePersonByBookId(repalBookId);
  561. return true;
  562. }
  563. @Override
  564. public boolean checkAllBillRefreshStatus(Long repalBookId, Long repalBillId) {
  565. LambdaQueryWrapper<RepalBill> qw = Wrappers.lambdaQuery(RepalBill.class);
  566. qw.eq(RepalBill::getRepalBookId,repalBookId);
  567. qw.ne(RepalBill::getId,repalBillId);
  568. List<RepalBill> results = list(qw);
  569. for(RepalBill accountBill:results){
  570. if(!RefreshStatusEnum.REFRESH_SUCCESS.getCode().equals(accountBill.getRefreshStatus())){
  571. return false;
  572. }
  573. }
  574. return true;
  575. }
  576. @Override
  577. public VOPage<RepalBillPageVO> getCustRepalBillPage(Integer pageNum, Integer pageSize, Long custId) {
  578. VOPage<RepalBillPageVO> voPage = new VOPage<>();
  579. voPage.setPageSize(pageSize);
  580. voPage.setPageNum(pageNum);
  581. // 分页数据
  582. Page<RepalBill> repalBillPage = new Page<>(pageNum,pageSize);
  583. repalBillPage = repalBillMapper.getCustRepalBillPage(repalBillPage,custId);
  584. voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages()));
  585. voPage.setTotalNum(repalBillPage.getTotal());
  586. voPage.setDataList(new ArrayList<>());
  587. if (CollUtil.isEmpty(repalBillPage.getRecords())) {
  588. return voPage;
  589. }
  590. // 未读消息
  591. List<Long> billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList());
  592. long userId = UserContextUtil.getUser().getUserId();
  593. Map<Long, RepalBillRemindUnReadVO> unreadMap = new HashMap<>();
  594. repalBillPage.getRecords().parallelStream().forEach(repalBill -> {
  595. RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId());
  596. RepalBillRemindUnReadVO readVO = repalRemindHistoryService.getBillRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(),
  597. repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId()
  598. ,repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(),
  599. null, null);
  600. unreadMap.put(repalBill.getId(), readVO);
  601. });
  602. Map<Long, List<String>> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList);
  603. List<RepalCustomer> customerList = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId,
  604. repalBillPage.getRecords().stream().map(RepalBill::getCustomerId).distinct().collect(Collectors.toList())));
  605. Map<Long, Integer> custMap = customerList.stream().collect(Collectors.toMap(RepalCustomer::getCustId, RepalCustomer::getCustProperty));
  606. voPage.setDataList(repalBillPage.getRecords().stream().map(t -> {
  607. RepalBillPageVO vo = new RepalBillPageVO();
  608. BeanUtils.copyProperties(t, vo);
  609. vo.setRepalBillId(t.getId());
  610. if(nameMap.containsKey(t.getId())) {
  611. vo.setResponsiblePersonNames(String.join("、", nameMap.get(t.getId())));
  612. }
  613. vo.setRepalOverdueStatus(t.getRepalBillStatus() > 1 ? t.getRepalBillStatus() + 1 : t.getRepalBillStatus());
  614. if (RepalBillStatusEnum.PROGRESSING.getCode().equals(vo.getRepalOverdueStatus()) && LocalDate.now().plusDays(3).equals(vo.getEndDate())) {
  615. vo.setRepalOverdueStatus(2);
  616. }
  617. vo.setCustName(t.getCustomerName());
  618. vo.setCustProperty(custMap.get(t.getCustomerId()));
  619. vo.setTotalMoneyStr(t.getTotalMoney().stripTrailingZeros().toPlainString());
  620. vo.setReceivableMoneyStr(t.getReceivable().stripTrailingZeros().toPlainString());
  621. // 评分趋势
  622. vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(t.getPreDiagnosisScore(), t.getDiagnosisScore(), t.getPreDiagnosisGrade(), t.getDiagnosisGrade()));
  623. if (Objects.nonNull(t.getDiagnosisScore())) {
  624. vo.setDiagnosisScore(t.getDiagnosisScore().stripTrailingZeros().toPlainString());
  625. }
  626. RepalBillRemindUnReadVO unReadVO = unreadMap.get(vo.getRepalBillId());
  627. if (Objects.nonNull(unReadVO)) {
  628. vo.setDynamicCountList(new ArrayList<Integer>(){{
  629. add(unReadVO.getUnreadRiskCount());
  630. add(unReadVO.getUnreadFinanceCount());
  631. add(unReadVO.getUnreadRankCount());
  632. add(unReadVO.getUnreadOverdueCount());
  633. }});
  634. }
  635. return vo;
  636. }).collect(Collectors.toList()));
  637. return voPage;
  638. }
  639. @Override
  640. public RepalManageBillInfoVO queryManageInfo() {
  641. //权限
  642. UserContextBO userContextBO = UserContextUtil.getUser();
  643. boolean allFlag = repalRolePermissionService.checkUserPermission(userContextBO.getUserId(),PermissionEnum.QUERY_ALL_URGE.getCode());
  644. //查询组织编号
  645. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class).eq(RepalGroupMember::getUserId,userContextBO.getUserId()).eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  646. if(ObjectUtil.isNull(repalGroupMember)){
  647. throw new CommonException(CodeMsg.FAILED,"您还未加入该组织,请联系超级管理员");
  648. }
  649. LocalDate startTime = LocalDate.now().plusDays(7);
  650. ManageBillInfoBO manageBillInfo = repalBillMapper.getManageBillInfo(allFlag,userContextBO.getUserId(),repalGroupMember.getRepalGroupId(),startTime);
  651. RepalManageBillInfoVO repalManageBillInfoVO = new RepalManageBillInfoVO();
  652. if(ObjectUtil.isNull(manageBillInfo.getTotalMoney()) || NumberUtil.equals(BigDecimal.ZERO,manageBillInfo.getTotalMoney())){
  653. repalManageBillInfoVO.setOverdueScaleStr("0");
  654. repalManageBillInfoVO.setTotalOverdueCount(0);
  655. repalManageBillInfoVO.setTotalOverdueStr("0");
  656. repalManageBillInfoVO.setTotalOverdueWeekCount(0);
  657. repalManageBillInfoVO.setTotalOverdueWeekStr("0");
  658. }else {
  659. repalManageBillInfoVO.setTotalOverdueCount(manageBillInfo.getTotalOverdueCount());
  660. repalManageBillInfoVO.setTotalOverdueStr(manageBillInfo.getTotalOverdue().toPlainString());
  661. repalManageBillInfoVO.setTotalOverdueWeekCount(manageBillInfo.getTotalOverdueWeekCount());
  662. repalManageBillInfoVO.setTotalOverdueWeekStr(manageBillInfo.getTotalOverdueWeek().toPlainString());
  663. repalManageBillInfoVO.setOverdueScaleStr(manageBillInfo.getTotalOverdue().divide(manageBillInfo.getTotalMoney(),2, RoundingMode.HALF_UP).toPlainString());
  664. }
  665. return repalManageBillInfoVO;
  666. }
  667. @Override
  668. public VOPage<RepalManageBillPageVO> queryManageBillPage(Integer pageNum, Integer pageSize) {
  669. //权限
  670. UserContextBO userContextBO = UserContextUtil.getUser();
  671. boolean allFlag = repalRolePermissionService.checkUserPermission(userContextBO.getUserId(),PermissionEnum.QUERY_ALL_URGE.getCode());
  672. //查询组织编号
  673. RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class).eq(RepalGroupMember::getUserId,userContextBO.getUserId()).eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
  674. if(ObjectUtil.isNull(repalGroupMember)){
  675. throw new CommonException(CodeMsg.FAILED,"您还未加入该组织,请联系超级管理员");
  676. }
  677. LocalDate startTime = LocalDate.now().plusDays(7);
  678. VOPage<RepalManageBillPageVO> voPage = new VOPage<>();
  679. voPage.setPageSize(pageSize);
  680. voPage.setPageNum(pageNum);
  681. // 分页数据
  682. Page<RepalManageBillPageBO> repalBillPage = new Page<>(pageNum,pageSize);
  683. repalBillPage = repalBillMapper.getManageBillPage(repalBillPage,allFlag,userContextBO.getUserId(),repalGroupMember.getRepalGroupId(),startTime);
  684. voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages()));
  685. voPage.setTotalNum(repalBillPage.getTotal());
  686. voPage.setDataList(new ArrayList<>());
  687. if (CollUtil.isEmpty(repalBillPage.getRecords())) {
  688. return voPage;
  689. }
  690. List<RepalManageBillPageVO> vos = new ArrayList<>();
  691. voPage.setDataList(vos);
  692. Map<Long,List<ResponsiblePersonNameVO>> personMap= repalResponsiblePersonMapper.getResponsiblePersonNameList(repalBillPage.getRecords().stream().map(RepalManageBillPageBO::getRepalBillId).collect(Collectors.toList())).stream().collect(Collectors.groupingBy(ResponsiblePersonNameVO::getRepalBillId));
  693. for(RepalManageBillPageBO manageBillPageBO:repalBillPage.getRecords()){
  694. RepalManageBillPageVO vo = new RepalManageBillPageVO();
  695. vos.add(vo);
  696. BeanUtils.copyProperties(manageBillPageBO,vo);
  697. vo.setOverdueDay(Math.abs(manageBillPageBO.getEndDate().toEpochDay() - LocalDate.now().toEpochDay()));
  698. vo.setTotalMoneyStr(manageBillPageBO.getTotalMoney().stripTrailingZeros().toPlainString());
  699. vo.setReceivableStr(manageBillPageBO.getReceivable().stripTrailingZeros().toPlainString());
  700. //负责人
  701. if(personMap.containsKey(manageBillPageBO.getRepalBillId())){
  702. List<ResponsiblePersonNameVO> personNames = personMap.get(manageBillPageBO.getRepalBillId());
  703. vo.setResponsiblePersonName(personNames.stream().map(ResponsiblePersonNameVO::getUserName).collect(Collectors.toList()));
  704. }
  705. //催款动态条数
  706. int dynamicCount = repalDynamicService.count(Wrappers.lambdaQuery(RepalDynamic.class).eq(RepalDynamic::getRepalBillId,manageBillPageBO.getRepalBillId()));
  707. vo.setRepalDynamicCount(dynamicCount);
  708. }
  709. return voPage;
  710. }
  711. @Override
  712. public RepalManageBillDetailVO querManageBillDetail(Long repalBillId) {
  713. //不校验权限,默认看到列表的时候已经通过
  714. RepalBill repalBill = this.getById(repalBillId);
  715. RepalManageBillDetailVO vo = new RepalManageBillDetailVO();
  716. BeanUtils.copyProperties(repalBill, vo);
  717. vo.setCustId(repalBill.getCustomerId());
  718. vo.setRepalBillId(repalBill.getId());
  719. RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId());
  720. vo.setCompanyId(repalCustomer.getCompanyId());
  721. vo.setCustProperty(repalCustomer.getCustProperty());
  722. List<String> nameList = repalResponsiblePersonService.getResponsiblePersonName(vo.getRepalBillId());
  723. vo.setResponsiblePersonName(nameList);
  724. vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString());
  725. vo.setReceiptStr(repalBill.getReceipt().stripTrailingZeros().toPlainString());
  726. vo.setReceivableStr(repalBill.getReceivable().stripTrailingZeros().toPlainString());
  727. vo.setOverdueDay(Math.abs(LocalDate.now().toEpochDay()-repalBill.getEndDate().toEpochDay()));
  728. // 评分趋势
  729. vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade()));
  730. if (Objects.nonNull(repalBill.getDiagnosisScore())) {
  731. vo.setDiagnosisGradeDesc(DiagnosisUtil.getGradeConclusion(repalBill.getDiagnosisScore()));
  732. vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString());
  733. }
  734. // companyId
  735. if (StrUtil.isNotBlank(vo.getCompanyId())) {
  736. // 财产数量
  737. ApiDataResult<List<FinanceDynamicNumVO>> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(vo.getCompanyId())));
  738. if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) {
  739. vo.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum());
  740. }
  741. // 风险数量
  742. ApiDataResult<List<CompanyRiskNumVO>> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(vo.getCompanyId())));
  743. if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) {
  744. vo.setRiskNum(riskResult.getData().get(0).getRiskNum());
  745. }
  746. // 失信限高标签
  747. ApiDataResult<List<CreditPunishmentLabelListVO>> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(vo.getCompanyId())));
  748. if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) {
  749. vo.setLabelList(labelResult.getData().get(0).getLabelList());
  750. }
  751. }
  752. //查询套餐剩余qingk
  753. RepalVip repalVip = repalVipService.getOne(Wrappers.lambdaQuery(RepalVip.class).eq(RepalVip::getRepalGroupId,repalCustomer.getRepalGroupId()),false);
  754. RepalVipVO repalVipVO = new RepalVipVO();
  755. if(ObjectUtil.isNotNull(repalVip)){
  756. BeanUtils.copyProperties(repalVip,repalVipVO);
  757. }
  758. vo.setRepalVip(repalVipVO);
  759. //查询催款动态列表
  760. List<RepalDynamic> dynamics = repalDynamicService.list(Wrappers.lambdaQuery(RepalDynamic.class).eq(RepalDynamic::getRepalBillId,repalBillId).orderByDesc(RepalDynamic::getId));
  761. if(CollUtil.isNotEmpty(dynamics)){
  762. List<RepalDynamicVO> repalDynamicVOs = new ArrayList<>(dynamics.size());
  763. vo.setRepalDynamics(repalDynamicVOs);
  764. Map<Long,RepalGroupMember> memberMap = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class).in(RepalGroupMember::getUserId,dynamics.stream().map(RepalDynamic::getMemberId).distinct().collect(Collectors.toList()))).stream().collect(Collectors.toMap(RepalGroupMember::getUserId,Function.identity()));
  765. for(RepalDynamic dynamic:dynamics){
  766. RepalDynamicVO repalDynamicVO = new RepalDynamicVO();
  767. repalDynamicVOs.add(repalDynamicVO);
  768. BeanUtils.copyProperties(dynamic,repalDynamicVO);
  769. if(memberMap.containsKey(dynamic.getMemberId())){
  770. RepalGroupMember repalGroupMember = memberMap.get(dynamic.getMemberId());
  771. repalDynamicVO.setMemberUserName(repalGroupMember.getMemberUserName());
  772. }
  773. }
  774. }
  775. return vo;
  776. }
  777. @Override
  778. public List<Long> getBillIdListByBookId(Long repalBookId, Long userId) {
  779. return repalBillMapper.getBillIdListByBookId(repalBookId, userId);
  780. }
  781. @Override
  782. public List<String> getBillGradeByBookId(Long repalBookId, Long userId, LocalDateTime start, LocalDateTime end) {
  783. return repalBillMapper.getBillGradeByBookId(repalBookId, userId, start, end);
  784. }
  785. @Override
  786. public HomeReceivableBO getBillTotal(Integer repalBillStatus, Long userId, Long repalBookId, Integer repalBillType, LocalDateTime start, LocalDateTime end) {
  787. return repalBillMapper.getBillTotal(repalBillStatus, userId, repalBookId, repalBillType, start, end);
  788. }
  789. @Override
  790. @Transactional(rollbackFor = Exception.class)
  791. public Boolean transferBill(TransferBillDTO dto) {
  792. // 账款创建人
  793. this.update(Wrappers.lambdaUpdate(RepalBill.class)
  794. .eq(RepalBill::getUserId, dto.getUserId())
  795. .set(RepalBill::getUserId, dto.getTransferUserId()));
  796. // 账款负责人
  797. repalResponsiblePersonService.update(Wrappers.lambdaUpdate(RepalResponsiblePerson.class)
  798. .eq(RepalResponsiblePerson::getUserId, dto.getUserId())
  799. .set(RepalResponsiblePerson::getUserId, dto.getTransferUserId()));
  800. // 客户负责人
  801. repalCustChargeRelService.update(Wrappers.lambdaUpdate(RepalCustChargeRel.class)
  802. .eq(RepalCustChargeRel::getMemberUserId, dto.getUserId())
  803. .set(RepalCustChargeRel::getMemberUserId, dto.getTransferUserId()));
  804. return true;
  805. }
  806. }