package com.ycl.platform.service.impl; import annotation.DataScope; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.base.CheckIndex; import com.ycl.platform.domain.dto.CheckResultExportDTO; import com.ycl.platform.domain.dto.CheckScoreDTO; import com.ycl.platform.domain.dto.CheckScoreIndexDTO; import com.ycl.platform.domain.dto.ScoreIndexDTO; import com.ycl.platform.domain.entity.*; import com.ycl.platform.domain.query.DashboardQuery; import com.ycl.platform.domain.vo.*; import com.ycl.platform.mapper.*; import com.ycl.platform.service.ICheckIndexCarService; import com.ycl.platform.service.ICheckIndexFaceService; import com.ycl.platform.service.ICheckIndexVideoService; import com.ycl.platform.service.ICheckScoreService; import com.ycl.system.entity.BaseEntity; import com.ycl.system.entity.SysRole; import com.ycl.system.entity.SysUser; import com.ycl.system.service.ISysDeptService; import com.ycl.utils.DateUtils; import com.ycl.utils.SecurityUtils; import com.ycl.utils.StringUtils; import constant.CheckConstants; import enumeration.general.AreaDeptEnum; import enumeration.general.PublishType; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import pojo.ExcelExp; import utils.poi.ExcelUtilManySheet; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.InetAddress; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * 考核积分明细Service业务层处理 * * @author ruoyi * @date 2024-04-22 */ @Service @Slf4j public class CheckScoreServiceImpl extends ServiceImpl implements ICheckScoreService { @Autowired private CheckScoreMapper scoreMapper; @Autowired private CheckTemplateMapper templateMapper; @Autowired private CheckTemplateRuleMapper templateRuleMapper; @Autowired private CheckRuleMapper ruleMapper; @Autowired private ICheckIndexCarService indexCarService; @Autowired private ICheckIndexFaceService indexFaceService; @Autowired private ICheckIndexVideoService indexVideoService; @Autowired private ISysDeptService deptService; @Autowired private PlatformMapper platformMapper; /** * 查询考核积分指标 * * @param id 考核积分主键 * @return 考核积分 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public CheckScoreDetailVO selectCheckScoreById(CheckScoreIndexDTO checkScoreIndexDTO) { Long checkScoreId = checkScoreIndexDTO.getId(); CheckScoreDetailVO checkScoreDetailVO = new CheckScoreDetailVO(); //根据id读取score CheckScore checkScore = scoreMapper.selectCheckScoreById(checkScoreId); Integer templateId = 0; //方便切换改为:根据score考核类别和dto考核标签查模板规则和权重,注意同种类同标签只能有一个模板 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("examine_tag", checkScoreIndexDTO.getExamineTag()); wrapper.eq("examine_category", checkScore.getExamineCategory()); Optional first = templateMapper.selectList(wrapper).stream().findFirst(); if (first.isPresent()) { CheckTemplate checkTemplate = first.get(); templateId = checkTemplate.getId(); } //读取规则以及权重 List templateRuleList = templateRuleMapper.selectListByTemplateId(templateId); List checkRules = new ArrayList<>(); //读取模板对应所有规则 Map scoreMap = new HashMap<>(); List ruleIds = templateRuleList.stream().map(checkTemplateRule -> checkTemplateRule.getCheckRuleId()) .collect(Collectors.toList()); List ruleIndex = ruleMapper.selectBatchIds(ruleIds); checkRules.addAll(ruleIndex); //根据examineCategory 读取不同index表 Short examineCategory = checkScore.getExamineCategory(); String[] indexTableArr = {"", "t_check_index_video", "t_check_index_car", "t_check_index_face"}; String tableName = indexTableArr[examineCategory]; ScoreIndexDTO scoreIndexDTO = new ScoreIndexDTO() .setTableName(tableName) .setDeptId(checkScore.getDeptId()) .setDate(checkScoreIndexDTO.getDate()) .setQuarter(checkScoreIndexDTO.getQuarter()); scoreIndexDTO.setParams(checkScoreIndexDTO.getParams()); scoreIndexDTO.setExamineTag(checkScoreIndexDTO.getExamineTag()); //获当月份 if (StringUtils.isEmpty(scoreIndexDTO.getDate()) && CollectionUtils.isEmpty(checkScoreIndexDTO.getQuarter())) { //如果查询条件不含参数,查询积分对应创建时间 Date createTime = checkScore.getCreateTime(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); scoreIndexDTO.setDate(formatter.format(createTime)); } //权限控制 roleControl(scoreIndexDTO); List map = scoreMapper.selectScoreIndex(scoreIndexDTO); scoreMap.put("tableData", checkRules); scoreMap.put("dataMap", map); checkScoreDetailVO.setCheckRuleList(templateRuleList); checkScoreDetailVO.setScoreMap(scoreMap); return checkScoreDetailVO; } /** * 查询考核积分卡片列表 * 这里显示当天的成绩如果没有当天成绩则显示最后一次成绩 * @param checkScore 考核积分 * @return 考核积分 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public Map> selectCheckScoreList(CheckScore query) { CheckScore checkScore = new CheckScore(); BeanUtils.copyProperties(query,checkScore); //区县只能看已发布 roleControl(checkScore); // 转换数据日期时间、标签 getCheckScore(checkScore); // // 一号查询之前的数据 // if (LocalDateTime.now().getDayOfMonth() == 1) { // calendar.add(Calendar.DAY_OF_MONTH, -1); // } List checkScores = scoreMapper.selectCheckScoreMap(checkScore); log.error("打印:{}",checkScores); // 如果数据为空,则查询之前的数据 if (CollectionUtils.isEmpty(checkScores) && (query.getStartDate() ==null || query.getStartDate() ==null)) { CheckScore one = scoreMapper.getLast(checkScore); if (Objects.nonNull(one)) { checkScore.setStartDate(one.getCreateTime()); checkScore.setEndDate(one.getCreateTime()); getCheckScore(checkScore); checkScores = scoreMapper.selectCheckScoreMap(checkScore); } } //分数保留一位小数 checkScores.stream().forEach(item -> item.setScore(item.getScore().setScale(1, RoundingMode.HALF_UP))); Map> map = checkScores.stream().collect(Collectors.groupingBy(CheckScore::getDeptId)); for (Map.Entry> entry : map.entrySet()) { List tempList = getCheckScores(entry); // 迭代结束后,将新元素添加到原始列表中 entry.getValue().addAll(tempList); } return map; } private List getCheckScores(Map.Entry> entry) { List tempList = new ArrayList<>(); // 临时存储需要添加的元素 boolean hasFace = false; boolean hasCar = false; for (int i =0;i > selectCheckScoreChart(CheckScore checkScore) { //区县只能看已发布 roleControl(checkScore); //查询成绩 String date = checkScore.getDate(); if (StringUtils.isEmpty(date)) { //如果为空查本月的数据 Calendar now = Calendar.getInstance(); //取昨天 // now.add(Calendar.DATE, -1); Date yesterday = now.getTime(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM"); date = simpleDateFormat.format(yesterday); checkScore.setDate(date); } List checkScores = scoreMapper.selectCheckScoreList(checkScore); //分数保留一位小数 checkScores.stream().forEach(item -> item.setScore(item.getScore().setScale(1, RoundingMode.HALF_UP))); return checkScores.stream().collect(Collectors.groupingBy(CheckScore::getDeptId)); } /** * 区县详情 * * @param checkScore 考核积分 * @return 考核积分 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List page(CheckScore checkScore) { //区县只能看已发布 roleControl(checkScore); List scoreList = scoreMapper.selectCheckScoreList(checkScore); scoreList.stream().forEach(item -> item.setScore(item.getScore().setScale(1, RoundingMode.HALF_UP))); return scoreList; } /** * 发布考核积分信息 * * @param checkScoreDTO 考核积分 * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) public int publishCheckScore(CheckScoreDTO checkScoreDTO) { if (CollectionUtils.isEmpty(checkScoreDTO.getId())) { return 0; } PublishType publishType = null; try { publishType = PublishType.valueOf(checkScoreDTO.getPublish()); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("参数类型不匹配"); } String code = publishType.getCode(); checkScoreDTO.setPublish(code); int i = scoreMapper.publishCheckScore(checkScoreDTO); //控制index表的发布状态 List ids = checkScoreDTO.getId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.in("id", ids); List scoreList = scoreMapper.selectList(queryWrapper); //最多为3次循环 for (CheckScore checkScore : scoreList) { Short examineCategory = checkScore.getExamineCategory(); if (CheckConstants.Rule_Category_Video.equals(examineCategory)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.set("publish", code); updateWrapper.eq("id", checkScore.getIndexId()); indexVideoService.update(updateWrapper); } else if (CheckConstants.Rule_Category_Car.equals(examineCategory)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.set("publish", code); updateWrapper.eq("id", checkScore.getIndexId()); indexCarService.update(updateWrapper); } else if (CheckConstants.Rule_Category_Face.equals(examineCategory)) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.set("publish", code); updateWrapper.eq("id", checkScore.getIndexId()); indexFaceService.update(updateWrapper); } } return i; } /** * 导出指标 * * @param checkScore 考核积分 * @return 考核积分 */ @Override public void exportIndex(HttpServletResponse response, CheckResultExportDTO exportDTO) throws IOException { //没有标签默认全导 if (CollectionUtils.isEmpty(exportDTO.getExamineTags())) { exportDTO.setExamineTags(Arrays.asList(0, 1, 2)); } /** 导三张sheet */ //车辆 List checkIndexCars = new ArrayList<>(); //车辆和人脸没有公安部 for (Integer examineTag : exportDTO.getExamineTags()) { if (examineTag == 2) continue; CheckIndexCar checkIndexCar = new CheckIndexCar(); // checkIndexCar.setDate(date); checkIndexCar.setQuarter(exportDTO.getQuarter()); checkIndexCar.setDeptId(exportDTO.getDeptId()); checkIndexCar.setDeptIds(exportDTO.getDeptIds()); //权限控制 只能查看已发布 roleControl(checkIndexCar); checkIndexCar.setExamineTag(Short.valueOf(examineTag + "")); checkIndexCars.addAll(indexCarService.selectCheckIndexCarList(checkIndexCar)); } //计算平均值放在excel最后 if (exportDTO.getAverage() != null && exportDTO.getAverage() && !CollectionUtils.isEmpty(checkIndexCars)) { //先区分考核标签,再区分区县 List countyList = checkIndexCars.stream().filter(car -> CheckConstants.Examine_Tag_County.equals(car.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(countyList)) { Map> carMap = countyList.stream().collect(Collectors.groupingBy(CheckIndexCar::getDeptId)); List cars = new ArrayList<>(); carMap.forEach((deptId, list) -> { CheckIndexCar car = CheckIndexCar.calculateAverage(list); cars.add(car); }); //根据积分降序 checkIndexCars.addAll(cars.stream().sorted(Comparator.comparing(CheckIndexCar::getScore).reversed()).collect(Collectors.toList())); } List provinceList = checkIndexCars.stream().filter(car -> CheckConstants.Examine_Tag_Province.equals(car.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(provinceList)) { Map> carMap = provinceList.stream().collect(Collectors.groupingBy(CheckIndexCar::getDeptId)); List cars = new ArrayList<>(); carMap.forEach((deptId, list) -> { CheckIndexCar car = CheckIndexCar.calculateAverage(list); cars.add(car); }); //根据积分降序 checkIndexCars.addAll(cars.stream().sorted(Comparator.comparing(CheckIndexCar::getScore).reversed()).collect(Collectors.toList())); } } List checkIndexCarVOS = new ArrayList<>(); for (CheckIndexCar indexCar : checkIndexCars) { CheckIndexCarVO excelVo = CheckIndexCar.getExcelVo(indexCar); checkIndexCarVOS.add(excelVo); } ExcelExp e1 = new ExcelExp("车辆考核指标数据", checkIndexCarVOS, CheckIndexCarVO.class); //人脸 List checkIndexFaces = new ArrayList<>(); for (Integer examineTag : exportDTO.getExamineTags()) { if (examineTag == 2) continue; CheckIndexFace checkIndexFace = new CheckIndexFace(); // checkIndexFace.setDate(date); checkIndexFace.setQuarter(exportDTO.getQuarter()); checkIndexFace.setDeptId(exportDTO.getDeptId()); checkIndexFace.setDeptIds(exportDTO.getDeptIds()); //权限控制 只能查看已发布 roleControl(checkIndexFace); checkIndexFace.setExamineTag(Short.valueOf(examineTag + "")); checkIndexFaces.addAll(indexFaceService.selectCheckIndexFaceList(checkIndexFace)); } //计算平均值放在excel最后 if (exportDTO.getAverage() != null && exportDTO.getAverage() && !CollectionUtils.isEmpty(checkIndexFaces)) { //先区分考核标签,再区分区县 List countyList = checkIndexFaces.stream().filter(face -> CheckConstants.Examine_Tag_County.equals(face.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(countyList)) { Map> faceMap = countyList.stream().collect(Collectors.groupingBy(CheckIndexFace::getDeptId)); List faces = new ArrayList<>(); faceMap.forEach((deptId, list) -> { CheckIndexFace face = CheckIndexFace.calculateAverage(list); faces.add(face); }); //根据积分降序 checkIndexFaces.addAll(faces.stream().sorted(Comparator.comparing(CheckIndexFace::getScore).reversed()).collect(Collectors.toList())); } List provinceList = checkIndexFaces.stream().filter(face -> CheckConstants.Examine_Tag_Province.equals(face.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(provinceList)) { Map> faceMap = provinceList.stream().collect(Collectors.groupingBy(CheckIndexFace::getDeptId)); List faces = new ArrayList<>(); faceMap.forEach((deptId, list) -> { CheckIndexFace face = CheckIndexFace.calculateAverage(list); faces.add(face); }); //根据积分降序 checkIndexFaces.addAll(faces.stream().sorted(Comparator.comparing(CheckIndexFace::getScore).reversed()).collect(Collectors.toList())); } } List checkIndexFaceVOS = new ArrayList<>(); for (CheckIndexFace indexFace : checkIndexFaces) { CheckIndexFaceVO excelVo = CheckIndexFace.getExcelVo(indexFace); checkIndexFaceVOS.add(excelVo); } ExcelExp e2 = new ExcelExp("人脸考核指标数据", checkIndexFaceVOS, CheckIndexFaceVO.class); //视频 List checkIndexVideos = new ArrayList<>(); for (Integer examineTag : exportDTO.getExamineTags()) { CheckIndexVideo checkIndexVideo = new CheckIndexVideo(); // checkIndexVideo.setDate(date); checkIndexVideo.setQuarter(exportDTO.getQuarter()); checkIndexVideo.setDeptId(exportDTO.getDeptId()); checkIndexVideo.setDeptIds(exportDTO.getDeptIds()); //权限控制 只能查看已发布 roleControl(checkIndexVideo); checkIndexVideo.setExamineTag(Short.valueOf(examineTag + "")); checkIndexVideos.addAll(indexVideoService.selectCheckIndexVideoList(checkIndexVideo)); } //计算平均值放在excel最后 if (exportDTO.getAverage() != null && exportDTO.getAverage() && !CollectionUtils.isEmpty(checkIndexVideos)) { //先区分考核标签,再区分区县 List countyList = checkIndexVideos.stream().filter(video -> CheckConstants.Examine_Tag_County.equals(video.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(countyList)) { Map> videoMap = countyList.stream().collect(Collectors.groupingBy(CheckIndexVideo::getDeptId)); List videos = new ArrayList<>(); videoMap.forEach((deptId, list) -> { CheckIndexVideo video = CheckIndexVideo.calculateAverage(list); videos.add(video); }); //根据积分降序 checkIndexVideos.addAll(videos.stream().sorted(Comparator.comparing(CheckIndexVideo::getScore).reversed()).collect(Collectors.toList())); } List provinceList = checkIndexVideos.stream().filter(video -> CheckConstants.Examine_Tag_Province.equals(video.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(provinceList)) { Map> videoMap = provinceList.stream().collect(Collectors.groupingBy(CheckIndexVideo::getDeptId)); List videos = new ArrayList<>(); videoMap.forEach((deptId, list) -> { CheckIndexVideo video = CheckIndexVideo.calculateAverage(list); videos.add(video); }); //根据积分降序 checkIndexVideos.addAll(videos.stream().sorted(Comparator.comparing(CheckIndexVideo::getScore).reversed()).collect(Collectors.toList())); } List deptList = checkIndexVideos.stream().filter(video -> CheckConstants.Examine_Tag_Dept.equals(video.getExamineTag())).collect(Collectors.toList()); if (!CollectionUtils.isEmpty(deptList)) { Map> videoMap = deptList.stream().collect(Collectors.groupingBy(CheckIndexVideo::getDeptId)); List videos = new ArrayList<>(); videoMap.forEach((deptId, list) -> { CheckIndexVideo video = CheckIndexVideo.calculateAverage(list); videos.add(video); }); //根据积分降序 checkIndexVideos.addAll(videos.stream().sorted(Comparator.comparing(CheckIndexVideo::getScore).reversed()).collect(Collectors.toList())); } } List checkIndexVideoVOS = new ArrayList<>(); for (CheckIndexVideo indexVideo : checkIndexVideos) { CheckIndexVideoVO excelVo = CheckIndexVideo.getExcelVo(indexVideo); checkIndexVideoVOS.add(excelVo); } ExcelExp e3 = new ExcelExp("视频考核指标数据", checkIndexVideoVOS, CheckIndexVideoVO.class); List mysheet = new ArrayList<>(); mysheet.add(e1); mysheet.add(e2); mysheet.add(e3); //规则明细 List allRuleTemplate = templateRuleMapper.getAllRuleTemplate(); //整合数据 List countyRuleList = allRuleTemplate.stream().filter(vo -> vo.getExamineTag().equals(Integer.parseInt(CheckConstants.Examine_Tag_County + ""))).collect(Collectors.toList()); List provinceRuleList = allRuleTemplate.stream().filter(vo -> vo.getExamineTag().equals(Integer.parseInt(CheckConstants.Examine_Tag_Province + ""))).collect(Collectors.toList()); //用区县规则做主体展示 for (RuleExcelVO countyRule : countyRuleList) { countyRule.setCountyWeight(countyRule.getWeight()); //筛选同种规则权重 for (RuleExcelVO provinceRule : provinceRuleList) { if (provinceRule.getRuleId().equals(countyRule.getRuleId()) && provinceRule.getExamineCategory().equals(countyRule.getExamineCategory())) { countyRule.setProvinceWeight(provinceRule.getWeight()); } } } ExcelExp e4 = new ExcelExp("规则明细", countyRuleList, RuleExcelVO.class); mysheet.add(e4); ExcelUtilManySheet> util = new ExcelUtilManySheet<>(mysheet); util.exportExcelManySheet(response, mysheet); } private void roleControl(CheckIndex checkIndex) { List roles = SecurityUtils.getLoginUser().getUser().getRoles(); SysUser user = SecurityUtils.getLoginUser().getUser(); if (!user.isAdmin()) { for (SysRole role : roles) { if (role.getPermissions().contains("check:score:role:publish")) { Map params = checkIndex.getParams(); params.put("publish", PublishType.PUBLISHED.getCode()); } } } } private void roleControl(BaseEntity checkScore) { List roles = SecurityUtils.getLoginUser().getUser().getRoles(); SysUser user = SecurityUtils.getLoginUser().getUser(); if (!user.isAdmin()) { for (SysRole role : roles) { if (role.getPermissions().contains("check:score:role:publish")) { Map params = checkScore.getParams(); params.put("publish", PublishType.PUBLISHED.getCode()); } } } } @Override public List> home() { Date now = new Date(); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, -7); Date startTime = calendar.getTime(); return baseMapper.home(startTime,now); } @Override public List> calculate(String category) { Calendar calendar = Calendar.getInstance(); Date endDate = calendar.getTime(); calendar.set(Calendar.DAY_OF_MONTH, 1); Date startDate = calendar.getTime(); return scoreMapper.calculate(startDate, endDate, category); } //大屏展示考核得分 @Override public Map> dashboard(DashboardQuery dashboardQuery) { Date now = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dashboardQuery.setStartTime(format.format(DateUtils.getDayStart(now))); dashboardQuery.setEndTime(format.format(DateUtils.getDayEnd(now))); List dashboard = scoreMapper.dashboard(dashboardQuery); //初始化各个区县数据 Map> resultMap = new HashMap<>(); for (AreaDeptEnum value : AreaDeptEnum.values()) { Map map = new HashMap<>(); map.put("video", 0); map.put("car", 0); map.put("face", 0); resultMap.put(value.getName(), map); } //填充各个区县数据 for (CheckScore checkScore : dashboard) { Map map = resultMap.get(checkScore.getDeptName()); if (CheckConstants.Rule_Category_Video.equals(checkScore.getExamineCategory())) { map.put("video", checkScore.getScore().setScale(1, RoundingMode.HALF_UP)); } else if (CheckConstants.Rule_Category_Car.equals(checkScore.getExamineCategory())) { map.put("car", checkScore.getScore().setScale(1, RoundingMode.HALF_UP)); } else if (CheckConstants.Rule_Category_Face.equals(checkScore.getExamineCategory())) { map.put("face", checkScore.getScore().setScale(1, RoundingMode.HALF_UP)); } resultMap.put(checkScore.getDeptName(), map); } return resultMap; } // /** // * 新增考核积分 // * // * @param checkScore 考核积分 // * @return 结果 // */ // @Override // public int insertCheckScore(CheckScore checkScore) // { // checkScore.setCreateTime(DateUtils.getNowDate()); // return scoreMapper.insertCheckScore(checkScore); // } // // /** // * 修改考核明细 // * // * @param checkScore 考核积分明细 // * @return 结果 // */ // @Override // public int updateCheckScore(CheckScore checkScore) // { // // return scoreMapper.updateCheckScore(checkScore); // } // // /** // * 批量删除考核积分 // * // * @param ids 需要删除的考核积分主键 // * @return 结果 // */ // @Override // public int deleteCheckScoreByIds(Long[] ids) // { // return scoreMapper.deleteCheckScoreByIds(ids); // } // // /** // * 删除考核积分信息 // * // * @param id 考核积分主键 // * @return 结果 // */ // @Override // public int deleteCheckScoreById(Long id) // { // return scoreMapper.deleteCheckScoreById(id); // } }