mitao
2025-04-07 18891c60ab1c06a4acc85d0ec54dee50d1b1a19f
finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java
@@ -4,9 +4,13 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.finance.common.basic.PageDTO;
import com.finance.common.core.domain.entity.SysUser;
import com.finance.common.enums.AreaLevelEnum;
import com.finance.common.enums.UserTypeEnum;
import com.finance.common.exception.ServiceException;
import com.finance.common.utils.BeanUtils;
import com.finance.common.utils.CollUtils;
import com.finance.common.utils.DateUtils;
import com.finance.system.constants.QuarterConstant;
import com.finance.system.domain.TbBasicDataConfig;
import com.finance.system.domain.TbScore;
import com.finance.system.mapper.TbScoreMapper;
@@ -15,13 +19,19 @@
import com.finance.system.query.HistoryScoreQuery;
import com.finance.system.query.ScoreCalculateDetailQuery;
import com.finance.system.query.ScoreQuery;
import com.finance.system.service.ISysUserService;
import com.finance.system.service.TbBasicDataConfigService;
import com.finance.system.service.TbScoreService;
import com.finance.system.vo.DataScreenConfigVO;
import com.finance.system.vo.DeptCalculateDetailVO;
import com.finance.system.vo.RiskMapVO;
import com.finance.system.vo.RiskRankingVO;
import com.finance.system.vo.ScoreCalculateDetailVO;
import com.finance.system.vo.ScoreDetailVO;
import com.finance.system.vo.ScoreRankVO;
import com.finance.system.vo.ScoreVO;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -44,6 +54,7 @@
        TbScoreService {
    private final TbBasicDataConfigService basicDataConfigService;
    private final ISysUserService sysUserService;
    @Override
    public Page<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page) {
@@ -59,8 +70,9 @@
    }
    @Override
    public ScoreCalculateDetailVO scoreCalculateDetail(ScoreCalculateDetailQuery query) {
        //查询计算类型
    public ScoreCalculateDetailVO scoreCalculateDetail(ScoreCalculateDetailQuery query)
            throws Exception {
        // 查询计算类型
        TbBasicDataConfig config = basicDataConfigService.getById(query.getId());
        if (Objects.isNull(config)) {
            throw new ServiceException("非法参数");
@@ -69,7 +81,28 @@
        vo.setTypeName(config.getTypeName());
        vo.setCalculateType(config.getCalculateType());
        Page<ScoreDetailVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        query.setPreviousQuarter(previousQuarter);
        Page<ScoreDetailVO> pageVO = baseMapper.scoreCalculateDetail(query, page);
        vo.setTotal(pageVO.getTotal());
        vo.setPages(pageVO.getPages());
        vo.setList(pageVO.getRecords());
        return vo;
    }
    @Override
    public ScoreCalculateDetailVO scoreCalculateHistoryDetail(ScoreCalculateDetailQuery query)
            throws Exception {
        // 查询计算类型
        TbBasicDataConfig config = basicDataConfigService.getById(query.getId());
        if (Objects.isNull(config)) {
            throw new ServiceException("非法参数");
        }
        ScoreCalculateDetailVO vo = new ScoreCalculateDetailVO();
        vo.setTypeName(config.getTypeName());
        vo.setCalculateType(config.getCalculateType());
        Page<ScoreDetailVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        Page<ScoreDetailVO> pageVO = baseMapper.scoreCalculateDetail(query, page);
        vo.setTotal(pageVO.getTotal());
        vo.setPages(pageVO.getPages());
@@ -83,8 +116,20 @@
    }
    @Override
    public ScoreRankVO queryRankAndScoreByAreaCode(String areaCode) {
        return baseMapper.queryRankAndScoreByAreaCode(areaCode);
    public ScoreRankVO queryRankAndScoreByAreaCode(String areaCode) throws Exception {
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        List<ScoreRankVO> voList = baseMapper.queryRankAndScoreByAreaCode(areaCode,
                previousQuarter);
        if (CollUtils.isNotEmpty(voList)) {
            for (int i = 0; i < voList.size(); i++) {
                if (areaCode.equals(voList.get(i).getAreaCode())) {
                    voList.get(i).setRank(i + 1);
                    return voList.get(i);
                }
            }
        }
        return null;
    }
    @Override
@@ -95,8 +140,8 @@
    @Override
    public ScoreCalculateDetailVO fieldsDetail(CalculateDetailQuery query,
            List<SysUser> countyList) {
        //查询计算类型
            List<SysUser> countyList) throws Exception {
        // 查询计算类型
        TbBasicDataConfig config = basicDataConfigService.getById(query.getId());
        if (Objects.isNull(config)) {
            throw new ServiceException("非法参数");
@@ -110,10 +155,97 @@
        vo.setTypeName(config.getTypeName());
        vo.setCalculateType(config.getCalculateType());
        Page<ScoreDetailVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        query.setPreviousQuarter(previousQuarter);
        Page<ScoreDetailVO> pageVO = baseMapper.fieldsDetail(query, page, areaCodeList);
        vo.setTotal(pageVO.getTotal());
        vo.setPages(pageVO.getPages());
        vo.setList(pageVO.getRecords());
        return vo;
    }
    @Override
    public List<RiskMapVO> getCurrentScoreList(String nowQuarter, String areaCode) {
        return baseMapper.getCurrentScoreList(nowQuarter, areaCode);
    }
    @Override
    public List<RiskRankingVO> queryRiskRanking(String nowQuarter) {
        return baseMapper.queryRiskRanking(nowQuarter);
    }
    /**
     * @param areaCode 区划代码
     * @return
     */
    @Override
    public List<RiskMapVO> getScoreByYearType(String areaCode, String quarter) {
        return baseMapper.getScoreByYearType(areaCode, quarter);
    }
    @Override
    public List<RiskMapVO> getCityScore(String previousQuarter, DataScreenConfigVO riskLevel) {
        // 查询城市部门
        List<SysUser> cityList = getCityList();
        List<RiskMapVO> riskMapVOList = new ArrayList<>();
        for (SysUser sysUser : cityList) {
            RiskMapVO vo = new RiskMapVO();
            vo.setAreaCode(sysUser.getAreaCode());
            vo.setAreaName(sysUser.getAreaName());
            vo.setAreaLevel(sysUser.getAreaLevel());
            String areaCode = sysUser.getAreaCode();
            areaCode = areaCode.substring(0, 4);
            Double totalAverageScore = baseMapper.getCityAverageScore(areaCode,
                    previousQuarter);
            // 查询区县的得分
            List<Double> countyScoreList = baseMapper.getCountyScoreList(areaCode, previousQuarter);
            // 将风险范围解析为列表,只解析一次
            List<Double> mediumRange = Arrays.stream(riskLevel.getMediumRisk().split("_"))
                    .map(Double::valueOf)
                    .collect(Collectors.toList());
            List<Double> noRiskRange = Arrays.stream(riskLevel.getNoRisk().split("_"))
                    .map(Double::valueOf)
                    .collect(Collectors.toList());
            // 计算中等风险和无风险的数量
            long mediumCount = 0;
            long noCount = 0;
            for (Double score : countyScoreList) {
                if (score >= mediumRange.get(0) && score <= mediumRange.get(1)) {
                    mediumCount++;
                } else if (score >= noRiskRange.get(0) && score <= noRiskRange.get(1)) {
                    noCount++;
                }
            }
            // 当中等风险的数量大于总数的1/3,总分减一
            if ((double) mediumCount / (double) countyScoreList.size() > 0.33) {
                totalAverageScore = totalAverageScore - 1D;
            }
            // 当无风险的数量大于总数的1/3,总分加一
            if ((double) noCount / (double) countyScoreList.size() > 0.33) {
                totalAverageScore = totalAverageScore + 1D;
            }
            vo.setScore(totalAverageScore);
            riskMapVOList.add(vo);
        }
        return riskMapVOList;
    }
    public List<SysUser> getCityList() {
        List<SysUser> list = sysUserService.lambdaQuery()
                .eq(SysUser::getAreaLevel, AreaLevelEnum.CITY)
                .list();
        return list;
    }
    public List<SysUser> getChildrenList(String areaCode) {
        String cityCode = areaCode.substring(0, 4);
        List<SysUser> list = sysUserService.lambdaQuery()
                .select(SysUser::getAreaCode, SysUser::getAreaName, SysUser::getAreaAlias,
                        SysUser::getUserId).eq(SysUser::getUserType,
                        UserTypeEnum.DEPARTMENT).likeRight(SysUser::getAreaCode, cityCode).list();
        return list;
    }
}