package com.winhc.repal.service.impl; import cn.hutool.core.collection.CollUtil; 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.BillPageBO; import com.winhc.repal.model.bo.TotalMoneyBO; import com.winhc.repal.model.bo.UserBillUnreadInfoBO; import com.winhc.repal.model.dto.*; import com.winhc.repal.model.vo.RepalBillDetailVO; import com.winhc.repal.model.vo.RepalBillInfoVO; import com.winhc.repal.model.vo.RepalBillPageVO; import com.winhc.repal.repository.RepalBillMapper; 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.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; 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; @Override public RepalBillInfoVO getRepalBillPage(GetRepalBillPageDTO dto) { if (ObjectUtil.hasEmpty(dto.getRepalGroupId(), dto.getRepalBookId())) { throw new CommonException(CodeMsg.VALIDATE_PARAMETER); } VOPage voPage = new VOPage<>(); voPage.setPageSize(dto.getPageSize()); voPage.setPageNum(dto.getPageNum()); RepalBillInfoVO infoVO = new RepalBillInfoVO(); boolean allFlag = repalRolePermissionService.checkUserPermission(UserContextUtil.getUser().getUserId(), 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(dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId()); overdueBO = repalBillMapper.getTotalMoneyByGroup(dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId()); totalBO = repalBillMapper.getTotalMoneyByGroup(dto.getRepalGroupId(), dto.getRepalBillType(), null, dto.getRepalBookId()); } else { // 只查询自己负责的 totalMoneyBO = repalBillMapper.getTotalMoneyByUser(UserContextUtil.getUser().getUserId(), dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.PROGRESSING.getCode(), dto.getRepalBookId()); overdueBO = repalBillMapper.getTotalMoneyByUser(UserContextUtil.getUser().getUserId(), dto.getRepalGroupId(), dto.getRepalBillType(), RepalBillStatusEnum.OVERDUE.getCode(), dto.getRepalBookId()); totalBO = repalBillMapper.getTotalMoneyByUser(UserContextUtil.getUser().getUserId(), dto.getRepalGroupId(), 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(UserContextUtil.getUser().getUserId()); billPageBO.setAllFlag(allFlag); // 对应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, dto); 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()); List unreadInfoList = repalRemindReadInfoService.getUserBillUnreadInfo(UserContextUtil.getUser().getUserId(), billIdList); Map unreadInfoMap = new HashMap<>(); if (CollUtil.isNotEmpty(unreadInfoList)) { unreadInfoMap = unreadInfoList.stream().collect(Collectors.toMap(UserBillUnreadInfoBO::getRepalBillId, Function.identity())); } Map> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList); Map finalUnreadInfoMap = unreadInfoMap; voPage.setDataList(repalBillPage.getRecords().stream().map(t -> { RepalBillPageVO vo = new RepalBillPageVO(); BeanUtils.copyProperties(t, vo); vo.setRepalBillId(t.getId()); vo.setResponsiblePersonNames(String.join("、", nameMap.get(t.getId()))); UserBillUnreadInfoBO unreadInfoBO = finalUnreadInfoMap.get(vo.getRepalBillId()); if (Objects.nonNull(unreadInfoBO)) { vo.setDynamicCountList(new ArrayList(){{ add(unreadInfoBO.getUnreadRiskCount()); add(unreadInfoBO.getUnreadFinanceCount()); add(unreadInfoBO.getUnreadRankCount()); add(unreadInfoBO.getUnreadOverdueCount()); }}); } return vo; }).collect(Collectors.toList())); return infoVO; } @Override public RepalBillDetailVO getRepalBillDetail(Long repalBillId) { RepalBill repalBill = this.getById(repalBillId); if (Objects.isNull(repalBill)) { return null; } 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()); 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)) { ApiDataResult apiDataResult = inCaseService.getRecordVO(repalBillDiagnosis.getBizId()); if (Objects.nonNull(apiDataResult)) { vo.setAnalysisList(DiagnosisUtil.convertItemToList(apiDataResult.getData().getResultItem())); } } } // 合同 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 public Boolean deleteRepalBillById(DeleteRepalBillDTO dto) { // 权限判断 todo 日志 this.update(Wrappers.lambdaUpdate(RepalBill.class).eq(RepalBill::getId, dto.getRepalBillId()) .set(RepalBill::getDeleted, DeletedStatusEnum.DELETE.getCode())); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean settleRepalBillById(SettleRepalBillDTO dto) { // todo 权限,日志 RepalBill repalBill = this.getById(dto.getRepalBillId()); // 结清tag boolean success = false; // 金额溢出 if (dto.getMoney().compareTo(repalBill.getReceivable()) >= 0) { dto.setMoney(repalBill.getReceivable()); success = true; } // 重新计算金额 repalBill.setReceivable(success ? BigDecimal.ZERO : repalBill.getReceivable().subtract(dto.getMoney())); repalBill.setReceipt(success ? repalBill.getTotalMoney() : repalBill.getReceipt().add(dto.getMoney())); RepalChangeRecord changeRecord = new RepalChangeRecord(); changeRecord.setRepalBookId(repalBill.getRepalBookId()); changeRecord.setRepalBillId(repalBill.getId()); changeRecord.setAfterMoney(BigDecimal.ZERO); changeRecord.setPreMoney(repalBill.getReceivable()); changeRecord.setTransMoney(repalBill.getReceivable()); changeRecord.setOperUserId(UserContextUtil.getUser().getUserId()); // changeRecord.setOperUserName(); 组织用户名称?用户名称? repalChangeRecordService.save(changeRecord); 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, "客户信息错误"); } boolean companyIdFlag = CustPropertyEnum.COMPANY.getCode().equals(customer.getCustProperty()) || CustPropertyEnum.GOV.getCode().equals(customer.getCustProperty()); if (companyIdFlag && StrUtil.isBlank(customer.getCompanyId())) { throw new CommonException(CodeMsg.FAILED, "公司信息错误"); } // 权限判断 todo 日志 if (Objects.isNull(dto.getRepalBookId())) { // 新建账本 RepalBook repalBook = new RepalBook(); repalBook.setRepalGroupId(dto.getRepalGroupId()); repalBook.setCustomerId(customer.getCustId()); repalBook.setCustomerName(customer.getCustName()); repalBook.setCompanyId(customer.getCompanyId()); 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())); if (CollUtil.isNotEmpty(dto.getContractUrlList())) { repalBill.setContractUrl(String.join(";", dto.getContractUrlList())); } if (companyIdFlag) { // 评分 todo } this.save(repalBill); // 负责人 repalResponsiblePersonService.saveBatch(dto.getResponsiblePersonIdList().stream().map(t -> { RepalResponsiblePerson person = new RepalResponsiblePerson(); person.setRepalGroupId(dto.getRepalGroupId()); person.setRepalBookId(dto.getRepalBookId()); person.setRepalBillId(repalBill.getId()); person.setUserId(t); return person; }).collect(Collectors.toList())); return true; } @Override public Boolean breakRepalBill(BreakRepalBillDTO dto) { // 权限 todo 日志 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) { 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; } }