123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- 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<RepalBillMapper, RepalBill> 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<RepalBillPageVO> 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<RepalBill> 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<Long> billIdList = repalBillPage.getRecords().stream().map(RepalBill::getId).collect(Collectors.toList());
- List<UserBillUnreadInfoBO> unreadInfoList = repalRemindReadInfoService.getUserBillUnreadInfo(UserContextUtil.getUser().getUserId(), billIdList);
- Map<Long, UserBillUnreadInfoBO> unreadInfoMap = new HashMap<>();
- if (CollUtil.isNotEmpty(unreadInfoList)) {
- unreadInfoMap = unreadInfoList.stream().collect(Collectors.toMap(UserBillUnreadInfoBO::getRepalBillId, Function.identity()));
- }
- Map<Long, List<String>> nameMap = repalResponsiblePersonService.getResponsiblePersonNameList(billIdList);
- Map<Long, UserBillUnreadInfoBO> 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<Integer>(){{
- 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<String> 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<List<FinanceDynamicNumVO>> 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<List<CompanyRiskNumVO>> 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<List<CreditPunishmentLabelListVO>> 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<DiagnosisRecordVO> apiDataResult = inCaseService.getRecordVO(repalBillDiagnosis.getBizId());
- if (Objects.nonNull(apiDataResult)) {
- vo.setAnalysisList(DiagnosisUtil.convertItemToList(apiDataResult.getData().getResultItem()));
- }
- }
- }
- // 合同
- if (StrUtil.isNotBlank(repalBill.getContractUrl())) {
- List<String> 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<RepalChangeRecord> 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<RepalBill> qw = Wrappers.lambdaQuery(RepalBill.class);
- qw.eq(RepalBill::getRepalBookId,repalBookId);
- qw.ne(RepalBill::getId,repalBillId);
- List<RepalBill> results = list(qw);
- for(RepalBill accountBill:results){
- if(!RefreshStatusEnum.REFRESH_SUCCESS.getCode().equals(accountBill.getRefreshStatus())){
- return false;
- }
- }
- return true;
- }
- }
|