RepalBillServiceImpl.java 61 KB

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