mitao
2025-04-07 18891c60ab1c06a4acc85d0ec54dee50d1b1a19f
finance-system/src/main/java/com/finance/system/service/impl/TbScoreServiceImpl.java
@@ -4,10 +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;
@@ -16,8 +19,10 @@
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;
@@ -25,6 +30,8 @@
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;
@@ -47,6 +54,7 @@
        TbScoreService {
    private final TbBasicDataConfigService basicDataConfigService;
    private final ISysUserService sysUserService;
    @Override
    public Page<ScoreVO> pageScore(ScoreQuery query, Page<ScoreVO> page) {
@@ -74,7 +82,7 @@
        vo.setCalculateType(config.getCalculateType());
        Page<ScoreDetailVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        query.setPreviousQuarter(previousQuarter);
        Page<ScoreDetailVO> pageVO = baseMapper.scoreCalculateDetail(query, page);
        vo.setTotal(pageVO.getTotal());
@@ -110,7 +118,7 @@
    @Override
    public ScoreRankVO queryRankAndScoreByAreaCode(String areaCode) throws Exception {
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2024年一季度";
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        List<ScoreRankVO> voList = baseMapper.queryRankAndScoreByAreaCode(areaCode,
                previousQuarter);
        if (CollUtils.isNotEmpty(voList)) {
@@ -148,7 +156,8 @@
        vo.setCalculateType(config.getCalculateType());
        Page<ScoreDetailVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        String previousQuarter = DateUtils.getPreviousQuarter();
        previousQuarter = "2023年一季度";
        previousQuarter = QuarterConstant.CURRENT_QUARTER;
        query.setPreviousQuarter(previousQuarter);
        Page<ScoreDetailVO> pageVO = baseMapper.fieldsDetail(query, page, areaCodeList);
        vo.setTotal(pageVO.getTotal());
        vo.setPages(pageVO.getPages());
@@ -174,4 +183,69 @@
    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;
    }
}