package com.finance.system.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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; import com.finance.system.query.CalculateDetailQuery; import com.finance.system.query.DeptCalculateDetailQuery; 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; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** *

* 得分表 服务实现类 *

* * @author mitao * @since 2024-03-13 */ @Slf4j @Service @RequiredArgsConstructor public class TbScoreServiceImpl extends ServiceImpl implements TbScoreService { private final TbBasicDataConfigService basicDataConfigService; private final ISysUserService sysUserService; @Override public Page pageScore(ScoreQuery query, Page page) { return baseMapper.pageScore(query, page); } @Override public PageDTO getHistoryScore(HistoryScoreQuery query) { ScoreQuery scoreQuery = BeanUtils.copyBean(query, ScoreQuery.class); Page scoreVOPage = baseMapper.pageScore(scoreQuery, new Page<>(query.getPageNum(), query.getPageSize())); return PageDTO.of(scoreVOPage); } @Override public ScoreCalculateDetailVO scoreCalculateDetail(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 page = new Page<>(query.getPageNum(), query.getPageSize()); String previousQuarter = DateUtils.getPreviousQuarter(); previousQuarter = QuarterConstant.CURRENT_QUARTER; query.setPreviousQuarter(previousQuarter); Page 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 page = new Page<>(query.getPageNum(), query.getPageSize()); Page pageVO = baseMapper.scoreCalculateDetail(query, page); vo.setTotal(pageVO.getTotal()); vo.setPages(pageVO.getPages()); vo.setList(pageVO.getRecords()); return vo; } @Override public List queryTotalScoreList() { return baseMapper.queryTotalScoreList(); } @Override public ScoreRankVO queryRankAndScoreByAreaCode(String areaCode) throws Exception { String previousQuarter = DateUtils.getPreviousQuarter(); previousQuarter = QuarterConstant.CURRENT_QUARTER; List 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 public List deptCalculateDetail(DeptCalculateDetailQuery query, String nowQuarter) { return baseMapper.deptCalculateDetail(query, nowQuarter); } @Override public ScoreCalculateDetailVO fieldsDetail(CalculateDetailQuery query, List countyList) throws Exception { // 查询计算类型 TbBasicDataConfig config = basicDataConfigService.getById(query.getId()); if (Objects.isNull(config)) { throw new ServiceException("非法参数"); } if (CollUtils.isEmpty(countyList)) { return new ScoreCalculateDetailVO(); } List areaCodeList = countyList.stream().map(SysUser::getAreaCode).distinct() .collect(Collectors.toList()); ScoreCalculateDetailVO vo = new ScoreCalculateDetailVO(); vo.setTypeName(config.getTypeName()); vo.setCalculateType(config.getCalculateType()); Page page = new Page<>(query.getPageNum(), query.getPageSize()); String previousQuarter = DateUtils.getPreviousQuarter(); previousQuarter = QuarterConstant.CURRENT_QUARTER; query.setPreviousQuarter(previousQuarter); Page pageVO = baseMapper.fieldsDetail(query, page, areaCodeList); vo.setTotal(pageVO.getTotal()); vo.setPages(pageVO.getPages()); vo.setList(pageVO.getRecords()); return vo; } @Override public List getCurrentScoreList(String nowQuarter, String areaCode) { return baseMapper.getCurrentScoreList(nowQuarter, areaCode); } @Override public List queryRiskRanking(String nowQuarter) { return baseMapper.queryRiskRanking(nowQuarter); } /** * @param areaCode 区划代码 * @return */ @Override public List getScoreByYearType(String areaCode, String quarter) { return baseMapper.getScoreByYearType(areaCode, quarter); } @Override public List getCityScore(String previousQuarter, DataScreenConfigVO riskLevel) { // 查询城市部门 List cityList = getCityList(); List 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 countyScoreList = baseMapper.getCountyScoreList(areaCode, previousQuarter); // 将风险范围解析为列表,只解析一次 List mediumRange = Arrays.stream(riskLevel.getMediumRisk().split("_")) .map(Double::valueOf) .collect(Collectors.toList()); List 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 getCityList() { List list = sysUserService.lambdaQuery() .eq(SysUser::getAreaLevel, AreaLevelEnum.CITY) .list(); return list; } public List getChildrenList(String areaCode) { String cityCode = areaCode.substring(0, 4); List list = sysUserService.lambdaQuery() .select(SysUser::getAreaCode, SysUser::getAreaName, SysUser::getAreaAlias, SysUser::getUserId).eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT).likeRight(SysUser::getAreaCode, cityCode).list(); return list; } }