RepalBillServiceImpl.java 39 KB

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