package com.winhc.repal.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.winhc.common.base.ApiDataResult; import com.winhc.common.enums.CodeMsg; import com.winhc.common.exception.CommonException; import com.winhc.common.model.base.VOPage; import com.winhc.repal.cloud.DataMiddlewareService; import com.winhc.repal.cloud.InCaseService; import com.winhc.repal.cloud.dto.GetCompanyRiskNumDTO; import com.winhc.repal.cloud.dto.GetCreditPunishmentLabelDTO; import com.winhc.repal.cloud.dto.GetFinanceDynamicNumDTO; import com.winhc.repal.cloud.vo.CompanyRiskNumVO; import com.winhc.repal.cloud.vo.CreditPunishmentLabelListVO; import com.winhc.repal.cloud.vo.DiagnosisRecordVO; import com.winhc.repal.cloud.vo.FinanceDynamicNumVO; import com.winhc.repal.entity.*; import com.winhc.repal.enums.*; import com.winhc.repal.model.bo.*; import com.winhc.repal.model.dto.*; import com.winhc.repal.model.vo.*; import com.winhc.repal.repository.RepalBillMapper; import com.winhc.repal.repository.RepalResponsiblePersonMapper; import com.winhc.repal.service.*; import com.winhc.repal.util.DiagnosisUtil; import com.winhc.repal.util.RepalBillStatusUtil; import com.winhc.repal.util.UserContextUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @description RepalBill 接口实现类 * @author Generator * @date 2022-04-08 */ @Service public class RepalBillServiceImpl extends ServiceImpl implements RepalBillService { public static final Logger LOGGER = LoggerFactory.getLogger(RepalBillServiceImpl.class); @Autowired private RepalBillMapper repalBillMapper; @Autowired private RepalResponsiblePersonService repalResponsiblePersonService; @Autowired private RepalGroupMemberService repalGroupMemberService; @Autowired private RepalCustomerService repalCustomerService; @Autowired private DataMiddlewareService dataMiddlewareService; @Autowired private InCaseService inCaseService; @Autowired private RepalBillDiagnosisService repalBillDiagnosisService; @Autowired private RepalChangeRecordService repalChangeRecordService; @Autowired private RepalBookService repalBookService; @Autowired private RepalRolePermissionService repalRolePermissionService; @Autowired private RepalRemindHistoryService repalRemindHistoryService; @Autowired private RepalRemindReadInfoService repalRemindReadInfoService; @Autowired private RepalBillOperLogService repalBillOperLogService; @Autowired private UserExtService userExtService; @Autowired private RepalResponsiblePersonMapper repalResponsiblePersonMapper; @Autowired private RepalDynamicService repalDynamicService; @Autowired private RepalVipService repalVipService; @Autowired private RepalCustChargeRelService repalCustChargeRelService; @Override public RepalBillInfoVO getRepalBillPage(GetRepalBillPageDTO dto) { long userId = UserContextUtil.getUser().getUserId(); Long groupId = repalGroupMemberService.getUserGroupId(userId); VOPage voPage = new VOPage<>(); voPage.setPageSize(dto.getPageSize()); voPage.setPageNum(dto.getPageNum()); RepalBillInfoVO infoVO = new RepalBillInfoVO(); boolean allFlag = repalRolePermissionService.checkUserPermission(userId, RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()) ? PermissionEnum.QUERY_ALL_RECEIVABLE.getCode() : PermissionEnum.QUERY_ALL_RECEIPT.getCode()); LOGGER.info("allFlag:[{}]", allFlag); TotalMoneyBO totalMoneyBO; TotalMoneyBO overdueBO; TotalMoneyBO totalBO; if (allFlag) { totalMoneyBO = repalBillMapper.getTotalMoneyByGroup(groupId, dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId()); overdueBO = repalBillMapper.getTotalMoneyByGroup(groupId, dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId()); totalBO = repalBillMapper.getTotalMoneyByGroup(groupId, dto.getRepalBillType(), null, dto.getRepalBookId()); } else { // 只查询自己负责的 totalMoneyBO = repalBillMapper.getTotalMoneyByUser(userId, groupId, dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId()); overdueBO = repalBillMapper.getTotalMoneyByUser(userId, groupId, dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId()); totalBO = repalBillMapper.getTotalMoneyByUser(userId, groupId, dto.getRepalBillType(), null, dto.getRepalBookId()); } infoVO.setTotalBillMoneyStr(totalMoneyBO.getTotalMoney().stripTrailingZeros().toPlainString()); infoVO.setTotalBillCount(totalMoneyBO.getTotalCount()); infoVO.setTotalOverdueCount(overdueBO.getTotalCount()); infoVO.setTotalOverdueStr(overdueBO.getTotalMoney().stripTrailingZeros().toPlainString()); infoVO.setTotalCount(totalBO.getTotalCount()); infoVO.setTotalStr(totalBO.getTotalMoney().stripTrailingZeros().toPlainString()); // 分页数据 Page repalBillPage = new Page<>(dto.getPageNum(),dto.getPageSize()); BillPageBO billPageBO = new BillPageBO(); BeanUtils.copyProperties(dto, billPageBO); billPageBO.setUserId(userId); billPageBO.setAllFlag(allFlag); billPageBO.setRepalGroupId(groupId); // 对应1-4到期时间 if (Objects.nonNull(dto.getOverdueType())) { switch (dto.getOverdueType()) { case 1: billPageBO.setStartDate(LocalDate.now()); billPageBO.setEndDate(billPageBO.getStartDate()); break; case 2: billPageBO.setStartDate(LocalDate.now().with(DayOfWeek.MONDAY)); billPageBO.setEndDate(LocalDate.now().with(DayOfWeek.SUNDAY)); break; case 3: billPageBO.setStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth())); billPageBO.setEndDate(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth())); case 4: billPageBO.setStartDate(LocalDate.now().with(TemporalAdjusters.firstDayOfYear())); billPageBO.setEndDate(LocalDate.now().with(TemporalAdjusters.lastDayOfYear())); break; default: break; } } repalBillPage = repalBillMapper.getRepalBillPage(repalBillPage, billPageBO); voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages())); voPage.setTotalNum(repalBillPage.getTotal()); voPage.setDataList(new ArrayList<>()); infoVO.setPage(voPage); if (CollUtil.isEmpty(repalBillPage.getRecords())) { return infoVO; } // 未读消息 List billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList()); Map unreadMap = new HashMap<>(); repalBillPage.getRecords().parallelStream().forEach(repalBill -> { RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId()); RepalBillRemindUnReadVO readVO = repalRemindHistoryService.getBillRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(), repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(), repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(), Objects.isNull(billPageBO.getStartDate()) ? null : LocalDateTime.of(billPageBO.getStartDate(), LocalTime.MIN), Objects.isNull(billPageBO.getEndDate()) ? null : LocalDateTime.of(billPageBO.getEndDate(), LocalTime.MAX)); unreadMap.put(repalBill.getId(), readVO); }); Map> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList); List customerList = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId, repalBillPage.getRecords().stream().map(RepalBill::getCustomerId).distinct().collect(Collectors.toList()))); Map custMap = customerList.stream().collect(Collectors.toMap(RepalCustomer::getCustId, RepalCustomer::getCustProperty)); voPage.setDataList(repalBillPage.getRecords().stream().map(repalBill -> { RepalBillPageVO vo = new RepalBillPageVO(); BeanUtils.copyProperties(repalBill, vo); vo.setRepalBillId(repalBill.getId()); if (nameMap.containsKey(repalBill.getId())) { vo.setResponsiblePersonNames(String.join("、", nameMap.get(repalBill.getId()))); } vo.setRepalOverdueStatus(repalBill.getRepalBillStatus() > 1 ? repalBill.getRepalBillStatus() + 1 : repalBill.getRepalBillStatus()); if (RepalBillStatusEnum.PROGRESSING.getCode().equals(vo.getRepalOverdueStatus()) && LocalDate.now().plusDays(3).equals(vo.getEndDate())) { vo.setRepalOverdueStatus(2); } vo.setCustName(repalBill.getCustomerName()); vo.setCustProperty(custMap.get(repalBill.getCustomerId())); vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString()); vo.setReceivableMoneyStr(repalBill.getReceivable().stripTrailingZeros().toPlainString()); // 评分趋势 vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade())); if (Objects.nonNull(repalBill.getDiagnosisScore())) { vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString()); } RepalBillRemindUnReadVO unReadVO = unreadMap.get(vo.getRepalBillId()); if (Objects.nonNull(unReadVO)) { vo.setDynamicCountList(new ArrayList(){{ add(unReadVO.getUnreadRiskCount()); add(unReadVO.getUnreadFinanceCount()); add(unReadVO.getUnreadRankCount()); add(unReadVO.getUnreadOverdueCount()); }}); } return vo; }).collect(Collectors.toList())); return infoVO; } @Override public VOPage searchBill(SearchBillDTO dto) { long userId = UserContextUtil.getUser().getUserId(); Long groupId = repalGroupMemberService.getUserGroupId(userId); VOPage voPage = new VOPage<>(); voPage.setPageSize(dto.getPageSize()); voPage.setPageNum(dto.getPageNum()); // 分页数据 Page repalBillPage = new Page<>(dto.getPageNum(),dto.getPageSize()); SearchBillPageBO searchBillPageBO = new SearchBillPageBO(); if (Objects.isNull(dto.getRepalBillType())) { searchBillPageBO.setReceivableFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIVABLE.getCode())); searchBillPageBO.setReceiptFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIPT.getCode())); } else { if (RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType())) { searchBillPageBO.setReceivableFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIVABLE.getCode())); searchBillPageBO.setReceiptFlag(false); } else { searchBillPageBO.setReceivableFlag(false); searchBillPageBO.setReceiptFlag(repalRolePermissionService.checkUserPermission(userId, PermissionEnum.QUERY_ALL_RECEIPT.getCode())); } } searchBillPageBO.setUserId(userId); searchBillPageBO.setRepalGroupId(groupId); searchBillPageBO.setRepalBookId(dto.getRepalBookId()); repalBillPage = repalBillMapper.searchPage(repalBillPage, searchBillPageBO); voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages())); voPage.setTotalNum(repalBillPage.getTotal()); voPage.setDataList(new ArrayList<>()); if (CollUtil.isEmpty(repalBillPage.getRecords())) { return voPage; } // 未读消息 List billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList()); Map unreadMap = new HashMap<>(); repalBillPage.getRecords().parallelStream().forEach(repalBill -> { RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId()); RepalBillRemindUnReadVO readVO = repalRemindHistoryService.getBillRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(), repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId(), repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(), null, null); unreadMap.put(repalBill.getId(), readVO); }); Map> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList); List customerList = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId, repalBillPage.getRecords().stream().map(RepalBill::getCustomerId).distinct().collect(Collectors.toList()))); Map custMap = customerList.stream().collect(Collectors.toMap(RepalCustomer::getCustId, RepalCustomer::getCustProperty)); voPage.setDataList(repalBillPage.getRecords().stream().map(repalBill -> { RepalBillPageVO vo = new RepalBillPageVO(); BeanUtils.copyProperties(repalBill, vo); vo.setRepalBillId(repalBill.getId()); if (nameMap.containsKey(repalBill.getId())) { vo.setResponsiblePersonNames(String.join("、", nameMap.get(repalBill.getId()))); } vo.setRepalOverdueStatus(repalBill.getRepalBillStatus() > 1 ? repalBill.getRepalBillStatus() + 1 : repalBill.getRepalBillStatus()); vo.setCustName(repalBill.getCustomerName()); vo.setCustProperty(custMap.get(repalBill.getCustomerId())); vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString()); vo.setReceivableMoneyStr(repalBill.getReceivable().stripTrailingZeros().toPlainString()); // 评分趋势 vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade())); if (Objects.nonNull(repalBill.getDiagnosisScore())) { vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString()); } RepalBillRemindUnReadVO unReadVO = unreadMap.get(vo.getRepalBillId()); if (Objects.nonNull(unReadVO)) { vo.setDynamicCountList(new ArrayList(){{ add(unReadVO.getUnreadRiskCount()); add(unReadVO.getUnreadFinanceCount()); add(unReadVO.getUnreadRankCount()); add(unReadVO.getUnreadOverdueCount()); }}); } return vo; }).collect(Collectors.toList())); return voPage; } @Override public RepalBillDetailVO getRepalBillDetail(Long repalBillId) { RepalBill repalBill = this.getById(repalBillId); // 负责人或高级权限才能查看 boolean queryAllFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.QUERY_ALL_RECEIVABLE.getCode() : PermissionEnum.QUERY_ALL_RECEIPT.getCode()); if (!queryAllFlag &&!repalResponsiblePersonService.getResponsiblePersonId(repalBillId).contains(UserContextUtil.getUser().getUserId())) { throw new CommonException(CodeMsg.FAILED, "没有查看权限"); } RepalBillDetailVO vo = new RepalBillDetailVO(); BeanUtils.copyProperties(repalBill, vo); vo.setRepalBillId(repalBill.getId()); RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId()); vo.setCompanyId(repalCustomer.getCompanyId()); vo.setCustProperty(repalCustomer.getCustProperty()); List nameList = repalResponsiblePersonService.getResponsiblePersonName(vo.getRepalBillId()); if (CollUtil.isNotEmpty(nameList)) { vo.setResponsiblePersonNames(CollUtil.isEmpty(nameList) ? "" : String.join("、", nameList)); } vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString()); vo.setReceiptStr(repalBill.getReceipt().stripTrailingZeros().toPlainString()); vo.setReceivableStr(repalBill.getReceivable().stripTrailingZeros().toPlainString()); // 评分趋势 vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade())); if (Objects.nonNull(repalBill.getDiagnosisScore())) { vo.setDiagnosisGradeDesc(DiagnosisUtil.getGradeConclusion(repalBill.getDiagnosisScore())); vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString()); } // companyId if (StrUtil.isNotBlank(vo.getCompanyId())) { // 财产数量 ApiDataResult> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(vo.getCompanyId()))); if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) { vo.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum()); } // 风险数量 ApiDataResult> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(vo.getCompanyId()))); if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) { vo.setRiskNum(riskResult.getData().get(0).getRiskNum()); } // 失信限高标签 ApiDataResult> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(vo.getCompanyId()))); if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) { vo.setLabelList(labelResult.getData().get(0).getLabelList()); } } if (Objects.nonNull(repalBill.getDiagnosisId())) { RepalBillDiagnosis repalBillDiagnosis = repalBillDiagnosisService.getById(repalBill.getDiagnosisId()); if (Objects.nonNull(repalBillDiagnosis)) { try { ApiDataResult apiDataResult = inCaseService.getRecordVO(repalBillDiagnosis.getBizId()); if (Objects.nonNull(apiDataResult)) { vo.setAnalysisList(DiagnosisUtil.convertItemToList(apiDataResult.getData().getResultItem())); } } catch (Exception e) { LOGGER.error("查询评估信息错误", e); } } } // 合同 if (StrUtil.isNotBlank(repalBill.getContractUrl())) { List urlList = Arrays.stream(repalBill.getContractUrl().split(";")).collect(Collectors.toList()); vo.setContractList(urlList.stream().map(s -> { RepalBillDetailVO.BillContract billContract = new RepalBillDetailVO.BillContract(); billContract.setContractUrl(s); billContract.setContractName(s.substring(s.lastIndexOf("/") + 1)); return billContract; }).collect(Collectors.toList())); } if (RepalBillStatusEnum.OVERDUE.getCode().equals(repalBill.getRepalBillStatus())) { if (Objects.nonNull(repalBill.getEndDate())) { if (LocalDate.now().isAfter(repalBill.getEndDate()) || LocalDate.now().compareTo(repalBill.getEndDate()) == 0) { // 避免天数出现负数 vo.setOverdueDay(Math.toIntExact(LocalDate.now().toEpochDay() - repalBill.getEndDate().toEpochDay()) + 1); } } } List repalChangeRecordList = repalChangeRecordService.list(Wrappers.lambdaQuery(RepalChangeRecord.class) .eq(RepalChangeRecord::getRepalBillId, vo.getRepalBillId()) .eq(RepalChangeRecord::getDeleted, DeletedStatusEnum.NORMAL.getCode())); if (CollUtil.isNotEmpty(repalChangeRecordList)) { vo.setChangeList(repalChangeRecordList.stream().map(t -> { RepalBillDetailVO.BillMoneyChange billMoneyChange = new RepalBillDetailVO.BillMoneyChange(); billMoneyChange.setChangeTime(t.getTimeCreated()); billMoneyChange.setChangeDesc(t.getOperUserName() + " 增加回款 " + t.getTransMoney().stripTrailingZeros().toPlainString()); return billMoneyChange; }).collect(Collectors.toList())); } return vo; } @Override @Transactional(rollbackFor = Exception.class) public Boolean deleteRepalBillById(DeleteRepalBillDTO dto) { RepalBill repalBill = this.getById(dto.getRepalBillId()); if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) { throw new CommonException(CodeMsg.FAILED, "无对应权限"); } this.update(Wrappers.lambdaUpdate(RepalBill.class).eq(RepalBill::getId, dto.getRepalBillId()) .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode())); // 删除关联人 repalResponsiblePersonService.deletePersonByBillId(dto.getRepalBillId()); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean settleRepalBillById(SettleRepalBillDTO dto) { long userId = UserContextUtil.getUser().getUserId(); RepalBill repalBill = this.getById(dto.getRepalBillId()); if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) { throw new CommonException(CodeMsg.FAILED, "无对应权限"); } // 结清tag boolean success = false; // 金额溢出 if (dto.getMoney().compareTo(repalBill.getReceivable()) >= 0) { dto.setMoney(repalBill.getReceivable()); success = true; } RepalGroupMember member = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class) .eq(RepalGroupMember::getRepalGroupId, repalGroupMemberService.getUserGroupId(userId)) .eq(RepalGroupMember::getUserId, userId) .eq(RepalGroupMember::getDeleted, DeletedStatusEnum.NORMAL.getCode())); if (Objects.isNull(member)) { throw new CommonException(CodeMsg.FAILED, "成员信息错误"); } RepalChangeRecord changeRecord = new RepalChangeRecord(); changeRecord.setRepalBookId(repalBill.getRepalBookId()); changeRecord.setRepalBillId(repalBill.getId()); changeRecord.setAfterMoney(repalBill.getReceivable().subtract(dto.getMoney())); changeRecord.setPreMoney(repalBill.getReceivable()); changeRecord.setTransMoney(dto.getMoney()); changeRecord.setOperUserId(userId); changeRecord.setRecordDate(dto.getRecordDate()); changeRecord.setOperUserName(member.getMemberUserName()); repalChangeRecordService.save(changeRecord); // 重新计算金额 repalBill.setReceivable(success ? BigDecimal.ZERO : repalBill.getReceivable().subtract(dto.getMoney())); repalBill.setReceipt(success ? repalBill.getTotalMoney() : repalBill.getReceipt().add(dto.getMoney())); this.update(Wrappers.lambdaUpdate(RepalBill.class) .eq(RepalBill::getId, repalBill.getId()) .set(success, RepalBill::getRepalBillStatus, RepalBillStatusEnum.SUCCESS.getCode()) .set(RepalBill::getReceivable, repalBill.getReceivable()) .set(RepalBill::getReceipt, repalBill.getReceipt()) .set(success, RepalBill::getSettleTime, LocalDateTime.now())); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean addRepalBill(AddRepalBillDTO dto) { RepalCustomer customer = repalCustomerService.getById(dto.getCustomerId()); if (Objects.isNull(customer)) { throw new CommonException(CodeMsg.FAILED, "客户信息错误"); } long groupId = repalGroupMemberService.getUserGroupId(UserContextUtil.getUser().getUserId()); // 评级flag boolean diagnosisFlag = (CustPropertyEnum.COMPANY.getCode().equals(customer.getCustProperty()) || CustPropertyEnum.GOV.getCode().equals(customer.getCustProperty())) && RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()); if (diagnosisFlag && StrUtil.isBlank(customer.getCompanyId())) { throw new CommonException(CodeMsg.FAILED, "公司信息错误"); } if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), RepalBillTypeEnum.RECEIVABLE.getCode().equals(dto.getRepalBillType()) ? PermissionEnum.ADD_RECEIVABLE.getCode() : PermissionEnum.ADD_RECEIPT.getCode())) { throw new CommonException(CodeMsg.FAILED, "无对应权限"); } if (Objects.isNull(dto.getRepalBookId())) { // 新建账本 RepalBook repalBook = new RepalBook(); repalBook.setRepalGroupId(groupId); repalBook.setRepalBookName("默认账本"); repalBook.setUserId(UserContextUtil.getUser().getUserId()); repalBookService.save(repalBook); dto.setRepalBookId(repalBook.getId()); } RepalBill repalBill = new RepalBill(); BeanUtils.copyProperties(dto, repalBill); repalBill.setCustomerName(customer.getCustName()); repalBill.setUserId(UserContextUtil.getUser().getUserId()); repalBill.setRepalBillStatus(RepalBillStatusUtil.getRepalBillStatus(dto.getEndDate())); repalBill.setRepalGroupId(groupId); repalBill.setReceivable(dto.getTotalMoney()); if (CollUtil.isNotEmpty(dto.getContractUrlList())) { repalBill.setContractUrl(String.join(";", dto.getContractUrlList())); } this.save(repalBill); if (diagnosisFlag) { // 非个人 & 应收,才会评级 repalBillDiagnosisService.addRepalBillDiagnosis(repalBill.getUserId(), repalBill.getId(), dto.getTotalMoney(), Collections.singletonList(customer.getCustName())); } // 负责人 if (CollUtil.isNotEmpty(dto.getResponsiblePersonIdList())) { repalResponsiblePersonService.saveBatch(dto.getResponsiblePersonIdList().stream().map(t -> { RepalResponsiblePerson person = new RepalResponsiblePerson(); person.setRepalGroupId(groupId); person.setRepalBookId(dto.getRepalBookId()); person.setRepalBillId(repalBill.getId()); person.setUserId(t); return person; }).collect(Collectors.toList())); } return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean breakRepalBill(BreakRepalBillDTO dto) { RepalBill repalBill = this.getById(dto.getRepalBillId()); if (Objects.isNull(repalBill)) { throw new CommonException(CodeMsg.FAILED, "账款错误"); } if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) { throw new CommonException(CodeMsg.FAILED, "无对应权限"); } this.update(Wrappers.lambdaUpdate(RepalBill.class) .eq(RepalBill::getId, dto.getRepalBillId()) .set(RepalBill::getRepalBillStatus, RepalBillStatusEnum.END.getCode()) .set(StrUtil.isNotBlank(dto.getBreakReason()), RepalBill::getBreakReason, dto.getBreakReason())); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean updateRepalBill(UpdateRepalBillDTO dto) { RepalBill repalBill = this.getById(dto.getRepalBillId()); if (!repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), RepalBillTypeEnum.RECEIVABLE.getCode().equals(repalBill.getRepalBillType()) ? PermissionEnum.UPDATE_RECEIVABLE.getCode() : PermissionEnum.UPDATE_RECEIPT.getCode())) { throw new CommonException(CodeMsg.FAILED, "无对应权限"); } // 责任人 List currentIdList = repalResponsiblePersonService.getResponsiblePersonId(repalBill.getId()); List difference = new ArrayList<>(CollUtil.disjunction(dto.getResponsiblePersonIdList(), currentIdList)); if (CollUtil.isNotEmpty(difference)) { for (Long aLong : difference) { if (currentIdList.contains(aLong)) { // 移除 repalResponsiblePersonService.update(Wrappers.lambdaUpdate(RepalResponsiblePerson.class) .eq(RepalResponsiblePerson::getRepalBillId, repalBill.getId()) .eq(RepalResponsiblePerson::getUserId, aLong) .set(RepalResponsiblePerson::getDeleted, DeletedStatusEnum.DELETE.getCode())); } if (dto.getResponsiblePersonIdList().contains(aLong)) { // 新增 RepalResponsiblePerson person = new RepalResponsiblePerson(); person.setRepalBillId(repalBill.getId()); person.setRepalBookId(repalBill.getRepalBookId()); person.setRepalGroupId(repalBill.getRepalGroupId()); person.setUserId(aLong); repalResponsiblePersonService.save(person); } } } if (LocalDate.now().isBefore(dto.getEndDate())) { // 逾期 repalBill.setRepalBillStatus(RepalBillStatusEnum.OVERDUE.getCode()); } repalBill.setTotalMoney(new BigDecimal(dto.getTotalMoneyStr())); if (repalBill.getReceipt().compareTo(repalBill.getTotalMoney()) >= 0) { // 收回了 repalBill.setRefreshStatus(RepalBillStatusEnum.SUCCESS.getCode()); repalBill.setReceivable(BigDecimal.ZERO); } this.update(Wrappers.lambdaUpdate(RepalBill.class) .eq(RepalBill::getId, repalBill.getId()) .set(RepalBill::getEndDate, dto.getEndDate()) .set(RepalBill::getRepalBillStatus, repalBill.getRepalBillStatus()) .set(RepalBill::getRepalBillStage, dto.getRepalBillStage()) .set(RepalBill::getBillRemark, dto.getBillRemark()) .set(RepalBill::getTotalMoney, repalBill.getTotalMoney()) .set(RepalBill::getReceivable, repalBill.getReceivable())); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean deleteRepalBillByBookId(Long repalBookId) { this.update(Wrappers.lambdaUpdate(RepalBill.class) .eq(RepalBill::getRepalBookId, repalBookId) .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode())); // 责任人也删除 repalResponsiblePersonService.deletePersonByBookId(repalBookId); return true; } @Override public boolean checkAllBillRefreshStatus(Long repalBookId, Long repalBillId) { LambdaQueryWrapper qw = Wrappers.lambdaQuery(RepalBill.class); qw.eq(RepalBill::getRepalBookId,repalBookId); qw.ne(RepalBill::getId,repalBillId); List results = list(qw); for(RepalBill accountBill:results){ if(!RefreshStatusEnum.REFRESH_SUCCESS.getCode().equals(accountBill.getRefreshStatus())){ return false; } } return true; } @Override public VOPage getCustRepalBillPage(Integer pageNum, Integer pageSize, Long custId) { VOPage voPage = new VOPage<>(); voPage.setPageSize(pageSize); voPage.setPageNum(pageNum); // 分页数据 Page repalBillPage = new Page<>(pageNum,pageSize); repalBillPage = repalBillMapper.getCustRepalBillPage(repalBillPage,custId); voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages())); voPage.setTotalNum(repalBillPage.getTotal()); voPage.setDataList(new ArrayList<>()); if (CollUtil.isEmpty(repalBillPage.getRecords())) { return voPage; } // 未读消息 List billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList()); long userId = UserContextUtil.getUser().getUserId(); Map unreadMap = new HashMap<>(); repalBillPage.getRecords().parallelStream().forEach(repalBill -> { RepalRemindReadInfo repalRemindReadInfo = repalRemindReadInfoService.getReadInfoByUserId(userId,repalBill.getId(),repalBill.getRepalBookId()); RepalBillRemindUnReadVO readVO = repalRemindHistoryService.getBillRemindUnReadVO(repalRemindReadInfo.getRiskRemindId(), repalRemindReadInfo.getRankRemindId(),repalRemindReadInfo.getOverdueRemindId() ,repalRemindReadInfo.getFinanceRemindId(),repalBill.getRepalBookId(),repalBill.getId(), null, null); unreadMap.put(repalBill.getId(), readVO); }); Map> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList); List customerList = repalCustomerService.list(Wrappers.lambdaQuery(RepalCustomer.class).in(RepalCustomer::getCustId, repalBillPage.getRecords().stream().map(RepalBill::getCustomerId).distinct().collect(Collectors.toList()))); Map custMap = customerList.stream().collect(Collectors.toMap(RepalCustomer::getCustId, RepalCustomer::getCustProperty)); voPage.setDataList(repalBillPage.getRecords().stream().map(t -> { RepalBillPageVO vo = new RepalBillPageVO(); BeanUtils.copyProperties(t, vo); vo.setRepalBillId(t.getId()); if(nameMap.containsKey(t.getId())) { vo.setResponsiblePersonNames(String.join("、", nameMap.get(t.getId()))); } vo.setRepalOverdueStatus(t.getRepalBillStatus() > 1 ? t.getRepalBillStatus() + 1 : t.getRepalBillStatus()); if (RepalBillStatusEnum.PROGRESSING.getCode().equals(vo.getRepalOverdueStatus()) && LocalDate.now().plusDays(3).equals(vo.getEndDate())) { vo.setRepalOverdueStatus(2); } vo.setCustName(t.getCustomerName()); vo.setCustProperty(custMap.get(t.getCustomerId())); vo.setTotalMoneyStr(t.getTotalMoney().stripTrailingZeros().toPlainString()); vo.setReceivableMoneyStr(t.getReceivable().stripTrailingZeros().toPlainString()); // 评分趋势 vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(t.getPreDiagnosisScore(), t.getDiagnosisScore(), t.getPreDiagnosisGrade(), t.getDiagnosisGrade())); if (Objects.nonNull(t.getDiagnosisScore())) { vo.setDiagnosisScore(t.getDiagnosisScore().stripTrailingZeros().toPlainString()); } RepalBillRemindUnReadVO unReadVO = unreadMap.get(vo.getRepalBillId()); if (Objects.nonNull(unReadVO)) { vo.setDynamicCountList(new ArrayList(){{ add(unReadVO.getUnreadRiskCount()); add(unReadVO.getUnreadFinanceCount()); add(unReadVO.getUnreadRankCount()); add(unReadVO.getUnreadOverdueCount()); }}); } return vo; }).collect(Collectors.toList())); return voPage; } @Override public RepalManageBillInfoVO queryManageInfo() { //权限 UserContextBO userContextBO = UserContextUtil.getUser(); boolean allFlag = repalRolePermissionService.checkUserPermission(userContextBO.getUserId(),PermissionEnum.QUERY_ALL_URGE.getCode()); //查询组织编号 RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class).eq(RepalGroupMember::getUserId,userContextBO.getUserId()).eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false); if(ObjectUtil.isNull(repalGroupMember)){ throw new CommonException(CodeMsg.FAILED,"您还未加入该组织,请联系超级管理员"); } LocalDate startTime = LocalDate.now().plusDays(7); ManageBillInfoBO manageBillInfo = repalBillMapper.getManageBillInfo(allFlag,userContextBO.getUserId(),repalGroupMember.getRepalGroupId(),startTime); RepalManageBillInfoVO repalManageBillInfoVO = new RepalManageBillInfoVO(); if(ObjectUtil.isNull(manageBillInfo.getTotalMoney()) || NumberUtil.equals(BigDecimal.ZERO,manageBillInfo.getTotalMoney())){ repalManageBillInfoVO.setOverdueScaleStr("0"); repalManageBillInfoVO.setTotalOverdueCount(0); repalManageBillInfoVO.setTotalOverdueStr("0"); repalManageBillInfoVO.setTotalOverdueWeekCount(0); repalManageBillInfoVO.setTotalOverdueWeekStr("0"); }else { repalManageBillInfoVO.setTotalOverdueCount(manageBillInfo.getTotalOverdueCount()); repalManageBillInfoVO.setTotalOverdueStr(manageBillInfo.getTotalOverdue().toPlainString()); repalManageBillInfoVO.setTotalOverdueWeekCount(manageBillInfo.getTotalOverdueWeekCount()); repalManageBillInfoVO.setTotalOverdueWeekStr(manageBillInfo.getTotalOverdueWeek().toPlainString()); repalManageBillInfoVO.setOverdueScaleStr(manageBillInfo.getTotalOverdue().divide(manageBillInfo.getTotalMoney(),2, RoundingMode.HALF_UP).toPlainString()); } return repalManageBillInfoVO; } @Override public VOPage queryManageBillPage(Integer pageNum, Integer pageSize) { //权限 UserContextBO userContextBO = UserContextUtil.getUser(); boolean allFlag = repalRolePermissionService.checkUserPermission(userContextBO.getUserId(),PermissionEnum.QUERY_ALL_URGE.getCode()); //查询组织编号 RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class).eq(RepalGroupMember::getUserId,userContextBO.getUserId()).eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false); if(ObjectUtil.isNull(repalGroupMember)){ throw new CommonException(CodeMsg.FAILED,"您还未加入该组织,请联系超级管理员"); } LocalDate startTime = LocalDate.now().plusDays(7); VOPage voPage = new VOPage<>(); voPage.setPageSize(pageSize); voPage.setPageNum(pageNum); // 分页数据 Page repalBillPage = new Page<>(pageNum,pageSize); repalBillPage = repalBillMapper.getManageBillPage(repalBillPage,allFlag,userContextBO.getUserId(),repalGroupMember.getRepalGroupId(),startTime); voPage.setTotalPage(Math.toIntExact(repalBillPage.getPages())); voPage.setTotalNum(repalBillPage.getTotal()); voPage.setDataList(new ArrayList<>()); if (CollUtil.isEmpty(repalBillPage.getRecords())) { return voPage; } List vos = new ArrayList<>(); voPage.setDataList(vos); Map> personMap= repalResponsiblePersonMapper.getResponsiblePersonNameList(repalBillPage.getRecords().stream().map(RepalManageBillPageBO::getRepalBillId).collect(Collectors.toList())).stream().collect(Collectors.groupingBy(ResponsiblePersonNameVO::getRepalBillId)); for(RepalManageBillPageBO manageBillPageBO:repalBillPage.getRecords()){ RepalManageBillPageVO vo = new RepalManageBillPageVO(); vos.add(vo); BeanUtils.copyProperties(manageBillPageBO,vo); vo.setOverdueDay(Math.abs(manageBillPageBO.getEndDate().toEpochDay() - LocalDate.now().toEpochDay())); vo.setTotalMoneyStr(manageBillPageBO.getTotalMoney().stripTrailingZeros().toPlainString()); vo.setReceivableStr(manageBillPageBO.getReceivable().stripTrailingZeros().toPlainString()); //负责人 if(personMap.containsKey(manageBillPageBO.getRepalBillId())){ List personNames = personMap.get(manageBillPageBO.getRepalBillId()); vo.setResponsiblePersonName(personNames.stream().map(ResponsiblePersonNameVO::getUserName).collect(Collectors.toList())); } //催款动态条数 int dynamicCount = repalDynamicService.count(Wrappers.lambdaQuery(RepalDynamic.class).eq(RepalDynamic::getRepalBillId,manageBillPageBO.getRepalBillId())); vo.setRepalDynamicCount(dynamicCount); } return voPage; } @Override public RepalManageBillDetailVO querManageBillDetail(Long repalBillId) { //不校验权限,默认看到列表的时候已经通过 RepalBill repalBill = this.getById(repalBillId); RepalManageBillDetailVO vo = new RepalManageBillDetailVO(); BeanUtils.copyProperties(repalBill, vo); vo.setCustId(repalBill.getCustomerId()); vo.setRepalBillId(repalBill.getId()); RepalCustomer repalCustomer = repalCustomerService.getById(repalBill.getCustomerId()); vo.setCompanyId(repalCustomer.getCompanyId()); vo.setCustProperty(repalCustomer.getCustProperty()); List nameList = repalResponsiblePersonService.getResponsiblePersonName(vo.getRepalBillId()); vo.setResponsiblePersonName(nameList); vo.setTotalMoneyStr(repalBill.getTotalMoney().stripTrailingZeros().toPlainString()); vo.setReceiptStr(repalBill.getReceipt().stripTrailingZeros().toPlainString()); vo.setReceivableStr(repalBill.getReceivable().stripTrailingZeros().toPlainString()); vo.setOverdueDay(Math.abs(LocalDate.now().toEpochDay()-repalBill.getEndDate().toEpochDay())); // 评分趋势 vo.setDiagnosisScoreTrend(DiagnosisUtil.getDiagnosisScoreTrend(repalBill.getPreDiagnosisScore(), repalBill.getDiagnosisScore(), repalBill.getPreDiagnosisGrade(), repalBill.getDiagnosisGrade())); if (Objects.nonNull(repalBill.getDiagnosisScore())) { vo.setDiagnosisGradeDesc(DiagnosisUtil.getGradeConclusion(repalBill.getDiagnosisScore())); vo.setDiagnosisScore(repalBill.getDiagnosisScore().stripTrailingZeros().toPlainString()); } // companyId if (StrUtil.isNotBlank(vo.getCompanyId())) { // 财产数量 ApiDataResult> financeResult = dataMiddlewareService.getFinanceDynamicNumV8List(new GetFinanceDynamicNumDTO().setCompanyIdList(Collections.singletonList(vo.getCompanyId()))); if (Objects.nonNull(financeResult) && CollUtil.isNotEmpty(financeResult.getData())) { vo.setAssetsNum(financeResult.getData().get(0).getFinanceDynamicNum()); } // 风险数量 ApiDataResult> riskResult = dataMiddlewareService.getCompanyRiskNumList(new GetCompanyRiskNumDTO(Collections.singletonList(vo.getCompanyId()))); if (Objects.nonNull(riskResult) && CollUtil.isNotEmpty(riskResult.getData())) { vo.setRiskNum(riskResult.getData().get(0).getRiskNum()); } // 失信限高标签 ApiDataResult> labelResult = dataMiddlewareService.getCreditPunishmentLabelList(new GetCreditPunishmentLabelDTO(Collections.singletonList(vo.getCompanyId()))); if (Objects.nonNull(labelResult) && CollUtil.isNotEmpty(labelResult.getData())) { vo.setLabelList(labelResult.getData().get(0).getLabelList()); } } //查询套餐剩余qingk RepalVip repalVip = repalVipService.getOne(Wrappers.lambdaQuery(RepalVip.class).eq(RepalVip::getRepalGroupId,repalCustomer.getRepalGroupId()),false); RepalVipVO repalVipVO = new RepalVipVO(); if(ObjectUtil.isNotNull(repalVip)){ BeanUtils.copyProperties(repalVip,repalVipVO); } vo.setRepalVip(repalVipVO); //查询催款动态列表 List dynamics = repalDynamicService.list(Wrappers.lambdaQuery(RepalDynamic.class).eq(RepalDynamic::getRepalBillId,repalBillId).orderByDesc(RepalDynamic::getId)); if(CollUtil.isNotEmpty(dynamics)){ List repalDynamicVOs = new ArrayList<>(dynamics.size()); vo.setRepalDynamics(repalDynamicVOs); Map 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())); for(RepalDynamic dynamic:dynamics){ RepalDynamicVO repalDynamicVO = new RepalDynamicVO(); repalDynamicVOs.add(repalDynamicVO); BeanUtils.copyProperties(dynamic,repalDynamicVO); if(memberMap.containsKey(dynamic.getMemberId())){ RepalGroupMember repalGroupMember = memberMap.get(dynamic.getMemberId()); repalDynamicVO.setMemberUserName(repalGroupMember.getMemberUserName()); } } } return vo; } @Override public List getBillIdListByBookId(Long repalBookId, Long userId) { return repalBillMapper.getBillIdListByBookId(repalBookId, userId); } @Override public List getBillGradeByBookId(Long repalBookId, Long userId, LocalDateTime start, LocalDateTime end) { return repalBillMapper.getBillGradeByBookId(repalBookId, userId, start, end); } @Override public HomeReceivableBO getBillTotal(Integer repalBillStatus, Long userId, Long repalBookId, Integer repalBillType, LocalDateTime start, LocalDateTime end) { return repalBillMapper.getBillTotal(repalBillStatus, userId, repalBookId, repalBillType, start, end); } @Override @Transactional(rollbackFor = Exception.class) public Boolean transferBill(TransferBillDTO dto) { // 账款创建人 this.update(Wrappers.lambdaUpdate(RepalBill.class) .eq(RepalBill::getUserId, dto.getUserId()) .set(RepalBill::getUserId, dto.getTransferUserId())); // 账款负责人 repalResponsiblePersonService.update(Wrappers.lambdaUpdate(RepalResponsiblePerson.class) .eq(RepalResponsiblePerson::getUserId, dto.getUserId()) .set(RepalResponsiblePerson::getUserId, dto.getTransferUserId())); // 客户负责人 repalCustChargeRelService.update(Wrappers.lambdaUpdate(RepalCustChargeRel.class) .eq(RepalCustChargeRel::getMemberUserId, dto.getUserId()) .set(RepalCustChargeRel::getMemberUserId, dto.getTransferUserId())); return true; } }