package com.ruoyi.project.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.domain.ServiceFund; import com.ruoyi.project.domain.ServiceFunddetail; import com.ruoyi.project.domain.ServiceFundtax; import com.ruoyi.project.domain.vo.FundTaxVO; import com.ruoyi.project.domain.vo.TaxMoneyByItemEO; import com.ruoyi.project.domain.vo.TaxMoneySumEO; import com.ruoyi.project.mapper.ServiceFundMapper; import com.ruoyi.project.mapper.ServiceFunddetailMapper; import com.ruoyi.project.mapper.ServiceFundtaxMapper; import com.ruoyi.project.service.IServiceFundService; import com.ruoyi.project.service.IServiceFunddetailService; import com.ruoyi.project.service.IServiceFundtaxService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.ZoneId; import java.time.temporal.TemporalAdjusters; import java.util.*; /** * 专家费用算税申请主Service业务层处理 * * @author ruoyi * @date 2024-03-13 */ @Slf4j @Service public class ServiceFundtaxServiceImpl extends ServiceImpl implements IServiceFundtaxService { @Autowired private ServiceFunddetailMapper serviceFunddetailMapper; @Autowired private IServiceFunddetailService serviceFunddetailService; @Autowired private IServiceFundService serviceFundService; @Autowired private ServiceFundtaxMapper serviceFundtaxMapper; @Autowired private ServiceFundMapper serviceFundMapper; /** * 查询专家费用算税申请主列表 * * @param serviceFundtax 专家费用算税申请主 * @return 专家费用算税申请主 */ @Override public List queryList(ServiceFundtax serviceFundtax) { LambdaQueryWrapper wrappers = Wrappers.lambdaQuery(); if (StringUtils.isNotBlank(serviceFundtax.getApplyno())) { wrappers.eq(ServiceFundtax::getApplyno, serviceFundtax.getApplyno()); } if (serviceFundtax.getTaxedtime() != null) { wrappers.eq(ServiceFundtax::getTaxedtime, serviceFundtax.getTaxedtime()); } if (StringUtils.isNotBlank(serviceFundtax.getUserno())) { wrappers.eq(ServiceFundtax::getUserno, serviceFundtax.getUserno()); } if (StringUtils.isNotBlank(serviceFundtax.getUsername())) { wrappers.like(ServiceFundtax::getUsername, serviceFundtax.getUsername()); } if (StringUtils.isNotBlank(serviceFundtax.getDeptmentno())) { wrappers.eq(ServiceFundtax::getDeptmentno, serviceFundtax.getDeptmentno()); } if (StringUtils.isNotBlank(serviceFundtax.getDeptmentname())) { wrappers.like(ServiceFundtax::getDeptmentname, serviceFundtax.getDeptmentname()); } if (StringUtils.isNotBlank(serviceFundtax.getManagerno())) { wrappers.eq(ServiceFundtax::getManagerno, serviceFundtax.getManagerno()); } if (StringUtils.isNotBlank(serviceFundtax.getManagername())) { wrappers.like(ServiceFundtax::getManagername, serviceFundtax.getManagername()); } if (serviceFundtax.getPretaxamount() != null) { wrappers.eq(ServiceFundtax::getPretaxamount, serviceFundtax.getPretaxamount()); } if (serviceFundtax.getTaxedamount() != null) { wrappers.eq(ServiceFundtax::getTaxedamount, serviceFundtax.getTaxedamount()); } if (serviceFundtax.getTaxamount() != null) { wrappers.eq(ServiceFundtax::getTaxamount, serviceFundtax.getTaxamount()); } if (serviceFundtax.getIstax() != null) { wrappers.eq(ServiceFundtax::getIstax, serviceFundtax.getIstax()); } if (serviceFundtax.getMedicalcost() != null) { wrappers.eq(ServiceFundtax::getMedicalcost, serviceFundtax.getMedicalcost()); } if (serviceFundtax.getBodymaintaincost() != null) { wrappers.eq(ServiceFundtax::getBodymaintaincost, serviceFundtax.getBodymaintaincost()); } if (serviceFundtax.getOrgangaincost() != null) { wrappers.eq(ServiceFundtax::getOrgangaincost, serviceFundtax.getOrgangaincost()); } if (serviceFundtax.getOrganmaintaincost() != null) { wrappers.eq(ServiceFundtax::getOrganmaintaincost, serviceFundtax.getOrganmaintaincost()); } if (StringUtils.isNotBlank(serviceFundtax.getRemark())) { wrappers.eq(ServiceFundtax::getRemark, serviceFundtax.getRemark()); } if (serviceFundtax.getRecordstatus() != null) { wrappers.eq(ServiceFundtax::getRecordstatus, serviceFundtax.getRecordstatus()); } if (serviceFundtax.getCheckstatus() != null) { wrappers.eq(ServiceFundtax::getCheckstatus, serviceFundtax.getCheckstatus()); } if (serviceFundtax.getFlowlevel() != null) { wrappers.eq(ServiceFundtax::getFlowlevel, serviceFundtax.getFlowlevel()); } if (serviceFundtax.getBackflowlevel() != null) { wrappers.eq(ServiceFundtax::getBackflowlevel, serviceFundtax.getBackflowlevel()); } if (StringUtils.isNotBlank(serviceFundtax.getIsdistribute())) { wrappers.eq(ServiceFundtax::getIsdistribute, serviceFundtax.getIsdistribute()); } if (StringUtils.isNotBlank(serviceFundtax.getRiqi())) { wrappers.eq(ServiceFundtax::getRiqi, serviceFundtax.getRiqi()); } if (StringUtils.isNotBlank(serviceFundtax.getOpochecker())) { wrappers.eq(ServiceFundtax::getOpochecker, serviceFundtax.getOpochecker()); } if (StringUtils.isNotBlank(serviceFundtax.getFinvicepresident())) { wrappers.eq(ServiceFundtax::getFinvicepresident, serviceFundtax.getFinvicepresident()); } if (StringUtils.isNotBlank(serviceFundtax.getBusvicepresident())) { wrappers.eq(ServiceFundtax::getBusvicepresident, serviceFundtax.getBusvicepresident()); } if (StringUtils.isNotBlank(serviceFundtax.getPresident())) { wrappers.eq(ServiceFundtax::getPresident, serviceFundtax.getPresident()); } if (StringUtils.isNotBlank(serviceFundtax.getOfficedirector())) { wrappers.eq(ServiceFundtax::getOfficedirector, serviceFundtax.getOfficedirector()); } if (StringUtils.isNotBlank(serviceFundtax.getFinancedirector())) { wrappers.eq(ServiceFundtax::getFinancedirector, serviceFundtax.getFinancedirector()); } if (StringUtils.isNotBlank(serviceFundtax.getFinancechecher())) { wrappers.eq(ServiceFundtax::getFinancechecher, serviceFundtax.getFinancechecher()); } if (StringUtils.isNotBlank(serviceFundtax.getUploadflag())) { wrappers.eq(ServiceFundtax::getUploadflag, serviceFundtax.getUploadflag()); } if (serviceFundtax.getUploadtime() != null) { wrappers.eq(ServiceFundtax::getUploadtime, serviceFundtax.getUploadtime()); } if (StringUtils.isNotBlank(serviceFundtax.getUpdownremark())) { wrappers.eq(ServiceFundtax::getUpdownremark, serviceFundtax.getUpdownremark()); } return this.list(wrappers); } @Override public Integer getMaxFundTaxId() { return serviceFundtaxMapper.getMaxFundTaxId(); } /** * 批量算税主入口 * 1. 校验参数 * 2. 校验批次合法性(如有必要) * 3. 查询本批次所有ServiceFund(按id升序) * 4. 预查询本月所有身份证号的累计金额,缓存到Map,提升后续算税效率 * 5. 遍历每个ServiceFund,批量算税 * * @param fundTaxVO 批次算税参数 * @return 是否算税成功 */ @Override public Boolean batchFundTax(FundTaxVO fundTaxVO) { log.info("批量算税的fundTaxVO入参为:{}", fundTaxVO); // 1. 校验参数 if (fundTaxVO.getFundTaxId() == null) { throw new BaseException("分批算税出问题了,请检查后再进行计算"); } // 2. 校验批次合法性(仅限修改操作) if (fundTaxVO.getAddOrupdate() == 1) { Integer maxFundTaxId = serviceFundtaxMapper.getMaxFundTaxId(); log.info("批量算税的maxFundTaxId为:{}", maxFundTaxId); if (!fundTaxVO.getFundTaxId().equals(Long.valueOf(maxFundTaxId))) { throw new BaseException("该批数据不能算税"); } } // 3. 查询本批次所有ServiceFund(按id升序) ServiceFund serviceFund = new ServiceFund(); serviceFund.setFundTaxId(fundTaxVO.getFundTaxId()); serviceFund.setDel_flag(0); List serviceFunds = serviceFundService.selectServiceFundList(serviceFund); for (ServiceFund serviceFund1 : serviceFunds) { serviceFundMapper.updateFundIsTexById(serviceFund1.getId(), 0L); } // 按id升序排序,保证处理顺序一致 serviceFunds.sort(Comparator.comparing(ServiceFund::getId)); if (CollectionUtils.isEmpty(serviceFunds)) { log.warn("未查询到相关ServiceFund,fundTaxId={}", fundTaxVO.getFundTaxId()); return false; } // 4. 预查询本月所有身份证号的累计金额,缓存到Map,提升后续算税效率 TaxMoneyByItemEO taxMoneyVO = new TaxMoneyByItemEO(); Date firstDay = Date.from(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay(ZoneId.systemDefault()).toInstant()); taxMoneyVO.setFirstDay(firstDay); taxMoneyVO.setTaxTime(new Date()); Map tempTaxSumMap = new HashMap<>(); List taxSum = serviceFunddetailMapper.getTaxSum(taxMoneyVO); for (TaxMoneySumEO taxMoneySumEO : taxSum) { tempTaxSumMap.put(taxMoneySumEO.getIDCardNo(), taxMoneySumEO); } // 5. 遍历每个ServiceFund,批量算税 for (ServiceFund serviceFund1 : serviceFunds) { ServiceFunddetail serviceFunddetail = new ServiceFunddetail(); serviceFunddetail.setFundid(serviceFund1.getId()); List serviceFunddetails = serviceFunddetailMapper.selectServiceFunddetailList(serviceFunddetail); // 传入累计金额缓存,提升算税效率 serviceFunddetailService.calculateTax(serviceFunddetails, tempTaxSumMap); } return true; } }